[Mesa-dev] [PATCH 2/2] main: Add entry point for glTextureBufferRange.

Laura Ekstrand laura at jlekstrand.net
Wed Jan 21 17:43:21 PST 2015


---
 src/mapi/glapi/gen/ARB_direct_state_access.xml |  8 +++
 src/mesa/main/tests/dispatch_sanity.cpp        |  1 +
 src/mesa/main/teximage.c                       | 92 +++++++++++++++++++++++++-
 src/mesa/main/teximage.h                       |  4 ++
 4 files changed, 104 insertions(+), 1 deletion(-)

diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml
index 2fe1638..86c00f9 100644
--- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
+++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
@@ -21,6 +21,14 @@
       <param name="buffer" type="GLuint" />
    </function>
 
+   <function name="TextureBufferRange" offset="assign">
+      <param name="texture" type="GLuint" />
+      <param name="internalformat" type="GLenum" />
+      <param name="buffer" type="GLuint" />
+      <param name="offset" type="GLintptr" />
+      <param name="size" type="GLsizeiptr" />
+   </function>
+
    <function name="TextureStorage1D" offset="assign">
       <param name="texture" type="GLuint" />
       <param name="levels" type="GLsizei" />
diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
index ee4db45..39d255d 100644
--- a/src/mesa/main/tests/dispatch_sanity.cpp
+++ b/src/mesa/main/tests/dispatch_sanity.cpp
@@ -987,6 +987,7 @@ const struct function gl_core_functions_possible[] = {
    { "glTextureStorage2DMultisample", 45, -1 },
    { "glTextureStorage3DMultisample", 45, -1 },
    { "glTextureBuffer", 45, -1 },
+   { "glTextureBufferRange", 45, -1 },
 
    { NULL, 0, -1 }
 };
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 5ada94f..2baf5c4 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -4957,7 +4957,7 @@ _mesa_validate_texbuffer_format(const struct gl_context *ctx,
 
 void
 _mesa_texture_buffer_range(struct gl_context *ctx,
-                           struct gl_texture_object *texObj, GLenum target, 
+                           struct gl_texture_object *texObj, GLenum target,
                            GLenum internalFormat,
                            struct gl_buffer_object *bufObj,
                            GLintptr offset, GLsizeiptr size, bool range,
@@ -5123,6 +5123,96 @@ _mesa_TextureBuffer(GLuint texture, GLenum internalFormat, GLuint buffer)
                               bufObj, 0, buffer ? -1 : 0, false, true);
 }
 
+void GLAPIENTRY
+_mesa_TextureBufferRange(GLuint texture, GLenum internalFormat, GLuint buffer,
+                         GLintptr offset, GLsizeiptr size)
+{
+   struct gl_texture_object *texObj;
+   struct gl_buffer_object *bufObj;
+
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* NOTE: ARB_texture_buffer_object has interactions with
+    * the compatibility profile that are not implemented.
+    */
+   if (!(ctx->API == API_OPENGL_CORE &&
+         ctx->Extensions.ARB_texture_buffer_object)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glTextureBufferRange(ARB_texture_buffer_object is not"
+                  " implemented for the compatibility profile)");
+      return;
+   }
+
+   bufObj = _mesa_lookup_bufferobj(ctx, buffer);
+   if (bufObj) {
+      /* OpenGL 4.5 core spec (30.10.2014) says in Section 8.9 Buffer
+       * Textures:
+       *    "An INVALID_VALUE error is generated if offset is negative, if
+       *    size is less than or equal to zero, or if offset + size is greater
+       *    than the value of BUFFER_SIZE for the buffer bound to target."
+       */
+      if (offset < 0) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glTextureBufferRange(offset %d < 0)", (int) offset);
+         return;
+      }
+
+      if (size <= 0) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glTextureBufferRange(size %d <= 0)", (int) size);
+         return;
+      }
+
+      if (offset + size > bufObj->Size) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glTextureBufferRange("
+                     "offset %d + size %d > buffer_size %d)", (int) offset,
+                     (int) size, (int) bufObj->Size);
+         return;
+      }
+
+      /* OpenGL 4.5 core spec (30.10.2014) says in Section 8.9 Buffer
+       * Textures:
+       *    "An INVALID_VALUE error is generated if offset is not an integer
+       *    multiple of the value of TEXTURE_BUFFER_OFFSET_ALIGNMENT."
+       */
+      if (offset % ctx->Const.TextureBufferOffsetAlignment) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glTextureBufferRange(invalid offset alignment)");
+         return;
+      }
+   } else if (buffer) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glTextureBufferRange(unrecognized buffer %u)", buffer);
+      return;
+   } else {
+
+      /* OpenGL 4.5 core spec (30.10.2014) says in Section 8.9 Buffer
+       * Textures:
+       *    "If buffer is zero, then any buffer object attached to the buffer
+       *    texture is detached, the values offset and size are ignored and
+       *    the state for offset and size for the buffer texture are reset to
+       *    zero."
+       */
+      offset = 0;
+      size = 0;
+   }
+
+   /* Get the texture object by Name. */
+   texObj = _mesa_lookup_texture_err(ctx, texture, "glTextureBufferRange");
+   if (!texObj)
+      return;
+
+   if (texObj->Target != GL_TEXTURE_BUFFER_ARB) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glTextureBufferRange(texture target"
+                                        " is not GL_TEXTURE_BUFFER)");
+      return;
+   }
+
+   _mesa_texture_buffer_range(ctx, texObj, texObj->Target, internalFormat,
+                              bufObj, offset, size, true, true);
+}
+
 static GLboolean
 is_renderable_texture_format(struct gl_context *ctx, GLenum internalformat)
 {
diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h
index 02b0eda..a4e6c2e 100644
--- a/src/mesa/main/teximage.h
+++ b/src/mesa/main/teximage.h
@@ -405,6 +405,10 @@ _mesa_TexBufferRange(GLenum target, GLenum internalFormat, GLuint buffer,
 extern void GLAPIENTRY
 _mesa_TextureBuffer(GLuint texture, GLenum internalFormat, GLuint buffer);
 
+extern void GLAPIENTRY
+_mesa_TextureBufferRange(GLuint texture, GLenum internalFormat, GLuint buffer,
+                         GLintptr offset, GLsizeiptr size);
+
 
 extern void GLAPIENTRY
 _mesa_TexImage2DMultisample(GLenum target, GLsizei samples,
-- 
2.1.0



More information about the mesa-dev mailing list