From 6ad0b7e07a0445e9e0f368e079c4f7b8a6757bb3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fredrik=20H=C3=B6glund?= Date: Sun, 10 May 2015 20:48:11 +0200 Subject: [PATCH] mesa: Add ARB_direct_state_access checks in FBO functions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Höglund Reviewed-by: Adam Jackson --- src/mesa/main/blit.c | 7 +++++ src/mesa/main/buffers.c | 21 +++++++++++++ src/mesa/main/clear.c | 32 +++++++++++++++++++ src/mesa/main/fbobject.c | 67 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+) diff --git a/src/mesa/main/blit.c b/src/mesa/main/blit.c index db8fee5a414..fac97245082 100644 --- a/src/mesa/main/blit.c +++ b/src/mesa/main/blit.c @@ -540,6 +540,13 @@ _mesa_BlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GET_CURRENT_CONTEXT(ctx); struct gl_framebuffer *readFb, *drawFb; + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glBlitNamedFramebuffer(GL_ARB_direct_state_access " + "is not supported)"); + return; + } + if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glBlitNamedFramebuffer(%u %u %d, %d, %d, %d, " diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index 0536266d756..c83459addf7 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -303,6 +303,13 @@ _mesa_NamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf) GET_CURRENT_CONTEXT(ctx); struct gl_framebuffer *fb; + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glNamedFramebufferDrawBuffer(GL_ARB_direct_state_access " + "is not supported)"); + return; + } + if (framebuffer) { fb = _mesa_lookup_framebuffer_err(ctx, framebuffer, "glNamedFramebufferDrawBuffer"); @@ -513,6 +520,13 @@ _mesa_NamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, GET_CURRENT_CONTEXT(ctx); struct gl_framebuffer *fb; + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glNamedFramebufferDrawBuffers(GL_ARB_direct_state_access " + "is not supported)"); + return; + } + if (framebuffer) { fb = _mesa_lookup_framebuffer_err(ctx, framebuffer, "glNamedFramebufferDrawBuffers"); @@ -750,6 +764,13 @@ _mesa_NamedFramebufferReadBuffer(GLuint framebuffer, GLenum src) GET_CURRENT_CONTEXT(ctx); struct gl_framebuffer *fb; + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glNamedFramebufferReadBuffer(GL_ARB_direct_state_access " + "is not supported)"); + return; + } + if (framebuffer) { fb = _mesa_lookup_framebuffer_err(ctx, framebuffer, "glNamedFramebufferReadBuffer"); diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c index 426caea4709..c6999f7fdb6 100644 --- a/src/mesa/main/clear.c +++ b/src/mesa/main/clear.c @@ -412,6 +412,14 @@ _mesa_ClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, { GLint oldfb; + GET_CURRENT_CONTEXT(ctx); + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glClearNamedFramebufferiv(GL_ARB_direct_state_access " + "is not supported)"); + return; + } + _mesa_GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &oldfb); _mesa_BindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); _mesa_ClearBufferiv(buffer, drawbuffer, value); @@ -502,6 +510,14 @@ _mesa_ClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, { GLint oldfb; + GET_CURRENT_CONTEXT(ctx); + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glClearNamedFramebufferuiv(GL_ARB_direct_state_access " + "is not supported)"); + return; + } + _mesa_GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &oldfb); _mesa_BindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); _mesa_ClearBufferuiv(buffer, drawbuffer, value); @@ -613,6 +629,14 @@ _mesa_ClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, { GLint oldfb; + GET_CURRENT_CONTEXT(ctx); + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glClearNamedFramebufferfv(GL_ARB_direct_state_access " + "is not supported)"); + return; + } + _mesa_GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &oldfb); _mesa_BindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); _mesa_ClearBufferfv(buffer, drawbuffer, value); @@ -695,6 +719,14 @@ _mesa_ClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, { GLint oldfb; + GET_CURRENT_CONTEXT(ctx); + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glClearNamedFramebufferfi(GL_ARB_direct_state_access " + "is not supported)"); + return; + } + _mesa_GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &oldfb); _mesa_BindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); _mesa_ClearBufferfi(buffer, 0, depth, stencil); diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index c2bc081cf1a..65e194cb749 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -2454,6 +2454,12 @@ create_framebuffers(GLsizei n, GLuint *framebuffers, bool dsa) const char *func = dsa ? "glCreateFramebuffers" : "glGenFramebuffers"; + if (dsa && !ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(GL_ARB_direct_state_access is not supported)", func); + return; + } + if (n < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "%s(n < 0)", func); return; @@ -2552,6 +2558,13 @@ _mesa_CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target) struct gl_framebuffer *fb; GET_CURRENT_CONTEXT(ctx); + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glCheckNamedFramebufferStatus(GL_ARB_direct_state_access " + "is not supported)"); + return 0; + } + /* Validate the target (for conformance's sake) and grab a reference to the * default framebuffer in case framebuffer = 0. * Section 9.4 Framebuffer Completeness of the OpenGL 4.5 core spec @@ -3097,6 +3110,12 @@ _mesa_NamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, const char *func = "glNamedFramebufferTextureLayer"; + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(GL_ARB_direct_state_access is not supported)", func); + return; + } + /* Get the framebuffer object */ fb = _mesa_lookup_framebuffer_err(ctx, framebuffer, func); if (!fb) @@ -3182,6 +3201,12 @@ _mesa_NamedFramebufferTexture(GLuint framebuffer, GLenum attachment, const char *func = "glNamedFramebufferTexture"; + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(GL_ARB_direct_state_access is not supported)", func); + return; + } + if (!_mesa_has_geometry_shaders(ctx)) { _mesa_error(ctx, GL_INVALID_OPERATION, "unsupported function (glNamedFramebufferTexture) called"); @@ -3307,6 +3332,13 @@ _mesa_NamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, struct gl_renderbuffer *rb; GET_CURRENT_CONTEXT(ctx); + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glNamedFramebufferRenderbuffer(GL_ARB_direct_state_access " + "is not supported)"); + return; + } + fb = _mesa_lookup_framebuffer_err(ctx, framebuffer, "glNamedFramebufferRenderbuffer"); @@ -3639,6 +3671,13 @@ _mesa_GetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GET_CURRENT_CONTEXT(ctx); struct gl_framebuffer *buffer; + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glGetNamedFramebufferAttachmentParameteriv(" + "GL_ARB_direct_state_access is not supported)"); + return; + } + if (framebuffer) { buffer = _mesa_lookup_framebuffer_err(ctx, framebuffer, "glGetNamedFramebufferAttachmentParameteriv"); @@ -3671,6 +3710,13 @@ _mesa_NamedFramebufferParameteri(GLuint framebuffer, GLenum pname, (void) pname; (void) param; + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glNamedFramebufferParameteri(" + "GL_ARB_direct_state_access is not supported)"); + return; + } + _mesa_error(ctx, GL_INVALID_OPERATION, "glNamedFramebufferParameteri not supported " "(ARB_framebuffer_no_attachments not implemented)"); @@ -3687,6 +3733,13 @@ _mesa_GetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, (void) pname; (void) param; + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glNamedFramebufferParameteriv(" + "GL_ARB_direct_state_access is not supported)"); + return; + } + _mesa_error(ctx, GL_INVALID_OPERATION, "glGetNamedFramebufferParameteriv not supported " "(ARB_framebuffer_no_attachments not implemented)"); @@ -3855,6 +3908,13 @@ _mesa_InvalidateNamedFramebufferSubData(GLuint framebuffer, struct gl_framebuffer *fb; GET_CURRENT_CONTEXT(ctx); + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glInvalidateNamedFramebufferSubData(" + "GL_ARB_direct_state_access is not supported)"); + return; + } + /* The OpenGL 4.5 core spec (02.02.2015) says (in Section 17.4 Whole * Framebuffer Operations, PDF page 522): "If framebuffer is zero, the * default draw framebuffer is affected." @@ -3916,6 +3976,13 @@ _mesa_InvalidateNamedFramebufferData(GLuint framebuffer, struct gl_framebuffer *fb; GET_CURRENT_CONTEXT(ctx); + if (!ctx->Extensions.ARB_direct_state_access) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glInvalidateNamedFramebufferData(" + "GL_ARB_direct_state_access is not supported)"); + return; + } + /* The OpenGL 4.5 core spec (02.02.2015) says (in Section 17.4 Whole * Framebuffer Operations, PDF page 522): "If framebuffer is zero, the * default draw framebuffer is affected." -- 2.30.2