mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-12 09:41:03 +00:00
Fix mesh view with double vertex attribute inputs
This commit is contained in:
@@ -22,8 +22,18 @@
|
||||
* THE SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
layout(location = 0) in vec4 position;
|
||||
layout(location = 1) in vec4 IN_secondary;
|
||||
// this allows overrides from outside to change to e.g. dvec4
|
||||
|
||||
#ifndef POSITION_TYPE
|
||||
#define POSITION_TYPE vec4
|
||||
#endif
|
||||
|
||||
#ifndef SECONDARY_TYPE
|
||||
#define SECONDARY_TYPE vec4
|
||||
#endif
|
||||
|
||||
layout(location = 0) in POSITION_TYPE position;
|
||||
layout(location = 1) in SECONDARY_TYPE IN_secondary;
|
||||
|
||||
#ifndef OPENGL_ES
|
||||
out gl_PerVertex
|
||||
@@ -41,21 +51,21 @@ void main(void)
|
||||
vec2 psprite[4] =
|
||||
vec2[](vec2(-1.0f, -1.0f), vec2(-1.0f, 1.0f), vec2(1.0f, -1.0f), vec2(1.0f, 1.0f));
|
||||
|
||||
vec4 pos = position;
|
||||
vec4 pos = vec4(position);
|
||||
if(Mesh.homogenousInput == 0u)
|
||||
{
|
||||
pos = vec4(position.xyz, 1);
|
||||
pos = vec4(pos.xyz, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef VULKAN
|
||||
pos = vec4(position.x, -position.y, position.z, position.w);
|
||||
pos = vec4(pos.x, -pos.y, pos.z, pos.w);
|
||||
#endif
|
||||
}
|
||||
|
||||
gl_Position = Mesh.mvp * pos;
|
||||
gl_Position.xy += Mesh.pointSpriteSize.xy * 0.01f * psprite[VERTEX_ID % 4] * gl_Position.w;
|
||||
secondary = IN_secondary;
|
||||
secondary = vec4(IN_secondary);
|
||||
norm = vec4(0, 0, 1, 1);
|
||||
|
||||
#ifdef VULKAN
|
||||
|
||||
@@ -640,6 +640,7 @@ extern bool IsGLES;
|
||||
EXT_TO_CHECK(40, 32, ARB_gpu_shader5) \
|
||||
EXT_TO_CHECK(40, 32, ARB_sample_shading) \
|
||||
EXT_TO_CHECK(40, 99, ARB_shader_subroutine) \
|
||||
EXT_TO_CHECK(40, 99, ARB_gpu_shader_fp64) \
|
||||
EXT_TO_CHECK(40, 32, ARB_tessellation_shader) \
|
||||
EXT_TO_CHECK(40, 32, ARB_texture_cube_map_array) \
|
||||
EXT_TO_CHECK(40, 30, ARB_transform_feedback2) \
|
||||
@@ -647,6 +648,7 @@ extern bool IsGLES;
|
||||
EXT_TO_CHECK(41, 31, ARB_separate_shader_objects) \
|
||||
EXT_TO_CHECK(41, 99, ARB_viewport_array) \
|
||||
EXT_TO_CHECK(41, 99, ARB_ES2_compatibility) \
|
||||
EXT_TO_CHECK(41, 99, ARB_vertex_attrib_64bit) \
|
||||
EXT_TO_CHECK(42, 99, ARB_base_instance) \
|
||||
EXT_TO_CHECK(42, 31, ARB_shader_atomic_counters) \
|
||||
EXT_TO_CHECK(42, 31, ARB_shader_image_load_store) \
|
||||
|
||||
@@ -338,21 +338,60 @@ void GLReplay::InitDebugData()
|
||||
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_mesh_frag), glslBaseVer);
|
||||
GenerateGLSLShader(gs, shaderType, "", GetEmbeddedResource(glsl_mesh_geom), glslBaseVer);
|
||||
|
||||
DebugData.meshProg = CreateShaderProgram(vs, fs);
|
||||
DebugData.meshgsProg = CreateShaderProgram(vs, fs, gs);
|
||||
DebugData.meshProg[0] = CreateShaderProgram(vs, fs);
|
||||
DebugData.meshgsProg[0] = CreateShaderProgram(vs, fs, gs);
|
||||
|
||||
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_trisize_frag), glslBaseVer);
|
||||
GenerateGLSLShader(gs, shaderType, "", GetEmbeddedResource(glsl_trisize_geom), glslBaseVer);
|
||||
|
||||
DebugData.trisizeProg = CreateShaderProgram(vs, fs, gs);
|
||||
|
||||
if(HasExt[ARB_gpu_shader_fp64] && HasExt[ARB_vertex_attrib_64bit])
|
||||
{
|
||||
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_mesh_frag), glslBaseVer);
|
||||
|
||||
std::string extensions =
|
||||
"#extension GL_ARB_gpu_shader_fp64 : require\n"
|
||||
"#extension GL_ARB_vertex_attrib_64bit : require\n";
|
||||
|
||||
// position only dvec4
|
||||
GenerateGLSLShader(vs, shaderType, extensions + "#define POSITION_TYPE dvec4",
|
||||
GetEmbeddedResource(glsl_mesh_vert), glslBaseVer);
|
||||
|
||||
DebugData.meshProg[1] = CreateShaderProgram(vs, fs);
|
||||
DebugData.meshgsProg[1] = CreateShaderProgram(vs, fs, gs);
|
||||
|
||||
// secondary only dvec4
|
||||
GenerateGLSLShader(vs, shaderType, extensions + "#define SECONDARY_TYPE dvec4",
|
||||
GetEmbeddedResource(glsl_mesh_vert), glslBaseVer);
|
||||
|
||||
DebugData.meshProg[2] = CreateShaderProgram(vs, fs);
|
||||
DebugData.meshgsProg[2] = CreateShaderProgram(vs, fs, gs);
|
||||
|
||||
// both dvec4
|
||||
GenerateGLSLShader(vs, shaderType, extensions +
|
||||
"#define POSITION_TYPE dvec4\n"
|
||||
"#define SECONDARY_TYPE dvec4",
|
||||
GetEmbeddedResource(glsl_mesh_vert), glslBaseVer);
|
||||
|
||||
DebugData.meshProg[3] = CreateShaderProgram(vs, fs);
|
||||
DebugData.meshgsProg[3] = CreateShaderProgram(vs, fs, gs);
|
||||
}
|
||||
else
|
||||
{
|
||||
// we don't warn about the lack of double support, assuming that if the driver doesn't support
|
||||
// it then it's highly unlikely that the capture uses it.
|
||||
DebugData.meshProg[1] = DebugData.meshProg[2] = DebugData.meshProg[3] = 0;
|
||||
DebugData.meshgsProg[1] = DebugData.meshgsProg[2] = DebugData.meshgsProg[3] = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GenerateGLSLShader(vs, shaderType, "", GetEmbeddedResource(glsl_mesh_vert), glslBaseVer);
|
||||
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_mesh_frag), glslBaseVer);
|
||||
|
||||
DebugData.meshProg = CreateShaderProgram(vs, fs);
|
||||
DebugData.meshgsProg = 0;
|
||||
DebugData.meshProg[0] = CreateShaderProgram(vs, fs);
|
||||
RDCEraseEl(DebugData.meshgsProg);
|
||||
DebugData.trisizeProg = 0;
|
||||
|
||||
const char *warning_msg =
|
||||
@@ -361,6 +400,39 @@ void GLReplay::InitDebugData()
|
||||
RDCWARN(warning_msg);
|
||||
m_pDriver->AddDebugMessage(MessageCategory::Portability, MessageSeverity::Medium,
|
||||
MessageSource::RuntimeWarning, warning_msg);
|
||||
|
||||
if(HasExt[ARB_gpu_shader_fp64] && HasExt[ARB_vertex_attrib_64bit])
|
||||
{
|
||||
std::string extensions =
|
||||
"#extension GL_ARB_gpu_shader_fp64 : require\n"
|
||||
"#extension GL_ARB_vertex_attrib_64bit : require\n";
|
||||
|
||||
// position only dvec4
|
||||
GenerateGLSLShader(vs, shaderType, extensions + "#define POSITION_TYPE dvec4",
|
||||
GetEmbeddedResource(glsl_mesh_vert), glslBaseVer);
|
||||
|
||||
DebugData.meshProg[1] = CreateShaderProgram(vs, fs);
|
||||
|
||||
// secondary only dvec4
|
||||
GenerateGLSLShader(vs, shaderType, extensions + "#define SECONDARY_TYPE dvec4",
|
||||
GetEmbeddedResource(glsl_mesh_vert), glslBaseVer);
|
||||
|
||||
DebugData.meshProg[2] = CreateShaderProgram(vs, fs);
|
||||
|
||||
// both dvec4
|
||||
GenerateGLSLShader(vs, shaderType, extensions +
|
||||
"#define POSITION_TYPE dvec4\n"
|
||||
"#define SECONDARY_TYPE dvec4",
|
||||
GetEmbeddedResource(glsl_mesh_vert), glslBaseVer);
|
||||
|
||||
DebugData.meshProg[3] = CreateShaderProgram(vs, fs);
|
||||
}
|
||||
else
|
||||
{
|
||||
// we don't warn about the lack of double support, assuming that if the driver doesn't support
|
||||
// it then it's highly unlikely that the capture uses it.
|
||||
DebugData.meshProg[1] = DebugData.meshProg[2] = DebugData.meshProg[3] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
RenderDoc::Inst().SetProgress(LoadProgress::DebugManagerInit, 0.4f);
|
||||
@@ -829,8 +901,12 @@ void GLReplay::DeleteDebugData()
|
||||
drv.glDeleteProgram(DebugData.checkerProg);
|
||||
if(DebugData.fixedcolFragShader)
|
||||
drv.glDeleteShader(DebugData.fixedcolFragShader);
|
||||
drv.glDeleteProgram(DebugData.meshProg);
|
||||
drv.glDeleteProgram(DebugData.meshgsProg);
|
||||
|
||||
for(size_t i = 0; i < ARRAY_COUNT(DebugData.meshProg); i++)
|
||||
{
|
||||
drv.glDeleteProgram(DebugData.meshProg[i]);
|
||||
drv.glDeleteProgram(DebugData.meshgsProg[i]);
|
||||
}
|
||||
drv.glDeleteProgram(DebugData.trisizeProg);
|
||||
|
||||
drv.glDeleteSamplers(1, &DebugData.linearSampler);
|
||||
|
||||
@@ -60,15 +60,11 @@ void GLReplay::RenderMesh(uint32_t eventId, const vector<MeshFormat> &secondaryD
|
||||
|
||||
GLenum topo = MakeGLPrimitiveTopology(cfg.position.topology);
|
||||
|
||||
GLuint prog = DebugData.meshProg;
|
||||
|
||||
MeshUBOData uboParams = {};
|
||||
MeshUBOData *uboptr = NULL;
|
||||
|
||||
drv.glBindBufferBase(eGL_UNIFORM_BUFFER, 0, DebugData.UBOs[0]);
|
||||
|
||||
drv.glUseProgram(prog);
|
||||
|
||||
if(HasExt[EXT_framebuffer_sRGB])
|
||||
drv.glEnable(eGL_FRAMEBUFFER_SRGB);
|
||||
|
||||
@@ -109,6 +105,8 @@ void GLReplay::RenderMesh(uint32_t eventId, const vector<MeshFormat> &secondaryD
|
||||
drv.glEnableVertexAttribArray(0);
|
||||
drv.glDisableVertexAttribArray(1);
|
||||
|
||||
drv.glUseProgram(DebugData.meshProg[0]);
|
||||
|
||||
for(size_t i = 0; i < secondaryDraws.size(); i++)
|
||||
{
|
||||
const MeshFormat &fmt = secondaryDraws[i];
|
||||
@@ -149,6 +147,8 @@ void GLReplay::RenderMesh(uint32_t eventId, const vector<MeshFormat> &secondaryD
|
||||
}
|
||||
}
|
||||
|
||||
int progidx = 0;
|
||||
|
||||
for(uint32_t i = 0; i < 2; i++)
|
||||
{
|
||||
if(meshData[i]->vertexResourceId == ResourceId())
|
||||
@@ -239,6 +239,8 @@ void GLReplay::RenderMesh(uint32_t eventId, const vector<MeshFormat> &secondaryD
|
||||
else if(meshData[i]->format.compType == CompType::Double)
|
||||
{
|
||||
drv.glVertexAttribLFormat(i, meshData[i]->format.compCount, eGL_DOUBLE, 0);
|
||||
|
||||
progidx |= (1 << i);
|
||||
}
|
||||
|
||||
GLintptr offs = (GLintptr)meshData[i]->vertexByteOffset;
|
||||
@@ -256,6 +258,16 @@ void GLReplay::RenderMesh(uint32_t eventId, const vector<MeshFormat> &secondaryD
|
||||
drv.glVertexAttribDivisor(i, 0);
|
||||
}
|
||||
|
||||
GLuint prog = DebugData.meshProg[progidx];
|
||||
|
||||
if(prog == 0)
|
||||
{
|
||||
RDCWARN("Couldn't compile right double-compatible mesh display shader");
|
||||
prog = DebugData.meshProg[0];
|
||||
}
|
||||
|
||||
drv.glUseProgram(prog);
|
||||
|
||||
// enable position attribute
|
||||
drv.glEnableVertexAttribArray(0);
|
||||
drv.glDisableVertexAttribArray(1);
|
||||
@@ -269,10 +281,16 @@ void GLReplay::RenderMesh(uint32_t eventId, const vector<MeshFormat> &secondaryD
|
||||
|
||||
GLuint solidProg = prog;
|
||||
|
||||
if(cfg.solidShadeMode == SolidShade::Lit && DebugData.meshgsProg)
|
||||
if(cfg.solidShadeMode == SolidShade::Lit && DebugData.meshgsProg[0])
|
||||
{
|
||||
// pick program with GS for per-face lighting
|
||||
solidProg = DebugData.meshgsProg;
|
||||
solidProg = DebugData.meshgsProg[progidx];
|
||||
|
||||
if(solidProg == 0)
|
||||
{
|
||||
RDCWARN("Couldn't compile right double-compatible mesh display shader");
|
||||
solidProg = DebugData.meshgsProg[0];
|
||||
}
|
||||
|
||||
ClearGLErrors();
|
||||
drv.glUseProgram(solidProg);
|
||||
@@ -377,6 +395,9 @@ void GLReplay::RenderMesh(uint32_t eventId, const vector<MeshFormat> &secondaryD
|
||||
}
|
||||
}
|
||||
|
||||
// helpers always use basic float-input program
|
||||
drv.glUseProgram(DebugData.meshProg[0]);
|
||||
|
||||
if(cfg.showBBox)
|
||||
{
|
||||
Vec4f a = Vec4f(cfg.minBounds.x, cfg.minBounds.y, cfg.minBounds.z, cfg.minBounds.w);
|
||||
|
||||
@@ -340,8 +340,9 @@ private:
|
||||
|
||||
GLuint fixedcolFragShader;
|
||||
|
||||
GLuint meshProg;
|
||||
GLuint meshgsProg;
|
||||
// 0 = both floats, 1 = position doubles, 2 = secondary doubles, 3 = both doubles
|
||||
GLuint meshProg[4];
|
||||
GLuint meshgsProg[4];
|
||||
GLuint trisizeProg;
|
||||
|
||||
GLuint meshVAO;
|
||||
|
||||
Reference in New Issue
Block a user