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:
parent
73bf626713
commit
413941e1a3
|
@ -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">
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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]));
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 },
|
||||
|
|
Loading…
Reference in New Issue