mesa: force rendertarget usage on required-renderable formats

the existing guesswork during format selection for teximage is
accurate most of the time, but it's not accurate all of the time.
GL/ES each have a set of sized formats that are required to be
color renderable, and so any time one of these is allocated as a
texture, it MUST have the rendertarget usage bit attached so that
it can later be bound as a framebuffer attachment

an alternative might be to relax this and then try to do migration
to a different format/buffer later if necessary, but that's hard and
probably not actually as useful

cc: mesa-stable

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28055>
(cherry picked from commit 0f66589c2a)
This commit is contained in:
Mike Blumenkrantz 2024-03-07 15:33:54 -05:00 committed by Eric Engestrom
parent 84abf14d9c
commit ef52324fb9
2 changed files with 19 additions and 2 deletions

View file

@ -1254,7 +1254,7 @@
"description": "mesa: force rendertarget usage on required-renderable formats",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null,
"notes": null

View file

@ -1333,6 +1333,21 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
is_renderbuffer = true;
} else {
pTarget = gl_target_to_pipe(target);
if (internalFormat == format) {
if (internalFormat == GL_RGBA) {
/* with GL_RGBA, these are effectively aliases to required formats */
switch (type) {
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_INT_8_8_8_8:
is_renderbuffer = true;
break;
default: break;
}
} else if (internalFormat == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) {
is_renderbuffer = true;
}
}
}
if (target == GL_TEXTURE_1D || target == GL_TEXTURE_1D_ARRAY) {
@ -1351,7 +1366,9 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
bindings = PIPE_BIND_SAMPLER_VIEW;
if (_mesa_is_depth_or_stencil_format(internalFormat))
bindings |= PIPE_BIND_DEPTH_STENCIL;
else if (is_renderbuffer || internalFormat == 3 || internalFormat == 4 ||
else if (is_renderbuffer)
bindings |= PIPE_BIND_RENDER_TARGET;
else if (internalFormat == 3 || internalFormat == 4 ||
internalFormat == GL_RGB || internalFormat == GL_RGBA ||
internalFormat == GL_RGBA2 ||
internalFormat == GL_RGB4 || internalFormat == GL_RGBA4 ||