Added support for GL binary shader caching. Added support for gDEBugger.

This commit is contained in:
bkaradzic 2012-05-31 19:29:58 -07:00
parent b0eea140b3
commit a48b3a9ee3
9 changed files with 275 additions and 97 deletions

67
3rdparty/glext/gl/GRemedyGLExtensions.h vendored Normal file
View file

@ -0,0 +1,67 @@
// ------------------------------ GRemdeyGLExtensions.h ------------------------------
// -----------------------------------------------------------------
// © 2004 - 2012 Advanced Micro Devices, Inc. All rights reserved.
// -----------------------------------------------------------------
#ifndef __GREMDEYGLEXTENSIONS
#define __GREMDEYGLEXTENSIONS
#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif
#ifndef APIENTRY
#define APIENTRY
#endif
#ifndef APIENTRYP
#define APIENTRYP APIENTRY *
#endif
#ifndef GLAPI
#define GLAPI extern
#endif
#ifdef __cplusplus
extern "C"
{
#endif
/* ----------------------- GL_GREMEDY_string_marker ----------------------- */
#ifndef GL_GREMEDY_string_marker
#define GL_GREMEDY_string_marker 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glStringMarkerGREMEDY(GLsizei len, const GLvoid *string);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC)(GLsizei len, const GLvoid *string);
#endif /* GL_GREMEDY_string_marker */
/* ----------------------- GL_GREMEDY_frame_terminator ----------------------- */
#ifndef GL_GREMEDY_frame_terminator
#define GL_GREMEDY_frame_terminator 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glFrameTerminatorGREMEDY(void);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC)(void);
#endif /* GL_GREMEDY_frame_terminator */
#ifdef __cplusplus
}
#endif
#endif /* __GREMDEYGLEXTENSIONS */

View file

@ -254,6 +254,7 @@ namespace bgfx
typedef void (*fatalFn)(Fatal::Enum _code, const char* _str); typedef void (*fatalFn)(Fatal::Enum _code, const char* _str);
typedef void* (*reallocFn)(void* _ptr, size_t _size); typedef void* (*reallocFn)(void* _ptr, size_t _size);
typedef void (*freeFn)(void* _ptr); typedef void (*freeFn)(void* _ptr);
typedef void (*cacheFn)(uint64_t _id, bool _store, void* _data, uint32_t& _length);
struct VertexDecl struct VertexDecl
{ {
@ -272,7 +273,7 @@ namespace bgfx
RendererType::Enum getRendererType(); RendererType::Enum getRendererType();
/// ///
void init(bool _createRenderThread = true, fatalFn _fatal = NULL, reallocFn _realloc = NULL, freeFn _free = NULL); void init(bool _createRenderThread = true, fatalFn _fatal = NULL, reallocFn _realloc = NULL, freeFn _free = NULL, cacheFn _cache = NULL);
/// ///
void shutdown(); void shutdown();

View file

@ -5,25 +5,6 @@
#include "bgfx_p.h" #include "bgfx_p.h"
BX_NO_INLINE void bgfxFatalStub(bgfx::Fatal::Enum _code, const char* _str)
{
BX_TRACE("0x%08x: %s", _code, _str);
}
BX_NO_INLINE void* bgfxReallocStub(void* _ptr, size_t _size)
{
void* ptr = ::realloc(_ptr, _size);
BX_CHECK(NULL != ptr, "Out of memory!");
// BX_TRACE("alloc %d, %p", _size, ptr);
return ptr;
}
BX_NO_INLINE void bgfxFreeStub(void* _ptr)
{
// BX_TRACE("free %p", _ptr);
::free(_ptr);
}
#if BX_PLATFORM_WINDOWS #if BX_PLATFORM_WINDOWS
HWND g_bgfxHwnd = NULL; HWND g_bgfxHwnd = NULL;
#endif // BX_PLATFORM_WINDOWS #endif // BX_PLATFORM_WINDOWS
@ -40,9 +21,34 @@ namespace bgfx
# define BGFX_RENDER_THREAD() # define BGFX_RENDER_THREAD()
#endif // BGFX_CONFIG_MULTITHREADED #endif // BGFX_CONFIG_MULTITHREADED
fatalFn g_fatal = bgfxFatalStub; void fatalStub(bgfx::Fatal::Enum _code, const char* _str)
reallocFn g_realloc = bgfxReallocStub; {
freeFn g_free = bgfxFreeStub; BX_TRACE("0x%08x: %s", _code, _str);
}
void* reallocStub(void* _ptr, size_t _size)
{
void* ptr = ::realloc(_ptr, _size);
BX_CHECK(NULL != ptr, "Out of memory!");
// BX_TRACE("alloc %d, %p", _size, ptr);
return ptr;
}
void freeStub(void* _ptr)
{
// BX_TRACE("free %p", _ptr);
::free(_ptr);
}
void cacheStub(uint64_t _id, bool _store, void* _data, uint32_t& _length)
{
_length = 0;
}
fatalFn g_fatal = fatalStub;
reallocFn g_realloc = reallocStub;
freeFn g_free = freeStub;
cacheFn g_cache = cacheStub;
static BX_THREAD uint32_t s_threadIndex = 0; static BX_THREAD uint32_t s_threadIndex = 0;
static Context s_ctx; static Context s_ctx;
@ -481,7 +487,7 @@ namespace bgfx
#endif // BGFX_CONFIG_RENDERER_ #endif // BGFX_CONFIG_RENDERER_
} }
void init(bool _createRenderThread, fatalFn _fatal, reallocFn _realloc, freeFn _free) void init(bool _createRenderThread, fatalFn _fatal, reallocFn _realloc, freeFn _free, cacheFn _cache)
{ {
if (NULL != _fatal) if (NULL != _fatal)
{ {
@ -495,6 +501,11 @@ namespace bgfx
g_free = _free; g_free = _free;
} }
if (NULL != _cache)
{
g_cache = _cache;
}
s_threadIndex = BGFX_MAIN_THREAD_MAGIC; s_threadIndex = BGFX_MAIN_THREAD_MAGIC;
s_ctx.init(_createRenderThread); s_ctx.init(_createRenderThread);
} }

