mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-24 07:26:34 +00:00
Check that texture swizzle extension is available before using it
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user