2009-02-09 21:15:56 +00:00
|
|
|
// stdafx.h : include file for standard system include files,
|
|
|
|
// or project specific include files that are used frequently, but
|
|
|
|
// are changed infrequently
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2009-06-03 12:09:04 +00:00
|
|
|
#pragma warning(disable: 4996 4995 4324 4100 4101 4201)
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2009-05-18 11:08:04 +00:00
|
|
|
#ifdef _WINDOWS
|
|
|
|
|
2009-06-03 12:09:04 +00:00
|
|
|
// The following macros define the minimum required platform. The minimum required platform
|
|
|
|
// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
|
|
|
|
// your application. The macros work by enabling all features available on platform versions up to and
|
|
|
|
// including the version specified.
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
// Modify the following defines if you have to target a platform prior to the ones specified below.
|
|
|
|
// Refer to MSDN for the latest info on corresponding values for different platforms.
|
2009-06-03 12:09:04 +00:00
|
|
|
|
|
|
|
#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
|
|
|
|
#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows.
|
2009-02-09 21:15:56 +00:00
|
|
|
#endif
|
|
|
|
|
2009-06-03 12:09:04 +00:00
|
|
|
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
|
|
|
|
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
|
|
|
|
#endif
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2009-06-03 12:09:04 +00:00
|
|
|
#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
|
2009-02-09 21:15:56 +00:00
|
|
|
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
|
|
|
|
#endif
|
|
|
|
|
2009-06-03 12:09:04 +00:00
|
|
|
#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
|
|
|
|
#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE.
|
2009-02-09 21:15:56 +00:00
|
|
|
#endif
|
|
|
|
|
2009-06-03 12:09:04 +00:00
|
|
|
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2009-06-03 12:09:04 +00:00
|
|
|
#include <windows.h>
|
|
|
|
#include <commctrl.h>
|
|
|
|
#include <commdlg.h>
|
|
|
|
#include <shellapi.h>
|
|
|
|
#include <atlbase.h>
|
2009-05-18 11:08:04 +00:00
|
|
|
|
|
|
|
#endif
|
2009-05-14 16:41:52 +00:00
|
|
|
|
|
|
|
// stdc
|
|
|
|
|
2009-02-09 21:15:56 +00:00
|
|
|
#include <math.h>
|
2009-05-18 11:08:04 +00:00
|
|
|
#include <time.h>
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2010-01-01 05:18:32 +00:00
|
|
|
#include <cstring>
|
2009-05-11 08:18:00 +00:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
#include <list>
|
|
|
|
#include <map>
|
|
|
|
#include <hash_map>
|
2009-07-16 21:36:07 +00:00
|
|
|
#include <hash_set>
|
2009-07-04 17:37:06 +00:00
|
|
|
#include <algorithm>
|
2009-05-11 08:18:00 +00:00
|
|
|
|
2010-01-01 05:18:32 +00:00
|
|
|
// Let's take advantage of the work that's already been done on making things cross-platform by bringing this in.
|
|
|
|
#include "Pcsx2Defs.h"
|
|
|
|
|
2009-05-11 08:18:00 +00:00
|
|
|
using namespace std;
|
2010-01-01 05:18:32 +00:00
|
|
|
|
|
|
|
#ifdef _WINDOWS
|
2009-05-11 08:18:00 +00:00
|
|
|
using namespace stdext;
|
2010-01-01 05:18:32 +00:00
|
|
|
#endif
|
2009-05-11 08:18:00 +00:00
|
|
|
|
|
|
|
extern string format(const char* fmt, ...);
|
|
|
|
|
2009-07-04 17:37:06 +00:00
|
|
|
struct delete_object {template<class T> void operator()(T& p) {delete p;}};
|
|
|
|
struct delete_first {template<class T> void operator()(T& p) {delete p.first;}};
|
|
|
|
struct delete_second {template<class T> void operator()(T& p) {delete p.second;}};
|
2009-07-07 13:04:56 +00:00
|
|
|
struct aligned_free_object {template<class T> void operator()(T& p) {_aligned_free(p);}};
|
|
|
|
struct aligned_free_first {template<class T> void operator()(T& p) {_aligned_free(p.first);}};
|
|
|
|
struct aligned_free_second {template<class T> void operator()(T& p) {_aligned_free(p.second);}};
|
2009-07-04 17:37:06 +00:00
|
|
|
|
2009-05-14 16:41:52 +00:00
|
|
|
// syntactic sugar
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2009-05-14 16:41:52 +00:00
|
|
|
// put these into vc9/common7/ide/usertype.dat to have them highlighted
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2009-05-14 16:41:52 +00:00
|
|
|
typedef unsigned char uint8;
|
|
|
|
typedef signed char int8;
|
|
|
|
typedef unsigned short uint16;
|
|
|
|
typedef signed short int16;
|
|
|
|
typedef unsigned int uint32;
|
|
|
|
typedef signed int int32;
|
|
|
|
typedef unsigned long long uint64;
|
|
|
|
typedef signed long long int64;
|
|
|
|
|
|
|
|
#define countof(a) (sizeof(a) / sizeof(a[0]))
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
#define EXPORT_C extern "C" __declspec(dllexport) void __stdcall
|
|
|
|
#define EXPORT_C_(type) extern "C" __declspec(dllexport) type __stdcall
|
|
|
|
|
2010-01-01 05:18:32 +00:00
|
|
|
#define ALIGN_STACK(n) __aligned(n) int __dummy;
|
2009-05-22 01:22:52 +00:00
|
|
|
|
2009-02-09 21:15:56 +00:00
|
|
|
#ifndef RESTRICT
|
2009-06-03 12:09:04 +00:00
|
|
|
#ifdef __INTEL_COMPILER
|
|
|
|
#define RESTRICT restrict
|
|
|
|
#elif _MSC_VER >= 1400 // TODO: gcc
|
|
|
|
#define RESTRICT __restrict
|
|
|
|
#else
|
|
|
|
#define RESTRICT
|
|
|
|
#endif
|
2009-05-18 11:08:04 +00:00
|
|
|
#endif
|
2009-06-03 12:09:04 +00:00
|
|
|
|
|
|
|
#if defined(_DEBUG) && defined(_MSC_VER)
|
2009-06-19 20:24:18 +00:00
|
|
|
#include <assert.h>
|
2009-06-03 12:09:04 +00:00
|
|
|
#define ASSERT assert
|
|
|
|
#else
|
|
|
|
#define ASSERT(exp) ((void)0)
|
2009-02-09 21:15:56 +00:00
|
|
|
#endif
|
|
|
|
|
2009-05-15 11:11:26 +00:00
|
|
|
#ifdef __x86_64__
|
2009-06-03 12:09:04 +00:00
|
|
|
#define _M_AMD64
|
2009-05-15 11:11:26 +00:00
|
|
|
#endif
|
|
|
|
|
2009-06-12 19:09:17 +00:00
|
|
|
#ifdef _WINDOWS
|
|
|
|
|
2009-05-14 16:41:52 +00:00
|
|
|
// directx
|
|
|
|
|
|
|
|
#include <ddraw.h>
|
2009-06-19 20:24:18 +00:00
|
|
|
#include <d3d11.h>
|
|
|
|
#include <d3dx11.h>
|
|
|
|
#include <d3d9.h>
|
|
|
|
#include <d3dx9.h>
|
2009-05-14 16:41:52 +00:00
|
|
|
|
|
|
|
#define D3DCOLORWRITEENABLE_RGBA (D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA)
|
|
|
|
|
2009-12-20 02:50:34 +00:00
|
|
|
#define USE_UPSCALE_HACKS //Hacks intended to fix upscaling / rendering glitches in HW renderers
|
|
|
|
|
2009-06-19 20:24:18 +00:00
|
|
|
// dxsdk beta missing these:
|
|
|
|
#define D3D11_SHADER_MACRO D3D10_SHADER_MACRO
|
|
|
|
#define ID3D11Blob ID3D10Blob
|
|
|
|
|
2009-06-12 19:09:17 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// opengl
|
|
|
|
|
2009-06-13 19:41:34 +00:00
|
|
|
#include <GL/glew.h>
|
2009-06-12 19:09:17 +00:00
|
|
|
#include <GL/glut.h>
|
2010-01-01 05:18:32 +00:00
|
|
|
#include <Cg/cg.h>
|
|
|
|
#include <Cg/cgGL.h>
|
2009-06-12 19:09:17 +00:00
|
|
|
|
2009-06-13 19:41:34 +00:00
|
|
|
#ifdef _WINDOWS
|
|
|
|
#include <GL/wglew.h>
|
|
|
|
#endif
|
|
|
|
|
2009-05-14 16:41:52 +00:00
|
|
|
// sse
|
|
|
|
|
2010-01-01 05:18:32 +00:00
|
|
|
#if !defined(_M_SSE) && (!defined(_WINDOWS) || defined(_M_AMD64) || defined(_M_IX86_FP) && _M_IX86_FP >= 2)
|
2009-05-14 16:41:52 +00:00
|
|
|
|
|
|
|
#define _M_SSE 0x200
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if _M_SSE >= 0x200
|
|
|
|
|
|
|
|
#include <xmmintrin.h>
|
|
|
|
#include <emmintrin.h>
|
|
|
|
|
|
|
|
#ifndef _MM_DENORMALS_ARE_ZERO
|
|
|
|
#define _MM_DENORMALS_ARE_ZERO 0x0040
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define MXCSR (_MM_DENORMALS_ARE_ZERO | _MM_MASK_MASK | _MM_ROUND_NEAREST | _MM_FLUSH_ZERO_ON)
|
|
|
|
|
|
|
|
#if _MSC_VER < 1500
|
|
|
|
|
|
|
|
__forceinline __m128i _mm_castps_si128(__m128 a) {return *(__m128i*)&a;}
|
|
|
|
__forceinline __m128 _mm_castsi128_ps(__m128i a) {return *(__m128*)&a;}
|
|
|
|
__forceinline __m128i _mm_castpd_si128(__m128d a) {return *(__m128i*)&a;}
|
|
|
|
__forceinline __m128d _mm_castsi128_pd(__m128i a) {return *(__m128d*)&a;}
|
|
|
|
__forceinline __m128d _mm_castps_pd(__m128 a) {return *(__m128d*)&a;}
|
|
|
|
__forceinline __m128 _mm_castpd_ps(__m128d a) {return *(__m128*)&a;}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define _MM_TRANSPOSE4_SI128(row0, row1, row2, row3) \
|
|
|
|
{ \
|
|
|
|
__m128 tmp0 = _mm_shuffle_ps(_mm_castsi128_ps(row0), _mm_castsi128_ps(row1), 0x44); \
|
|
|
|
__m128 tmp2 = _mm_shuffle_ps(_mm_castsi128_ps(row0), _mm_castsi128_ps(row1), 0xEE); \
|
|
|
|
__m128 tmp1 = _mm_shuffle_ps(_mm_castsi128_ps(row2), _mm_castsi128_ps(row3), 0x44); \
|
|
|
|
__m128 tmp3 = _mm_shuffle_ps(_mm_castsi128_ps(row2), _mm_castsi128_ps(row3), 0xEE); \
|
|
|
|
(row0) = _mm_castps_si128(_mm_shuffle_ps(tmp0, tmp1, 0x88)); \
|
|
|
|
(row1) = _mm_castps_si128(_mm_shuffle_ps(tmp0, tmp1, 0xDD)); \
|
|
|
|
(row2) = _mm_castps_si128(_mm_shuffle_ps(tmp2, tmp3, 0x88)); \
|
|
|
|
(row3) = _mm_castps_si128(_mm_shuffle_ps(tmp2, tmp3, 0xDD)); \
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#error TODO: GSVector4 and GSRasterizer needs SSE2
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if _M_SSE >= 0x301
|
|
|
|
|
|
|
|
#include <tmmintrin.h>
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2009-05-14 16:41:52 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if _M_SSE >= 0x401
|
|
|
|
|
|
|
|
#include <smmintrin.h>
|
|
|
|
|
|
|
|
#endif
|
2009-07-04 15:14:04 +00:00
|
|
|
|
|
|
|
#undef min
|
|
|
|
#undef max
|