--- src/mapi/glapi/gen/ARB_direct_state_access.xml | 8 +++ src/mesa/main/tests/dispatch_sanity.cpp | 1 + src/mesa/main/teximage.c | 90 ++++++++++++++++++++++++++ src/mesa/main/teximage.h | 4 ++ 4 files changed, 103 insertions(+)
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 1f1a3a8..b78c1ce 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 }, /* GL_EXT_polygon_offset_clamp */ { "glPolygonOffsetClampEXT", 11, -1 }, diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 336feff..ce6f446 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -5197,6 +5197,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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev