gles2: a stub implementation for GL_EXT_discard_framebuffer

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@intel.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-and-tested-by: Chad Versace <chad.versace@linux.intel.com>
This commit is contained in:
Tapani Pälli 2013-02-18 09:12:27 +02:00 committed by Chad Versace
parent 73bf626713
commit 413941e1a3
7 changed files with 77 additions and 1 deletions

View File

@ -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">

View File

@ -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);

View File

@ -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

View File

@ -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(EXT_framebuffer_object), 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 },

View File

@ -3310,3 +3310,56 @@ _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]));
}

View File

@ -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 */

View File

@ -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 },