From 3acb0270019e22cb21389e4ac8c70c1045855cd6 Mon Sep 17 00:00:00 2001 From: Janos Pantos Date: Thu, 3 Aug 2017 13:37:41 +0200 Subject: [PATCH] Add support for GL_{OES|NV}_viewport_array extensions --- renderdoc/driver/gl/gl_driver.cpp | 2 + renderdoc/driver/gl/gl_driver.h | 4 + renderdoc/driver/gl/gl_hookset.h | 25 ++++--- renderdoc/driver/gl/gl_hookset_defs.h | 74 +++++++------------ renderdoc/driver/gl/gl_renderstate.cpp | 45 ++++++++--- .../driver/gl/wrappers/gl_state_funcs.cpp | 54 +++++++++++++- 6 files changed, 134 insertions(+), 70 deletions(-) diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 3254e9f4e..fc7142a28 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -788,6 +788,7 @@ void WrappedOpenGL::BuildGLESExtensions() m_GLESExtensions.push_back("GL_KHR_texture_compression_astc_hdr"); m_GLESExtensions.push_back("GL_KHR_texture_compression_astc_ldr"); m_GLESExtensions.push_back("GL_KHR_texture_compression_astc_sliced_3d"); + m_GLESExtensions.push_back("GL_NV_viewport_array"); m_GLESExtensions.push_back("GL_OES_compressed_ETC1_RGB8_texture"); m_GLESExtensions.push_back("GL_OES_copy_image"); m_GLESExtensions.push_back("GL_OES_depth24"); @@ -818,6 +819,7 @@ void WrappedOpenGL::BuildGLESExtensions() m_GLESExtensions.push_back("GL_OES_texture_storage_multisample_2d_array"); m_GLESExtensions.push_back("GL_OES_vertex_array_object"); m_GLESExtensions.push_back("GL_OES_vertex_half_float"); + m_GLESExtensions.push_back("GL_OES_viewport_array"); m_GLESExtensions.push_back("GL_OVR_multiview"); m_GLESExtensions.push_back("GL_OVR_multiview2"); m_GLESExtensions.push_back("GL_OVR_multiview_multisampled_render_to_texture"); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 4ac92f760..bbe96daa2 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -651,8 +651,12 @@ public: IMPLEMENT_FUNCTION_SERIALISED(void, glDepthRangef(GLfloat nearVal, GLfloat farVal)); IMPLEMENT_FUNCTION_SERIALISED(void, glDepthRangeIndexed(GLuint index, GLdouble nearVal, GLdouble farVal)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDepthRangeIndexedfOES(GLuint index, GLfloat nearVal, + GLfloat farVal)); IMPLEMENT_FUNCTION_SERIALISED(void, glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDepthRangeArrayfvOES(GLuint first, GLsizei count, + const GLfloat *v)); IMPLEMENT_FUNCTION_SERIALISED(void, glDepthBoundsEXT(GLclampd nearVal, GLclampd farVal)); IMPLEMENT_FUNCTION_SERIALISED(void, glClipControl(GLenum origin, GLenum depth)); IMPLEMENT_FUNCTION_SERIALISED(void, glProvokingVertex(GLenum mode)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index e414d1b98..d695b4532 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -141,7 +141,7 @@ struct GLHookSet PFNGLGETSTRINGIPROC glGetStringi; PFNGLGETBOOLEANI_VPROC glGetBooleani_v; PFNGLGETINTEGERI_VPROC glGetIntegeri_v; - PFNGLGETFLOATI_VPROC glGetFloati_v; // aliases glGetFloati_vEXT + PFNGLGETFLOATI_VPROC glGetFloati_v; // aliases glGetFloati_vEXT, glGetFloati_vOES, glGetFloati_vNV PFNGLGETDOUBLEI_VPROC glGetDoublei_v; // aliases glGetDoublei_vEXT PFNGLGETINTEGER64I_VPROC glGetInteger64i_v; PFNGLGETINTEGER64VPROC glGetInteger64v; @@ -276,9 +276,9 @@ struct GLHookSet PFNGLOBJECTLABELPROC glObjectLabel; // aliases glObjectLabelKHR PFNGLLABELOBJECTEXTPROC glLabelObjectEXT; PFNGLOBJECTPTRLABELPROC glObjectPtrLabel; // aliases glObjectPtrLabelKHR - PFNGLENABLEIPROC glEnablei; // aliases glEnableiEXT, glEnableIndexedEXT - PFNGLDISABLEIPROC glDisablei; // aliases glDisableiEXT, glDisableIndexedEXT - PFNGLISENABLEDIPROC glIsEnabledi; // aliases glIsEnablediEXT, glIsEnabledIndexedEXT + PFNGLENABLEIPROC glEnablei; // aliases glEnableiEXT, glEnableIndexedEXT, glEnableiOES, glEnableiNV + PFNGLDISABLEIPROC glDisablei; // aliases glDisableiEXT, glDisableIndexedEXT, glDisableiOES, glDisableiNV + PFNGLISENABLEDIPROC glIsEnabledi; // aliases glIsEnablediEXT, glIsEnabledIndexedEXT, glIsEnablediOES, glIsEnablediNV PFNGLISBUFFERPROC glIsBuffer; // aliases glIsBufferARB PFNGLISFRAMEBUFFERPROC glIsFramebuffer; // aliases glIsFramebufferEXT PFNGLISPROGRAMPROC glIsProgram; @@ -476,12 +476,12 @@ struct GLHookSet PFNGLINVALIDATESUBFRAMEBUFFERPROC glInvalidateSubFramebuffer; PFNGLINVALIDATETEXIMAGEPROC glInvalidateTexImage; PFNGLINVALIDATETEXSUBIMAGEPROC glInvalidateTexSubImage; - PFNGLSCISSORARRAYVPROC glScissorArrayv; - PFNGLSCISSORINDEXEDPROC glScissorIndexed; - PFNGLSCISSORINDEXEDVPROC glScissorIndexedv; - PFNGLVIEWPORTINDEXEDFPROC glViewportIndexedf; - PFNGLVIEWPORTINDEXEDFVPROC glViewportIndexedfv; - PFNGLVIEWPORTARRAYVPROC glViewportArrayv; + PFNGLSCISSORARRAYVPROC glScissorArrayv; // aliases glScissorArrayvOES, glScissorArrayvNV + PFNGLSCISSORINDEXEDPROC glScissorIndexed; // aliases glScissorIndexedOES, glScissorIndexedNV + PFNGLSCISSORINDEXEDVPROC glScissorIndexedv; // aliases glScissorIndexedvOES, glScissorIndexedvNV + PFNGLVIEWPORTINDEXEDFPROC glViewportIndexedf; // aliases glViewportIndexedfOES, glViewportIndexedfNV + PFNGLVIEWPORTINDEXEDFVPROC glViewportIndexedfv; // aliases glViewportIndexedfvOES, glViewportIndexedfvNV + PFNGLVIEWPORTARRAYVPROC glViewportArrayv; // aliases glViewportArrayvOES, glViewportArrayvNV PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; PFNGLSHADERSTORAGEBLOCKBINDINGPROC glShaderStorageBlockBinding; PFNGLUNIFORMSUBROUTINESUIVPROC glUniformSubroutinesuiv; @@ -613,6 +613,11 @@ struct GLHookSet // GLES: EXT_discard_framebuffer PFNGLDISCARDFRAMEBUFFEREXTPROC glDiscardFramebufferEXT; + // GLES: OES_viewport_array, NV_viewport_array + // only 2 functions which have different parameter types, so they can't be aliases of the ARB functions + PFNGLDEPTHRANGEARRAYFVOESPROC glDepthRangeArrayfvOES; // aliases glDepthRangeArrayfvNV + PFNGLDEPTHRANGEINDEXEDFOESPROC glDepthRangeIndexedfOES; // aliases glDepthRangeIndexedfNV + // ARB_shading_language_include PFNGLNAMEDSTRINGARBPROC glNamedStringARB; PFNGLDELETENAMEDSTRINGARBPROC glDeleteNamedStringARB; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 597bd5a7d..9bc25222f 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -346,12 +346,18 @@ HookExtension(PFNGLENABLEIPROC, glEnablei); \ HookExtensionAlias(PFNGLENABLEIPROC, glEnablei, glEnableiEXT); \ HookExtensionAlias(PFNGLENABLEIPROC, glEnablei, glEnableIndexedEXT); \ + HookExtensionAlias(PFNGLENABLEIPROC, glEnablei, glEnableiOES); \ + HookExtensionAlias(PFNGLENABLEIPROC, glEnablei, glEnableiNV); \ HookExtension(PFNGLDISABLEIPROC, glDisablei); \ HookExtensionAlias(PFNGLDISABLEIPROC, glDisablei, glDisableiEXT); \ HookExtensionAlias(PFNGLDISABLEIPROC, glDisablei, glDisableIndexedEXT); \ + HookExtensionAlias(PFNGLDISABLEIPROC, glDisablei, glDisableiOES); \ + HookExtensionAlias(PFNGLDISABLEIPROC, glDisablei, glDisableiNV); \ HookExtension(PFNGLISENABLEDIPROC, glIsEnabledi); \ HookExtensionAlias(PFNGLISENABLEDIPROC, glIsEnabledi, glIsEnablediEXT); \ HookExtensionAlias(PFNGLISENABLEDIPROC, glIsEnabledi, glIsEnabledIndexedEXT); \ + HookExtensionAlias(PFNGLISENABLEDIPROC, glIsEnabledi, glIsEnablediOES); \ + HookExtensionAlias(PFNGLISENABLEDIPROC, glIsEnabledi, glIsEnablediNV); \ HookExtension(PFNGLBEGINTRANSFORMFEEDBACKPROC, glBeginTransformFeedback); \ HookExtensionAlias(PFNGLBEGINTRANSFORMFEEDBACKPROC, glBeginTransformFeedback, glBeginTransformFeedbackEXT); \ HookExtension(PFNGLENDTRANSFORMFEEDBACKPROC, glEndTransformFeedback); \ @@ -793,15 +799,29 @@ HookExtension(PFNGLGETVERTEXATTRIBLDVPROC, glGetVertexAttribLdv); \ HookExtensionAlias(PFNGLGETVERTEXATTRIBLDVPROC, glGetVertexAttribLdv, glGetVertexAttribLdvEXT); \ HookExtension(PFNGLVIEWPORTARRAYVPROC, glViewportArrayv); \ + HookExtensionAlias(PFNGLVIEWPORTARRAYVPROC, glViewportArrayv, glViewportArrayvOES); \ + HookExtensionAlias(PFNGLVIEWPORTARRAYVPROC, glViewportArrayv, glViewportArrayvNV); \ HookExtension(PFNGLVIEWPORTINDEXEDFPROC, glViewportIndexedf); \ + HookExtensionAlias(PFNGLVIEWPORTINDEXEDFPROC, glViewportIndexedf, glViewportIndexedfOES); \ + HookExtensionAlias(PFNGLVIEWPORTINDEXEDFPROC, glViewportIndexedf, glViewportIndexedfNV); \ HookExtension(PFNGLVIEWPORTINDEXEDFVPROC, glViewportIndexedfv); \ + HookExtensionAlias(PFNGLVIEWPORTINDEXEDFVPROC, glViewportIndexedfv, glViewportIndexedfvOES); \ + HookExtensionAlias(PFNGLVIEWPORTINDEXEDFVPROC, glViewportIndexedfv, glViewportIndexedfvNV); \ HookExtension(PFNGLSCISSORARRAYVPROC, glScissorArrayv); \ + HookExtensionAlias(PFNGLSCISSORARRAYVPROC, glScissorArrayv, glScissorArrayvOES); \ + HookExtensionAlias(PFNGLSCISSORARRAYVPROC, glScissorArrayv, glScissorArrayvNV); \ HookExtension(PFNGLSCISSORINDEXEDPROC, glScissorIndexed); \ + HookExtensionAlias(PFNGLSCISSORINDEXEDPROC, glScissorIndexed, glScissorIndexedOES); \ + HookExtensionAlias(PFNGLSCISSORINDEXEDPROC, glScissorIndexed, glScissorIndexedNV); \ HookExtension(PFNGLSCISSORINDEXEDVPROC, glScissorIndexedv); \ + HookExtensionAlias(PFNGLSCISSORINDEXEDVPROC, glScissorIndexedv, glScissorIndexedvOES); \ + HookExtensionAlias(PFNGLSCISSORINDEXEDVPROC, glScissorIndexedv, glScissorIndexedvNV); \ HookExtension(PFNGLDEPTHRANGEARRAYVPROC, glDepthRangeArrayv); \ HookExtension(PFNGLDEPTHRANGEINDEXEDPROC, glDepthRangeIndexed); \ HookExtension(PFNGLGETFLOATI_VPROC, glGetFloati_v); \ HookExtensionAlias(PFNGLGETFLOATI_VPROC, glGetFloati_v, glGetFloati_vEXT); \ + HookExtensionAlias(PFNGLGETFLOATI_VPROC, glGetFloati_v, glGetFloati_vOES); \ + HookExtensionAlias(PFNGLGETFLOATI_VPROC, glGetFloati_v, glGetFloati_vNV); \ HookExtension(PFNGLGETDOUBLEI_VPROC, glGetDoublei_v); \ HookExtensionAlias(PFNGLGETDOUBLEI_VPROC, glGetDoublei_v, glGetDoublei_vEXT); \ HookExtension(PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC, glDrawArraysInstancedBaseInstance); \ @@ -1161,6 +1181,10 @@ HookExtension(PFNGLPRIMITIVEBOUNDINGBOXPROC, glPrimitiveBoundingBox); \ HookExtensionAlias(PFNGLPRIMITIVEBOUNDINGBOXPROC, glPrimitiveBoundingBox, glPrimitiveBoundingBoxEXT); \ HookExtensionAlias(PFNGLPRIMITIVEBOUNDINGBOXPROC, glPrimitiveBoundingBox, glPrimitiveBoundingBoxOES); \ + HookExtension(PFNGLDEPTHRANGEARRAYFVOESPROC, glDepthRangeArrayfvOES); \ + HookExtensionAlias(PFNGLDEPTHRANGEARRAYFVOESPROC, glDepthRangeArrayfvOES, glDepthRangeArrayfvNV); \ + HookExtension(PFNGLDEPTHRANGEINDEXEDFOESPROC, glDepthRangeIndexedfOES); \ + HookExtensionAlias(PFNGLDEPTHRANGEINDEXEDFOESPROC, glDepthRangeIndexedfOES, glDepthRangeIndexedfNV); \ HookExtension(PFNGLDISCARDFRAMEBUFFEREXTPROC, glDiscardFramebufferEXT); \ HookExtension(PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC, glFramebufferTexture2DMultisampleEXT); \ HookExtension(PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC, glFramebufferTextureMultisampleMultiviewOVR); \ @@ -2019,6 +2043,8 @@ HookWrapper6(void, glFramebufferTextureMultiviewOVR, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level, GLint, baseViewIndex, GLsizei, numViews); \ HookWrapper0(void, glBlendBarrier); \ HookWrapper8(void, glPrimitiveBoundingBox, GLfloat, minX, GLfloat, minY, GLfloat, minZ, GLfloat, minW, GLfloat, maxX, GLfloat, maxY, GLfloat, maxZ, GLfloat, maxW); \ + HookWrapper3(void, glDepthRangeArrayfvOES, GLuint, first, GLsizei, count, const GLfloat *, v); \ + HookWrapper3(void, glDepthRangeIndexedfOES, GLuint, index, GLfloat, n, GLfloat, f); \ HookWrapper3(void, glDiscardFramebufferEXT, GLenum, target, GLsizei, numAttachments, const GLenum *, attachments); \ HookWrapper6(void, glFramebufferTexture2DMultisampleEXT, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level, GLsizei, samples); \ HookWrapper7(void, glFramebufferTextureMultisampleMultiviewOVR, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level, GLsizei, samples, GLint, baseViewIndex, GLsizei, numViews); \ @@ -3576,27 +3602,15 @@ HookWrapper4(void, glgetnuniformuivkhr, GLuint, program, GLint, location, GLsizei, bufSize, GLuint *, params); \ HookWrapper2(void, gleglimagetargettexture2does, GLenum, target, GLeglImageOES, image); \ HookWrapper2(void, gleglimagetargetrenderbufferstorageoes, GLenum, target, GLeglImageOES, image); \ - HookWrapper2(void, glenableioes, GLenum, target, GLuint, index); \ - HookWrapper2(void, gldisableioes, GLenum, target, GLuint, index); \ HookWrapper2(void, glblendequationioes, GLuint, buf, GLenum, mode); \ HookWrapper3(void, glblendequationseparateioes, GLuint, buf, GLenum, modeRGB, GLenum, modeAlpha); \ HookWrapper3(void, glblendfuncioes, GLuint, buf, GLenum, src, GLenum, dst); \ HookWrapper5(void, glblendfuncseparateioes, GLuint, buf, GLenum, srcRGB, GLenum, dstRGB, GLenum, srcAlpha, GLenum, dstAlpha); \ HookWrapper5(void, glcolormaskioes, GLuint, index, GLboolean, r, GLboolean, g, GLboolean, b, GLboolean, a); \ - HookWrapper2(GLboolean, glisenabledioes, GLenum, target, GLuint, index); \ HookWrapper6(void, gldrawelementsinstancedbasevertexoes, GLenum, mode, GLsizei, count, GLenum, type, const void *, indices, GLsizei, instancecount, GLint, basevertex); \ HookWrapper5(void, glgetprogrambinaryoes, GLuint, program, GLsizei, bufSize, GLsizei *, length, GLenum *, binaryFormat, void *, binary); \ HookWrapper4(void, glprogrambinaryoes, GLuint, program, GLenum, binaryFormat, const void *, binary, GLint, length); \ HookWrapper8(void, gltextureviewoes, GLuint, texture, GLenum, target, GLuint, origtexture, GLenum, internalformat, GLuint, minlevel, GLuint, numlevels, GLuint, minlayer, GLuint, numlayers); \ - HookWrapper3(void, glviewportarrayvoes, GLuint, first, GLsizei, count, const GLfloat *, v); \ - HookWrapper5(void, glviewportindexedfoes, GLuint, index, GLfloat, x, GLfloat, y, GLfloat, w, GLfloat, h); \ - HookWrapper2(void, glviewportindexedfvoes, GLuint, index, const GLfloat *, v); \ - HookWrapper3(void, glscissorarrayvoes, GLuint, first, GLsizei, count, const GLint *, v); \ - HookWrapper5(void, glscissorindexedoes, GLuint, index, GLint, left, GLint, bottom, GLsizei, width, GLsizei, height); \ - HookWrapper2(void, glscissorindexedvoes, GLuint, index, const GLint *, v); \ - HookWrapper3(void, gldepthrangearrayfvoes, GLuint, first, GLsizei, count, const GLfloat *, v); \ - HookWrapper3(void, gldepthrangeindexedfoes, GLuint, index, GLfloat, n, GLfloat, f); \ - HookWrapper3(void, glgetfloati_voes, GLenum, target, GLuint, index, GLfloat *, data); \ HookWrapper10(void, glblitframebufferangle, GLint, srcX0, GLint, srcY0, GLint, srcX1, GLint, srcY1, GLint, dstX0, GLint, dstY0, GLint, dstX1, GLint, dstY1, GLbitfield, mask, GLenum, filter); \ HookWrapper5(void, glrenderbufferstoragemultisampleangle, GLenum, target, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height); \ HookWrapper4(void, gldrawarraysinstancedangle, GLenum, mode, GLint, first, GLsizei, count, GLsizei, primcount); \ @@ -3685,18 +3699,6 @@ HookWrapper4(void, gluniformmatrix4x3fvnv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value); \ HookWrapper2(void, glpolygonmodenv, GLenum, face, GLenum, mode); \ HookWrapper1(void, glreadbuffernv, GLenum, mode); \ - HookWrapper3(void, glviewportarrayvnv, GLuint, first, GLsizei, count, const GLfloat *, v); \ - HookWrapper5(void, glviewportindexedfnv, GLuint, index, GLfloat, x, GLfloat, y, GLfloat, w, GLfloat, h); \ - HookWrapper2(void, glviewportindexedfvnv, GLuint, index, const GLfloat *, v); \ - HookWrapper3(void, glscissorarrayvnv, GLuint, first, GLsizei, count, const GLint *, v); \ - HookWrapper5(void, glscissorindexednv, GLuint, index, GLint, left, GLint, bottom, GLsizei, width, GLsizei, height); \ - HookWrapper2(void, glscissorindexedvnv, GLuint, index, const GLint *, v); \ - HookWrapper3(void, gldepthrangearrayfvnv, GLuint, first, GLsizei, count, const GLfloat *, v); \ - HookWrapper3(void, gldepthrangeindexedfnv, GLuint, index, GLfloat, n, GLfloat, f); \ - HookWrapper3(void, glgetfloati_vnv, GLenum, target, GLuint, index, GLfloat *, data); \ - HookWrapper2(void, glenableinv, GLenum, target, GLuint, index); \ - HookWrapper2(void, gldisableinv, GLenum, target, GLuint, index); \ - HookWrapper2(GLboolean, glisenabledinv, GLenum, target, GLuint, index); \ HookWrapper5(void, glviewportswizzlenv, GLuint, index, GLenum, swizzlex, GLenum, swizzley, GLenum, swizzlez, GLenum, swizzlew); \ HookWrapper2(void, glalphafuncqcom, GLenum, func, GLclampf, ref); \ HookWrapper3(void, glgetdrivercontrolsqcom, GLint *, num, GLsizei, size, GLuint *, driverControls); \ @@ -5539,27 +5541,15 @@ HandleUnsupported(PFNGLGETNUNIFORMUIVKHRPROC, glgetnuniformuivkhr); \ HandleUnsupported(PFNGLEGLIMAGETARGETTEXTURE2DOESPROC, gleglimagetargettexture2does); \ HandleUnsupported(PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC, gleglimagetargetrenderbufferstorageoes); \ - HandleUnsupported(PFNGLENABLEIOESPROC, glenableioes); \ - HandleUnsupported(PFNGLDISABLEIOESPROC, gldisableioes); \ HandleUnsupported(PFNGLBLENDEQUATIONIOESPROC, glblendequationioes); \ HandleUnsupported(PFNGLBLENDEQUATIONSEPARATEIOESPROC, glblendequationseparateioes); \ HandleUnsupported(PFNGLBLENDFUNCIOESPROC, glblendfuncioes); \ HandleUnsupported(PFNGLBLENDFUNCSEPARATEIOESPROC, glblendfuncseparateioes); \ HandleUnsupported(PFNGLCOLORMASKIOESPROC, glcolormaskioes); \ - HandleUnsupported(PFNGLISENABLEDIOESPROC, glisenabledioes); \ HandleUnsupported(PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC, gldrawelementsinstancedbasevertexoes); \ HandleUnsupported(PFNGLGETPROGRAMBINARYOESPROC, glgetprogrambinaryoes); \ HandleUnsupported(PFNGLPROGRAMBINARYOESPROC, glprogrambinaryoes); \ HandleUnsupported(PFNGLTEXTUREVIEWOESPROC, gltextureviewoes); \ - HandleUnsupported(PFNGLVIEWPORTARRAYVOESPROC, glviewportarrayvoes); \ - HandleUnsupported(PFNGLVIEWPORTINDEXEDFOESPROC, glviewportindexedfoes); \ - HandleUnsupported(PFNGLVIEWPORTINDEXEDFVOESPROC, glviewportindexedfvoes); \ - HandleUnsupported(PFNGLSCISSORARRAYVOESPROC, glscissorarrayvoes); \ - HandleUnsupported(PFNGLSCISSORINDEXEDOESPROC, glscissorindexedoes); \ - HandleUnsupported(PFNGLSCISSORINDEXEDVOESPROC, glscissorindexedvoes); \ - HandleUnsupported(PFNGLDEPTHRANGEARRAYFVOESPROC, gldepthrangearrayfvoes); \ - HandleUnsupported(PFNGLDEPTHRANGEINDEXEDFOESPROC, gldepthrangeindexedfoes); \ - HandleUnsupported(PFNGLGETFLOATI_VOESPROC, glgetfloati_voes); \ HandleUnsupported(PFNGLBLITFRAMEBUFFERANGLEPROC, glblitframebufferangle); \ HandleUnsupported(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC, glrenderbufferstoragemultisampleangle); \ HandleUnsupported(PFNGLDRAWARRAYSINSTANCEDANGLEPROC, gldrawarraysinstancedangle); \ @@ -5648,18 +5638,6 @@ HandleUnsupported(PFNGLUNIFORMMATRIX4X3FVNVPROC, gluniformmatrix4x3fvnv); \ HandleUnsupported(PFNGLPOLYGONMODENVPROC, glpolygonmodenv); \ HandleUnsupported(PFNGLREADBUFFERNVPROC, glreadbuffernv); \ - HandleUnsupported(PFNGLVIEWPORTARRAYVNVPROC, glviewportarrayvnv); \ - HandleUnsupported(PFNGLVIEWPORTINDEXEDFNVPROC, glviewportindexedfnv); \ - HandleUnsupported(PFNGLVIEWPORTINDEXEDFVNVPROC, glviewportindexedfvnv); \ - HandleUnsupported(PFNGLSCISSORARRAYVNVPROC, glscissorarrayvnv); \ - HandleUnsupported(PFNGLSCISSORINDEXEDNVPROC, glscissorindexednv); \ - HandleUnsupported(PFNGLSCISSORINDEXEDVNVPROC, glscissorindexedvnv); \ - HandleUnsupported(PFNGLDEPTHRANGEARRAYFVNVPROC, gldepthrangearrayfvnv); \ - HandleUnsupported(PFNGLDEPTHRANGEINDEXEDFNVPROC, gldepthrangeindexedfnv); \ - HandleUnsupported(PFNGLGETFLOATI_VNVPROC, glgetfloati_vnv); \ - HandleUnsupported(PFNGLENABLEINVPROC, glenableinv); \ - HandleUnsupported(PFNGLDISABLEINVPROC, gldisableinv); \ - HandleUnsupported(PFNGLISENABLEDINVPROC, glisenabledinv); \ HandleUnsupported(PFNGLVIEWPORTSWIZZLENVPROC, glviewportswizzlenv); \ HandleUnsupported(PFNGLALPHAFUNCQCOMPROC, glalphafuncqcom); \ HandleUnsupported(PFNGLGETDRIVERCONTROLSQCOMPROC, glgetdrivercontrolsqcom); \ diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 9eeb3f717..ae6db362f 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -993,7 +993,18 @@ void GLRenderState::FetchState(void *ctx, WrappedOpenGL *gl) } for(GLuint i = 0; i < RDCMIN(maxViews, (GLuint)ARRAY_COUNT(DepthRanges)); i++) - m_Real->glGetDoublei_v(eGL_DEPTH_RANGE, i, &DepthRanges[i].nearZ); + { + if(IsGLES) + { + float v[2]; + m_Real->glGetFloati_v(eGL_DEPTH_RANGE, i, v); + DepthRanges[i] = {(double)v[0], (double)v[1]}; + } + else + { + m_Real->glGetDoublei_v(eGL_DEPTH_RANGE, i, &DepthRanges[i].nearZ); + } + } } else { @@ -1004,8 +1015,16 @@ void GLRenderState::FetchState(void *ctx, WrappedOpenGL *gl) m_Real->glGetFloatv(eGL_VIEWPORT, &Viewports[0].x); m_Real->glGetIntegerv(eGL_SCISSOR_BOX, &Scissors[0].x); Scissors[0].enabled = (m_Real->glIsEnabled(eGL_SCISSOR_TEST) == GL_TRUE); - if(!IsGLES) + if(IsGLES) + { + float v[2]; + m_Real->glGetFloatv(eGL_DEPTH_RANGE, v); + DepthRanges[0] = {(double)v[0], (double)v[1]}; + } + else + { m_Real->glGetDoublev(eGL_DEPTH_RANGE, &DepthRanges[0].nearZ); + } for(GLuint i = 1; i < (GLuint)ARRAY_COUNT(Viewports); i++) memcpy(&Viewports[i], &Viewports[0], sizeof(Viewports[i])); @@ -1013,11 +1032,8 @@ void GLRenderState::FetchState(void *ctx, WrappedOpenGL *gl) for(GLuint i = 1; i < (GLuint)ARRAY_COUNT(Scissors); i++) memcpy(&Scissors[i], &Scissors[0], sizeof(Scissors[i])); - if(!IsGLES) - { - for(GLuint i = 1; i < (GLuint)ARRAY_COUNT(DepthRanges); i++) - memcpy(&DepthRanges[i], &DepthRanges[0], sizeof(DepthRanges[i])); - } + for(GLuint i = 1; i < (GLuint)ARRAY_COUNT(DepthRanges); i++) + memcpy(&DepthRanges[i], &DepthRanges[0], sizeof(DepthRanges[i])); } m_Real->glGetIntegerv(eGL_DRAW_FRAMEBUFFER_BINDING, (GLint *)&DrawFBO); @@ -1388,8 +1404,15 @@ void GLRenderState::ApplyState(void *ctx, WrappedOpenGL *gl) for(GLuint i = 0; i < RDCMIN(maxViews, (GLuint)ARRAY_COUNT(DepthRanges)); i++) { - double v[2] = {DepthRanges[i].nearZ, DepthRanges[i].farZ}; - m_Real->glDepthRangeArrayv(i, 1, v); + if(IsGLES) + { + float v[2] = {(float)DepthRanges[i].nearZ, (float)DepthRanges[i].farZ}; + m_Real->glDepthRangeArrayfvOES(i, 1, v); + } + else + { + m_Real->glDepthRangeArrayv(i, 1, &DepthRanges[i].nearZ); + } } } else @@ -1404,7 +1427,9 @@ void GLRenderState::ApplyState(void *ctx, WrappedOpenGL *gl) else m_Real->glDisable(eGL_SCISSOR_TEST); - if(!IsGLES) + if(IsGLES) + m_Real->glDepthRangef((float)DepthRanges[0].nearZ, (float)DepthRanges[0].farZ); + else m_Real->glDepthRange(DepthRanges[0].nearZ, DepthRanges[0].farZ); } diff --git a/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp index d7d010fb1..275d9c250 100644 --- a/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp @@ -702,7 +702,12 @@ bool WrappedOpenGL::Serialise_glDepthRangeIndexed(GLuint index, GLdouble nearVal SERIALISE_ELEMENT(GLdouble, f, farVal); if(m_State <= EXECUTING) - m_Real.glDepthRangeIndexed(i, n, f); + { + if(IsGLES) + m_Real.glDepthRangeIndexedfOES(i, (GLfloat)n, (GLfloat)f); + else + m_Real.glDepthRangeIndexed(i, n, f); + } return true; } @@ -720,6 +725,19 @@ void WrappedOpenGL::glDepthRangeIndexed(GLuint index, GLdouble nearVal, GLdouble } } +void WrappedOpenGL::glDepthRangeIndexedfOES(GLuint index, GLfloat nearVal, GLfloat farVal) +{ + m_Real.glDepthRangeIndexedfOES(index, nearVal, farVal); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(DEPTH_RANGE_IDX); + Serialise_glDepthRangeIndexed(index, (GLdouble)nearVal, (GLdouble)farVal); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v) { SERIALISE_ELEMENT(uint32_t, idx, first); @@ -728,7 +746,20 @@ bool WrappedOpenGL::Serialise_glDepthRangeArrayv(GLuint first, GLsizei count, co if(m_State <= EXECUTING) { - m_Real.glDepthRangeArrayv(idx, cnt, ranges); + if(IsGLES) + { + GLfloat *fv = new GLfloat[cnt * 2]; + for(uint32_t i = 0; i < cnt * 2; ++i) + fv[i] = (GLfloat)ranges[i]; + + m_Real.glDepthRangeArrayfvOES(idx, cnt, fv); + + delete[] fv; + } + else + { + m_Real.glDepthRangeArrayv(idx, cnt, ranges); + } } delete[] ranges; @@ -749,6 +780,25 @@ void WrappedOpenGL::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdoub } } +void WrappedOpenGL::glDepthRangeArrayfvOES(GLuint first, GLsizei count, const GLfloat *v) +{ + m_Real.glDepthRangeArrayfvOES(first, count, v); + + if(m_State == WRITING_CAPFRAME) + { + GLdouble *dv = new GLdouble[count * 2]; + for(GLsizei i = 0; i < count * 2; ++i) + dv[i] = v[i]; + + SCOPED_SERIALISE_CONTEXT(DEPTH_RANGEARRAY); + Serialise_glDepthRangeArrayv(first, count, dv); + + delete[] dv; + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glDepthBoundsEXT(GLclampd nearVal, GLclampd farVal) { SERIALISE_ELEMENT(GLdouble, n, nearVal);