Display texture swizzling and depth/stencil read mode on textures

This commit is contained in:
baldurk
2015-01-17 15:53:09 +00:00
parent ce7c8eb44f
commit 24fd91a7e0
6 changed files with 111 additions and 1 deletions
+3
View File
@@ -73,6 +73,9 @@ struct GLPipelineState
ResourceId Resource;
uint32_t FirstSlice;
ShaderResourceType ResType;
TextureSwizzle Swizzle[4];
int32_t DepthReadChannel;
};
rdctype::array<Texture> Textures;
+10
View File
@@ -46,6 +46,16 @@ enum FormatComponentType
eCompType_Double,
};
enum TextureSwizzle
{
eSwizzle_Red,
eSwizzle_Green,
eSwizzle_Blue,
eSwizzle_Alpha,
eSwizzle_Zero,
eSwizzle_One,
};
enum ShaderResourceType
{
eResType_None,
+47 -1
View File
@@ -1259,7 +1259,53 @@ void GLReplay::SavePipelineState()
pipe.Textures[unit].Resource = rm->GetOriginalID(rm->GetID(TextureRes(ctx, tex)));
pipe.Textures[unit].FirstSlice = (uint32_t)firstSlice;
pipe.Textures[unit].ResType = resType;
pipe.Textures[unit].DepthReadChannel = -1;
GLenum levelQueryType = target == eGL_TEXTURE_CUBE_MAP ? eGL_TEXTURE_CUBE_MAP_POSITIVE_X : target;
GLenum fmt = eGL_NONE;
gl.glGetTexLevelParameteriv(levelQueryType, 0, eGL_TEXTURE_INTERNAL_FORMAT, (GLint *)&fmt);
if(IsDepthStencilFormat(fmt))
{
GLint depthMode;
gl.glGetTexParameteriv(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, &depthMode);
if(depthMode == eGL_DEPTH_COMPONENT)
pipe.Textures[unit].DepthReadChannel = 0;
else if(depthMode == eGL_STENCIL_INDEX)
pipe.Textures[unit].DepthReadChannel = 1;
}
GLint swizzles[4] = { eGL_RED, eGL_GREEN, eGL_BLUE, eGL_ALPHA };
if(target != eGL_TEXTURE_BUFFER)
gl.glGetTexParameteriv(target, eGL_TEXTURE_SWIZZLE_RGBA, swizzles);
for(int i=0; i < 4; i++)
{
switch(swizzles[i])
{
default:
case GL_ZERO:
pipe.Textures[unit].Swizzle[i] = eSwizzle_Zero;
break;
case GL_ONE:
pipe.Textures[unit].Swizzle[i] = eSwizzle_One;
break;
case eGL_RED:
pipe.Textures[unit].Swizzle[i] = eSwizzle_Red;
break;
case eGL_GREEN:
pipe.Textures[unit].Swizzle[i] = eSwizzle_Green;
break;
case eGL_BLUE:
pipe.Textures[unit].Swizzle[i] = eSwizzle_Blue;
break;
case eGL_ALPHA:
pipe.Textures[unit].Swizzle[i] = eSwizzle_Alpha;
break;
}
}
GLuint samp;
gl.glGetIntegerv(eGL_SAMPLER_BINDING, (GLint *)&samp);