mesa: add EXT_dsa (Named)Framebuffer functions
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Mon, 29 Apr 2019 11:53:29 +0000 (13:53 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 31 Jul 2019 02:04:26 +0000 (22:04 -0400)
These functions dont support display list as specified:

    Should the selector-free versions of various OpenGL 3.0 and
    EXT_framebuffer_object framebuffer object commands not be allowed
    in display lists [...]?

    RESOLVED:  Yes

src/mapi/glapi/gen/EXT_direct_state_access.xml
src/mapi/glapi/gen/static_data.py
src/mesa/main/buffers.c
src/mesa/main/buffers.h
src/mesa/main/fbobject.c
src/mesa/main/fbobject.h
src/mesa/main/tests/dispatch_sanity.cpp

index dd529c18790ab8e6c33594e7a92c2ed740b6faa8..ddefa07de00f4c6d15d9886d2c3ea21c28060607 100644 (file)
       <param name="access" type="GLbitfield" />
    </function>
 
+   <function name="FramebufferDrawBufferEXT">
+      <param name="framebuffer" type="GLuint" />
+      <param name="mode" type="GLenum" />
+   </function>
+
+   <function name="FramebufferDrawBuffersEXT">
+      <param name="framebuffer" type="GLuint" />
+      <param name="n" type="GLsizei" />
+      <param name="bufs" type="const GLenum *" />
+   </function>
+
+   <function name="FramebufferReadBufferEXT">
+      <param name="framebuffer" type="GLuint" />
+      <param name="mode" type="GLenum" />
+   </function>
+
+   <function name="GetFramebufferParameterivEXT">
+      <param name="framebuffer" type="GLuint" />
+      <param name="pname" type="GLenum" />
+      <param name="param" type="GLint *" />
+   </function>
+
+   <function name="CheckNamedFramebufferStatusEXT">
+      <return type="GLenum" />
+      <param name="framebuffer" type="GLuint" />
+      <param name="target" type="GLenum" />
+   </function>
+
+   <function name="NamedFramebufferTexture1DEXT">
+      <param name="framebuffer" type="GLuint" />
+      <param name="attachment" type="GLenum" />
+      <param name="textarget" type="GLenum" />
+      <param name="texture" type="GLuint" />
+      <param name="level" type="GLint" />
+   </function>
+
+   <function name="NamedFramebufferTexture2DEXT">
+      <param name="framebuffer" type="GLuint" />
+      <param name="attachment" type="GLenum" />
+      <param name="textarget" type="GLenum" />
+      <param name="texture" type="GLuint" />
+      <param name="level" type="GLint" />
+   </function>
+
+   <function name="NamedFramebufferTexture3DEXT">
+      <param name="framebuffer" type="GLuint" />
+      <param name="attachment" type="GLenum" />
+      <param name="textarget" type="GLenum" />
+      <param name="texture" type="GLuint" />
+      <param name="level" type="GLint" />
+      <param name="zoffset" type="GLint" />
+   </function>
+
+   <function name="NamedFramebufferRenderbufferEXT">
+      <param name="framebuffer" type="GLuint" />
+      <param name="attachment" type="GLenum" />
+      <param name="renderbuffertarget" type="GLenum" />
+      <param name="renderbuffer" type="GLuint" />
+   </function>
+
+   <function name="GetNamedFramebufferAttachmentParameterivEXT">
+      <param name="framebuffer" type="GLuint" />
+      <param name="attachment" type="GLenum" />
+      <param name="pname" type="GLenum" />
+      <param name="params" type="GLint *" />
+   </function>
 </category>
 </OpenGLAPI>
index b2a8ca159115c837df1a94aedcc4f9f21a0ebd8c..696ba60fa89854a810d799e48ecf2d030a318ba4 100644 (file)
@@ -1504,6 +1504,17 @@ offsets = {
     "GetNamedBufferPointervEXT": 1468,
     "GetNamedBufferParameterivEXT": 1469,
     "FlushMappedNamedBufferRangeEXT": 1470,
+    "FramebufferDrawBufferEXT": 1471,
+    "FramebufferDrawBuffersEXT": 1472,
+    "FramebufferReadBufferEXT": 1473,
+    "GetFramebufferParameterivEXT": 1474,
+    "CheckNamedFramebufferStatusEXT": 1475,
+    "NamedFramebufferTexture1DEXT": 1476,
+    "NamedFramebufferTexture2DEXT": 1477,
+    "NamedFramebufferTexture3DEXT": 1478,
+    "NamedFramebufferRenderbufferEXT": 1479,
+    "GetNamedFramebufferAttachmentParameterivEXT": 1480,
+
 }
 
 functions = [
index 4e48b76fcb884a4affeccfbffebf85c47a848231..a47438920b48e36721b38ce9737de25f4eebabac 100644 (file)
@@ -35,6 +35,7 @@
 #include "context.h"
 #include "enums.h"
 #include "fbobject.h"
+#include "hash.h"
 #include "mtypes.h"
 #include "util/bitscan.h"
 #include "util/u_math.h"
@@ -376,6 +377,25 @@ _mesa_NamedFramebufferDrawBuffer_no_error(GLuint framebuffer, GLenum buf)
 }
 
 
+void GLAPIENTRY
+_mesa_FramebufferDrawBufferEXT(GLuint framebuffer, GLenum buf)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_framebuffer *fb;
+
+   if (framebuffer) {
+      fb = _mesa_lookup_framebuffer_dsa(ctx, framebuffer,
+                                        "glFramebufferDrawBufferEXT");
+      if (!fb)
+         return;
+   }
+   else
+      fb = ctx->WinSysDrawBuffer;
+
+   draw_buffer_error(ctx, fb, buf, "glFramebufferDrawBufferEXT");
+}
+
+
 void GLAPIENTRY
 _mesa_NamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf)
 {
@@ -649,6 +669,24 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
    draw_buffers_error(ctx, ctx->DrawBuffer, n, buffers, "glDrawBuffers");
 }
 
