diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 38ba48a85..5661e4914 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -305,6 +305,7 @@ enum GLChunkType BIND_VERTEXBUFFERS, VERTEXBINDINGDIVISOR, DISPATCH_COMPUTE, + DISPATCH_COMPUTE_GROUP_SIZE, DISPATCH_COMPUTE_INDIRECT, MEMORY_BARRIER, MEMORY_BARRIER_BY_REGION, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 5763b7f34..296d12181 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -199,6 +199,7 @@ const char *GLChunkNames[] = "glBindVertexBuffers", "glVertexBindingDivisor", "glDispatchCompute", + "glDispatchComputeGroupSizeARB", "glDispatchComputeIndirect", "glMemoryBarrier", "glMemoryBarrierByRegion", @@ -343,6 +344,7 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) globalExts.push_back("GL_ARB_clear_texture"); globalExts.push_back("GL_ARB_color_buffer_float"); globalExts.push_back("GL_ARB_compute_shader"); + globalExts.push_back("GL_ARB_compute_variable_group_size"); globalExts.push_back("GL_ARB_conservative_depth"); globalExts.push_back("GL_ARB_copy_buffer"); globalExts.push_back("GL_ARB_copy_image"); @@ -367,6 +369,7 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) globalExts.push_back("GL_ARB_framebuffer_object"); globalExts.push_back("GL_ARB_framebuffer_sRGB"); globalExts.push_back("GL_ARB_get_program_binary"); + globalExts.push_back("GL_ARB_geometry_shader4"); globalExts.push_back("GL_ARB_gpu_shader_fp64"); globalExts.push_back("GL_ARB_gpu_shader5"); globalExts.push_back("GL_ARB_half_float_pixel"); @@ -450,6 +453,7 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) globalExts.push_back("GL_ARB_vertex_program"); globalExts.push_back("GL_ARB_vertex_type_10f_11f_11f_rev"); globalExts.push_back("GL_ARB_vertex_type_2_10_10_10_rev"); + globalExts.push_back("GL_ARB_viewport_array"); globalExts.push_back("GL_EXT_depth_bounds_test"); globalExts.push_back("GL_EXT_direct_state_access"); globalExts.push_back("GL_EXT_framebuffer_blit"); @@ -2329,6 +2333,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case DISPATCH_COMPUTE: Serialise_glDispatchCompute(0, 0, 0); break; + case DISPATCH_COMPUTE_GROUP_SIZE: + Serialise_glDispatchComputeGroupSizeARB(0, 0, 0, 0, 0, 0); + break; case DISPATCH_COMPUTE_INDIRECT: Serialise_glDispatchComputeIndirect(0); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index a36deeae4..9f42f84d5 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -600,6 +600,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)); IMPLEMENT_FUNCTION_SERIALISED(void, glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDispatchComputeGroupSizeARB(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z)); IMPLEMENT_FUNCTION_SERIALISED(void, glDispatchComputeIndirect(GLintptr indirect)); IMPLEMENT_FUNCTION_SERIALISED(void, glMemoryBarrier(GLbitfield barriers)); IMPLEMENT_FUNCTION_SERIALISED(void, glMemoryBarrierByRegion(GLbitfield barriers)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 632f8c135..ca8df05cc 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -264,7 +264,7 @@ struct GLHookSet PFNGLDETACHSHADERPROC glDetachShader; PFNGLRELEASESHADERCOMPILERPROC glReleaseShaderCompiler; PFNGLLINKPROGRAMPROC glLinkProgram; - PFNGLPROGRAMPARAMETERIPROC glProgramParameteri; + PFNGLPROGRAMPARAMETERIPROC glProgramParameteri; // aliases glProgramParameteriARB PFNGLUSEPROGRAMPROC glUseProgram; PFNGLSHADERBINARYPROC glShaderBinary; PFNGLPROGRAMBINARYPROC glProgramBinary; @@ -301,12 +301,12 @@ struct GLHookSet PFNGLDRAWBUFFERSPROC glDrawBuffers; // aliases glDrawBuffersARB PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; // aliases glGenFramebuffersEXT PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; // aliases glBindFramebufferEXT - PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture; + PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture; // aliases glFramebufferTextureARB PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; // aliases glFramebufferTexture1DEXT PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; // aliases glFramebufferTexture2DEXT PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; // aliases glFramebufferTexture3DEXT PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; // aliases glFramebufferRenderbufferEXT - PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; + PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; // aliases glFramebufferTextureLayerARB PFNGLFRAMEBUFFERPARAMETERIPROC glFramebufferParameteri; PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; // aliases glDeleteFramebuffersEXT PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; // aliases glGenRenderbuffersEXT @@ -463,6 +463,7 @@ struct GLHookSet PFNGLPOINTPARAMETERIPROC glPointParameteri; PFNGLPOINTPARAMETERIVPROC glPointParameteriv; PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; + PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC glDispatchComputeGroupSizeARB; PFNGLDISPATCHCOMPUTEINDIRECTPROC glDispatchComputeIndirect; PFNGLMEMORYBARRIERPROC glMemoryBarrier; PFNGLMEMORYBARRIERBYREGIONPROC glMemoryBarrierByRegion; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index fd752fc95..c72457541 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -412,6 +412,7 @@ HookExtensionAlias(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer, glBlitFramebufferEXT); \ HookExtension(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample); \ HookExtension(PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer); \ + HookExtensionAlias(PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer, glFramebufferTextureLayerARB); \ HookExtension(PFNGLMAPBUFFERRANGEPROC, glMapBufferRange); \ HookExtension(PFNGLFLUSHMAPPEDBUFFERRANGEPROC, glFlushMappedBufferRange); \ HookExtension(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray); \ @@ -448,6 +449,7 @@ HookExtension(PFNGLGETINTEGER64I_VPROC, glGetInteger64i_v); \ HookExtension(PFNGLGETBUFFERPARAMETERI64VPROC, glGetBufferParameteri64v); \ HookExtension(PFNGLFRAMEBUFFERTEXTUREPROC, glFramebufferTexture); \ + HookExtensionAlias(PFNGLFRAMEBUFFERTEXTUREPROC, glFramebufferTexture, glFramebufferTextureARB); \ HookExtension(PFNGLTEXIMAGE2DMULTISAMPLEPROC, glTexImage2DMultisample); \ HookExtension(PFNGLTEXIMAGE3DMULTISAMPLEPROC, glTexImage3DMultisample); \ HookExtension(PFNGLGETMULTISAMPLEFVPROC, glGetMultisamplefv); \ @@ -542,6 +544,7 @@ HookExtension(PFNGLGETPROGRAMBINARYPROC, glGetProgramBinary); \ HookExtension(PFNGLPROGRAMBINARYPROC, glProgramBinary); \ HookExtension(PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri); \ + HookExtensionAlias(PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri, glProgramParameteriARB); \ HookExtension(PFNGLUSEPROGRAMSTAGESPROC, glUseProgramStages); \ HookExtension(PFNGLACTIVESHADERPROGRAMPROC, glActiveShaderProgram); \ HookExtension(PFNGLCREATESHADERPROGRAMVPROC, glCreateShaderProgramv); \ @@ -739,6 +742,7 @@ HookExtension(PFNGLREADNPIXELSPROC, glReadnPixels); \ HookExtensionAlias(PFNGLREADNPIXELSPROC, glReadnPixels, glReadnPixelsARB); \ HookExtension(PFNGLTEXTUREBARRIERPROC, glTextureBarrier); \ + HookExtension(PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC, glDispatchComputeGroupSizeARB); \ HookExtension(PFNGLBLENDBARRIERKHRPROC, glBlendBarrierKHR); \ HookExtension(PFNGLDEPTHBOUNDSEXTPROC, glDepthBoundsEXT); \ HookExtension(PFNGLTEXTUREPARAMETERFEXTPROC, glTextureParameterfEXT); \ @@ -1514,6 +1518,7 @@ HookWrapper4(void, glGetnUniformuiv, GLuint, program, GLint, location, GLsizei, bufSize, GLuint *, params); \ HookWrapper8(void, glReadnPixels, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, GLsizei, bufSize, void *, data); \ HookWrapper0(void, glTextureBarrier); \ + HookWrapper6(void, glDispatchComputeGroupSizeARB, GLuint, num_groups_x, GLuint, num_groups_y, GLuint, num_groups_z, GLuint, group_size_x, GLuint, group_size_y, GLuint, group_size_z); \ HookWrapper0(void, glBlendBarrierKHR); \ HookWrapper2(void, glDepthBoundsEXT, GLclampd, zmin, GLclampd, zmax); \ HookWrapper4(void, glTextureParameterfEXT, GLuint, texture, GLenum, target, GLenum, pname, GLfloat, param); \ @@ -1738,7 +1743,6 @@ HookWrapper2(void, glvertexattribl1ui64varb, GLuint, index, const GLuint64EXT *, v); \ HookWrapper3(void, glgetvertexattriblui64varb, GLuint, index, GLenum, pname, GLuint64EXT *, params); \ HookWrapper3(GLsync, glcreatesyncfromcleventarb, struct _cl_context *, context, struct _cl_event *, event, GLbitfield, flags); \ - HookWrapper6(void, gldispatchcomputegroupsizearb, GLuint, num_groups_x, GLuint, num_groups_y, GLuint, num_groups_z, GLuint, group_size_x, GLuint, group_size_y, GLuint, group_size_z); \ HookWrapper5(void, glmultidrawarraysindirectcountarb, GLenum, mode, GLintptr, indirect, GLintptr, drawcount, GLsizei, maxdrawcount, GLsizei, stride); \ HookWrapper6(void, glmultidrawelementsindirectcountarb, GLenum, mode, GLenum, type, GLintptr, indirect, GLintptr, drawcount, GLsizei, maxdrawcount, GLsizei, stride); \ HookWrapper5(void, glnamedstringarb, GLenum, type, GLint, namelen, const GLchar *, name, GLint, stringlen, const GLchar *, string); \ @@ -1887,9 +1891,6 @@ HookWrapper3(void, glgetprogramivarb, GLenum, target, GLenum, pname, GLint *, params); \ HookWrapper3(void, glgetprogramstringarb, GLenum, target, GLenum, pname, void *, string); \ HookWrapper1(GLboolean, glisprogramarb, GLuint, program); \ - HookWrapper3(void, glprogramparameteriarb, GLuint, program, GLenum, pname, GLint, value); \ - HookWrapper4(void, glframebuffertexturearb, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level); \ - HookWrapper5(void, glframebuffertexturelayerarb, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level, GLint, layer); \ HookWrapper5(void, glframebuffertexturefacearb, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level, GLenum, face); \ HookWrapper6(void, glcolortable, GLenum, target, GLenum, internalformat, GLsizei, width, GLenum, format, GLenum, type, const void *, table); \ HookWrapper3(void, glcolortableparameterfv, GLenum, target, GLenum, pname, const GLfloat *, params); \ @@ -3432,7 +3433,6 @@ HandleUnsupported(PFNGLVERTEXATTRIBL1UI64VARBPROC, glvertexattribl1ui64varb); \ HandleUnsupported(PFNGLGETVERTEXATTRIBLUI64VARBPROC, glgetvertexattriblui64varb); \ HandleUnsupported(PFNGLCREATESYNCFROMCLEVENTARBPROC, glcreatesyncfromcleventarb); \ - HandleUnsupported(PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC, gldispatchcomputegroupsizearb); \ HandleUnsupported(PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC, glmultidrawarraysindirectcountarb); \ HandleUnsupported(PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC, glmultidrawelementsindirectcountarb); \ HandleUnsupported(PFNGLNAMEDSTRINGARBPROC, glnamedstringarb); \ @@ -3581,9 +3581,6 @@ HandleUnsupported(PFNGLGETPROGRAMIVARBPROC, glgetprogramivarb); \ HandleUnsupported(PFNGLGETPROGRAMSTRINGARBPROC, glgetprogramstringarb); \ HandleUnsupported(PFNGLISPROGRAMARBPROC, glisprogramarb); \ - HandleUnsupported(PFNGLPROGRAMPARAMETERIARBPROC, glprogramparameteriarb); \ - HandleUnsupported(PFNGLFRAMEBUFFERTEXTUREARBPROC, glframebuffertexturearb); \ - HandleUnsupported(PFNGLFRAMEBUFFERTEXTURELAYERARBPROC, glframebuffertexturelayerarb); \ HandleUnsupported(PFNGLFRAMEBUFFERTEXTUREFACEARBPROC, glframebuffertexturefacearb); \ HandleUnsupported(PFNGLCOLORTABLEPROC, glcolortable); \ HandleUnsupported(PFNGLCOLORTABLEPARAMETERFVPROC, glcolortableparameterfv); \ diff --git a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp index 0a578761d..f940d3184 100644 --- a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp @@ -74,6 +74,60 @@ void WrappedOpenGL::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, } } +bool WrappedOpenGL::Serialise_glDispatchComputeGroupSizeARB(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z) +{ + SERIALISE_ELEMENT(uint32_t, X, num_groups_x); + SERIALISE_ELEMENT(uint32_t, Y, num_groups_y); + SERIALISE_ELEMENT(uint32_t, Z, num_groups_z); + SERIALISE_ELEMENT(uint32_t, sX, group_size_x); + SERIALISE_ELEMENT(uint32_t, sY, group_size_y); + SERIALISE_ELEMENT(uint32_t, sZ, group_size_z); + + if(m_State <= EXECUTING) + { + m_Real.glDispatchComputeGroupSizeARB(X, Y, Z, sX, sY, sZ); + } + + const string desc = m_pSerialiser->GetDebugStr(); + + vector debugMessages = Serialise_DebugMessages(); + + if(m_State == READING) + { + AddEvent(DISPATCH_COMPUTE, desc); + string name = "glDispatchComputeGroupSizeARB(" + + ToStr::Get(X) + ", " + + ToStr::Get(Y) + ", " + + ToStr::Get(Z) + ", " + + ToStr::Get(sX) + ", " + + ToStr::Get(sY) + ", " + + ToStr::Get(sZ) + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_Dispatch; + + draw.debugMessages = debugMessages; + + AddDrawcall(draw, true); + } + + return true; +} + +void WrappedOpenGL::glDispatchComputeGroupSizeARB(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z) +{ + m_Real.glDispatchComputeGroupSizeARB(num_groups_x, num_groups_y, num_groups_z, group_size_x, group_size_y, group_size_z); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(DISPATCH_COMPUTE_GROUP_SIZE); + Serialise_glDispatchComputeGroupSizeARB(num_groups_x, num_groups_y, num_groups_z, group_size_x, group_size_y, group_size_z); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glDispatchComputeIndirect(GLintptr indirect) { SERIALISE_ELEMENT(uint64_t, offs, indirect);