mesa: Allow MESA_framebuffer_flip_y for GLES 3
authorFritz Koenig <frkoenig@google.com>
Tue, 30 Jul 2019 21:53:30 +0000 (14:53 -0700)
committerFritz Koenig <frkoenig@google.com>
Tue, 8 Oct 2019 20:53:01 +0000 (13:53 -0700)
Implement glFramebufferParameteriMESA on GLES 3 so
that the extension is not dependant on GLES 3.1

Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
docs/specs/MESA_framebuffer_flip_y.txt
src/mapi/glapi/gen/apiexec.py
src/mapi/glapi/gen/es_EXT.xml
src/mapi/glapi/gen/static_data.py
src/mesa/main/extensions_table.h
src/mesa/main/fbobject.c
src/mesa/main/fbobject.h
src/mesa/main/tests/dispatch_sanity.cpp

index 0866203689f89853c665ed37674d0d797b634f7e..891cc43fe5f5371e27440ffde734762a5d4cce1b 100644 (file)
@@ -23,7 +23,7 @@ Status
 
 Version
 
-    Version 2, June 4, 2019
+    Version 3, August, 2019
 
 Number
 
@@ -32,7 +32,7 @@ Number
 
 Dependencies
 
-    OpenGL ES 3.1 or OpenGL 4.3 is required, for FramebufferParameteri.
+    Requires OpenGL ES 3.0, OpenGL 4.3, or ARB_framebuffer_no_attachments.
 
 Overview
 
@@ -59,7 +59,10 @@ Issues
 
 New Procedures and Functions
 
-    None
+    OpenGL ES must provide the following functions:
+
+    void FramebufferParameteriMESA(enum target, enum pname, int param);
+    void GetFramebufferParameterivMESA(enum target, enum pname, int *params);
 
 New Types
 
@@ -67,20 +70,35 @@ New Types
 
 New Tokens
 
-    Accepted by the <pname> argument of FramebufferParameteri and
-    GetFramebufferParameteriv:
+    Accepted by the <pname> argument of FramebufferParameteriMESA and
+    GetFramebufferParameterivMESA:
 
         GL_FRAMEBUFFER_FLIP_Y_MESA                      0x8BBB
 
+Interactions with OpenGL 4.3, OpenGL ES 3.1, ARB_framebuffer_no_attachments
+and any other versions and extensions that provide the entry points
+FramebufferParameteri and GetFramebufferParameteriv
+
+        Token GL_FRAMEBUFFER_FLIP_Y_MESA is accepted as the <pname> argument of
+        FramebufferParameteri and GetFramebufferParameteriv.
+
 Errors
 
-    An INVALID_OPERATION error is generated by GetFramebufferParameteriv if the
-    default framebuffer is bound to <target> and <pname> is FRAMEBUFFER_FLIP_Y_MESA.
+    An INVALID_OPERATION error is generated by GetFramebufferParameteriv or
+    GetFramebufferParameterivMESA if the default framebuffer is bound
+    to <target> and <pname> is GL_FRAMEBUFFER_FLIP_Y_MESA.
+
+
 
 
 
 Revision History
 
+    Version 3, August, 2019
+        Allow OpenGL ES 3.0 to implement by adding functions
+        FramebufferParameteriMESA and GetFramebufferParameterivMESA which were
+        previously only available in OpenGL ES 3.1.
+
     Version 2, June, 2019
         Enable extension for OpenGL 4.3 and beyond
 
