diff options
author | Laura Ekstrand <laura@jlekstrand.net> | 2014-12-02 17:51:30 -0800 |
---|---|---|
committer | Laura Ekstrand <laura@jlekstrand.net> | 2015-01-08 11:37:30 -0800 |
commit | 98e64e538afeaa800e1cdcbc7ce5d5093b274fe7 (patch) | |
tree | 3f9e6e85c4f30ae34a8e34542be34788cc1a2df7 | |
parent | 499004e56a51bdabff489913680aa972e7fab369 (diff) |
main: Added entry point for glTextureBuffer.
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
-rw-r--r-- | src/mapi/glapi/gen/ARB_direct_state_access.xml | 6 | ||||
-rw-r--r-- | src/mesa/main/tests/dispatch_sanity.cpp | 1 | ||||
-rw-r--r-- | src/mesa/main/teximage.c | 90 | ||||
-rw-r--r-- | src/mesa/main/teximage.h | 11 |
4 files changed, 92 insertions, 16 deletions
diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml index c48fb261f74..2fe1638fde9 100644 --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml @@ -15,6 +15,12 @@ <param name="textures" type="GLuint *" /> </function> + <function name="TextureBuffer" offset="assign"> + <param name="texture" type="GLuint" /> + <param name="internalformat" type="GLenum" /> + <param name="buffer" type="GLuint" /> + </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 109bbd08636..ee4db45402f 100644 --- a/src/mesa/main/tests/dispatch_sanity.cpp +++ b/src/mesa/main/tests/dispatch_sanity.cpp @@ -986,6 +986,7 @@ const struct function gl_core_functions_possible[] = { { "glGenerateTextureMipmap", 45, -1 }, { "glTextureStorage2DMultisample", 45, -1 }, { "glTextureStorage3DMultisample", 45, -1 }, + { "glTextureBuffer", 45, -1 }, { NULL, 0, -1 } }; diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index a283bbe5e85..2f2f072c8e1 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -4919,30 +4919,26 @@ _mesa_validate_texbuffer_format(const struct gl_context *ctx, } -static void -texbufferrange(struct gl_context *ctx, GLenum target, GLenum internalFormat, - struct gl_buffer_object *bufObj, - GLintptr offset, GLsizeiptr size) +void +_mesa_texture_buffer_range(struct gl_context *ctx, + struct gl_texture_object *texObj, GLenum target, + GLenum internalFormat, + struct gl_buffer_object *bufObj, + GLintptr offset, GLsizeiptr size, bool range, + bool dsa) { - struct gl_texture_object *texObj; mesa_format format; FLUSH_VERTICES(ctx, 0); - if (target != GL_TEXTURE_BUFFER_ARB) { - _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(target)"); - return; - } - format = _mesa_validate_texbuffer_format(ctx, internalFormat); if (format == MESA_FORMAT_NONE) { - _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(internalFormat 0x%x)", - internalFormat); + _mesa_error(ctx, GL_INVALID_ENUM, + "glTex%sBuffer%s(internalFormat 0x%x)", dsa ? "ture" : "", + range ? "Range" : "", internalFormat); return; } - texObj = _mesa_get_current_tex_object(ctx, target); - _mesa_lock_texture(ctx, texObj); { _mesa_reference_buffer_object(ctx, &texObj->BufferObject, bufObj); @@ -4965,10 +4961,17 @@ texbufferrange(struct gl_context *ctx, GLenum target, GLenum internalFormat, void GLAPIENTRY _mesa_TexBuffer(GLenum target, GLenum internalFormat, GLuint buffer) { + struct gl_texture_object *texObj; struct gl_buffer_object *bufObj; GET_CURRENT_CONTEXT(ctx); + /* Need to catch this before it gets to _mesa_get_current_tex_object */ + if (target != GL_TEXTURE_BUFFER_ARB) { + _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(target)"); + return; + } + /* NOTE: ARB_texture_buffer_object has interactions with * the compatibility profile that are not implemented. */ @@ -4984,7 +4987,12 @@ _mesa_TexBuffer(GLenum target, GLenum internalFormat, GLuint buffer) return; } - texbufferrange(ctx, target, internalFormat, bufObj, 0, buffer ? -1 : 0); + texObj = _mesa_get_current_tex_object(ctx, target); + if (!texObj) + return; + + _mesa_texture_buffer_range(ctx, texObj, target, internalFormat, bufObj, 0, + buffer ? -1 : 0, false, false); } @@ -4993,10 +5001,17 @@ void GLAPIENTRY _mesa_TexBufferRange(GLenum target, GLenum internalFormat, GLuint buffer, GLintptr offset, GLsizeiptr size) { + struct gl_texture_object *texObj; struct gl_buffer_object *bufObj; GET_CURRENT_CONTEXT(ctx); + /* Need to catch this before it gets to _mesa_get_current_tex_object */ + if (target != GL_TEXTURE_BUFFER_ARB) { + _mesa_error(ctx, GL_INVALID_ENUM, "glTexBufferRange(target)"); + return; + } + if (!(ctx->API == API_OPENGL_CORE && ctx->Extensions.ARB_texture_buffer_range)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBufferRange"); @@ -5025,9 +5040,52 @@ _mesa_TexBufferRange(GLenum target, GLenum internalFormat, GLuint buffer, size = 0; } - texbufferrange(ctx, target, internalFormat, bufObj, offset, size); + texObj = _mesa_get_current_tex_object(ctx, target); + if (!texObj) + return; + + _mesa_texture_buffer_range(ctx, texObj, target, internalFormat, bufObj, + offset, size, true, false); } +void GLAPIENTRY +_mesa_TextureBuffer(GLuint texture, GLenum internalFormat, GLuint buffer) +{ + 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, "glTextureBuffer"); + return; + } + + bufObj = _mesa_lookup_bufferobj(ctx, buffer); + if (!bufObj && buffer) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glTextureBuffer(buffer %u)", + buffer); + return; + } + + /* Get the texture object by Name. */ + texObj = _mesa_lookup_texture_err(ctx, texture, + "glTextureBuffer(texture)"); + if (!texObj) + return; + + if (texObj->Target != GL_TEXTURE_BUFFER_ARB) { + _mesa_error(ctx, GL_INVALID_ENUM, "glTextureBuffer(target)"); + return; + } + + _mesa_texture_buffer_range(ctx, texObj, texObj->Target, internalFormat, + bufObj, 0, buffer ? -1 : 0, false, 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 7dd122a041c..02b0eda3858 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -202,6 +202,14 @@ _mesa_texture_image_multisample(struct gl_context *ctx, GLuint dims, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations, GLboolean immutable, const char *func); + +extern void +_mesa_texture_buffer_range(struct gl_context *ctx, + struct gl_texture_object *texObj, GLenum target, + GLenum internalFormat, + struct gl_buffer_object *bufObj, + GLintptr offset, GLsizeiptr size, bool range, + bool dsa); /*@}*/ @@ -394,6 +402,9 @@ extern void GLAPIENTRY _mesa_TexBufferRange(GLenum target, GLenum internalFormat, GLuint buffer, GLintptr offset, GLsizeiptr size); +extern void GLAPIENTRY +_mesa_TextureBuffer(GLuint texture, GLenum internalFormat, GLuint buffer); + extern void GLAPIENTRY _mesa_TexImage2DMultisample(GLenum target, GLsizei samples, |