View file

@ -112,6 +112,8 @@ namespace bgfx
extern fatalFn g_fatal; extern fatalFn g_fatal;
extern reallocFn g_realloc; extern reallocFn g_realloc;
extern freeFn g_free; extern freeFn g_free;
extern cacheFn g_cache;
extern void fatal(bgfx::Fatal::Enum _code, const char* _format, ...); extern void fatal(bgfx::Fatal::Enum _code, const char* _format, ...);
extern void release(Memory* _mem); extern void release(Memory* _mem);
extern void saveTga(const char* _filePath, uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _data); extern void saveTga(const char* _filePath, uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _data);
@ -348,6 +350,11 @@ namespace bgfx
m_pos = strideAlign(m_pos, _align); m_pos = strideAlign(m_pos, _align);
} }
uint32_t remaining() const
{
return m_size-m_pos;
}
private: private:
const uint8_t* m_data; const uint8_t* m_data;
uint32_t m_size; uint32_t m_size;

View file

@ -32,6 +32,10 @@
# define BGFX_CONFIG_DEBUG_PIX 0 # define BGFX_CONFIG_DEBUG_PIX 0
#endif // BGFX_CONFIG_DEBUG_PIX #endif // BGFX_CONFIG_DEBUG_PIX
#ifndef BGFX_CONFIG_DEBUG_GREMEDY
# define BGFX_CONFIG_DEBUG_GREMEDY 0
#endif // BGFX_CONFIG_DEBUG_GREMEDY
#ifndef BGFX_CONFIG_MULTITHREADED #ifndef BGFX_CONFIG_MULTITHREADED
# define BGFX_CONFIG_MULTITHREADED ( (BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360|BX_PLATFORM_NACL)&(!BGFX_CONFIG_RENDERER_NULL) ) # define BGFX_CONFIG_MULTITHREADED ( (BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360|BX_PLATFORM_NACL)&(!BGFX_CONFIG_RENDERER_NULL) )
#endif // BGFX_CONFIG_MULTITHREADED #endif // BGFX_CONFIG_MULTITHREADED

