mesa: track gl_texture_object swizzle internally

this moves updating of swizzles to the points at which it could possibly change

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17687>
This commit is contained in:
Mike Blumenkrantz
2022-08-01 10:34:57 -04:00
committed by Marge Bot
parent 383b39f313
commit 0ccc0f7b50
10 changed files with 74 additions and 4 deletions
+3
View File
@@ -982,6 +982,9 @@ struct gl_texture_object
*/
GLuint lastLevel;
unsigned Swizzle;
unsigned SwizzleGLSL130;
unsigned int validated_first_level;
unsigned int validated_last_level;
+3
View File
@@ -3288,6 +3288,7 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims,
GLenum depth_mode = ctx->API == API_OPENGL_CORE ? GL_RED : GL_LUMINANCE;
if (texObj->Attrib.DepthMode != depth_mode)
_mesa_update_teximage_format_swizzle(ctx, texObj->Image[0][texObj->Attrib.BaseLevel], texObj->Attrib.DepthMode);
_mesa_update_texture_object_swizzle(ctx, texObj);
}
}
_mesa_unlock_texture(ctx, texObj);
@@ -4547,6 +4548,7 @@ copyteximage(struct gl_context *ctx, GLuint dims, struct gl_texture_object *texO
_mesa_update_fbo_texture(ctx, texObj, face, level);
_mesa_dirty_texobj(ctx, texObj);
_mesa_update_texture_object_swizzle(ctx, texObj);
}
}
_mesa_unlock_texture(ctx, texObj);
@@ -7030,6 +7032,7 @@ texture_image_multisample(struct gl_context *ctx, GLuint dims,
_mesa_update_fbo_texture(ctx, texObj, 0, 0);
}
_mesa_update_texture_object_swizzle(ctx, texObj);
}
+52 -1
View File
@@ -262,6 +262,57 @@ _mesa_get_texobj_by_target_and_texunit(struct gl_context *ctx, GLenum target,
return texUnit->CurrentTex[targetIndex];
}
/**
* Return swizzle1(swizzle2)
*/
static unsigned
swizzle_swizzle(unsigned swizzle1, unsigned swizzle2)
{
unsigned i, swz[4];
if (swizzle1 == SWIZZLE_XYZW) {
/* identity swizzle, no change to swizzle2 */
return swizzle2;
}
for (i = 0; i < 4; i++) {
unsigned s = GET_SWZ(swizzle1, i);
switch (s) {
case SWIZZLE_X:
case SWIZZLE_Y:
case SWIZZLE_Z:
case SWIZZLE_W:
swz[i] = GET_SWZ(swizzle2, s);
break;
case SWIZZLE_ZERO:
swz[i] = SWIZZLE_ZERO;
break;
case SWIZZLE_ONE:
swz[i] = SWIZZLE_ONE;
break;
default:
assert(!"Bad swizzle term");
swz[i] = SWIZZLE_X;
}
}
return MAKE_SWIZZLE4(swz[0], swz[1], swz[2], swz[3]);
}
void
_mesa_update_texture_object_swizzle(struct gl_context *ctx,
struct gl_texture_object *texObj)
{
if (texObj->Attrib.BaseLevel >= MAX_TEXTURE_LEVELS)
return;
const struct gl_texture_image *img = texObj->Image[0][texObj->Attrib.BaseLevel];
if (!img)
return;
/* Combine the texture format swizzle with user's swizzle */
texObj->Swizzle = swizzle_swizzle(texObj->Attrib._Swizzle, img->FormatSwizzle);
texObj->SwizzleGLSL130 = swizzle_swizzle(texObj->Attrib._Swizzle, img->FormatSwizzleGLSL130);
}
/**
* Initialize a new texture object to default values.
@@ -1034,7 +1085,7 @@ _mesa_get_fallback_texture(struct gl_context *ctx, gl_texture_index tex)
(dims > 2) ? depth : 1,
0, /* border */
GL_RGBA, texFormat);
_mesa_update_texture_object_swizzle(ctx, texObj);
st_TexImage(ctx, dims, texImage,
GL_RGBA, GL_UNSIGNED_BYTE, texel,
&ctx->DefaultPacking);
+3 -1
View File
@@ -204,7 +204,9 @@ extern struct gl_texture_object *
_mesa_lookup_or_create_texture(struct gl_context *ctx, GLenum target,
GLuint texName, bool no_error, bool is_ext_dsa,
const char *name);
void
_mesa_update_texture_object_swizzle(struct gl_context *ctx,
struct gl_texture_object *texObj);
/*@}*/
#ifdef __cplusplus
+8 -2
View File
@@ -415,8 +415,10 @@ set_tex_parameteri(struct gl_context *ctx,
texObj->Attrib.BaseLevel = MIN2(texObj->Attrib.ImmutableLevels - 1, params[0]);
else
texObj->Attrib.BaseLevel = params[0];
if (texObj->Attrib.BaseLevel < MAX_TEXTURE_LEVELS)
if (texObj->Attrib.BaseLevel < MAX_TEXTURE_LEVELS) {
_mesa_update_teximage_format_swizzle(ctx, texObj->Image[0][texObj->Attrib.BaseLevel], texObj->Attrib.DepthMode);
_mesa_update_texture_object_swizzle(ctx, texObj);
}
return GL_TRUE;
@@ -520,8 +522,10 @@ set_tex_parameteri(struct gl_context *ctx,
(ctx->Extensions.ARB_texture_rg && params[0] == GL_RED)) {
flush(ctx);
texObj->Attrib.DepthMode = params[0];
if (texObj->Attrib.BaseLevel < MAX_TEXTURE_LEVELS)
if (texObj->Attrib.BaseLevel < MAX_TEXTURE_LEVELS) {
_mesa_update_teximage_format_swizzle(ctx, texObj->Image[0][texObj->Attrib.BaseLevel], texObj->Attrib.DepthMode);
_mesa_update_texture_object_swizzle(ctx, texObj);
}
return GL_TRUE;
}
goto invalid_param;
@@ -572,6 +576,7 @@ set_tex_parameteri(struct gl_context *ctx,
flush(ctx);
texObj->Attrib.Swizzle[comp] = params[0];
set_swizzle_component(&texObj->Attrib._Swizzle, comp, swz);
_mesa_update_texture_object_swizzle(ctx, texObj);
return GL_TRUE;
}
goto invalid_pname;
@@ -586,6 +591,7 @@ set_tex_parameteri(struct gl_context *ctx,
if (swz >= 0) {
texObj->Attrib.Swizzle[comp] = params[comp];
set_swizzle_component(&texObj->Attrib._Swizzle, comp, swz);
_mesa_update_texture_object_swizzle(ctx, texObj);
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
+1
View File
@@ -169,6 +169,7 @@ initialize_texture_fields(struct gl_context *ctx,
levelWidth, levelHeight, levelDepth,
&levelWidth, &levelHeight, &levelDepth);
}
_mesa_update_texture_object_swizzle(ctx, texObj);
return GL_TRUE;
}
+1
View File
@@ -701,6 +701,7 @@ texture_view(struct gl_context *ctx, struct gl_texture_object *origTexObj,
texObj->Target = target;
texObj->TargetIndex = _mesa_tex_target_to_index(ctx, target);
assert(texObj->TargetIndex < NUM_TEXTURE_TARGETS);
_mesa_update_texture_object_swizzle(ctx, texObj);
if (!st_TextureView(ctx, texObj, origTexObj)) {
return; /* driver recorded error */
+1
View File
@@ -405,6 +405,7 @@ st_bind_egl_image(struct gl_context *ctx,
texObj->level_override = stimg->level;
texObj->layer_override = stimg->layer;
_mesa_update_texture_object_swizzle(ctx, texObj);
_mesa_dirty_texobj(ctx, texObj);
}
+1
View File
@@ -1041,6 +1041,7 @@ prep_teximage(struct gl_context *ctx, struct gl_texture_image *texImage,
texImage->InternalFormat, texFormat);
texObj->surface_based = GL_FALSE;
_mesa_update_texture_object_swizzle(ctx, texObj);
}
}
+1
View File
@@ -900,6 +900,7 @@ st_context_teximage(struct st_context_iface *stctxi,
_mesa_clear_texture_image(ctx, texImage);
width = height = depth = 0;
}
_mesa_update_texture_object_swizzle(ctx, texObj);
pipe_resource_reference(&texObj->pt, tex);
st_texture_release_all_sampler_views(st, texObj);