2011-03-14 03:32:28 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2007-2009 Gabest
|
|
|
|
* http://www.gabest.org
|
|
|
|
*
|
|
|
|
* This Program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
|
|
* any later version.
|
|
|
|
*
|
|
|
|
* This Program 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.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with GNU Make; see the file COPYING. If not, write to
|
2012-09-09 18:16:11 +00:00
|
|
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA USA.
|
2011-03-14 03:32:28 +00:00
|
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
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
|
|
|
|
|
2011-12-16 19:13:58 +00:00
|
|
|
#include "config.h"
|
|
|
|
|
2016-01-27 15:33:10 +00:00
|
|
|
#ifdef _WIN32
|
2009-05-18 11:08:04 +00:00
|
|
|
|
2013-07-01 21:28:58 +00:00
|
|
|
#include "targetver.h"
|
2009-02-09 21:15:56 +00:00
|
|
|
|
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>
|
2016-03-19 19:07:02 +00:00
|
|
|
#include <d3dcompiler.h>
|
2011-02-20 22:33:22 +00:00
|
|
|
#include <d3d11.h>
|
|
|
|
#include <d3d9.h>
|
2013-07-01 21:28:58 +00:00
|
|
|
#include <comutil.h>
|
2015-11-09 20:55:07 +00:00
|
|
|
#include <atlcomcli.h>
|
2011-02-20 22:33:22 +00:00
|
|
|
|
|
|
|
#define D3DCOLORWRITEENABLE_RGBA (D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA)
|
2009-05-18 11:08:04 +00:00
|
|
|
|
2016-10-25 18:29:38 +00:00
|
|
|
#else
|
|
|
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
2009-05-18 11:08:04 +00:00
|
|
|
#endif
|
2009-05-14 16:41:52 +00:00
|
|
|
|
2014-12-01 22:06:24 +00:00
|
|
|
|
|
|
|
#ifdef ENABLE_OPENCL
|
|
|
|
|
|
|
|
#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
|
|
|
|
#define __CL_ENABLE_EXCEPTIONS
|
|
|
|
#include <CL/cl.hpp>
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2011-12-27 09:15:35 +00:00
|
|
|
// put these into vc9/common7/ide/usertype.dat to have them highlighted
|
|
|
|
|
|
|
|
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;
|
2014-03-23 14:42:05 +00:00
|
|
|
#ifdef __x86_64__
|
|
|
|
typedef uint64 uptr;
|
|
|
|
#else
|
|
|
|
typedef uint32 uptr;
|
|
|
|
#endif
|
2011-12-27 09:15:35 +00:00
|
|
|
|
2015-11-13 08:30:48 +00:00
|
|
|
|
|
|
|
// xbyak compatibilities
|
|
|
|
typedef int64 sint64;
|
|
|
|
#define MIE_INTEGER_TYPE_DEFINED
|
2016-11-20 12:08:08 +00:00
|
|
|
#define XBYAK_ENABLE_OMITTED_OPERAND
|
2015-11-13 08:30:48 +00:00
|
|
|
|
2009-05-14 16:41:52 +00:00
|
|
|
// stdc
|
|
|
|
|
2016-05-25 22:02:16 +00:00
|
|
|
#include <cstddef>
|
|
|
|
#include <cstdio>
|
|
|
|
#include <cstdarg>
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <cmath>
|
|
|
|
#include <cfloat>
|
|
|
|
#include <ctime>
|
|
|
|
#include <climits>
|
|
|
|
#include <cstring>
|
|
|
|
#include <cassert>
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2013-09-05 20:01:47 +00:00
|
|
|
#include <complex>
|
2009-05-11 08:18:00 +00:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
#include <list>
|
|
|
|
#include <map>
|
2011-02-19 03:36:30 +00:00
|
|
|
#include <set>
|
2011-12-18 08:13:20 +00:00
|
|
|
#include <queue>
|
2009-07-04 17:37:06 +00:00
|
|
|
#include <algorithm>
|
2015-03-03 09:00:43 +00:00
|
|
|
#include <thread>
|
|
|
|
#include <atomic>
|
|
|
|
#include <mutex>
|
|
|
|
#include <condition_variable>
|
2009-05-11 08:18:00 +00:00
|
|
|
|
2011-02-19 03:36:30 +00:00
|
|
|
using namespace std;
|
2011-02-07 01:59:05 +00:00
|
|
|
|
2014-08-13 03:05:33 +00:00
|
|
|
#include <memory>
|
2011-12-19 01:20:55 +00:00
|
|
|
|
2016-02-24 21:52:17 +00:00
|
|
|
#include <zlib.h>
|
|
|
|
|
2016-01-27 15:33:10 +00:00
|
|
|
#if _MSC_VER >= 1800 || !defined(_WIN32)
|
2015-08-05 20:32:02 +00:00
|
|
|
#include <unordered_map>
|
|
|
|
#include <unordered_set>
|
|
|
|
#define hash_map unordered_map
|
|
|
|
#define hash_set unordered_set
|
|
|
|
#else
|
|
|
|
#include <hash_map>
|
|
|
|
#include <hash_set>
|
|
|
|
using namespace stdext;
|
|
|
|
#endif
|
|
|
|
|
2016-01-27 15:33:10 +00:00
|
|
|
#ifdef _WIN32
|
2011-02-18 01:56:05 +00:00
|
|
|
|
2013-08-03 08:29:01 +00:00
|
|
|
// Note use GL/glcorearb.h on the future
|
2013-01-04 23:02:48 +00:00
|
|
|
#include <GL/gl.h>
|
|
|
|
#include <GL/glext.h>
|
|
|
|
#include <GL/wglext.h>
|
2013-01-11 13:39:07 +00:00
|
|
|
#include "GLLoader.h"
|
2013-01-04 23:02:48 +00:00
|
|
|
|
2011-12-27 09:15:35 +00:00
|
|
|
// hashing algoritms at: http://www.cris.com/~Ttwang/tech/inthash.htm
|
|
|
|
// default hash_compare does ldiv and other crazy stuff to reduce speed
|
|
|
|
|
|
|
|
template<> class hash_compare<uint32>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum {bucket_size = 1};
|
|
|
|
|
|
|
|
size_t operator()(uint32 key) const
|
|
|
|
{
|
|
|
|
key += ~(key << 15);
|
|
|
|
key ^= (key >> 10);
|
|
|
|
key += (key << 3);
|
|
|
|
key ^= (key >> 6);
|
|
|
|
key += ~(key << 11);
|
|
|
|
key ^= (key >> 16);
|
|
|
|
|
|
|
|
return (size_t)key;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool operator()(uint32 a, uint32 b) const
|
|
|
|
{
|
|
|
|
return a < b;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<> class hash_compare<uint64>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum {bucket_size = 1};
|
|
|
|
|
|
|
|
size_t operator()(uint64 key) const
|
|
|
|
{
|
|
|
|
key += ~(key << 32);
|
|
|
|
key ^= (key >> 22);
|
|
|
|
key += ~(key << 13);
|
|
|
|
key ^= (key >> 8);
|
|
|
|
key += (key << 3);
|
|
|
|
key ^= (key >> 15);
|
|
|
|
key += ~(key << 27);
|
|
|
|
key ^= (key >> 31);
|
|
|
|
|
|
|
|
return (size_t)key;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool operator()(uint64 a, uint64 b) const
|
|
|
|
{
|
|
|
|
return a < b;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2011-12-16 19:13:58 +00:00
|
|
|
#define vsnprintf _vsnprintf
|
|
|
|
#define snprintf _snprintf
|
2011-02-19 03:36:30 +00:00
|
|
|
|
2011-12-16 19:13:58 +00:00
|
|
|
#define DIRECTORY_SEPARATOR '\\'
|
2011-02-18 01:56:05 +00:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
2013-08-03 08:29:01 +00:00
|
|
|
// Note use GL/glcorearb.h on the future
|
2011-12-27 17:04:28 +00:00
|
|
|
#include <GL/gl.h>
|
|
|
|
#include <GL/glext.h>
|
2013-01-16 18:25:53 +00:00
|
|
|
#include "GLLoader.h"
|
2012-04-28 15:24:02 +00:00
|
|
|
|
2016-01-14 19:02:52 +00:00
|
|
|
#include <sys/stat.h> // mkdir
|
|
|
|
|
2011-12-16 19:13:58 +00:00
|
|
|
#define DIRECTORY_SEPARATOR '/'
|
2011-02-19 03:36:30 +00:00
|
|
|
|
|
|
|
#endif
|
2010-01-01 05:18:32 +00:00
|
|
|
|
2011-02-18 01:56:05 +00:00
|
|
|
#ifdef _MSC_VER
|
2016-05-11 23:24:37 +00:00
|
|
|
#if _MSC_VER < 1900
|
|
|
|
#define alignas(n) __declspec(align(n))
|
|
|
|
#endif
|
2011-02-18 01:56:05 +00:00
|
|
|
|
2016-06-05 21:46:53 +00:00
|
|
|
#define EXPORT_C_(type) extern "C" type __stdcall
|
2011-02-19 03:36:30 +00:00
|
|
|
#define EXPORT_C EXPORT_C_(void)
|
2011-02-18 01:56:05 +00:00
|
|
|
|
2016-05-11 23:24:37 +00:00
|
|
|
#define ALIGN_STACK(n) alignas(n) int dummy__;
|
2016-01-14 19:02:52 +00:00
|
|
|
|
2011-02-18 01:56:05 +00:00
|
|
|
#else
|
|
|
|
|
2016-05-01 09:43:18 +00:00
|
|
|
#ifndef __fastcall
|
|
|
|
#define __fastcall __attribute__((fastcall))
|
|
|
|
#endif
|
2011-02-18 01:56:05 +00:00
|
|
|
|
2011-03-12 22:10:58 +00:00
|
|
|
#define EXPORT_C_(type) extern "C" __attribute__((stdcall,externally_visible,visibility("default"))) type
|
2011-02-19 03:36:30 +00:00
|
|
|
#define EXPORT_C EXPORT_C_(void)
|
2011-02-18 01:56:05 +00:00
|
|
|
|
2011-02-19 09:05:15 +00:00
|
|
|
#ifdef __GNUC__
|
2011-02-19 23:41:52 +00:00
|
|
|
#define __forceinline __inline__ __attribute__((always_inline,unused))
|
|
|
|
// #define __forceinline __inline__ __attribute__((__always_inline__,__gnu_inline__))
|
2014-08-15 04:43:52 +00:00
|
|
|
#define __assume(c) do { if (!(c)) __builtin_unreachable(); } while(0)
|
2011-02-19 09:05:15 +00:00
|
|
|
|
2016-01-14 19:02:52 +00:00
|
|
|
// GCC removes the variable as dead code and generates some warnings.
|
|
|
|
// Stack is automatically realigned due to SSE/AVX operations
|
|
|
|
#define ALIGN_STACK(n) (void)0;
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
// TODO Check clang behavior
|
2016-05-11 23:24:37 +00:00
|
|
|
#define ALIGN_STACK(n) alignas(n) int dummy__;
|
2016-01-14 19:02:52 +00:00
|
|
|
|
2011-02-19 09:05:15 +00:00
|
|
|
#endif
|
|
|
|
|
2016-01-14 19:02:52 +00:00
|
|
|
|
2010-01-01 05:18:32 +00:00
|
|
|
#endif
|
2009-05-11 08:18:00 +00:00
|
|
|
|
2009-05-14 16:41:52 +00:00
|
|
|
#define countof(a) (sizeof(a) / sizeof(a[0]))
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
#ifndef RESTRICT
|
2011-02-19 03:36:30 +00:00
|
|
|
|
|
|
|
#ifdef __INTEL_COMPILER
|
|
|
|
|
|
|
|
#define RESTRICT restrict
|
|
|
|
|
2014-08-13 03:05:33 +00:00
|
|
|
#elif defined(_MSC_VER)
|
2011-02-19 03:36:30 +00:00
|
|
|
|
|
|
|
#define RESTRICT __restrict
|
|
|
|
|
2014-08-13 03:05:33 +00:00
|
|
|
#elif defined(__GNUC__)
|
2013-06-16 08:43:50 +00:00
|
|
|
|
|
|
|
#define RESTRICT __restrict__
|
|
|
|
|
2011-02-19 03:36:30 +00:00
|
|
|
#else
|
|
|
|
|
|
|
|
#define RESTRICT
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2009-05-18 11:08:04 +00:00
|
|
|
#endif
|
2009-06-03 12:09:04 +00:00
|
|
|
|
2016-05-25 22:02:16 +00:00
|
|
|
#define ASSERT assert
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2009-05-15 11:11:26 +00:00
|
|
|
#ifdef __x86_64__
|
2009-06-03 12:09:04 +00:00
|
|
|
#define _M_AMD64
|
2016-11-19 14:01:14 +00:00
|
|
|
#endif
|
2011-02-19 03:36:30 +00:00
|
|
|
|
2016-11-19 14:01:14 +00:00
|
|
|
#ifdef _M_AMD64
|
2016-11-15 18:27:44 +00:00
|
|
|
// Yeah let use mips naming ;)
|
|
|
|
#ifdef _WIN64
|
|
|
|
#define a0 rcx
|
|
|
|
#define a1 rdx
|
|
|
|
#define a2 r8
|
|
|
|
#define a3 r9
|
|
|
|
#define t0 rdi
|
|
|
|
#define t1 rsi
|
|
|
|
#else
|
|
|
|
#define a0 rdi
|
|
|
|
#define a1 rsi
|
|
|
|
#define a2 rdx
|
|
|
|
#define a3 rcx
|
|
|
|
#define t0 r8
|
|
|
|
#define t1 r9
|
|
|
|
#endif
|
2009-05-15 11:11:26 +00:00
|
|
|
#endif
|
|
|
|
|
2009-05-14 16:41:52 +00:00
|
|
|
// sse
|
2016-11-19 14:01:14 +00:00
|
|
|
#if defined(__GNUC__)
|
2016-11-15 18:27:44 +00:00
|
|
|
|
2014-10-26 13:40:14 +00:00
|
|
|
// Convert gcc see define into GSdx (windows) define
|
|
|
|
#if defined(__AVX2__)
|
2016-11-19 14:01:14 +00:00
|
|
|
#if defined(__x86_64__)
|
|
|
|
#define _M_SSE 0x500 // TODO
|
|
|
|
#else
|
|
|
|
#define _M_SSE 0x501
|
|
|
|
#endif
|
2014-10-26 13:40:14 +00:00
|
|
|
#elif defined(__AVX__)
|
|
|
|
#define _M_SSE 0x500
|
2015-02-12 17:49:31 +00:00
|
|
|
#elif defined(__SSE4_1__)
|
|
|
|
#define _M_SSE 0x401
|
|
|
|
#elif defined(__SSSE3__)
|
|
|
|
#define _M_SSE 0x301
|
|
|
|
#elif defined(__SSE2__)
|
|
|
|
#define _M_SSE 0x200
|
2016-11-15 18:27:44 +00:00
|
|
|
#endif
|
|
|
|
|
2014-10-26 13:40:14 +00:00
|
|
|
#endif
|
2009-05-14 16:41:52 +00:00
|
|
|
|
2016-01-27 15:33:10 +00:00
|
|
|
#if !defined(_M_SSE) && (!defined(_WIN32) || 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)
|
|
|
|
|
|
|
|
#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
|
|
|
|
2011-01-28 08:21:05 +00:00
|
|
|
#if _M_SSE >= 0x500
|
|
|
|
|
|
|
|
#include <immintrin.h>
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2009-07-04 15:14:04 +00:00
|
|
|
#undef min
|
2010-04-25 00:31:27 +00:00
|
|
|
#undef max
|
2011-02-19 03:36:30 +00:00
|
|
|
#undef abs
|
|
|
|
|
|
|
|
#if !defined(_MSC_VER)
|
2014-07-12 17:57:26 +00:00
|
|
|
#if defined(__USE_ISOC11) && !defined(ASAN_WORKAROUND) // not supported yet on gcc 4.9
|
2014-06-13 18:56:21 +00:00
|
|
|
|
|
|
|
#define _aligned_malloc(size, a) aligned_alloc(a, size)
|
|
|
|
|
2015-06-05 18:31:14 +00:00
|
|
|
#else
|
2011-02-18 01:56:05 +00:00
|
|
|
|
2011-12-16 19:13:58 +00:00
|
|
|
extern void* _aligned_malloc(size_t size, size_t alignment);
|
2011-02-18 01:56:05 +00:00
|
|
|
|
2011-12-16 19:13:58 +00:00
|
|
|
#endif
|
2011-02-19 03:36:30 +00:00
|
|
|
|
2014-08-17 11:03:43 +00:00
|
|
|
static inline void _aligned_free(void* p) {
|
|
|
|
free(p);
|
|
|
|
}
|
2011-02-19 03:36:30 +00:00
|
|
|
|
2011-12-16 19:13:58 +00:00
|
|
|
// http://svn.reactos.org/svn/reactos/trunk/reactos/include/crt/mingw32/intrin_x86.h?view=markup
|
2011-02-19 09:05:15 +00:00
|
|
|
|
2011-12-16 19:13:58 +00:00
|
|
|
__forceinline unsigned char _BitScanForward(unsigned long* const Index, const unsigned long Mask)
|
|
|
|
{
|
2014-07-15 23:13:32 +00:00
|
|
|
__asm__("bsfl %k[Mask], %k[Index]" : [Index] "=r" (*Index) : [Mask] "mr" (Mask));
|
2012-01-05 02:40:24 +00:00
|
|
|
|
2011-12-16 19:13:58 +00:00
|
|
|
return Mask ? 1 : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef __GNUC__
|
|
|
|
|
2013-04-14 10:48:50 +00:00
|
|
|
// gcc 4.8 define __rdtsc but unfortunately the compiler crash...
|
|
|
|
// The redefine allow to skip the gcc __rdtsc version -- Gregory
|
|
|
|
#define __rdtsc _lnx_rdtsc
|
|
|
|
//__forceinline unsigned long long __rdtsc()
|
|
|
|
__forceinline unsigned long long _lnx_rdtsc()
|
2011-12-16 19:13:58 +00:00
|
|
|
{
|
|
|
|
#if defined(__amd64__) || defined(__x86_64__)
|
|
|
|
unsigned long long low, high;
|
|
|
|
__asm__ __volatile__("rdtsc" : "=a"(low), "=d"(high));
|
|
|
|
return low | (high << 32);
|
|
|
|
#else
|
|
|
|
unsigned long long retval;
|
|
|
|
__asm__ __volatile__("rdtsc" : "=A"(retval));
|
|
|
|
return retval;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
2011-02-19 09:05:15 +00:00
|
|
|
|
2011-02-19 03:36:30 +00:00
|
|
|
#endif
|
|
|
|
|
2016-04-23 17:15:33 +00:00
|
|
|
extern string format(const char* fmt, ...);
|
|
|
|
|
|
|
|
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;}};
|
|
|
|
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);}};
|
|
|
|
|
2011-02-19 03:36:30 +00:00
|
|
|
extern void* vmalloc(size_t size, bool code);
|
2011-02-19 10:27:10 +00:00
|
|
|
extern void vmfree(void* ptr, size_t size);
|
2011-02-20 22:33:22 +00:00
|
|
|
|
2016-10-25 18:29:38 +00:00
|
|
|
extern void* fifo_alloc(size_t size, size_t repeat);
|
|
|
|
extern void fifo_free(void* ptr, size_t size, size_t repeat);
|
|
|
|
|
2016-11-18 21:40:52 +00:00
|
|
|
#ifdef ENABLE_VTUNE
|
2011-12-16 19:13:58 +00:00
|
|
|
|
2016-11-18 21:40:52 +00:00
|
|
|
#include "jitprofiling.h"
|
2011-12-16 19:13:58 +00:00
|
|
|
|
2016-11-18 21:40:52 +00:00
|
|
|
#ifdef _WIN32
|
2011-12-16 19:13:58 +00:00
|
|
|
|
|
|
|
#pragma comment(lib, "jitprofiling.lib")
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|
2015-02-21 12:51:06 +00:00
|
|
|
|
2016-05-16 14:59:00 +00:00
|
|
|
// Note: GL messages are present in common code, so in all renderers.
|
|
|
|
|
2015-05-30 07:54:20 +00:00
|
|
|
#define GL_INSERT(type, code, sev, ...) \
|
2016-05-16 14:59:00 +00:00
|
|
|
do if (glDebugMessageInsert) glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, type, code, sev, -1, format(__VA_ARGS__).c_str()); while(0);
|
2015-05-30 07:54:20 +00:00
|
|
|
|
2015-05-30 07:56:12 +00:00
|
|
|
#if defined(_DEBUG)
|
2015-05-30 07:54:20 +00:00
|
|
|
#define GL_CACHE(...) GL_INSERT(GL_DEBUG_TYPE_OTHER, 0xFEAD, GL_DEBUG_SEVERITY_NOTIFICATION, __VA_ARGS__)
|
2015-05-13 06:49:32 +00:00
|
|
|
#else
|
2015-05-16 17:28:22 +00:00
|
|
|
#define GL_CACHE(...) (0);
|
2015-05-13 06:49:32 +00:00
|
|
|
#endif
|
|
|
|
|
2016-10-04 17:01:27 +00:00
|
|
|
#if defined(ENABLE_TRACE_REG) && defined(_DEBUG)
|
|
|
|
#define GL_REG(...) GL_INSERT(GL_DEBUG_TYPE_OTHER, 0xB0B0, GL_DEBUG_SEVERITY_NOTIFICATION, __VA_ARGS__)
|
|
|
|
#else
|
|
|
|
#define GL_REG(...) (0);
|
|
|
|
#endif
|
|
|
|
|
2016-10-14 18:24:52 +00:00
|
|
|
#if defined(ENABLE_EXTRA_LOG) && defined(_DEBUG)
|
|
|
|
#define GL_DBG(...) GL_INSERT(GL_DEBUG_TYPE_OTHER, 0xD0D0, GL_DEBUG_SEVERITY_NOTIFICATION, __VA_ARGS__)
|
|
|
|
#else
|
|
|
|
#define GL_DBG(...) (0);
|
|
|
|
#endif
|
|
|
|
|
2015-05-30 07:56:12 +00:00
|
|
|
#if defined(ENABLE_OGL_DEBUG)
|
2016-05-05 15:42:22 +00:00
|
|
|
struct GLAutoPop {
|
|
|
|
~GLAutoPop() {
|
2016-06-10 23:12:47 +00:00
|
|
|
if (glPopDebugGroup)
|
|
|
|
glPopDebugGroup();
|
2016-05-05 15:42:22 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2016-05-16 14:59:00 +00:00
|
|
|
#define GL_PUSH_(...) do if (glPushDebugGroup) glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0xBAD, -1, format(__VA_ARGS__).c_str()); while(0);
|
|
|
|
#define GL_PUSH(...) do if (glPushDebugGroup) glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0xBAD, -1, format(__VA_ARGS__).c_str()); while(0); GLAutoPop gl_auto_pop;
|
|
|
|
#define GL_POP() do if (glPopDebugGroup) glPopDebugGroup(); while(0);
|
2015-05-30 07:54:20 +00:00
|
|
|
#define GL_INS(...) GL_INSERT(GL_DEBUG_TYPE_ERROR, 0xDEAD, GL_DEBUG_SEVERITY_MEDIUM, __VA_ARGS__)
|
2015-07-10 19:30:42 +00:00
|
|
|
#define GL_PERF(...) GL_INSERT(GL_DEBUG_TYPE_PERFORMANCE, 0xFEE1, GL_DEBUG_SEVERITY_NOTIFICATION, __VA_ARGS__)
|
2015-05-06 16:52:51 +00:00
|
|
|
#else
|
2016-05-05 15:42:22 +00:00
|
|
|
#define GL_PUSH_(...) (0);
|
2015-05-16 17:28:22 +00:00
|
|
|
#define GL_PUSH(...) (0);
|
|
|
|
#define GL_POP() (0);
|
|
|
|
#define GL_INS(...) (0);
|
2015-05-17 10:19:38 +00:00
|
|
|
#define GL_PERF(...) (0);
|
2015-05-06 16:52:51 +00:00
|
|
|
#endif
|
|
|
|
|
2015-02-21 12:51:06 +00:00
|
|
|
// Helper path to dump texture
|
2016-01-27 15:33:10 +00:00
|
|
|
#ifdef _WIN32
|
2015-02-21 12:51:06 +00:00
|
|
|
const std::string root_sw("c:\\temp1\\_");
|
|
|
|
const std::string root_hw("c:\\temp2\\_");
|
|
|
|
#else
|
2016-11-16 19:24:42 +00:00
|
|
|
#ifdef _M_AMD64
|
|
|
|
const std::string root_sw("/tmp/GS_SW_dump64/");
|
|
|
|
const std::string root_hw("/tmp/GS_HW_dump64/");
|
|
|
|
#else
|
|
|
|
const std::string root_sw("/tmp/GS_SW_dump32/");
|
|
|
|
const std::string root_hw("/tmp/GS_HW_dump32/");
|
|
|
|
#endif
|
2015-02-21 12:51:06 +00:00
|
|
|
#endif
|