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
|
|
|
|
2016-09-18 20:40:51 +00:00
|
|
|
#if __GNUC__ > 5 || ( __GNUC__ == 5 && __GNUC_MINOR__ >= 4 )
|
|
|
|
#include <codecvt>
|
|
|
|
#include <locale>
|
|
|
|
#endif
|
|
|
|
|
2013-09-05 20:01:47 +00:00
|
|
|
#include <complex>
|
2009-05-11 08:18:00 +00:00
|
|
|
#include <string>
|
2017-01-12 20:04:00 +00:00
|
|
|
#include <array>
|
2009-05-11 08:18:00 +00:00
|
|
|
#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>
|
gsdx: Make GSJobQueue non-inheritable
In the previous code, the threads were created and destroyed in the base
class constructor and destructor, so the threads could potentially be
active while the object is in a partially constructed or destroyed state.
The thread however, relies on a virtual function to process the queue
items, and the vtable might not be in the desired state when the object
is partially constructed or destroyed.
This probably only matters during object destruction - no items are in
the queue during object construction so the virtual function won't be
called, but items may still be queued up when the destructor is called,
so the virtual function can be called. It wasn't an issue because all
uses of the thread explicitly waited for the queues to be empty before
invoking the destructor.
Adjust the constructor to take a std::function parameter, which the
thread will use instead to process queue items, and avoid inheriting
from the GSJobQueue class. This will also eliminate the need to
explicitly wait for all jobs to finish (unless there are other external
factors, of course), which would probably make future code safer.
2016-11-09 01:34:48 +00:00
|
|
|
#include <functional>
|
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>
|
|
|
|
|
2015-08-05 20:32:02 +00:00
|
|
|
#include <unordered_map>
|
|
|
|
#include <unordered_set>
|
|
|
|
#define hash_map unordered_map
|
|
|
|
#define hash_set unordered_set
|
|
|
|
|
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-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-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
|
|
|
|
2017-01-11 20:25:09 +00:00
|
|
|
__forceinline int _BitScanForward(unsigned long* const Index, const unsigned long Mask)
|
2011-12-16 19:13:58 +00:00
|
|
|
{
|
2017-01-11 20:25:09 +00:00
|
|
|
#if defined(__GCC_ASM_FLAG_OUTPUTS__) && 0
|
|
|
|
// Need GCC6 to test the code validity
|
|
|
|
int flag;
|
|
|
|
__asm__("bsfl %k[Mask], %k[Index]" : [Index] "=r" (*Index), "=@ccz" (flag) : [Mask] "mr" (Mask));
|
|
|
|
return flag;
|
|
|
|
#else
|
|
|
|
__asm__("bsfl %k[Mask], %k[Index]" : [Index] "=r" (*Index) : [Mask] "mr" (Mask) : "cc");
|
2011-12-16 19:13:58 +00:00
|
|
|
return Mask ? 1 : 0;
|
2017-01-11 20:25:09 +00:00
|
|
|
#endif
|
2011-12-16 19:13:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#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, ...);
|
|
|
|
|
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
|
2017-01-22 17:44:07 +00:00
|
|
|
#define GL_CACHE(...) (void)(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
|
2017-01-22 17:44:07 +00:00
|
|
|
#define GL_REG(...) (void)(0);
|
2016-10-04 17:01:27 +00:00
|
|
|
#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
|
2017-01-22 17:44:07 +00:00
|
|
|
#define GL_DBG(...) (void)(0);
|
2016-10-14 18:24:52 +00:00
|
|
|
#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
|
2017-01-22 17:44:07 +00:00
|
|
|
#define GL_PUSH_(...) (void)(0);
|
|
|
|
#define GL_PUSH(...) (void)(0);
|
|
|
|
#define GL_POP() (void)(0);
|
|
|
|
#define GL_INS(...) (void)(0);
|
|
|
|
#define GL_PERF(...) (void)(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
|