[Mesa-dev] [PATCH v2] gles2: a stub implementation for GL_EXT_discard_framebuffer

Tapani Pälli tapani.palli at intel.com
Wed Feb 13 04:38:59 PST 2013


This patch implements a stub for GL_EXT_discard_framebuffer with
required checks listed by the extension specification. This extension
is required by GLBenchmark 2.5 when compiled with OpenGL ES 2.0
as the rendering backend.

Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
---
 src/mapi/glapi/gen/es_EXT.xml           | 13 ++++++++
 src/mesa/drivers/common/driverfuncs.c   |  1 +
 src/mesa/main/dd.h                      |  4 ++-
 src/mesa/main/extensions.c              |  1 +
 src/mesa/main/fbobject.c                | 54 +++++++++++++++++++++++++++++++++
 src/mesa/main/fbobject.h                |  4 +++
 src/mesa/main/tests/dispatch_sanity.cpp |  2 ++
 7 files changed, 78 insertions(+), 1 deletion(-)

diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
index 0f6746d..103c93a 100644
--- a/src/mapi/glapi/gen/es_EXT.xml
+++ b/src/mapi/glapi/gen/es_EXT.xml
@@ -663,6 +663,19 @@
     <enum name="MAX_TEXTURE_LOD_BIAS_EXT"                 value="0x84FD"/>
 </category>
 
+<!-- 64. GL_EXT_discard_framebuffer -->
+
+<category name="GL_EXT_discard_framebuffer" number="64">
+    <function name="DiscardFramebufferEXT" es1="1.0" es2="2.0" offset="assign" desktop="false">
+        <param name="target" type="GLenum"/>
+        <param name="numAttachments" type="GLsizei"/>
+        <param name="attachments" type="const GLenum *" count="numAttachments"/>
+    </function>
+    <enum name="COLOR_EXT"                                value="0x1800"/>
+    <enum name="DEPTH_EXT"                                value="0x1801"/>
+    <enum name="STENCIL_EXT"                              value="0x1802"/>
+</category>
+
 <!-- 65. GL_EXT_blend_minmax -->
 
 <category name="GL_EXT_read_format_bgra" number="66">
diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c
index aab61e1..43c9de9 100644
--- a/src/mesa/drivers/common/driverfuncs.c
+++ b/src/mesa/drivers/common/driverfuncs.c
@@ -174,6 +174,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
    driver->ValidateFramebuffer = _mesa_validate_framebuffer;
 
    driver->BlitFramebuffer = _swrast_BlitFramebuffer;