View file

@ -61,3 +61,8 @@ GL_IMPORT(false, PFNGLUNIFORMMATRIX4FVPROC, glUniformMatrix4fv);
GL_IMPORT(true, PFNGLGETPROGRAMBINARYPROC, glGetProgramBinary); GL_IMPORT(true, PFNGLGETPROGRAMBINARYPROC, glGetProgramBinary);
GL_IMPORT(true, PFNGLPROGRAMBINARYPROC, glProgramBinary); GL_IMPORT(true, PFNGLPROGRAMBINARYPROC, glProgramBinary);
GL_IMPORT(true, PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri); GL_IMPORT(true, PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri);
#if BGFX_CONFIG_DEBUG_GREMEDY
GL_IMPORT(true, PFNGLSTRINGMARKERGREMEDYPROC, glStringMarkerGREMEDY);
GL_IMPORT(true, PFNGLFRAMETERMINATORGREMEDYPROC, glFrameTerminatorGREMEDY);
#endif // BGFX_CONFIG_DEBUG_GREMEDY

View file

@ -135,7 +135,7 @@ namespace bgfx
m_params.BackBufferHeight = rect.bottom-rect.top; m_params.BackBufferHeight = rect.bottom-rect.top;
m_d3d9dll = LoadLibrary("d3d9.dll"); m_d3d9dll = LoadLibrary("d3d9.dll");
BX_CHECK(m_d3d9dll, "Module d3d9.dll not found."); BGFX_FATAL(NULL != m_d3d9dll, bgfx::Fatal::D3D9_UnableToCreateInterface, "Failed to load d3d9.dll.");
m_D3DPERF_SetMarker = (D3DPERF_SetMarkerFunc)GetProcAddress(m_d3d9dll, "D3DPERF_SetMarker"); m_D3DPERF_SetMarker = (D3DPERF_SetMarkerFunc)GetProcAddress(m_d3d9dll, "D3DPERF_SetMarker");
m_D3DPERF_BeginEvent = (D3DPERF_BeginEventFunc)GetProcAddress(m_d3d9dll, "D3DPERF_BeginEvent"); m_D3DPERF_BeginEvent = (D3DPERF_BeginEventFunc)GetProcAddress(m_d3d9dll, "D3DPERF_BeginEvent");
@ -143,11 +143,11 @@ namespace bgfx
#if BGFX_CONFIG_RENDERER_DIRECT3D_EX #if BGFX_CONFIG_RENDERER_DIRECT3D_EX
Direct3DCreate9ExFunc direct3DCreate9Ex = (Direct3DCreate9ExFunc)GetProcAddress(m_d3d9dll, "Direct3DCreate9Ex"); Direct3DCreate9ExFunc direct3DCreate9Ex = (Direct3DCreate9ExFunc)GetProcAddress(m_d3d9dll, "Direct3DCreate9Ex");
BX_CHECK(direct3DCreate9Ex, "Function Direct3DCreate9Ex not found."); BGFX_FATAL(NULL != direct3DCreate9Ex, bgfx::Fatal::D3D9_UnableToCreateInterface, "Function Direct3DCreate9Ex not found.");
DX_CHECK(direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d9) ); direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d9);
#else #else
Direct3DCreate9Func direct3DCreate9 = (Direct3DCreate9Func)GetProcAddress(m_d3d9dll, "Direct3DCreate9"); Direct3DCreate9Func direct3DCreate9 = (Direct3DCreate9Func)GetProcAddress(m_d3d9dll, "Direct3DCreate9");
BX_CHECK(direct3DCreate9, "Function Direct3DCreate9 not found."); BGFX_FATAL(NULL != direct3DCreate9, bgfx::Fatal::D3D9_UnableToCreateInterface, "Function Direct3DCreate9 not found.");
m_d3d9 = direct3DCreate9(D3D_SDK_VERSION); m_d3d9 = direct3DCreate9(D3D_SDK_VERSION);
#endif // defined(D3D_DISABLE_9EX) #endif // defined(D3D_DISABLE_9EX)