index 4f9229d5fcd98a5ab831670192a30c294e49ab3e..26adb00ae21a7bbb26789dd45ec67a5eaf68d9d3 100644 (file)
@@ -150,6 +150,10 @@ functions = {
     "FramebufferParameteri": exec_info(compatibility=30, core=31, es2=31),
     "GetFramebufferParameteriv": exec_info(compatibility=30, core=31, es2=31),
 
+    # OpenGL 4.3 / GL_MESA_framebuffer_flip_y.
+    "FramebufferParameteriMESA": exec_info(core=31, es2=30),
+    "GetFramebufferParameterivMESA": exec_info(core=31, es2=30),
+
     # OpenGL 4.5 / GL_ARB_direct_state_access.   Mesa can expose the extension
     # with core profile.
     "CreateTransformFeedbacks": exec_info(compatibility=31, core=31),
index be466e34ae84e3ebe1f120f993074782b6fedf2d..e3cad15679d62dfd1c1786be9e6a7eb6953fdbd6 100644 (file)
    </function>
 </category>
 
+<!-- 302. GL_MESA_framebuffer_flip_y -->
+<category name="GL_MESA_framebuffer_flip_y" number="302">
+   <enum name="GL_FRAMEBUFFER_FLIP_Y_MESA" value="0x8BBB"/>
+   <function name="FramebufferParameteriMESA" es2="3.0">
+       <param name="target" type="GLenum"/>
+       <param name="pname"  type="GLenum"/>
+       <param name="param"  type="GLint" />
+   </function>
+   <function name="GetFramebufferParameterivMESA" es2="3.0">
+       <param name="target" type="GLenum" />
+       <param name="pname"  type="GLenum" />
+       <param name="params" type="GLint *" output="true" />
+   </function>
+</category>
+
 </OpenGLAPI>
index c1b3c6a5119b14629bece369fab0fa5801376994..2f3e448750a4dd31c0d8b9ce0f9f316e092b14b8 100644 (file)
@@ -1567,6 +1567,8 @@ offsets = {
     "GetCompressedMultiTexImageEXT": 1531,
     "GetMultiTexLevelParameterivEXT": 1532,
     "GetMultiTexLevelParameterfvEXT": 1533,
+    "FramebufferParameteriMESA": 1534,
+    "GetFramebufferParameterivMESA": 1535,
 }
 
 functions = [
index 41d066174e639b4a9fe9bd37ee590df35238046f..991adfc909867178342d82dbc398afee96c65869 100644 (file)
@@ -356,7 +356,7 @@ EXT(KHR_texture_compression_astc_hdr        , KHR_texture_compression_astc_hdr
 EXT(KHR_texture_compression_astc_ldr        , KHR_texture_compression_astc_ldr       , GLL, GLC,  x , ES2, 2012)
 EXT(KHR_texture_compression_astc_sliced_3d  , KHR_texture_compression_astc_sliced_3d , GLL, GLC,  x , ES2, 2015)
 
-EXT(MESA_framebuffer_flip_y                 , MESA_framebuffer_flip_y                ,  43,  43,  x ,  31, 2018)
+EXT(MESA_framebuffer_flip_y                 , MESA_framebuffer_flip_y                ,  43,  43,  x ,  30, 2018)
 EXT(MESA_pack_invert                        , MESA_pack_invert                       , GLL, GLC,  x ,  x , 2002)
 EXT(MESA_shader_integer_functions           , MESA_shader_integer_functions          , GLL, GLC,  x ,  30, 2016)
 EXT(MESA_texture_signed_rgba                , EXT_texture_snorm                      , GLL, GLC,  x ,  x , 2009)
index 088b45aa732558d91c45fb258a3722812dffaa18..bc4f69c149e315f9d331b46e8b1a0fd15dd8b233 100644 (file)
@@ -1625,18 +1625,46 @@ invalid_pname_enum:
    _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
 }
 
+static bool
+validate_framebuffer_parameter_extensions(GLenum pname, const char *func)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
+       !ctx->Extensions.ARB_sample_locations &&
+       !ctx->Extensions.MESA_framebuffer_flip_y) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "%s not supported "
+                  "(none of ARB_framebuffer_no_attachments,"
+                  " ARB_sample_locations, or"
+                  " MESA_framebuffer_flip_y extensions are available)",
+                  func);
+      return false;
+   }
+
+   /*
+    * If only the MESA_framebuffer_flip_y extension is enabled
+    * pname can only be GL_FRAMEBUFFER_FLIP_Y_MESA
+    */
+   if (ctx->Extensions.MESA_framebuffer_flip_y &&
+       pname != GL_FRAMEBUFFER_FLIP_Y_MESA &&
+       !(ctx->Extensions.ARB_framebuffer_no_attachments ||
+         ctx->Extensions.ARB_sample_locations)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
+      return false;
+   }
+
+   return true;
+}
+
 void GLAPIENTRY
 _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param)
 {
    GET_CURRENT_CONTEXT(ctx);
    struct gl_framebuffer *fb;
 
-   if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
-       !ctx->Extensions.ARB_sample_locations) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glFramebufferParameteriv not supported "
-                  "(neither ARB_framebuffer_no_attachments nor ARB_sample_locations"
-                  " is available)");
+   if (!validate_framebuffer_parameter_extensions(pname,
+       "glFramebufferParameteri")) {
       return;
    }
 
