From b82b3d28d340dfbcebde471cb9037e57a0ac48da Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Mon, 3 Sep 2018 09:53:31 +1000 Subject: [PATCH] mesa: add support for glTextureSubImage2DEXT() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák Signed-off-by: Marek Olšák --- .../glapi/gen/EXT_direct_state_access.xml | 15 ++ src/mapi/glapi/gen/static_data.py | 1 + src/mesa/main/tests/dispatch_sanity.cpp | 2 +- src/mesa/main/teximage.c | 137 ++++++++++++++---- src/mesa/main/teximage.h | 6 + 5 files changed, 132 insertions(+), 29 deletions(-) diff --git a/src/mapi/glapi/gen/EXT_direct_state_access.xml b/src/mapi/glapi/gen/EXT_direct_state_access.xml index 6a6a118a2bd..53c6aa7d563 100644 --- a/src/mapi/glapi/gen/EXT_direct_state_access.xml +++ b/src/mapi/glapi/gen/EXT_direct_state_access.xml @@ -100,6 +100,21 @@ + + + + + + + + + + + + + + + diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py index 3970452b0cb..e7b1e126508 100644 --- a/src/mapi/glapi/gen/static_data.py +++ b/src/mapi/glapi/gen/static_data.py @@ -1478,6 +1478,7 @@ offsets = { "NamedBufferSubDataEXT": 1442, "NamedBufferStorageEXT": 1443, "MapNamedBufferRangeEXT": 1444, + "TextureSubImage2DEXT": 1445, } functions = [ diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp index 8813e945bfc..fa41aa66e38 100644 --- a/src/mesa/main/tests/dispatch_sanity.cpp +++ b/src/mesa/main/tests/dispatch_sanity.cpp @@ -1041,7 +1041,7 @@ const struct function common_desktop_functions_possible[] = { //{ "glTextureImage1DEXT", 11, -1 }, //{ "glTextureImage2DEXT", 11, -1 }, //{ "glTextureSubImage1DEXT", 11, -1 }, - //{ "glTextureSubImage2DEXT", 11, -1 }, + { "glTextureSubImage2DEXT", 11, -1 }, //{ "glCopyTextureImage1DEXT", 11, -1 }, //{ "glCopyTextureImage2DEXT", 11, -1 }, //{ "glCopyTextureSubImage1DEXT", 11, -1 }, diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 4b33403bfaa..8508fbb711e 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -3276,6 +3276,68 @@ _mesa_EGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image) } +static struct gl_texture_object * +lookup_texture_ext_dsa(struct gl_context *ctx, GLenum target, GLuint texture, + const char *caller) +{ + GLenum boundTarget; + switch (target) { + case GL_TEXTURE_CUBE_MAP_POSITIVE_X: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: + boundTarget = GL_TEXTURE_CUBE_MAP; + break; + default: + boundTarget = target; + break; + } + + int targetIndex = _mesa_tex_target_to_index(ctx, boundTarget); + if (targetIndex < 0) { + _mesa_error(ctx, GL_INVALID_ENUM, "%s(target = %s)", caller, + _mesa_enum_to_string(target)); + return NULL; + } + assert(targetIndex < NUM_TEXTURE_TARGETS); + + struct gl_texture_object *texObj; + if (texture == 0) { + /* Use a default texture object */ + texObj = ctx->Shared->DefaultTex[targetIndex]; + assert(texObj); + } else { + texObj = _mesa_lookup_texture(ctx, texture); + if (!texObj && ctx->API == API_OPENGL_CORE) { + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-gen name)", caller); + return NULL; + } + + if (!texObj) { + texObj = ctx->Driver.NewTextureObject(ctx, texture, boundTarget); + if (!texObj) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller); + return NULL; + } + + /* insert into hash table */ + _mesa_HashInsert(ctx->Shared->TexObjects, texObj->Name, texObj); + } + + if (texObj->Target != boundTarget) { + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(%s != %s)", + caller, _mesa_enum_to_string(texObj->Target), + _mesa_enum_to_string(target)); + return NULL; + } + } + + return texObj; +} + + /** * Helper that implements the glTexSubImage1/2/3D() * and glTextureSubImage1/2/3D() functions. @@ -3399,11 +3461,11 @@ texsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level, */ static ALWAYS_INLINE void texturesubimage(struct gl_context *ctx, GLuint dims, - GLuint texture, GLint level, + GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels, - const char *callerName, bool no_error) + const char *callerName, bool no_error, bool ext_dsa) { struct gl_texture_object *texObj; struct gl_texture_image *texImage; @@ -3419,7 +3481,11 @@ texturesubimage(struct gl_context *ctx, GLuint dims, /* Get the texture object by Name. */ if (!no_error) { - texObj = _mesa_lookup_texture_err(ctx, texture, callerName); + if (!ext_dsa) { + texObj = _mesa_lookup_texture_err(ctx, texture, callerName); + } else { + texObj = lookup_texture_ext_dsa(ctx, target, texture, callerName); + } if (!texObj) return; } else { @@ -3510,29 +3576,29 @@ texturesubimage(struct gl_context *ctx, GLuint dims, static void texturesubimage_error(struct gl_context *ctx, GLuint dims, - GLuint texture, GLint level, + GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels, - const char *callerName) + const char *callerName, bool ext_dsa) { - texturesubimage(ctx, dims, texture, level, xoffset, yoffset, zoffset, - width, height, depth, format, type, pixels, callerName, - false); + texturesubimage(ctx, dims, texture, target, level, xoffset, yoffset, + zoffset, width, height, depth, format, type, pixels, + callerName, false, ext_dsa); } static void texturesubimage_no_error(struct gl_context *ctx, GLuint dims, - GLuint texture, GLint level, + GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels, - const char *callerName) + const char *callerName, bool ext_dsa) { - texturesubimage(ctx, dims, texture, level, xoffset, yoffset, zoffset, - width, height, depth, format, type, pixels, callerName, - true); + texturesubimage(ctx, dims, texture, target, level, xoffset, yoffset, + zoffset, width, height, depth, format, type, pixels, + callerName, true, ext_dsa); } @@ -3630,8 +3696,9 @@ _mesa_TextureSubImage1D_no_error(GLuint texture, GLint level, GLint xoffset, const GLvoid *pixels) { GET_CURRENT_CONTEXT(ctx); - texturesubimage_no_error(ctx, 1, texture, level, xoffset, 0, 0, width, 1, 1, - format, type, pixels, "glTextureSubImage1D"); + texturesubimage_no_error(ctx, 1, texture, 0, level, xoffset, 0, 0, width, + 1, 1, format, type, pixels, "glTextureSubImage1D", + false); } @@ -3642,8 +3709,9 @@ _mesa_TextureSubImage1D(GLuint texture, GLint level, const GLvoid *pixels) { GET_CURRENT_CONTEXT(ctx); - texturesubimage_error(ctx, 1, texture, level, xoffset, 0, 0, width, 1, 1, - format, type, pixels, "glTextureSubImage1D"); + texturesubimage_error(ctx, 1, texture, 0, level, xoffset, 0, 0, width, 1, + 1, format, type, pixels, "glTextureSubImage1D", + false); } @@ -3654,9 +3722,22 @@ _mesa_TextureSubImage2D_no_error(GLuint texture, GLint level, GLint xoffset, const GLvoid *pixels) { GET_CURRENT_CONTEXT(ctx); - texturesubimage_no_error(ctx, 2, texture, level, xoffset, yoffset, 0, width, - height, 1, format, type, pixels, - "glTextureSubImage2D"); + texturesubimage_no_error(ctx, 2, texture, 0, level, xoffset, yoffset, 0, + width, height, 1, format, type, pixels, + "glTextureSubImage2D", false); +} + + +void GLAPIENTRY +_mesa_TextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, + GLint xoffset, GLint yoffset, GLsizei width, + GLsizei height, GLenum format, GLenum type, + const GLvoid *pixels) +{ + GET_CURRENT_CONTEXT(ctx); + texturesubimage_error(ctx, 2, texture, target, level, xoffset, yoffset, 0, + width, height, 1, format, type, pixels, + "glTextureSubImage2DEXT", true); } @@ -3668,9 +3749,9 @@ _mesa_TextureSubImage2D(GLuint texture, GLint level, const GLvoid *pixels) { GET_CURRENT_CONTEXT(ctx); - texturesubimage_error(ctx, 2, texture, level, xoffset, yoffset, 0, width, - height, 1, format, type, pixels, - "glTextureSubImage2D"); + texturesubimage_error(ctx, 2, texture, 0, level, xoffset, yoffset, 0, + width, height, 1, format, type, pixels, + "glTextureSubImage2D", false); } @@ -3681,9 +3762,9 @@ _mesa_TextureSubImage3D_no_error(GLuint texture, GLint level, GLint xoffset, GLenum type, const GLvoid *pixels) { GET_CURRENT_CONTEXT(ctx); - texturesubimage_no_error(ctx, 3, texture, level, xoffset, yoffset, zoffset, - width, height, depth, format, type, pixels, - "glTextureSubImage3D"); + texturesubimage_no_error(ctx, 3, texture, 0, level, xoffset, yoffset, + zoffset, width, height, depth, format, type, + pixels, "glTextureSubImage3D", false); } @@ -3695,9 +3776,9 @@ _mesa_TextureSubImage3D(GLuint texture, GLint level, const GLvoid *pixels) { GET_CURRENT_CONTEXT(ctx); - texturesubimage_error(ctx, 3, texture, level, xoffset, yoffset, zoffset, + texturesubimage_error(ctx, 3, texture, 0, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, - "glTextureSubImage3D"); + "glTextureSubImage3D", false); } diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h index 261daae3948..494b167e2d5 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -350,6 +350,12 @@ _mesa_TextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLenum format, GLenum type, const GLvoid *pixels); +void GLAPIENTRY +_mesa_TextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, + GLint xoffset, GLint yoffset, GLsizei width, + GLsizei height, GLenum format, GLenum type, + const GLvoid *pixels); + void GLAPIENTRY _mesa_TextureSubImage2D_no_error(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, -- 2.30.2