View file

@ -41,6 +41,7 @@ namespace bgfx
: m_dxtSupport(false) : m_dxtSupport(false)
, m_flip(false) , m_flip(false)
, m_postSwapBuffers(NULL) , m_postSwapBuffers(NULL)
, m_hash( (BX_PLATFORM_WINDOWS<<1) | BX_ARCH_64BIT)
#if BX_PLATFORM_NACL #if BX_PLATFORM_NACL
, m_context(0) , m_context(0)
, m_instance(0) , m_instance(0)
@ -109,37 +110,39 @@ namespace bgfx
#elif BX_PLATFORM_WINDOWS #elif BX_PLATFORM_WINDOWS
if (NULL == m_hdc) if (NULL == m_hdc)
{ {
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
24, 0, 0,
PFD_MAIN_PLANE,
0, 0, 0, 0
};
m_hdc = GetDC(g_bgfxHwnd); m_hdc = GetDC(g_bgfxHwnd);
BGFX_FATAL(NULL != m_hdc, bgfx::Fatal::OPENGL_UnableToCreateContext, "GetDC failed!");
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(pfd) );
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cAlphaBits = 8;
pfd.cDepthBits = 24;
pfd.cStencilBits = 8;
pfd.iLayerType = PFD_MAIN_PLANE;
int pixelFormat = ChoosePixelFormat(m_hdc, &pfd); int pixelFormat = ChoosePixelFormat(m_hdc, &pfd);
BX_CHECK(0 != pixelFormat, "ChoosePixelFormat failed!"); BGFX_FATAL(0 != pixelFormat, bgfx::Fatal::OPENGL_UnableToCreateContext, "ChoosePixelFormat failed!");
DescribePixelFormat(m_hdc, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
int result; int result;
result = SetPixelFormat(m_hdc, pixelFormat, &pfd); result = SetPixelFormat(m_hdc, pixelFormat, &pfd);
BX_CHECK(0 != result, "SetPixelFormat failed!"); BGFX_FATAL(0 != result, bgfx::Fatal::OPENGL_UnableToCreateContext, "SetPixelFormat failed!");
m_context = wglCreateContext(m_hdc); m_context = wglCreateContext(m_hdc);
BX_CHECK(NULL != m_context, "wglCreateContext failed!"); BGFX_FATAL(NULL != m_context, bgfx::Fatal::OPENGL_UnableToCreateContext, "wglCreateContext failed!");
result = wglMakeCurrent(m_hdc, m_context); result = wglMakeCurrent(m_hdc, m_context);
BX_CHECK(0 != result, "wglMakeCurrent failed!"); BGFX_FATAL(0 != result, bgfx::Fatal::OPENGL_UnableToCreateContext, "wglMakeCurrent failed!");
# define GL_IMPORT(_optional, _proto, _func) \ # define GL_IMPORT(_optional, _proto, _func) \
{ \ { \
_func = (_proto)wglGetProcAddress(#_func); \ _func = (_proto)wglGetProcAddress(#_func); \
BGFX_FATAL(!_optional && NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. wglGetProcAddress %s", #_func); \ BGFX_FATAL(_optional || NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. wglGetProcAddress(\"%s\")", #_func); \
} }
# include "glimports.h" # include "glimports.h"
# undef GL_IMPORT # undef GL_IMPORT
@ -257,7 +260,7 @@ namespace bgfx
# define GL_IMPORT(_optional, _proto, _func) \ # define GL_IMPORT(_optional, _proto, _func) \
{ \ { \
_func = (_proto)glXGetProcAddress((const GLubyte*)#_func); \ _func = (_proto)glXGetProcAddress((const GLubyte*)#_func); \
BGFX_FATAL(!_optional && NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. glXGetProcAddress %s", #_func); \ BGFX_FATAL(_optional || NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. glXGetProcAddress %s", #_func); \
} }
# include "glimports.h" # include "glimports.h"
# undef GL_IMPORT # undef GL_IMPORT
@ -333,6 +336,7 @@ namespace bgfx
bool m_flip; bool m_flip;
PostSwapBuffersFn m_postSwapBuffers; PostSwapBuffersFn m_postSwapBuffers;
uint64_t m_hash;
#if BX_PLATFORM_NACL #if BX_PLATFORM_NACL
PP_Resource m_context; PP_Resource m_context;
@ -385,11 +389,13 @@ namespace bgfx
enum Enum enum Enum
{ {
EXT_texture_format_BGRA8888, EXT_texture_format_BGRA8888,
EXT_texture_compression_s3tc,
EXT_texture_compression_dxt1, EXT_texture_compression_dxt1,
CHROMIUM_texture_compression_dxt3, CHROMIUM_texture_compression_dxt3,
CHROMIUM_texture_compression_dxt5, CHROMIUM_texture_compression_dxt5,
OES_standard_derivatives, OES_standard_derivatives,
ARB_get_program_binary, ARB_get_program_binary,
OES_get_program_binary,
Count Count
}; };
@ -404,11 +410,13 @@ namespace bgfx
// Nvidia BGRA on Linux bug: // Nvidia BGRA on Linux bug:
// https://groups.google.com/a/chromium.org/forum/?fromgroups#!topic/chromium-reviews/yFfbUdyeUCQ // https://groups.google.com/a/chromium.org/forum/?fromgroups#!topic/chromium-reviews/yFfbUdyeUCQ
{ "GL_EXT_texture_format_BGRA8888", false, !BX_PLATFORM_LINUX }, { "GL_EXT_texture_format_BGRA8888", false, !BX_PLATFORM_LINUX },
{ "GL_EXT_texture_compression_s3tc", false, true },
{ "GL_EXT_texture_compression_dxt1", false, true }, { "GL_EXT_texture_compression_dxt1", false, true },
{ "GL_CHROMIUM_texture_compression_dxt3", false, true }, { "GL_CHROMIUM_texture_compression_dxt3", false, true },
{ "GL_CHROMIUM_texture_compression_dxt5", false, true }, { "GL_CHROMIUM_texture_compression_dxt5", false, true },
{ "GL_OES_standard_derivatives", false, true }, { "GL_OES_standard_derivatives", false, true },
{ "GL_ARB_get_program_binary", false, false }, { "GL_ARB_get_program_binary", false, true },
{ "GL_OES_get_program_binary", false, false },
}; };
static const GLenum s_primType[] = static const GLenum s_primType[] =
@ -605,13 +613,41 @@ namespace bgfx
m_id = glCreateProgram(); m_id = glCreateProgram();
BX_TRACE("material create: %d: %d, %d", m_id, _vsh.m_id, _fsh.m_id); BX_TRACE("material create: %d: %d, %d", m_id, _vsh.m_id, _fsh.m_id);
bool cached = false;
#if BGFX_CONFIG_RENDERER_OPENGL #if BGFX_CONFIG_RENDERER_OPENGL
uint64_t id = (uint64_t(_vsh.m_hash)<<32) | _fsh.m_hash;
id ^= s_renderCtx.m_hash;
if (s_extension[Extension::ARB_get_program_binary].m_supported) if (s_extension[Extension::ARB_get_program_binary].m_supported)
{
uint32_t length;
g_cache(id, false, NULL, length);
cached = length > 0;
if (cached)
{
void* data = g_realloc(NULL, length);
g_cache(id, false, data, length);
StreamRead stream(data, length);
GLenum format;
stream.read(format);
GL_CHECK(glProgramBinary(m_id, format, stream.getDataPtr(), stream.remaining() ) );
g_free(data);
}
else
{ {
GL_CHECK(glProgramParameteri(m_id, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE) ); GL_CHECK(glProgramParameteri(m_id, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE) );
} }
}
#endif // BGFX_CONFIG_RENDERER_OPENGL #endif // BGFX_CONFIG_RENDERER_OPENGL
if (!cached)
{
GL_CHECK(glAttachShader(m_id, _vsh.m_id) ); GL_CHECK(glAttachShader(m_id, _vsh.m_id) );
GL_CHECK(glAttachShader(m_id, _fsh.m_id) ); GL_CHECK(glAttachShader(m_id, _fsh.m_id) );
GL_CHECK(glLinkProgram(m_id) ); GL_CHECK(glLinkProgram(m_id) );
@ -632,17 +668,21 @@ namespace bgfx
#if BGFX_CONFIG_RENDERER_OPENGL #if BGFX_CONFIG_RENDERER_OPENGL
if (s_extension[Extension::ARB_get_program_binary].m_supported) if (s_extension[Extension::ARB_get_program_binary].m_supported)
{ {
GLint length; GLint programLength;
GLenum format; GLenum format;
GL_CHECK(glGetProgramiv(m_id, GL_PROGRAM_BINARY_LENGTH, &length) ); GL_CHECK(glGetProgramiv(m_id, GL_PROGRAM_BINARY_LENGTH, &programLength) );
void* data = g_realloc(NULL, length);
GL_CHECK(glGetProgramBinary(m_id, length, NULL, &format, data) );
dbgPrintfData(data, length, "Binary 0x%08x", format); uint32_t length = programLength + 4;
uint8_t* data = (uint8_t*)g_realloc(NULL, length);
GL_CHECK(glGetProgramBinary(m_id, programLength, NULL, &format, &data[4]) );
*(uint32_t*)data = format;
g_cache(id, true, data, length);
g_free(data); g_free(data);
} }
#endif // BGFX_CONFIG_RENDERER_OPENGL #endif // BGFX_CONFIG_RENDERER_OPENGL
}
init(); init();
} }
@ -1120,10 +1160,16 @@ namespace bgfx
{ {
if (0 < colorFormat) if (0 < colorFormat)
{ {
#if BGFX_CONFIG_RENDERER_OPENGL
GLenum depthComponent = GL_DEPTH_COMPONENT32;
#else
GLenum depthComponent = GL_DEPTH_COMPONENT16;
#endif // BGFX_CONFIG_RENDERER_OPENGL
GL_CHECK(glGenRenderbuffers(1, &m_rbo) ); GL_CHECK(glGenRenderbuffers(1, &m_rbo) );
BX_CHECK(0 != m_rbo, "Failed to generate renderbuffer id."); BX_CHECK(0 != m_rbo, "Failed to generate renderbuffer id.");
GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_rbo) ); GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_rbo) );
GL_CHECK(glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _width, _height) ); GL_CHECK(glRenderbufferStorage(GL_RENDERBUFFER, depthComponent, _width, _height) );
GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, 0) ); GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, 0) );
GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER
@ -1390,6 +1436,10 @@ namespace bgfx
&& s_extension[Extension::CHROMIUM_texture_compression_dxt3].m_supported && s_extension[Extension::CHROMIUM_texture_compression_dxt3].m_supported
&& s_extension[Extension::CHROMIUM_texture_compression_dxt5].m_supported && s_extension[Extension::CHROMIUM_texture_compression_dxt5].m_supported
; ;
s_renderCtx.m_dxtSupport |=
s_extension[Extension::EXT_texture_compression_s3tc].m_supported
;
} }
void Context::rendererShutdown() void Context::rendererShutdown()
@ -1584,6 +1634,8 @@ namespace bgfx
changedFlags = BGFX_STATE_MASK; changedFlags = BGFX_STATE_MASK;
currentState.m_flags = newFlags; currentState.m_flags = newFlags;
GREMEDY_SETMARKER("view");
view = key.m_view; view = key.m_view;
materialIdx = bgfx::invalidHandle; materialIdx = bgfx::invalidHandle;
@ -2083,7 +2135,7 @@ namespace bgfx
g_textVideoMemBlitter.blit(m_render->m_textVideoMem); g_textVideoMemBlitter.blit(m_render->m_textVideoMem);
} }
GL_CHECK(glFlush() ); GREMEDY_FRAMETERMINATOR();
} }
#if BX_PLATFORM_WINDOWS #if BX_PLATFORM_WINDOWS

