Check that texture swizzle extension is available before using it

This commit is contained in:
baldurk
2017-01-17 11:02:41 +00:00
parent eb5761dabe
commit 16dd02a4a4
4 changed files with 44 additions and 13 deletions
+3 -1
View File
@@ -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
+15 -3
View File
@@ -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);
+16 -8
View File
@@ -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)
+10 -1
View File
@@ -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;
}