diff --git a/scripts/code_generation_hashes/OpenGL_dispatch_table.json b/scripts/code_generation_hashes/OpenGL_dispatch_table.json index b94157bf3..b40e9372f 100644 --- a/scripts/code_generation_hashes/OpenGL_dispatch_table.json +++ b/scripts/code_generation_hashes/OpenGL_dispatch_table.json @@ -2,17 +2,17 @@ "src/libANGLE/renderer/angle_format.py": "601bfb757e052c50ac8f4cb4e0b58eb5", "src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp": - "a2359f6e62a34b03ad6304811df39ce7", + "26e64fe13d7248c4ae04d6c8f3ac5890", "src/libANGLE/renderer/gl/DispatchTableGL_autogen.h": - "df251bcc28f69eb873b5f9773e814f32", + "94e376d7f3b7e2ef6587284f825dfe39", "src/libANGLE/renderer/gl/generate_gl_dispatch_table.py": "2fb7f3906b4966b192c629228bc3e961", "src/libANGLE/renderer/gl/gl_bindings_data.json": - "c3859551f6e137dbf4663a81b088cbf7", + "1c8d597d390eff780a14c703105304c4", "src/libANGLE/renderer/gl/null_functions.cpp": - "d5082eb846b2396b998d642b78a0019a", + "38cd5858fa583e39bd76744ff532db49", "src/libANGLE/renderer/gl/null_functions.h": - "c2a35eb1408399f78b5d177bff70a9c6", + "dff00d65990f16e1f77a73d12085a408", "third_party/OpenGL-Registry/src/xml/gl.xml": "49f0afe5cac23951c74420e457b0cb23" } \ No newline at end of file diff --git a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp index 40d73f147..fed56f48e 100644 --- a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp +++ b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp @@ -2818,6 +2818,11 @@ void DispatchTableGL::initProcsSharedExtensions(const std::set &ext ASSIGN("glMaxShaderCompilerThreadsKHR", maxShaderCompilerThreadsKHR); } + if (extensions.count("GL_MESA_framebuffer_flip_y") != 0) + { + ASSIGN("glFramebufferParameteriMESA", framebufferParameteriMESA); + } + if (extensions.count("GL_NV_fence") != 0) { ASSIGN("glDeleteFencesNV", deleteFencesNV); @@ -5634,6 +5639,11 @@ void DispatchTableGL::initProcsSharedExtensionsNULL(const std::set maxShaderCompilerThreadsKHR = &glMaxShaderCompilerThreadsKHRNULL; } + if (extensions.count("GL_MESA_framebuffer_flip_y") != 0) + { + framebufferParameteriMESA = &glFramebufferParameteriMESANULL; + } + if (extensions.count("GL_NV_fence") != 0) { deleteFencesNV = &glDeleteFencesNVNULL; diff --git a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h index 2ed4181cc..1c3ca6d77 100644 --- a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h +++ b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h @@ -807,6 +807,9 @@ class DispatchTableGL : angle::NonCopyable // GL_KHR_parallel_shader_compile PFNGLMAXSHADERCOMPILERTHREADSKHRPROC maxShaderCompilerThreadsKHR = nullptr; + // GL_MESA_framebuffer_flip_y + PFNGLFRAMEBUFFERPARAMETERIMESAPROC framebufferParameteriMESA = nullptr; + // GL_NV_framebuffer_blit PFNGLBLITFRAMEBUFFERNVPROC blitFramebufferNV = nullptr; diff --git a/src/libANGLE/renderer/gl/FramebufferGL.cpp b/src/libANGLE/renderer/gl/FramebufferGL.cpp index 1b8b6be7c..fc6eff48c 100644 --- a/src/libANGLE/renderer/gl/FramebufferGL.cpp +++ b/src/libANGLE/renderer/gl/FramebufferGL.cpp @@ -1327,8 +1327,17 @@ angle::Result FramebufferGL::syncState(const gl::Context *context, mState.getDefaultLayers()); break; case Framebuffer::DIRTY_BIT_FLIP_Y: - functions->framebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, - gl::ConvertToGLBoolean(mState.getFlipY())); + ASSERT(functions->framebufferParameteri || functions->framebufferParameteriMESA); + if (functions->framebufferParameteri) + { + functions->framebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, + gl::ConvertToGLBoolean(mState.getFlipY())); + } + else + { + functions->framebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, + gl::ConvertToGLBoolean(mState.getFlipY())); + } break; default: { diff --git a/src/libANGLE/renderer/gl/functionsgl_typedefs.h b/src/libANGLE/renderer/gl/functionsgl_typedefs.h index 6dd29def2..8f6bb0d99 100644 --- a/src/libANGLE/renderer/gl/functionsgl_typedefs.h +++ b/src/libANGLE/renderer/gl/functionsgl_typedefs.h @@ -1993,6 +1993,9 @@ typedef void(INTERNAL_GL_APIENTRY *PFNGLPOLYGONOFFSETCLAMPEXTPROC)(GLfloat facto // GL_EXT_shader_framebuffer_fetch_non_coherent typedef void(INTERNAL_GL_APIENTRY *PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC)(); +// GL_MESA_framebuffer_flip_y +typedef void(INTERNAL_GL_APIENTRY *PFNGLFRAMEBUFFERPARAMETERIMESAPROC)(GLenum, GLenum, GLint); + } // namespace rx #endif // LIBANGLE_RENDERER_GL_FUNCTIONSGLTYPEDEFS_H_ diff --git a/src/libANGLE/renderer/gl/gl_bindings_data.json b/src/libANGLE/renderer/gl/gl_bindings_data.json index a2279b425..204f80914 100644 --- a/src/libANGLE/renderer/gl/gl_bindings_data.json +++ b/src/libANGLE/renderer/gl/gl_bindings_data.json @@ -876,5 +876,10 @@ "GL_EXT_shader_framebuffer_fetch_non_coherent": [ "FramebufferFetchBarrierEXT" + ], + + "GL_MESA_framebuffer_flip_y": + [ + "FramebufferParameteriMESA" ] } diff --git a/src/libANGLE/renderer/gl/null_functions.cpp b/src/libANGLE/renderer/gl/null_functions.cpp index b909f1e46..c569d0805 100644 --- a/src/libANGLE/renderer/gl/null_functions.cpp +++ b/src/libANGLE/renderer/gl/null_functions.cpp @@ -814,6 +814,9 @@ void INTERNAL_GL_APIENTRY glFramebufferFetchBarrierEXTNULL() {} void INTERNAL_GL_APIENTRY glFramebufferParameteriNULL(GLenum target, GLenum pname, GLint param) {} +void INTERNAL_GL_APIENTRY glFramebufferParameteriMESANULL(GLenum target, GLenum pname, GLint param) +{} + void INTERNAL_GL_APIENTRY glFramebufferRenderbufferNULL(GLenum target, GLenum attachment, GLenum renderbuffertarget, diff --git a/src/libANGLE/renderer/gl/null_functions.h b/src/libANGLE/renderer/gl/null_functions.h index 488ef62b9..197736051 100644 --- a/src/libANGLE/renderer/gl/null_functions.h +++ b/src/libANGLE/renderer/gl/null_functions.h @@ -551,6 +551,7 @@ void INTERNAL_GL_APIENTRY glFlushMappedNamedBufferRangeNULL(GLuint buffer, GLsizeiptr length); void INTERNAL_GL_APIENTRY glFramebufferFetchBarrierEXTNULL(); void INTERNAL_GL_APIENTRY glFramebufferParameteriNULL(GLenum target, GLenum pname, GLint param); +void INTERNAL_GL_APIENTRY glFramebufferParameteriMESANULL(GLenum target, GLenum pname, GLint param); void INTERNAL_GL_APIENTRY glFramebufferRenderbufferNULL(GLenum target, GLenum attachment, GLenum renderbuffertarget,