View file

@ -11,6 +11,30 @@
# include <gl/glext.h> # include <gl/glext.h>
#elif BGFX_CONFIG_RENDERER_OPENGLES #elif BGFX_CONFIG_RENDERER_OPENGLES
# include <GLES2/gl2.h> # include <GLES2/gl2.h>
# ifndef GL_BGRA_EXT
# define GL_BGRA_EXT 0x80E1
# endif // GL_BGRA_EXT
# ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT
# define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
# endif // GL_COMPRESSED_RGB_S3TC_DXT1_EXT
# ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
# define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
# endif // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
# ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
# define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
# endif // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
# ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
# define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
# endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
# ifndef GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES
# define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B
# endif // GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES
#endif // BGFX_CONFIG_RENDERER_OPENGL #endif // BGFX_CONFIG_RENDERER_OPENGL
#if BX_PLATFORM_NACL #if BX_PLATFORM_NACL
@ -25,29 +49,9 @@
# include <X11/Xlib.h> # include <X11/Xlib.h>
#endif // BX_PLATFORM_ #endif // BX_PLATFORM_
#ifndef GL_BGRA_EXT #if BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
# define GL_BGRA_EXT 0x80E1 # include <gl/GRemedyGLExtensions.h>
#endif // GL_BGRA_EXT #endif // BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
#ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT
# define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
#endif // GL_COMPRESSED_RGB_S3TC_DXT1_EXT
#ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
# define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
#endif // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
#ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
# define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
#endif // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
#ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
# define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
#endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
#ifndef GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES
# define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B
#endif // GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES
namespace bgfx namespace bgfx
{ {
@ -65,6 +69,31 @@ namespace bgfx
# define GL_CHECK(_call) _call # define GL_CHECK(_call) _call
#endif // BGFX_CONFIG_DEBUG #endif // BGFX_CONFIG_DEBUG
#if BGFX_CONFIG_DEBUG_GREMEDY
# define _GREMEDY_SETMARKER(_string) \
do \
{ \
if (NULL != glStringMarkerGREMEDY) \
{ \
glStringMarkerGREMEDY( (GLsizei)strlen(_string), _string); \
} \
} while(0)
# define _GREMEDY_FRAMETERMINATOR() \
do \
{ \
if (NULL != glStringMarkerGREMEDY) \
{ \
glFrameTerminatorGREMEDY(); \
} \
} while(0)
#else
# define _GREMEDY_SETMARKER(_string) do {} while(0)
# define _GREMEDY_FRAMETERMINATOR() do {} while(0)
#endif // BGFX_CONFIG_DEBUG_GREMEDY
#define GREMEDY_SETMARKER(_string) _GREMEDY_SETMARKER(_string)
#define GREMEDY_FRAMETERMINATOR() _GREMEDY_FRAMETERMINATOR()
#if BGFX_CONFIG_RENDERER_OPENGL #if BGFX_CONFIG_RENDERER_OPENGL
# define GL_IMPORT(_optional, _proto, _func) extern _proto _func # define GL_IMPORT(_optional, _proto, _func) extern _proto _func
# include "glimports.h" # include "glimports.h"
@ -177,6 +206,7 @@ namespace bgfx
if (0 != m_id) if (0 != m_id)
{ {
m_hash = hash(_code, (uint32_t)strlen( (const char*)_code) );
GL_CHECK(glShaderSource(m_id, 1, (const GLchar**)&_code, NULL) ); GL_CHECK(glShaderSource(m_id, 1, (const GLchar**)&_code, NULL) );
GL_CHECK(glCompileShader(m_id) ); GL_CHECK(glCompileShader(m_id) );
@ -202,6 +232,7 @@ namespace bgfx
GLuint m_id; GLuint m_id;
GLenum m_type; GLenum m_type;
uint32_t m_hash;
}; };
struct RenderTarget struct RenderTarget