+void GLAPIENTRY
+_mesa_FramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n,
+                                const GLenum *bufs)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_framebuffer *fb;
+
+   if (framebuffer) {
+      fb = _mesa_lookup_framebuffer_dsa(ctx, framebuffer,
+                                        "glFramebufferDrawBuffersEXT");
+      if (!fb)
+         return;
+   }
+   else
+      fb = ctx->WinSysDrawBuffer;
+
+   draw_buffers_error(ctx, fb, n, bufs, "glFramebufferDrawBuffersEXT");
+}
 
 void GLAPIENTRY
 _mesa_NamedFramebufferDrawBuffers_no_error(GLuint framebuffer, GLsizei n,
@@ -959,6 +997,25 @@ _mesa_NamedFramebufferReadBuffer_no_error(GLuint framebuffer, GLenum src)
 }
 
 
+void GLAPIENTRY
+_mesa_FramebufferReadBufferEXT(GLuint framebuffer, GLenum buf)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_framebuffer *fb;
+
+   if (framebuffer) {
+      fb = _mesa_lookup_framebuffer_dsa(ctx, framebuffer,
+                                        "glFramebufferReadBufferEXT");
+      if (!fb)
+         return;
+   }
+   else
+      fb = ctx->WinSysDrawBuffer;
+
+   read_buffer_err(ctx, fb, buf, "glFramebufferReadBufferEXT");
+}
+
+
 void GLAPIENTRY
 _mesa_NamedFramebufferReadBuffer(GLuint framebuffer, GLenum src)
 {
index 913af7842fe0c069e7a7cefdbcfb3aebe6e6ee5a..c24b636e19d87c00f92a428f02ff6c1b24b85f82 100644 (file)
@@ -90,5 +90,13 @@ _mesa_NamedFramebufferReadBuffer_no_error(GLuint framebuffer, GLenum src);
 extern void GLAPIENTRY
 _mesa_NamedFramebufferReadBuffer(GLuint framebuffer, GLenum src);
 
+extern void GLAPIENTRY
+_mesa_FramebufferDrawBufferEXT(GLuint framebuffer, GLenum buf);
+
+extern void GLAPIENTRY
+_mesa_FramebufferReadBufferEXT(GLuint framebuffer, GLenum buf);
 
+extern void GLAPIENTRY
+_mesa_FramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n,
+                                const GLenum *bufs);
 #endif
