summaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/dd.h4
-rw-r--r--src/mesa/main/extensions.c1
-rw-r--r--src/mesa/main/fbobject.c53
-rw-r--r--src/mesa/main/fbobject.h4
-rw-r--r--src/mesa/main/tests/dispatch_sanity.cpp2
5 files changed, 63 insertions, 1 deletions
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 9a75fd9541a..9c818ccd86a 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 04435e0c97a..e90a2968064 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(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 },
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 257f839a666..89bc5750932 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -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]));
+}
diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
index 9207f59c789..ec8b0afe410 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 519f6a9a46a..bf6b297e139 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 },