From 16dd02a4a4a129704205effe8680aaef10d9c78c Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 13 Jan 2017 11:10:09 +0000 Subject: [PATCH] Check that texture swizzle extension is available before using it --- renderdoc/driver/gl/gl_common.h | 4 +++- renderdoc/driver/gl/gl_manager.cpp | 18 +++++++++++++++--- renderdoc/driver/gl/gl_replay.cpp | 24 ++++++++++++++++-------- renderdoc/driver/gl/gl_resources.cpp | 11 ++++++++++- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 265f120f6..d3cf422fe 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -203,7 +203,9 @@ extern bool GLIsCore; EXT_TO_CHECK(ARB_shader_storage_buffer_object) \ EXT_TO_CHECK(EXT_direct_state_access) \ EXT_TO_CHECK(ARB_clear_buffer_object) \ - EXT_TO_CHECK(ARB_internalformat_query2) + EXT_TO_CHECK(ARB_internalformat_query2) \ + EXT_TO_CHECK(ARB_texture_swizzle) \ + EXT_TO_CHECK(EXT_texture_swizzle) // extensions we know we want to check for are precached, indexd by this enum enum ExtensionCheckEnum diff --git a/renderdoc/driver/gl/gl_manager.cpp b/renderdoc/driver/gl/gl_manager.cpp index 6a9b5188c..eaf1013e9 100644 --- a/renderdoc/driver/gl/gl_manager.cpp +++ b/renderdoc/driver/gl/gl_manager.cpp @@ -600,8 +600,19 @@ void GLResourceManager::PrepareTextureInitialContents(ResourceId liveid, Resourc (GLint *)&state->baseLevel); gl.glGetTextureParameterivEXT(res.name, details.curType, eGL_TEXTURE_MAX_LEVEL, (GLint *)&state->maxLevel); - gl.glGetTextureParameterivEXT(res.name, details.curType, eGL_TEXTURE_SWIZZLE_RGBA, - (GLint *)&state->swizzle[0]); + + if(ExtensionSupported[GLExt_ARB_texture_swizzle] || ExtensionSupported[GLExt_EXT_texture_swizzle]) + { + gl.glGetTextureParameterivEXT(res.name, details.curType, eGL_TEXTURE_SWIZZLE_RGBA, + (GLint *)&state->swizzle[0]); + } + else + { + state->swizzle[0] = eGL_RED; + state->swizzle[1] = eGL_GREEN; + state->swizzle[2] = eGL_BLUE; + state->swizzle[3] = eGL_ALPHA; + } // only non-ms textures have sampler state if(!ms) @@ -1857,7 +1868,8 @@ void GLResourceManager::Apply_InitialState(GLResource live, InitialContentData i (GLint *)&state->maxLevel); // assume that emulated (luminance, alpha-only etc) textures are not swizzled - if(!details.emulated) + if(!details.emulated && (ExtensionSupported[GLExt_ARB_texture_swizzle] || + ExtensionSupported[GLExt_EXT_texture_swizzle])) gl.glTextureParameterivEXT(live.name, details.curType, eGL_TEXTURE_SWIZZLE_RGBA, (GLint *)state->swizzle); diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 052236aa1..8fd85f8d2 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -1364,7 +1364,8 @@ void GLReplay::SavePipelineState() } GLint swizzles[4] = {eGL_RED, eGL_GREEN, eGL_BLUE, eGL_ALPHA}; - if(target != eGL_TEXTURE_BUFFER) + if(target != eGL_TEXTURE_BUFFER && (ExtensionSupported[GLExt_ARB_texture_swizzle] || + ExtensionSupported[GLExt_EXT_texture_swizzle])) gl.glGetTexParameteriv(target, eGL_TEXTURE_SWIZZLE_RGBA, swizzles); for(int i = 0; i < 4; i++) @@ -2880,15 +2881,22 @@ ResourceId GLReplay::CreateProxyTexture(const FetchTexture &templateTex) if(templateTex.format.bgraOrder && binding != eGL_NONE) { - GLint bgraSwizzle[] = {eGL_BLUE, eGL_GREEN, eGL_RED, eGL_ALPHA}; - GLint bgrSwizzle[] = {eGL_BLUE, eGL_GREEN, eGL_RED, eGL_ONE}; + if(ExtensionSupported[GLExt_ARB_texture_swizzle] || ExtensionSupported[GLExt_EXT_texture_swizzle]) + { + GLint bgraSwizzle[] = {eGL_BLUE, eGL_GREEN, eGL_RED, eGL_ALPHA}; + GLint bgrSwizzle[] = {eGL_BLUE, eGL_GREEN, eGL_RED, eGL_ONE}; - if(templateTex.format.compCount == 4) - gl.glTexParameteriv(binding, eGL_TEXTURE_SWIZZLE_RGBA, bgraSwizzle); - else if(templateTex.format.compCount == 3) - gl.glTexParameteriv(binding, eGL_TEXTURE_SWIZZLE_RGBA, bgrSwizzle); + if(templateTex.format.compCount == 4) + gl.glTexParameteriv(binding, eGL_TEXTURE_SWIZZLE_RGBA, bgraSwizzle); + else if(templateTex.format.compCount == 3) + gl.glTexParameteriv(binding, eGL_TEXTURE_SWIZZLE_RGBA, bgrSwizzle); + else + RDCERR("Unexpected component count %d for BGRA order format", templateTex.format.compCount); + } else - RDCERR("Unexpected component count %d for BGRA order format", templateTex.format.compCount); + { + RDCERR("Can't create a BGRA proxy texture without texture swizzle extension"); + } } if(templateTex.customName) diff --git a/renderdoc/driver/gl/gl_resources.cpp b/renderdoc/driver/gl/gl_resources.cpp index c14556e10..7e536e47c 100644 --- a/renderdoc/driver/gl/gl_resources.cpp +++ b/renderdoc/driver/gl/gl_resources.cpp @@ -737,7 +737,16 @@ bool EmulateLuminanceFormat(const GLHookSet &gl, GLuint tex, GLenum target, GLen } if(tex) - gl.glTextureParameterivEXT(tex, target, eGL_TEXTURE_SWIZZLE_RGBA, (GLint *)swizzle); + { + if(ExtensionSupported[GLExt_ARB_texture_swizzle] || ExtensionSupported[GLExt_EXT_texture_swizzle]) + { + gl.glTextureParameterivEXT(tex, target, eGL_TEXTURE_SWIZZLE_RGBA, (GLint *)swizzle); + } + else + { + RDCERR("Cannot emulate luminance format without texture swizzle extension"); + } + } return true; }