zink: clear null image surfaces to 0

GL Spec says that imageLoad from incomplete images must return 0.
This is not really spec compliant as for proper behavior nullDescriptor
and robustImageAccess2 is needed.
A workaround for lack of either of these requires a shader variant.
Clearing the null surface and hoping the app doesn't write to the image
is closer to spec, while avoiding a shader recompile.

KHR-GL46.shader_image_load_store.incomplete_textures tests this.

cc: mesa-stable

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21135>
(cherry picked from commit 22e91af1a7)

Conflicts:
	src/gallium/drivers/zink/zink_context.c
This commit is contained in:
SoroushIMG 2023-02-05 14:18:16 +00:00 committed by Dylan Baker
parent 656b086fcf
commit bb0222b5cf
2 changed files with 8 additions and 1 deletions

View file

@ -391,7 +391,7 @@
"description": "zink: clear null image surfaces to 0",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null
},

View file

@ -4765,6 +4765,13 @@ zink_get_dummy_pipe_surface(struct zink_context *ctx, int samples_index)
{
if (!ctx->dummy_surface[samples_index]) {
ctx->dummy_surface[samples_index] = zink_surface_create_null(ctx, PIPE_TEXTURE_2D, 1024, 1024, BITFIELD_BIT(samples_index));
/* This is possibly used with imageLoad which according to GL spec must return 0 */
if (!samples_index) {
union pipe_color_union color = {0};
struct pipe_box box;
u_box_2d(0, 0, 1024, 1024, &box);
ctx->base.clear_texture(&ctx->base, ctx->dummy_surface[samples_index]->texture, 0, &box, &color);
}
}
return ctx->dummy_surface[samples_index];
}