@@ -1650,6 +1678,12 @@ _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param)
    framebuffer_parameteri(ctx, fb, pname, param, "glFramebufferParameteri");
 }
 
+void GLAPIENTRY
+_mesa_FramebufferParameteriMESA(GLenum target, GLenum pname, GLint param)
+{
+   _mesa_FramebufferParameteri(target, pname, param);
+}
+
 static bool
 validate_get_framebuffer_parameteriv_pname(struct gl_context *ctx,
                                            struct gl_framebuffer *fb,
@@ -1779,12 +1813,8 @@ _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
    GET_CURRENT_CONTEXT(ctx);
    struct gl_framebuffer *fb;
 
-   if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
-       !ctx->Extensions.ARB_sample_locations) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glGetFramebufferParameteriv not supported "
-                  "(neither ARB_framebuffer_no_attachments nor ARB_sample_locations"
-                  " is available)");
+   if (!validate_framebuffer_parameter_extensions(pname,
+       "glGetFramebufferParameteriv")) {
       return;
    }
 
@@ -1799,6 +1829,11 @@ _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
                                "glGetFramebufferParameteriv");
 }
 
+void GLAPIENTRY
+_mesa_GetFramebufferParameterivMESA(GLenum target, GLenum pname, GLint *params)
+{
+   _mesa_GetFramebufferParameteriv(target, pname, params);
+}
 
 /**
  * Remove the specified renderbuffer or texture from any attachment point in
index dcbff85eccf4b167264165f150724cd8b4f4fd7e..e44373e7dd351b040ef2d6b52cce724786c11e48 100644 (file)
@@ -404,9 +404,15 @@ _mesa_DiscardFramebufferEXT(GLenum target, GLsizei numAttachments,
 extern void GLAPIENTRY
 _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param);
 
+extern void GLAPIENTRY
+_mesa_FramebufferParameteriMESA(GLenum target, GLenum pname, GLint param);
+
 extern void GLAPIENTRY
 _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
 
+extern void GLAPIENTRY
+_mesa_GetFramebufferParameterivMESA(GLenum target, GLenum pname, GLint *params);
+
 extern void GLAPIENTRY
 _mesa_FramebufferSampleLocationsfvARB(GLenum target, GLuint start,
                                       GLsizei count, const GLfloat *v);
index 6ba5180592e1893492bd22bc07645c8fffa1f676..c3ac7beb73e123bbbfd25e8c1833172a85fa98e4 100644 (file)
@@ -1412,6 +1412,10 @@ const struct function common_desktop_functions_possible[] = {
    /* GL_EXT_shader_image_load_store */
    { "glBindImageTextureEXT", 30, -1 },
 
+   /* GL_MESA_framebuffer_flip_y */
+   { "glFramebufferParameteriMESA", 43, -1 },
+   { "glGetFramebufferParameterivMESA", 43, -1 },
+
    { NULL, 0, -1 }
 };
 
@@ -2653,6 +2657,10 @@ const struct function gles3_functions_possible[] = {
    { "glRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
    { "glNamedRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
 
+   /* GL_MESA_framebuffer_flip_y */
+   { "glFramebufferParameteriMESA", 30, -1 },
+   { "glGetFramebufferParameterivMESA", 30, -1 },
+
    { NULL, 0, -1 }
 };