index d95f2444f0083c0621826abe300cbcb43eb38ef1..088b45aa732558d91c45fb258a3722812dffaa18 100644 (file)
@@ -155,6 +155,41 @@ _mesa_lookup_framebuffer(struct gl_context *ctx, GLuint id)
 
    fb = (struct gl_framebuffer *)
       _mesa_HashLookup(ctx->Shared->FrameBuffers, id);
+
+   return fb;
+}
+
+
+struct gl_framebuffer *
+_mesa_lookup_framebuffer_dsa(struct gl_context *ctx, GLuint id,
+                             const char* func)
+{
+   struct gl_framebuffer *fb;
+
+   if (id == 0)
+      return NULL;
+
+   fb = _mesa_lookup_framebuffer(ctx, id);
+
+   /* Name exists but buffer is not initialized */
+   if (fb == &DummyFramebuffer) {
+      fb = ctx->Driver.NewFramebuffer(ctx, id);
+      _mesa_HashLockMutex(ctx->Shared->FrameBuffers);
+      _mesa_HashInsert(ctx->Shared->FrameBuffers, id, fb);
+      _mesa_HashUnlockMutex(ctx->Shared->BufferObjects);
+   }
+   /* Name doesn't exist */
+   else if (!fb) {
+      _mesa_HashLockMutex(ctx->Shared->FrameBuffers);
+      fb = ctx->Driver.NewFramebuffer(ctx, id);
+      if (!fb) {
+         _mesa_HashUnlockMutex(ctx->Shared->FrameBuffers);
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
+         return NULL;
+      }
+      _mesa_HashInsertLocked(ctx->Shared->BufferObjects, id, fb);
+      _mesa_HashUnlockMutex(ctx->Shared->BufferObjects);
+   }
    return fb;
 }
 
@@ -3152,6 +3187,37 @@ _mesa_CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target)
 }
 
 
+GLenum GLAPIENTRY
+_mesa_CheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target)
+{
+   struct gl_framebuffer *fb;
+   GET_CURRENT_CONTEXT(ctx);
+
+   switch (target) {
+      case GL_DRAW_FRAMEBUFFER:
+      case GL_FRAMEBUFFER:
+      case GL_READ_FRAMEBUFFER:
+         break;
+      default:
+         _mesa_error(ctx, GL_INVALID_ENUM,
+                     "glCheckNamedFramebufferStatusEXT(invalid target %s)",
+                     _mesa_enum_to_string(target));
+         return 0;
+   }
+
+   if (framebuffer == 0) {
+      return _mesa_CheckNamedFramebufferStatus(0, target);
+   }
+
+   fb = _mesa_lookup_framebuffer_dsa(ctx, framebuffer,
+                                     "glCheckNamedFramebufferStatusEXT");
+   if (!fb)
+      return 0;
+
+   return _mesa_check_framebuffer_status(ctx, fb);
+}
+
+
 /**
  * Replicate the src attachment point. Used by framebuffer_texture() when
  * the same texture is attached at GL_DEPTH_ATTACHMENT and
@@ -3606,17 +3672,21 @@ framebuffer_texture_with_dims_no_error(GLenum target, GLenum attachment,
 
 
 static void
-framebuffer_texture_with_dims(int dims, GLenum target,
+framebuffer_texture_with_dims(int dims, GLenum target, GLuint framebuffer,
                               GLenum attachment, GLenum textarget,
                               GLuint texture, GLint level, GLsizei samples,
-                              GLint layer, const char *caller)
+                              GLint layer, const char *caller, bool dsa)
 {
    GET_CURRENT_CONTEXT(ctx);
    struct gl_framebuffer *fb;
    struct gl_texture_object *texObj;
 
    /* Get the framebuffer object */
-   fb = get_framebuffer_target(ctx, target);
+   if (dsa) {
+      fb = _mesa_lookup_framebuffer_dsa(ctx, framebuffer, caller);
+   } else {
+      fb = get_framebuffer_target(ctx, target);
+   }
    if (!fb) {
       _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid target %s)", caller,
                   _mesa_enum_to_string(target));
@@ -3662,8 +3732,8 @@ void GLAPIENTRY
 _mesa_FramebufferTexture1D(GLenum target, GLenum attachment,
                            GLenum textarget, GLuint texture, GLint level)
 {
-   framebuffer_texture_with_dims(1, target, attachment, textarget, texture,
-                                 level, 0, 0, "glFramebufferTexture1D");
+   framebuffer_texture_with_dims(1, target, 0, attachment, textarget, texture,
+                                 level, 0, 0, "glFramebufferTexture1D", false);
 }
 
 
@@ -3681,8 +3751,8 @@ void GLAPIENTRY
 _mesa_FramebufferTexture2D(GLenum target, GLenum attachment,
                            GLenum textarget, GLuint texture, GLint level)
 {
-   framebuffer_texture_with_dims(2, target, attachment, textarget, texture,
-                                 level, 0, 0, "glFramebufferTexture2D");
+   framebuffer_texture_with_dims(2, target, 0, attachment, textarget, texture,
+                                 level, 0, 0, "glFramebufferTexture2D", false);
 }
 
 
@@ -3691,8 +3761,10 @@ _mesa_FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
                                          GLenum textarget, GLuint texture,
                                          GLint level, GLsizei samples)
 {
-   framebuffer_texture_with_dims(2, target, attachment, textarget, texture,
-                                 level, samples, 0, "glFramebufferTexture2DMultisampleEXT");
+   framebuffer_texture_with_dims(2, target, 0, attachment, textarget, texture,
+                                 level, samples, 0,
+                                 "glFramebufferTexture2DMultisampleEXT",
+                                 false);
 }
 
 
@@ -3711,8 +3783,8 @@ _mesa_FramebufferTexture3D(GLenum target, GLenum attachment,
                            GLenum textarget, GLuint texture,
                            GLint level, GLint layer)
 {
-   framebuffer_texture_with_dims(3, target, attachment, textarget, texture,
-                                 level, 0, layer, "glFramebufferTexture3D");
+   framebuffer_texture_with_dims(3, target, 0, attachment, textarget, texture,
+                                 level, 0, layer, "glFramebufferTexture3D", false);
 }
 
 
@@ -3879,6 +3951,37 @@ _mesa_NamedFramebufferTexture(GLuint framebuffer, GLenum attachment,
 }
 
 
+void GLAPIENTRY
+_mesa_NamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment,
+                                   GLenum textarget, GLuint texture, GLint level)
+{
+   framebuffer_texture_with_dims(1, GL_FRAMEBUFFER, framebuffer, attachment,
+                                 textarget, texture, level, 0, 0,
+                                 "glNamedFramebufferTexture1DEXT", true);
+}
+
+
+void GLAPIENTRY
+_mesa_NamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment,
+                                   GLenum textarget, GLuint texture, GLint level)
+{
+   framebuffer_texture_with_dims(2, GL_FRAMEBUFFER, framebuffer, attachment,
+                                 textarget, texture, level, 0, 0,
+                                 "glNamedFramebufferTexture2DEXT", true);
+}
+
+
+void GLAPIENTRY
+_mesa_NamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment,
+                                   GLenum textarget, GLuint texture,
+                                   GLint level, GLint zoffset)
+{
+   framebuffer_texture_with_dims(3, GL_FRAMEBUFFER, framebuffer, attachment,
+                                 textarget, texture, level, 0, zoffset,
+                                 "glNamedFramebufferTexture3DEXT", true);
+}
+
+
 void
 _mesa_framebuffer_renderbuffer(struct gl_context *ctx,
                                struct gl_framebuffer *fb,
@@ -4060,6 +4163,25 @@ _mesa_NamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment,
 }
 
 
+void GLAPIENTRY
+_mesa_NamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment,
+                                      GLenum renderbuffertarget,
+                                      GLuint renderbuffer)
+{
+   struct gl_framebuffer *fb;
+   GET_CURRENT_CONTEXT(ctx);
+
+   fb = _mesa_lookup_framebuffer_dsa(ctx, framebuffer,
+                                     "glNamedFramebufferRenderbufferEXT");
+   if (!fb)
+      return;
+
+   framebuffer_renderbuffer_error(ctx, fb, attachment, renderbuffertarget,
+                                  renderbuffer,
+                                  "glNamedFramebufferRenderbuffer");
+}
+
+
 static void
 get_framebuffer_attachment_parameter(struct gl_context *ctx,
                                      struct gl_framebuffer *buffer,
@@ -4461,6 +4583,36 @@ _mesa_GetNamedFramebufferAttachmentParameteriv(GLuint framebuffer,
 }
 
 
+void GLAPIENTRY
+_mesa_GetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer,
+                                                  GLenum attachment,
+                                                  GLenum pname, GLint *params)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_framebuffer *buffer;
+
+   if (framebuffer) {
+      buffer = _mesa_lookup_framebuffer_dsa(ctx, framebuffer,
+                              "glGetNamedFramebufferAttachmentParameterivEXT");
+      if (!buffer)
+         return;
+   }
+   else {
+      /*
+       * Section 9.2 Binding and Managing Framebuffer Objects of the OpenGL
+       * 4.5 core spec (30.10.2014, PDF page 314):
+       *    "If framebuffer is zero, then the default draw framebuffer is
+       *    queried."
+       */
+      buffer = ctx->WinSysDrawBuffer;
+   }
+
+   get_framebuffer_attachment_parameter(ctx, buffer, attachment, pname,
+                                        params,
+                              "glGetNamedFramebufferAttachmentParameterivEXT");
+}
+
+
 void GLAPIENTRY
 _mesa_NamedFramebufferParameteri(GLuint framebuffer, GLenum pname,
                                  GLint param)
@@ -4491,6 +4643,43 @@ _mesa_NamedFramebufferParameteri(GLuint framebuffer, GLenum pname,
 }
 
 
+void GLAPIENTRY
+_mesa_GetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname,
+                                   GLint *param)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_framebuffer *fb;
+
+   if (framebuffer)
+      fb = _mesa_lookup_framebuffer_dsa(ctx, framebuffer,
+                                        "glGetFramebufferParameterivEXT");
+   else
+      fb = ctx->WinSysDrawBuffer;
+
+   if (fb) {
+      /* The GL_EXT_direct_state_access says:
+       *
+       * The pname parameter must be one of framebuffer dependent values
+       * listed in either table 4.nnn (namely DRAW_BUFFER, READ_BUFFER,
+       * or DRAW_BUFFER0 through DRAW_BUFFER15).
+       */
+      if (pname == GL_DRAW_BUFFER) {
+         *param = fb->ColorDrawBuffer[0];
+
+      }
+      else if (pname == GL_READ_BUFFER) {
+         *param = fb->ColorReadBuffer;
+      }
+      else if (GL_DRAW_BUFFER0 <= pname && pname <= GL_DRAW_BUFFER15) {
+         *param = fb->ColorDrawBuffer[pname - GL_DRAW_BUFFER0];
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetFramebufferParameterivEXT(pname)");
+      }
+   }
+}
+
+
 void GLAPIENTRY
 _mesa_GetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname,
                                      GLint *param)
index fcf9835dfa44fa200a7fd94f4cdb1025b4687608..dcbff85eccf4b167264165f150724cd8b4f4fd7e 100644 (file)
@@ -74,6 +74,10 @@ extern struct gl_framebuffer *
 _mesa_lookup_framebuffer_err(struct gl_context *ctx, GLuint id,
                              const char *func);
 
