mesa: refactor compressed_tex_sub_image function

Combine compressed_tex_sub_image, compressed_tex_sub_image_error and
compressed_tex_sub_image_no_error in a single function.

The added "enum tex_mode mode" parameter allows to implement the
DSA / non-DSA variants and their error/no_error combination.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2019-08-07 14:42:59 +02:00 committed by Marek Olšák
parent 6c5d983865
commit 7df233d68d

View file

@ -5452,49 +5452,71 @@ compressed_texture_sub_image(struct gl_context *ctx, GLuint dims,
} }
static ALWAYS_INLINE void enum tex_mode {
/* Use bound texture to current unit */
TEX_MODE_CURRENT_NO_ERROR = 0,
TEX_MODE_CURRENT_ERROR,
/* Use the specified texture name */
TEX_MODE_DSA_NO_ERROR,
TEX_MODE_DSA_ERROR,
/* Use the specified texture name + target */
TEX_MODE_EXT_DSA_TEXTURE,
};
static void
compressed_tex_sub_image(unsigned dim, GLenum target, GLuint texture, compressed_tex_sub_image(unsigned dim, GLenum target, GLuint texture,
GLint level, GLint xoffset, GLint yoffset, GLint level, GLint xoffset, GLint yoffset,
GLint zoffset, GLsizei width, GLsizei height, GLint zoffset, GLsizei width, GLsizei height,
GLsizei depth, GLenum format, GLsizei imageSize, GLsizei depth, GLenum format, GLsizei imageSize,
const GLvoid *data, bool dsa, bool ext_dsa, const GLvoid *data, enum tex_mode mode,
bool no_error, const char *caller) const char *caller)
{ {
struct gl_texture_object *texObj = NULL; struct gl_texture_object *texObj;
struct gl_texture_image *texImage; struct gl_texture_image *texImage;
bool no_error = false;
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
if (dsa) { switch (mode) {
if (no_error) { case TEX_MODE_DSA_ERROR:
texObj = _mesa_lookup_texture(ctx, texture); assert(target == 0);
target = texObj->Target; texObj = _mesa_lookup_texture_err(ctx, texture, caller);
} else { if (texObj)
if (!ext_dsa) {
texObj = _mesa_lookup_texture_err(ctx, texture, caller);
if (!texObj)
return;
target = texObj->Target; target = texObj->Target;
} else { break;
texObj = lookup_texture_ext_dsa(ctx, target, texture, caller); case TEX_MODE_DSA_NO_ERROR:
if (!texObj) assert(target == 0);
return; texObj = _mesa_lookup_texture(ctx, texture);
} if (texObj)
} target = texObj->Target;
no_error = true;
break;
case TEX_MODE_EXT_DSA_TEXTURE:
texObj = _mesa_lookup_or_create_texture(ctx, target, texture,
false, true, caller);
break;
case TEX_MODE_CURRENT_ERROR:
no_error = true;
case TEX_MODE_CURRENT_NO_ERROR:
default:
assert(texture == 0);
texObj = _mesa_get_current_tex_object(ctx, target);
break;
} }
if (!texObj)
return;
if (!no_error && if (!no_error &&
compressed_subtexture_target_check(ctx, target, dim, format, dsa, compressed_subtexture_target_check(ctx, target, dim, format,
mode == TEX_MODE_DSA_ERROR,
caller)) { caller)) {
return; return;
} }
if (!dsa) { if (!no_error && !texObj)
texObj = _mesa_get_current_tex_object(ctx, target); return;
if (!no_error && !texObj)
return;
}
if (!no_error && if (!no_error &&
compressed_subtexture_error_check(ctx, dim, texObj, target, level, compressed_subtexture_error_check(ctx, dim, texObj, target, level,
@ -5505,7 +5527,9 @@ compressed_tex_sub_image(unsigned dim, GLenum target, GLuint texture,
} }
/* Must handle special case GL_TEXTURE_CUBE_MAP. */ /* Must handle special case GL_TEXTURE_CUBE_MAP. */
if (dim == 3 && dsa && texObj->Target == GL_TEXTURE_CUBE_MAP) { if (dim == 3 &&
(mode == TEX_MODE_DSA_ERROR || mode == TEX_MODE_DSA_NO_ERROR) &&
texObj->Target == GL_TEXTURE_CUBE_MAP) {
const char *pixels = data; const char *pixels = data;
GLint image_stride; GLint image_stride;
@ -5547,31 +5571,6 @@ compressed_tex_sub_image(unsigned dim, GLenum target, GLuint texture,
} }
} }
static void
compressed_tex_sub_image_error(unsigned dim, GLenum target, GLuint texture,
GLint level, GLint xoffset, GLint yoffset,
GLint zoffset, GLsizei width, GLsizei height,
GLsizei depth, GLenum format, GLsizei imageSize,
const GLvoid *data, bool dsa, bool ext_dsa,
const char *caller)
{
compressed_tex_sub_image(dim, target, texture, level, xoffset, yoffset,
zoffset, width, height, depth, format, imageSize,
data, dsa, ext_dsa, false, caller);
}
static void
compressed_tex_sub_image_no_error(unsigned dim, GLenum target, GLuint texture,
GLint level, GLint xoffset, GLint yoffset,
GLint zoffset, GLsizei width, GLsizei height,
GLsizei depth, GLenum format, GLsizei imageSize,
const GLvoid *data, bool dsa, bool ext_dsa,
const char *caller)
{
compressed_tex_sub_image(dim, target, texture, level, xoffset, yoffset,
zoffset, width, height, depth, format, imageSize,
data, dsa, ext_dsa, true, caller);
}
void GLAPIENTRY void GLAPIENTRY
_mesa_CompressedTexSubImage1D_no_error(GLenum target, GLint level, _mesa_CompressedTexSubImage1D_no_error(GLenum target, GLint level,
@ -5579,9 +5578,11 @@ _mesa_CompressedTexSubImage1D_no_error(GLenum target, GLint level,
GLenum format, GLsizei imageSize, GLenum format, GLsizei imageSize,
const GLvoid *data) const GLvoid *data)
{ {
compressed_tex_sub_image_no_error(1, target, 0, level, xoffset, 0, 0, width, compressed_tex_sub_image(1, target, 0,
1, 1, format, imageSize, data, false, level, xoffset, 0, 0, width,
false, "glCompressedTexSubImage1D"); 1, 1, format, imageSize, data,
TEX_MODE_CURRENT_NO_ERROR,
"glCompressedTexSubImage1D");
} }
@ -5590,9 +5591,11 @@ _mesa_CompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset,
GLsizei width, GLenum format, GLsizei width, GLenum format,
GLsizei imageSize, const GLvoid *data) GLsizei imageSize, const GLvoid *data)
{ {
compressed_tex_sub_image_error(1, target, 0, level, xoffset, 0, 0, width, 1, compressed_tex_sub_image(1, target, 0,
1, format, imageSize, data, false, false, level, xoffset, 0, 0, width,
"glCompressedTexSubImage1D"); 1, 1, format, imageSize, data,
TEX_MODE_CURRENT_ERROR,
"glCompressedTexSubImage1D");
} }
@ -5602,10 +5605,11 @@ _mesa_CompressedTextureSubImage1D_no_error(GLuint texture, GLint level,
GLenum format, GLsizei imageSize, GLenum format, GLsizei imageSize,
const GLvoid *data) const GLvoid *data)
{ {
compressed_tex_sub_image_no_error(1, 0, texture, level, xoffset, 0, 0, compressed_tex_sub_image(1, 0, texture,
width, 1, 1, format, imageSize, data, level, xoffset, 0, 0,
true, false, width, 1, 1, format, imageSize, data,
"glCompressedTextureSubImage1D"); TEX_MODE_DSA_NO_ERROR,
"glCompressedTextureSubImage1D");
} }
@ -5614,9 +5618,11 @@ _mesa_CompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset,
GLsizei width, GLenum format, GLsizei width, GLenum format,
GLsizei imageSize, const GLvoid *data) GLsizei imageSize, const GLvoid *data)
{ {
compressed_tex_sub_image_error(1, 0, texture, level, xoffset, 0, 0, width, compressed_tex_sub_image(1, 0, texture,
1, 1, format, imageSize, data, true, false, level, xoffset, 0, 0,
"glCompressedTextureSubImage1D"); width, 1, 1, format, imageSize, data,
TEX_MODE_DSA_ERROR,
"glCompressedTextureSubImage1D");
} }
@ -5627,10 +5633,11 @@ _mesa_CompressedTexSubImage2D_no_error(GLenum target, GLint level,
GLenum format, GLsizei imageSize, GLenum format, GLsizei imageSize,
const GLvoid *data) const GLvoid *data)
{ {
compressed_tex_sub_image_no_error(2, target, 0, level, xoffset, yoffset, 0, compressed_tex_sub_image(2, target, 0, level,
width, height, 1, format, imageSize, data, xoffset, yoffset, 0,
false, false, width, height, 1, format, imageSize, data,
"glCompressedTexSubImage2D"); TEX_MODE_CURRENT_NO_ERROR,
"glCompressedTexSubImage2D");
} }
@ -5640,10 +5647,11 @@ _mesa_CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset,
GLenum format, GLsizei imageSize, GLenum format, GLsizei imageSize,
const GLvoid *data) const GLvoid *data)
{ {
compressed_tex_sub_image_error(2, target, 0, level, xoffset, yoffset, 0, compressed_tex_sub_image(2, target, 0, level,
width, height, 1, format, imageSize, data, xoffset, yoffset, 0,
false, false, width, height, 1, format, imageSize, data,
"glCompressedTexSubImage2D"); TEX_MODE_CURRENT_ERROR,
"glCompressedTexSubImage2D");
} }
@ -5654,10 +5662,11 @@ _mesa_CompressedTextureSubImage2DEXT(GLuint texture, GLenum target,
GLsizei height, GLenum format, GLsizei height, GLenum format,
GLsizei imageSize, const GLvoid *data) GLsizei imageSize, const GLvoid *data)
{ {
compressed_tex_sub_image_error(2, target, texture, level, xoffset, yoffset, compressed_tex_sub_image(2, target, texture, level, xoffset,
0, width, height, 1, format, imageSize, yoffset, 0, width, height, 1, format,
data, true, true, imageSize, data,
"glCompressedTextureSubImage2DEXT"); TEX_MODE_EXT_DSA_TEXTURE,
"glCompressedTextureSubImage2DEXT");
} }
@ -5668,10 +5677,10 @@ _mesa_CompressedTextureSubImage2D_no_error(GLuint texture, GLint level,
GLenum format, GLsizei imageSize, GLenum format, GLsizei imageSize,
const GLvoid *data) const GLvoid *data)
{ {
compressed_tex_sub_image_no_error(2, 0, texture, level, xoffset, yoffset, 0, compressed_tex_sub_image(2, 0, texture, level, xoffset, yoffset, 0,
width, height, 1, format, imageSize, data, width, height, 1, format, imageSize, data,
true, false, TEX_MODE_DSA_NO_ERROR,
"glCompressedTextureSubImage2D"); "glCompressedTextureSubImage2D");
} }
@ -5682,10 +5691,10 @@ _mesa_CompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset,
GLenum format, GLsizei imageSize, GLenum format, GLsizei imageSize,
const GLvoid *data) const GLvoid *data)
{ {
compressed_tex_sub_image_error(2, 0, texture, level, xoffset, yoffset, 0, compressed_tex_sub_image(2, 0, texture, level, xoffset, yoffset, 0,
width, height, 1, format, imageSize, data, width, height, 1, format, imageSize, data,
true, false, TEX_MODE_DSA_ERROR,
"glCompressedTextureSubImage2D"); "glCompressedTextureSubImage2D");
} }
void GLAPIENTRY void GLAPIENTRY
@ -5696,10 +5705,11 @@ _mesa_CompressedTexSubImage3D_no_error(GLenum target, GLint level,
GLenum format, GLsizei imageSize, GLenum format, GLsizei imageSize,
const GLvoid *data) const GLvoid *data)
{ {
compressed_tex_sub_image_no_error(3, target, 0, level, xoffset, yoffset, compressed_tex_sub_image(3, target, 0, level, xoffset, yoffset,
zoffset, width, height, depth, format, zoffset, width, height, depth, format,
imageSize, data, false, false, imageSize, data,
"glCompressedTexSubImage3D"); TEX_MODE_CURRENT_NO_ERROR,
"glCompressedTexSubImage3D");
} }
void GLAPIENTRY void GLAPIENTRY
@ -5708,10 +5718,11 @@ _mesa_CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset,
GLsizei height, GLsizei depth, GLenum format, GLsizei height, GLsizei depth, GLenum format,
GLsizei imageSize, const GLvoid *data) GLsizei imageSize, const GLvoid *data)
{ {
compressed_tex_sub_image_error(3, target, 0, level, xoffset, yoffset, compressed_tex_sub_image(3, target, 0, level, xoffset, yoffset,
zoffset, width, height, depth, format, zoffset, width, height, depth, format,
imageSize, data, false, false, imageSize, data,
"glCompressedTexSubImage3D"); TEX_MODE_CURRENT_ERROR,
"glCompressedTexSubImage3D");
} }
void GLAPIENTRY void GLAPIENTRY
@ -5722,10 +5733,11 @@ _mesa_CompressedTextureSubImage3D_no_error(GLuint texture, GLint level,
GLenum format, GLsizei imageSize, GLenum format, GLsizei imageSize,
const GLvoid *data) const GLvoid *data)
{ {
compressed_tex_sub_image_no_error(3, 0, texture, level, xoffset, yoffset, compressed_tex_sub_image(3, 0, texture, level, xoffset, yoffset,
zoffset, width, height, depth, format, zoffset, width, height, depth, format,
imageSize, data, true, false, imageSize, data,
"glCompressedTextureSubImage3D"); TEX_MODE_DSA_NO_ERROR,
"glCompressedTextureSubImage3D");
} }
void GLAPIENTRY void GLAPIENTRY
@ -5735,12 +5747,14 @@ _mesa_CompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset,
GLenum format, GLsizei imageSize, GLenum format, GLsizei imageSize,
const GLvoid *data) const GLvoid *data)
{ {
compressed_tex_sub_image_error(3, 0, texture, level, xoffset, yoffset, compressed_tex_sub_image(3, 0, texture, level, xoffset, yoffset,
zoffset, width, height, depth, format, zoffset, width, height, depth, format,
imageSize, data, true, false, imageSize, data,
"glCompressedTextureSubImage3D"); TEX_MODE_DSA_ERROR,
"glCompressedTextureSubImage3D");
} }
mesa_format mesa_format
_mesa_get_texbuffer_format(const struct gl_context *ctx, GLenum internalFormat) _mesa_get_texbuffer_format(const struct gl_context *ctx, GLenum internalFormat)
{ {