mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-28 04:41:07 +00:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user