+struct gl_framebuffer *
+_mesa_lookup_framebuffer_dsa(struct gl_context *ctx, GLuint id,
+                             const char* func);
+
 
 void
 _mesa_update_texture_renderbuffer(struct gl_context *ctx,
@@ -235,6 +239,9 @@ _mesa_CheckFramebufferStatus(GLenum target);
 extern GLenum GLAPIENTRY
 _mesa_CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
 
+extern GLenum GLAPIENTRY
+_mesa_CheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target);
+
 extern void GLAPIENTRY
 _mesa_FramebufferTexture1D_no_error(GLenum target, GLenum attachment,
                                     GLenum textarget, GLuint texture,
@@ -296,6 +303,24 @@ extern void GLAPIENTRY
 _mesa_NamedFramebufferTexture(GLuint framebuffer, GLenum attachment,
                               GLuint texture, GLint level);
 
+extern void GLAPIENTRY
+_mesa_NamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment,
+                                      GLenum renderbuffertarget,
+                                      GLuint renderbuffer);
+
+extern void GLAPIENTRY
+_mesa_NamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment,
+                                   GLenum textarget, GLuint texture, GLint level);
+
+extern void GLAPIENTRY
+_mesa_NamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment,
+                                   GLenum textarget, GLuint texture, GLint level);
+
+extern void GLAPIENTRY
+_mesa_NamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment,
+                                   GLenum textarget, GLuint texture,
+                                   GLint level, GLint zoffset);
+
 void GLAPIENTRY
 _mesa_FramebufferRenderbuffer_no_error(GLenum target, GLenum attachment,
                                        GLenum renderbuffertarget,
@@ -319,16 +344,26 @@ _mesa_NamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment,
 
 extern void GLAPIENTRY
 _mesa_GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment,
-                                             GLenum pname, GLint *params);
+                                          GLenum pname, GLint *params);
+
 extern void GLAPIENTRY
 _mesa_GetNamedFramebufferAttachmentParameteriv(GLuint framebuffer,
                                                GLenum attachment,
                                                GLenum pname, GLint *params);
 
+extern void GLAPIENTRY
+_mesa_GetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer,
+                                                  GLenum attachment,
+                                                  GLenum pname, GLint *params);
+
 extern void GLAPIENTRY
 _mesa_NamedFramebufferParameteri(GLuint framebuffer, GLenum pname,
                                  GLint param);
 
+extern void GLAPIENTRY
+_mesa_GetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname,
+                                   GLint *param);
+
 extern void GLAPIENTRY
 _mesa_GetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname,
                                      GLint *param);
index 0b2dcfc4a812c571f96e9755e74d9a9e71c9aef4..3e0e273dd04c2b6c07c2729edb09be92c49c79a6 100644 (file)
@@ -1189,18 +1189,18 @@ const struct function common_desktop_functions_possible[] = {
    //{ "glNamedRenderbufferStorageEXT", 30, -1 },
    //{ "glGetNamedRenderbufferParameterivEXT", 30, -1 },
    //{ "glNamedRenderbufferStorageMultisampleEXT", 30, -1 },
-   //{ "glCheckNamedFramebufferStatusEXT", 30, -1 },
-   //{ "glNamedFramebufferTexture1DEXT", 30, -1 },
-   //{ "glNamedFramebufferTexture2DEXT", 30, -1 },
-   //{ "glNamedFramebufferTexture3DEXT", 30, -1 },
-   //{ "glNamedFramebufferRenderbufferEXT", 30, -1 },
-   //{ "glGetNamedFramebufferAttachmentParameterivEXT", 30, -1 },
+   { "glCheckNamedFramebufferStatusEXT", 30, -1 },
+   { "glNamedFramebufferTexture1DEXT", 30, -1 },
+   { "glNamedFramebufferTexture2DEXT", 30, -1 },
+   { "glNamedFramebufferTexture3DEXT", 30, -1 },
+   { "glNamedFramebufferRenderbufferEXT", 30, -1 },
+   { "glGetNamedFramebufferAttachmentParameterivEXT", 30, -1 },
    //{ "glGenerateTextureMipmapEXT", 30, -1 },
    //{ "glGenerateMultiTexMipmapEXT", 30, -1 },
-   //{ "glFramebufferDrawBufferEXT", 30, -1 },
-   //{ "glFramebufferDrawBuffersEXT", 30, -1 },
-   //{ "glFramebufferReadBufferEXT", 30, -1 },
-   //{ "glGetFramebufferParameterivEXT", 30, -1 },
+   { "glFramebufferDrawBufferEXT", 30, -1 },
+   { "glFramebufferDrawBuffersEXT", 30, -1 },
+   { "glFramebufferReadBufferEXT", 30, -1 },
+   { "glGetFramebufferParameterivEXT", 30, -1 },
    //{ "glNamedCopyBufferSubDataEXT", 30, -1 },
    //{ "glVertexArrayVertexOffsetEXT", 30, -1 },
    //{ "glVertexArrayColorOffsetEXT", 30, -1 },