+   driver->DiscardFramebuffer = NULL;
 
    _mesa_init_texture_barrier_functions(driver);
 
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 9a75fd9..9c818cc 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -604,7 +604,7 @@ struct dd_function_table {
    /*@}*/
 
    /**
-    * \name Functions for GL_EXT_framebuffer_{object,blit}.
+    * \name Functions for GL_EXT_framebuffer_{object,blit,discard}.
     */
    /*@{*/
    struct gl_framebuffer * (*NewFramebuffer)(struct gl_context *ctx, GLuint name);
@@ -628,6 +628,8 @@ struct dd_function_table {
                            GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
                            GLbitfield mask, GLenum filter);
+   void (*DiscardFramebuffer)(struct gl_context *ctx,
+                              GLenum target, GLsizei numAttachments, const GLenum *attachments);
 
    /**
     * \name Query objects
diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
index 04435e0..2112a06 100644
--- a/src/mesa/main/extensions.c
+++ b/src/mesa/main/extensions.c
@@ -168,6 +168,7 @@ static const struct extension extension_table[] = {
    { "GL_EXT_blend_color",                         o(EXT_blend_color),                         GLL,            1995 },
    { "GL_EXT_blend_equation_separate",             o(EXT_blend_equation_separate),             GL,             2003 },
    { "GL_EXT_blend_func_separate",                 o(EXT_blend_func_separate),                 GLL,            1999 },
+   { "GL_EXT_discard_framebuffer",                 o(dummy_true),                                    ES1 | ES2, 2009 },
    { "GL_EXT_blend_minmax",                        o(EXT_blend_minmax),                        GLL | ES1 | ES2, 1995 },
    { "GL_EXT_blend_subtract",                      o(dummy_true),                              GLL,            1995 },
    { "GL_EXT_clip_volume_hint",                    o(EXT_clip_volume_hint),                    GL,             1996 },
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 257f839..9acf3f5 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -3310,3 +3310,57 @@ _mesa_InvalidateFramebuffer(GLenum target, GLsizei numAttachments,
                                   0, 0, MAX_VIEWPORT_WIDTH, MAX_VIEWPORT_HEIGHT,
                                   "glInvalidateFramebuffer");
 }
+
+void GLAPIENTRY
+_mesa_DiscardFramebufferEXT(GLenum target, GLsizei numAttachments,
+                            const GLenum *attachments)
+{
+   struct gl_framebuffer *fb;
+   GLint i;
+
+   GET_CURRENT_CONTEXT(ctx);
+
+   fb = get_framebuffer_target(ctx, target);
+   if (!fb) {
+      _mesa_error(ctx, GL_INVALID_ENUM,
+         "glDiscardFramebufferEXT(target %s)",
+         _mesa_lookup_enum_by_nr(target));
+      return;
+   }
+
+   if (numAttachments < 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+                  "glDiscardFramebufferEXT(numAttachments < 0)");
+      return;
+   }
+
+   for(i = 0; i < numAttachments; i++) {
+
+      switch (attachments[i]) {
+      case GL_COLOR:
+      case GL_DEPTH:
+      case GL_STENCIL:
+         if (_mesa_is_user_fbo(fb))
+            goto invalid_enum;
+         break;
+      case GL_COLOR_ATTACHMENT0:
+      case GL_DEPTH_ATTACHMENT:
+      case GL_STENCIL_ATTACHMENT:
+         if (_mesa_is_winsys_fbo(fb))
+            goto invalid_enum;
+         break;
+      default:
+         goto invalid_enum;
+      }
+   }
+
+   if (ctx->Driver.DiscardFramebuffer)
+      ctx->Driver.DiscardFramebuffer(ctx, target, numAttachments, attachments);
+
+   return;
+
+invalid_enum:
+   _mesa_error(ctx, GL_INVALID_ENUM,
+               "glDiscardFramebufferEXT(attachment %s)",
+              _mesa_lookup_enum_by_nr(attachments[i]));
+}
diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
index 9207f59..ec8b0af 100644
--- a/src/mesa/main/fbobject.h
+++ b/src/mesa/main/fbobject.h
@@ -214,4 +214,8 @@ extern void GLAPIENTRY
 _mesa_InvalidateFramebuffer(GLenum target, GLsizei numAttachments,
                             const GLenum *attachments);
 
+extern void GLAPIENTRY
+_mesa_DiscardFramebufferEXT(GLenum target, GLsizei numAttachments,
+                            const GLenum *attachments);
+
 #endif /* FBOBJECT_H */
diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
index 519f6a9..bf6b297 100644
--- a/src/mesa/main/tests/dispatch_sanity.cpp
+++ b/src/mesa/main/tests/dispatch_sanity.cpp
@@ -949,6 +949,7 @@ const struct function gles11_functions_possible[] = {
    { "glDepthRangef", 11, -1 },
    { "glDepthRangex", 11, -1 },
    { "glDisable", 11, _gloffset_Disable },
+   { "glDiscardFramebufferEXT", 11, -1 },
    { "glDisableClientState", 11, _gloffset_DisableClientState },
    { "glDrawArrays", 11, _gloffset_DrawArrays },
    { "glDrawElements", 11, _gloffset_DrawElements },
@@ -1145,6 +1146,7 @@ const struct function gles2_functions_possible[] = {
    { "glDepthRangef", 20, -1 },
    { "glDetachShader", 20, -1 },
    { "glDisable", 20, _gloffset_Disable },
+   { "glDiscardFramebufferEXT", 20, -1 },
    { "glDisableVertexAttribArray", 20, -1 },
    { "glDrawArrays", 20, _gloffset_DrawArrays },
    { "glDrawBuffersNV", 20, -1 },
-- 
1.8.1



More information about the mesa-dev mailing list