Crash fixes, ensure we read back from valid uniform locations

* We can't use the uniform locations from our separable program as that's
  not guaranteed to be the same in the real program (could end up reading
  a completely different uniform value).
This commit is contained in:
baldurk
2014-08-13 13:03:12 +01:00
parent df5913855e
commit fe027e61d5
2 changed files with 73 additions and 5 deletions
+32 -5
View File
@@ -42,9 +42,9 @@ GLReplay::GLReplay()
void GLReplay::Shutdown()
{
delete m_pDriver;
CloseReplayContext();
delete m_pDriver;
}
#pragma region Implemented
@@ -589,19 +589,46 @@ ShaderReflection *GLReplay::GetShader(ResourceId id)
auto &refl = shaderDetails.reflection;
// in case of bugs, we readback into this array instead of
GLint dummyReadback[32];
#if !defined(RELEASE)
for(int i=1; i < ARRAY_COUNT(dummyReadback); i++)
dummyReadback[i] = 0x6c7b8a9d;
#endif
// update with latest uniform values
for(int32_t i=0; i < refl.Resources.count; i++)
{
if(refl.Resources.elems[i].IsSRV && refl.Resources.elems[i].IsTexture)
gl.glGetUniformiv(curProg, refl.Resources.elems[i].variableAddress, (GLint *)&refl.Resources.elems[i].bindPoint);
{
GLint loc = gl.glGetUniformLocation(curProg, refl.Resources.elems[i].name.elems);
if(loc >= 0)
{
gl.glGetUniformiv(curProg, loc, dummyReadback);
refl.Resources.elems[i].bindPoint = dummyReadback[0];
}
}
}
for(int32_t i=0; i < refl.ConstantBlocks.count; i++)
{
if(refl.ConstantBlocks.elems[i].bufferAddress >= 0)
gl.glGetActiveUniformBlockiv(curProg, refl.ConstantBlocks.elems[i].bufferAddress,
eGL_UNIFORM_BLOCK_BINDING, (GLint *)&refl.ConstantBlocks.elems[i].bindPoint);
{
GLint loc = gl.glGetUniformBlockIndex(curProg, refl.ConstantBlocks.elems[i].name.elems);
if(loc >= 0)
{
gl.glGetActiveUniformBlockiv(curProg, refl.ConstantBlocks.elems[i].bufferAddress, eGL_UNIFORM_BLOCK_BINDING, dummyReadback);
refl.ConstantBlocks.elems[i].bindPoint = dummyReadback[0];
}
}
}
#if !defined(RELEASE)
for(int i=1; i < ARRAY_COUNT(dummyReadback); i++)
if(dummyReadback[i] != 0x6c7b8a9d)
RDCERR("Invalid uniform readback - data beyond first element modified!");
#endif
return &refl;
}
+41
View File
@@ -134,204 +134,245 @@ void MakeShaderReflection(const GLHookSet &gl, GLenum shadType, GLuint sepProg,
res.variableType.descriptor.rows = 1;
res.variableType.descriptor.cols = 4;
res.variableType.descriptor.elements = 1;
res.variableType.descriptor.rowMajorStorage = false;
res.bindPoint = 0;
// float samplers
if(values[0] == GL_SAMPLER_BUFFER)
{
res.resType = eResType_Buffer;
res.variableType.descriptor.name = "samplerBuffer";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_1D)
{
res.resType = eResType_Texture1D;
res.variableType.descriptor.name = "sampler1D";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_1D_ARRAY)
{
res.resType = eResType_Texture1DArray;
res.variableType.descriptor.name = "sampler1DArray";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_1D_SHADOW)
{
res.resType = eResType_Texture1D;
res.variableType.descriptor.name = "sampler1DShadow";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_1D_ARRAY_SHADOW)
{
res.resType = eResType_Texture1DArray;
res.variableType.descriptor.name = "sampler1DArrayShadow";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_2D)
{
res.resType = eResType_Texture2D;
res.variableType.descriptor.name = "sampler2D";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_2D_ARRAY)
{
res.resType = eResType_Texture2DArray;
res.variableType.descriptor.name = "sampler2DArray";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_2D_SHADOW)
{
res.resType = eResType_Texture2D;
res.variableType.descriptor.name = "sampler2DShadow";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_2D_ARRAY_SHADOW)
{
res.resType = eResType_Texture2DArray;
res.variableType.descriptor.name = "sampler2DArrayShadow";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_2D_RECT)
{
res.resType = eResType_Texture2D;
res.variableType.descriptor.name = "sampler2DRect";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_2D_RECT_SHADOW)
{
res.resType = eResType_Texture2D;
res.variableType.descriptor.name = "sampler2DRectShadow";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_3D)
{
res.resType = eResType_Texture3D;
res.variableType.descriptor.name = "sampler3D";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_CUBE)
{
res.resType = eResType_TextureCube;
res.variableType.descriptor.name = "samplerCube";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_CUBE_SHADOW)
{
res.resType = eResType_TextureCube;
res.variableType.descriptor.name = "samplerCubeShadow";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_CUBE_MAP_ARRAY)
{
res.resType = eResType_TextureCubeArray;
res.variableType.descriptor.name = "samplerCubeArray";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_2D_MULTISAMPLE)
{
res.resType = eResType_Texture2DMS;
res.variableType.descriptor.name = "sampler2DMS";
res.variableType.descriptor.type = eVar_Float;
}
else if(values[0] == GL_SAMPLER_2D_MULTISAMPLE_ARRAY)
{
res.resType = eResType_Texture2DMSArray;
res.variableType.descriptor.name = "sampler2DMSArray";
res.variableType.descriptor.type = eVar_Float;
}
// int samplers
else if(values[0] == GL_INT_SAMPLER_BUFFER)
{
res.resType = eResType_Buffer;
res.variableType.descriptor.name = "samplerBuffer";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_1D)
{
res.resType = eResType_Texture1D;
res.variableType.descriptor.name = "sampler1D";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_1D_ARRAY)
{
res.resType = eResType_Texture1DArray;
res.variableType.descriptor.name = "sampler1DArray";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_2D)
{
res.resType = eResType_Texture2D;
res.variableType.descriptor.name = "sampler2D";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_2D_ARRAY)
{
res.resType = eResType_Texture2DArray;
res.variableType.descriptor.name = "sampler2DArray";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_2D_RECT)
{
res.resType = eResType_Texture2D;
res.variableType.descriptor.name = "sampler2DRect";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_3D)
{
res.resType = eResType_Texture3D;
res.variableType.descriptor.name = "sampler3D";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_CUBE)
{
res.resType = eResType_TextureCube;
res.variableType.descriptor.name = "samplerCube";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_CUBE_MAP_ARRAY)
{
res.resType = eResType_TextureCubeArray;
res.variableType.descriptor.name = "samplerCubeArray";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_2D_MULTISAMPLE)
{
res.resType = eResType_Texture2DMS;
res.variableType.descriptor.name = "sampler2DMS";
res.variableType.descriptor.type = eVar_Int;
}
else if(values[0] == GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY)
{
res.resType = eResType_Texture2DMSArray;
res.variableType.descriptor.name = "sampler2DMSArray";
res.variableType.descriptor.type = eVar_Int;
}
// unsigned int samplers
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_BUFFER)
{
res.resType = eResType_Buffer;
res.variableType.descriptor.name = "samplerBuffer";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_1D)
{
res.resType = eResType_Texture1D;
res.variableType.descriptor.name = "sampler1D";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_1D_ARRAY)
{
res.resType = eResType_Texture1DArray;
res.variableType.descriptor.name = "sampler1DArray";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_2D)
{
res.resType = eResType_Texture2D;
res.variableType.descriptor.name = "sampler2D";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_2D_ARRAY)
{
res.resType = eResType_Texture2DArray;
res.variableType.descriptor.name = "sampler2DArray";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_2D_RECT)
{
res.resType = eResType_Texture2D;
res.variableType.descriptor.name = "sampler2DRect";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_3D)
{
res.resType = eResType_Texture3D;
res.variableType.descriptor.name = "sampler3D";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_CUBE)
{
res.resType = eResType_TextureCube;
res.variableType.descriptor.name = "samplerCube";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY)
{
res.resType = eResType_TextureCubeArray;
res.variableType.descriptor.name = "samplerCubeArray";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE)
{
res.resType = eResType_Texture2DMS;
res.variableType.descriptor.name = "sampler2DMS";
res.variableType.descriptor.type = eVar_UInt;
}
else if(values[0] == GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY)
{
res.resType = eResType_Texture2DMSArray;
res.variableType.descriptor.name = "sampler2DMSArray";
res.variableType.descriptor.type = eVar_UInt;
}
else
{