2009-09-12 10:09:59 +00:00
|
|
|
/* PCSX2 - PS2 Emulator for PCs
|
2023-12-22 09:35:20 +00:00
|
|
|
* Copyright (C) 2002-2023 PCSX2 Dev Team
|
2009-10-04 09:00:07 +00:00
|
|
|
*
|
2009-09-12 10:09:59 +00:00
|
|
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
|
|
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
|
|
|
* ation, either version 3 of the License, or (at your option) any later version.
|
2009-03-13 07:27:52 +00:00
|
|
|
*
|
2009-09-12 10:09:59 +00:00
|
|
|
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE. See the GNU General Public License for more details.
|
2009-07-29 14:00:00 +00:00
|
|
|
*
|
2009-09-12 10:09:59 +00:00
|
|
|
* You should have received a copy of the GNU General Public License along with PCSX2.
|
|
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
2009-03-13 07:27:52 +00:00
|
|
|
*/
|
2009-07-29 14:00:00 +00:00
|
|
|
|
2021-09-01 20:31:46 +00:00
|
|
|
#pragma once
|
2009-03-13 07:27:52 +00:00
|
|
|
|
2023-12-22 09:35:20 +00:00
|
|
|
// make sure __POSIX__ is defined for all systems where we assume POSIX compliance
|
|
|
|
#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
|
2023-12-22 10:41:59 +00:00
|
|
|
#ifndef __POSIX__
|
|
|
|
#define __POSIX__ 1
|
|
|
|
#endif
|
2015-11-17 17:35:02 +00:00
|
|
|
#endif
|
|
|
|
|
2009-07-29 14:00:00 +00:00
|
|
|
#include "Pcsx2Types.h"
|
2022-10-12 13:57:53 +00:00
|
|
|
#include <cstddef>
|
2009-07-29 14:00:00 +00:00
|
|
|
|
2010-08-09 04:10:38 +00:00
|
|
|
// --------------------------------------------------------------------------------------
|
2009-07-29 14:00:00 +00:00
|
|
|
// Dev / Debug conditionals - Consts for using if() statements instead of uglier #ifdef.
|
2010-08-09 04:10:38 +00:00
|
|
|
// --------------------------------------------------------------------------------------
|
2016-11-12 15:28:37 +00:00
|
|
|
#ifdef PCSX2_DEVBUILD
|
2023-12-22 10:41:59 +00:00
|
|
|
static constexpr bool IsDevBuild = true;
|
2016-11-12 15:28:37 +00:00
|
|
|
#else
|
2023-12-22 10:41:59 +00:00
|
|
|
static constexpr bool IsDevBuild = false;
|
2016-11-12 15:28:37 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef PCSX2_DEBUG
|
2023-12-22 10:41:59 +00:00
|
|
|
static constexpr bool IsDebugBuild = true;
|
2016-11-12 15:28:37 +00:00
|
|
|
#else
|
2023-12-22 10:41:59 +00:00
|
|
|
static constexpr bool IsDebugBuild = false;
|
2010-07-02 15:32:03 +00:00
|
|
|
#endif
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2009-11-02 07:00:59 +00:00
|
|
|
// Defines the memory page size for the target platform at compilation. All supported platforms
|
|
|
|
// (which means Intel only right now) have a 4k granularity.
|
2023-07-22 04:22:06 +00:00
|
|
|
static constexpr unsigned int __pagesize = 0x1000;
|
|
|
|
static constexpr unsigned int __pageshift = 12;
|
|
|
|
static constexpr unsigned int __pagemask = __pagesize - 1;
|
2009-11-02 07:00:59 +00:00
|
|
|
|
2009-11-07 14:13:07 +00:00
|
|
|
// --------------------------------------------------------------------------------------
|
2010-04-25 00:31:27 +00:00
|
|
|
// Microsoft Visual Studio
|
2009-11-07 14:13:07 +00:00
|
|
|
// --------------------------------------------------------------------------------------
|
2009-03-13 07:27:52 +00:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
|
2023-12-22 10:41:59 +00:00
|
|
|
#define __noinline __declspec(noinline)
|
|
|
|
#define __noreturn __declspec(noreturn)
|
|
|
|
|
|
|
|
#define RESTRICT __restrict
|
|
|
|
#define ASSUME(x) __assume(x)
|
2009-05-27 13:10:43 +00:00
|
|
|
|
2009-03-13 07:27:52 +00:00
|
|
|
#else
|
|
|
|
|
2009-11-07 14:13:07 +00:00
|
|
|
// --------------------------------------------------------------------------------------
|
2023-12-22 10:41:59 +00:00
|
|
|
// GCC / Clang Compilers Section
|
2009-11-07 14:13:07 +00:00
|
|
|
// --------------------------------------------------------------------------------------
|
2009-05-19 13:25:09 +00:00
|
|
|
|
2023-12-22 10:41:59 +00:00
|
|
|
// SysV ABI passes vector parameters through registers unconditionally.
|
|
|
|
#ifndef _WIN32
|
|
|
|
#define __vectorcall
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Inlining note: GCC needs ((unused)) attributes defined on inlined functions to suppress
|
|
|
|
// warnings when a static inlined function isn't used in the scope of a single file (which
|
|
|
|
// happens *by design* like all the friggen time >_<)
|
2022-05-12 12:34:42 +00:00
|
|
|
|
2023-12-22 10:41:59 +00:00
|
|
|
#define __forceinline __attribute__((always_inline, unused))
|
|
|
|
#define __noinline __attribute__((noinline))
|
|
|
|
#define __noreturn __attribute__((noreturn))
|
2021-08-29 20:49:55 +00:00
|
|
|
|
2023-12-22 10:41:59 +00:00
|
|
|
#define RESTRICT __restrict__
|
|
|
|
|
|
|
|
#define ASSUME(x) \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
if (!(x)) \
|
|
|
|
__builtin_unreachable(); \
|
|
|
|
} while (0)
|
2021-08-29 20:49:55 +00:00
|
|
|
|
2009-03-13 07:27:52 +00:00
|
|
|
#endif
|
|
|
|
|
2010-08-09 04:10:38 +00:00
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
// __releaseinline / __ri -- a forceinline macro that is enabled for RELEASE/PUBLIC builds ONLY.
|
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
// This is useful because forceinline can make certain types of debugging problematic since
|
|
|
|
// functions that look like they should be called won't breakpoint since their code is
|
|
|
|
// inlined, and it can make stack traces confusing or near useless.
|
|
|
|
//
|
|
|
|
// Use __releaseinline for things which are generally large functions where trace debugging
|
|
|
|
// from Devel builds is likely useful; but which should be inlined in an optimized Release
|
|
|
|
// environment.
|
|
|
|
//
|
2023-12-22 09:41:44 +00:00
|
|
|
#define __fi __forceinline
|
2010-08-09 04:10:38 +00:00
|
|
|
#ifdef PCSX2_DEVBUILD
|
2023-12-22 10:41:59 +00:00
|
|
|
#define __ri
|
2010-08-09 04:10:38 +00:00
|
|
|
#else
|
2023-12-22 10:41:59 +00:00
|
|
|
#define __ri __fi
|
2023-12-22 10:30:31 +00:00
|
|
|
#endif
|
|
|
|
|
2022-05-18 13:27:23 +00:00
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Safe deallocation macros -- checks pointer validity (non-null) when needed, and sets
|
|
|
|
// pointer to null after deallocation.
|
|
|
|
|
2023-12-22 10:41:59 +00:00
|
|
|
#define safe_delete(ptr) (delete (ptr), (ptr) = nullptr)
|
|
|
|
#define safe_delete_array(ptr) (delete[] (ptr), (ptr) = nullptr)
|
|
|
|
#define safe_free(ptr) (std::free(ptr), (ptr) = nullptr)
|
2022-05-18 13:27:23 +00:00
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
// ImplementEnumOperators (macro)
|
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
// This macro implements ++/-- operators for any conforming enumeration. In order for an
|
|
|
|
// enum to conform, it must have _FIRST and _COUNT members defined, and must have a full
|
|
|
|
// compliment of sequential members (no custom assignments) --- looking like so:
|
|
|
|
//
|
|
|
|
// enum Dummy {
|
|
|
|
// Dummy_FIRST,
|
|
|
|
// Dummy_Item = Dummy_FIRST,
|
|
|
|
// Dummy_Crap,
|
|
|
|
// Dummy_COUNT
|
|
|
|
// };
|
|
|
|
//
|
|
|
|
// The macro also defines utility functions for bounds checking enumerations:
|
|
|
|
// EnumIsValid(value); // returns TRUE if the enum value is between FIRST and COUNT.
|
|
|
|
// EnumAssert(value);
|
|
|
|
//
|
|
|
|
// It also defines a *prototype* for converting the enumeration to a string. Note that this
|
|
|
|
// method is not implemented! You must implement it yourself if you want to use it:
|
|
|
|
// EnumToString(value);
|
|
|
|
//
|
|
|
|
#define ImplementEnumOperators(enumName) \
|
|
|
|
static __fi enumName& operator++(enumName& src) \
|
|
|
|
{ \
|
|
|
|
src = (enumName)((int)src + 1); \
|
|
|
|
return src; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
static __fi enumName& operator--(enumName& src) \
|
|
|
|
{ \
|
|
|
|
src = (enumName)((int)src - 1); \
|
|
|
|
return src; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
static __fi enumName operator++(enumName& src, int) \
|
|
|
|
{ \
|
|
|
|
enumName orig = src; \
|
|
|
|
src = (enumName)((int)src + 1); \
|
|
|
|
return orig; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
static __fi enumName operator--(enumName& src, int) \
|
|
|
|
{ \
|
|
|
|
enumName orig = src; \
|
|
|
|
src = (enumName)((int)src - 1); \
|
|
|
|
return orig; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
static __fi bool operator<(const enumName& left, const pxEnumEnd_t&) { return (int)left < enumName##_COUNT; } \
|
|
|
|
static __fi bool operator!=(const enumName& left, const pxEnumEnd_t&) { return (int)left != enumName##_COUNT; } \
|
|
|
|
static __fi bool operator==(const enumName& left, const pxEnumEnd_t&) { return (int)left == enumName##_COUNT; } \
|
|
|
|
\
|
|
|
|
static __fi bool EnumIsValid(enumName id) \
|
|
|
|
{ \
|
|
|
|
return ((int)id >= enumName##_FIRST) && ((int)id < enumName##_COUNT); \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
extern const char* EnumToString(enumName id)
|
|
|
|
|
|
|
|
class pxEnumEnd_t
|
|
|
|
{
|
|
|
|
};
|
|
|
|
static const pxEnumEnd_t pxEnumEnd = {};
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
// DeclareNoncopyableObject
|
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
// This macro provides an easy and clean method for ensuring objects are not copyable.
|
|
|
|
// Simply add the macro to the head or tail of your class declaration, and attempts to
|
2022-12-25 12:31:46 +00:00
|
|
|
// copy the class will give you a moderately obtuse compiler error.
|
2022-05-18 13:27:23 +00:00
|
|
|
//
|
|
|
|
#ifndef DeclareNoncopyableObject
|
|
|
|
#define DeclareNoncopyableObject(classname) \
|
|
|
|
public: \
|
|
|
|
classname(const classname&) = delete; \
|
|
|
|
classname& operator=(const classname&) = delete
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
// Handy Human-readable constants for common immediate values (_16kb -> _4gb)
|
|
|
|
|
|
|
|
static constexpr sptr _1kb = 1024 * 1;
|
|
|
|
static constexpr sptr _4kb = _1kb * 4;
|
|
|
|
static constexpr sptr _16kb = _1kb * 16;
|
|
|
|
static constexpr sptr _32kb = _1kb * 32;
|
|
|
|
static constexpr sptr _64kb = _1kb * 64;
|
|
|
|
static constexpr sptr _128kb = _1kb * 128;
|
|
|
|
static constexpr sptr _256kb = _1kb * 256;
|
|
|
|
|
|
|
|
static constexpr s64 _1mb = 1024 * 1024;
|
|
|
|
static constexpr s64 _8mb = _1mb * 8;
|
|
|
|
static constexpr s64 _16mb = _1mb * 16;
|
|
|
|
static constexpr s64 _32mb = _1mb * 32;
|
|
|
|
static constexpr s64 _64mb = _1mb * 64;
|
|
|
|
static constexpr s64 _256mb = _1mb * 256;
|
|
|
|
static constexpr s64 _1gb = _1mb * 1024;
|
|
|
|
static constexpr s64 _4gb = _1gb * 4;
|
|
|
|
|
|
|
|
// Disable some spammy warnings which wx appeared to disable.
|
|
|
|
// We probably should fix these at some point.
|
|
|
|
#ifdef _MSC_VER
|
2023-12-22 10:41:59 +00:00
|
|
|
#pragma warning(disable : 4244) // warning C4244: 'initializing': conversion from 'uptr' to 'uint', possible loss of data
|
|
|
|
#pragma warning(disable : 4267) // warning C4267: 'initializing': conversion from 'size_t' to 'uint', possible loss of data
|
2022-05-18 13:27:23 +00:00
|
|
|
#endif
|