diff options
-rw-r--r-- | docs/features.txt | 2 | ||||
-rw-r--r-- | src/mapi/glapi/gen/ARB_framebuffer_no_attachments.xml | 12 | ||||
-rw-r--r-- | src/mapi/glapi/gen/static_data.py | 4 | ||||
-rw-r--r-- | src/mesa/main/fbobject.c | 76 | ||||
-rw-r--r-- | src/mesa/main/fbobject.h | 8 | ||||
-rw-r--r-- | src/mesa/main/tests/dispatch_sanity.cpp | 4 |
6 files changed, 102 insertions, 4 deletions
diff --git a/docs/features.txt b/docs/features.txt index 9cf76533fc2..9463b17a043 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -378,7 +378,7 @@ GL_EXT_direct_state_access additions from other extensions (complete list): GL_ARB_bindless_texture DONE GL_ARB_buffer_storage DONE GL_ARB_clear_buffer_object not started - GL_ARB_framebuffer_no_attachments not started + GL_ARB_framebuffer_no_attachments DONE GL_ARB_gpu_shader_fp64 not started GL_ARB_instanced_arrays not started GL_ARB_internalformat_query2 DONE diff --git a/src/mapi/glapi/gen/ARB_framebuffer_no_attachments.xml b/src/mapi/glapi/gen/ARB_framebuffer_no_attachments.xml index 55ad7642ff5..13c2501702c 100644 --- a/src/mapi/glapi/gen/ARB_framebuffer_no_attachments.xml +++ b/src/mapi/glapi/gen/ARB_framebuffer_no_attachments.xml @@ -27,6 +27,18 @@ <param name="params" type="GLint *" output="true" /> </function> + <function name="NamedFramebufferParameteriEXT"> + <param name="framebuffer" type="GLuint" /> + <param name="pname" type="GLenum" /> + <param name="param" type="GLint" /> + </function> + + <function name="GetNamedFramebufferParameterivEXT"> + <param name="framebuffer" type="GLuint" /> + <param name="pname" type="GLenum" /> + <param name="params" type="GLint*" /> + </function> + </category> </OpenGLAPI> diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py index 6e84132e563..fe9f94ae97f 100644 --- a/src/mapi/glapi/gen/static_data.py +++ b/src/mapi/glapi/gen/static_data.py @@ -1615,7 +1615,9 @@ offsets = { "GetVertexArrayIntegervEXT": 1579, "GetVertexArrayPointervEXT": 1580, "GetVertexArrayIntegeri_vEXT": 1581, - "GetVertexArrayPointeri_vEXT": 1582 + "GetVertexArrayPointeri_vEXT": 1582, + "NamedFramebufferParameteriEXT": 1583, + "GetNamedFramebufferParameterivEXT": 1584, } functions = [ diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index 2aeb48dfe7d..ea89565cfe2 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -4733,6 +4733,65 @@ _mesa_NamedFramebufferParameteri(GLuint framebuffer, GLenum pname, } +/* Helper function for ARB_framebuffer_no_attachments functions interacting with EXT_direct_state_access */ +static struct gl_framebuffer * +lookup_named_framebuffer_ext_dsa(struct gl_context *ctx, GLuint framebuffer, const char* caller) +{ + struct gl_framebuffer *fb = NULL; + + if (framebuffer) { + /* The ARB_framebuffer_no_attachments spec says: + * + * "The error INVALID_VALUE is generated if <framebuffer> is not + * a name returned by GenFramebuffers. If a framebuffer object + * named <framebuffer> does not yet exist, it will be created." + * + * This is different from the EXT_direct_state_access spec which says: + * + * "If the framebuffer object named by the framebuffer parameter has not + * been previously bound or has been deleted since the last binding, + * the GL first creates a new state vector in the same manner as when + * BindFramebuffer creates a new framebuffer object" + * + * So first we verify that the name exists. + */ + fb = _mesa_lookup_framebuffer(ctx, framebuffer); + if (!fb) { + _mesa_error(ctx, GL_INVALID_VALUE, "%s(frameBuffer)", caller); + return NULL; + } + /* Then, make sure it's initialized */ + if (fb == &DummyFramebuffer) { + fb = ctx->Driver.NewFramebuffer(ctx, framebuffer); + _mesa_HashLockMutex(ctx->Shared->FrameBuffers); + _mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, fb); + _mesa_HashUnlockMutex(ctx->Shared->BufferObjects); + } + } + else + fb = ctx->WinSysDrawBuffer; + + return fb; +} + + +void GLAPIENTRY +_mesa_NamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, + GLint param) +{ + GET_CURRENT_CONTEXT(ctx); + struct gl_framebuffer *fb = + lookup_named_framebuffer_ext_dsa(ctx, framebuffer, + "glNamedFramebufferParameteriEXT"); + + if (!fb) + return; + + framebuffer_parameteri(ctx, fb, pname, param, + "glNamedFramebufferParameteriEXT"); +} + + void GLAPIENTRY _mesa_GetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint *param) @@ -4798,6 +4857,23 @@ _mesa_GetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, } +void GLAPIENTRY +_mesa_GetNamedFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, + GLint *param) +{ + GET_CURRENT_CONTEXT(ctx); + struct gl_framebuffer *fb = + lookup_named_framebuffer_ext_dsa(ctx, framebuffer, + "glGetNamedFramebufferParameterivEXT"); + + if (!fb) + return; + + get_framebuffer_parameteriv(ctx, fb, pname, param, + "glGetNamedFramebufferParameterivEXT"); +} + + static void invalidate_framebuffer_storage(struct gl_context *ctx, struct gl_framebuffer *fb, diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h index bd1f7e4a537..6c8c4f0dc61 100644 --- a/src/mesa/main/fbobject.h +++ b/src/mesa/main/fbobject.h @@ -369,6 +369,10 @@ _mesa_NamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param); extern void GLAPIENTRY +_mesa_NamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, + GLint param); + +extern void GLAPIENTRY _mesa_GetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname, GLint *params); @@ -380,6 +384,10 @@ extern void GLAPIENTRY _mesa_GetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param); +extern void GLAPIENTRY +_mesa_GetNamedFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, + GLint *param); + void GLAPIENTRY _mesa_InvalidateSubFramebuffer_no_error(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp index e6cefabd386..390e3ef381f 100644 --- a/src/mesa/main/tests/dispatch_sanity.cpp +++ b/src/mesa/main/tests/dispatch_sanity.cpp @@ -874,8 +874,8 @@ const struct function common_desktop_functions_possible[] = { // { "glVertexArrayVertexBindingDivisorEXT", 43, -1 }, // XXX: Add to xml { "glFramebufferParameteri", 43, -1 }, { "glGetFramebufferParameteriv", 43, -1 }, -// { "glNamedFramebufferParameteriEXT", 43, -1 }, // XXX: Add to xml -// { "glGetNamedFramebufferParameterivEXT", 43, -1 }, // XXX: Add to xml + { "glNamedFramebufferParameteriEXT", 43, -1 }, + { "glGetNamedFramebufferParameterivEXT", 43, -1 }, // { "glGetInternalformati64v", 43, -1 }, // XXX: Add to xml { "glInvalidateTexSubImage", 43, -1 }, { "glInvalidateTexImage", 43, -1 }, |