--- .../glapi/gen/EXT_direct_state_access.xml | 15 ++ src/mesa/main/tests/dispatch_sanity.cpp | 2 +- src/mesa/main/teximage.c | 137 ++++++++++++++---- src/mesa/main/teximage.h | 6 + 4 files changed, 131 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 d8fdf8921da..57abf7671d5 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 @@ <param name="matrixMode" type="GLenum" /> </function> + <!-- OpenGL 1.1 --> + + <function name="TextureSubImage2DEXT"> + <param name="texture" type="GLuint" /> + <param name="target" type="GLenum" /> + <param name="level" type="GLint" /> + <param name="xoffset" type="GLint" /> + <param name="yoffset" type="GLint" /> + <param name="width" type="GLsizei" /> + <param name="height" type="GLsizei" /> + <param name="format" type="GLenum" /> + <param name="type" type="GLenum" /> + <param name="pixels" type="const GLvoid *" /> + </function> + <!-- OpenGL 1.2.1 --> <function name="BindMultiTextureEXT"> diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp index ba020c31e70..5b0d1b437d1 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", 10, -1 }, //{ "glTextureImage2DEXT", 10, -1 }, //{ "glTextureSubImage1DEXT", 10, -1 }, - //{ "glTextureSubImage2DEXT", 10, -1 }, + { "glTextureSubImage2DEXT", 10, -1 }, //{ "glCopyTextureImage1DEXT", 10, -1 }, //{ "glCopyTextureImage2DEXT", 10, -1 }, //{ "glCopyTextureSubImage1DEXT", 10, -1 }, diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index d45854bd17f..ab8b96c8dbd 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -3295,6 +3295,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. @@ -3418,11 +3480,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; @@ -3438,7 +3500,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 { @@ -3529,29 +3595,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); } @@ -3649,8 +3715,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); } @@ -3661,8 +3728,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); } @@ -3673,9 +3741,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); } @@ -3687,9 +3768,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); } @@ -3700,9 +3781,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); } @@ -3714,9 +3795,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 266a9f3d83d..39a355b3828 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.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev