From 01cbcdfe2ee777ae6e6f5c1ab04b64ed6b1c666a Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 2 Jun 2026 10:01:54 -0400 Subject: [PATCH] zink/clear: handle texture clears on current fb texture need to ensure existing clears are flushed before applying these cc: mesa-stable Part-of: --- .../drivers/zink/ci/zink-anv-adl-fails.txt | 4 -- .../drivers/zink/ci/zink-anv-tgl-fails.txt | 2 - .../drivers/zink/ci/zink-lavapipe-fails.txt | 2 - .../zink/ci/zink-radv-gfx1201-fails.txt | 5 -- .../zink/ci/zink-radv-navi31-fails.txt | 4 -- .../zink/ci/zink-radv-vangogh-fails.txt | 2 - .../drivers/zink/ci/zink-tu-a750-fails.txt | 2 - src/gallium/drivers/zink/zink_clear.c | 49 +++++++++++++++---- 8 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/gallium/drivers/zink/ci/zink-anv-adl-fails.txt b/src/gallium/drivers/zink/ci/zink-anv-adl-fails.txt index 7e01c4670ba..58496946a80 100644 --- a/src/gallium/drivers/zink/ci/zink-anv-adl-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-anv-adl-fails.txt @@ -508,10 +508,6 @@ spec@ext_transform_feedback@tessellation triangle_fan flat_first,Fail spec@khr_texture_compression_astc@miptree-gles srgb-fp,Fail spec@khr_texture_compression_astc@miptree-gles srgb-fp@sRGB decode full precision,Fail -# uprev Piglit in Mesa -spec@!opengl 1.1@large-tex,Fail -spec@!opengl 1.1@large-tex@test_clear_tex_sub_image,Fail - #glcts update spec@glsl-4.00@execution@built-in-functions@fs-inverse-dmat4,Crash dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_y,Fail diff --git a/src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt b/src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt index 4fa6f098450..3564b605dc4 100644 --- a/src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-anv-tgl-fails.txt @@ -469,8 +469,6 @@ spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp@sRGB decode ful glx@glx-multi-window-single-context,Fail # uprev Piglit in Mesa -spec@!opengl 1.1@large-tex,Fail -spec@!opengl 1.1@large-tex@test_clear_tex_sub_image,Fail spec@arb_shader_storage_buffer_object@max-ssbo-size@fs,Crash spec@arb_shader_storage_buffer_object@max-ssbo-size@vs,Crash spec@egl_mesa_configless_context@basic,Fail diff --git a/src/gallium/drivers/zink/ci/zink-lavapipe-fails.txt b/src/gallium/drivers/zink/ci/zink-lavapipe-fails.txt index 594d8796124..1ec943dd5ab 100644 --- a/src/gallium/drivers/zink/ci/zink-lavapipe-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-lavapipe-fails.txt @@ -147,8 +147,6 @@ spec@ext_transform_feedback@tessellation quads wireframe,Fail spec@ext_transform_feedback@tessellation quad_strip wireframe,Fail # uprev Piglit in Mesa -spec@!opengl 1.1@large-tex,Fail -spec@!opengl 1.1@large-tex@test_clear_tex_sub_image,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp@sRGB decode full precision,Fail diff --git a/src/gallium/drivers/zink/ci/zink-radv-gfx1201-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-gfx1201-fails.txt index 4e49a0e7841..980964d5274 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-gfx1201-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-gfx1201-fails.txt @@ -40,8 +40,3 @@ spec@ext_image_dma_buf_import@ext_image_dma_buf_import-sample_yvyu,Fail spec@ext_image_dma_buf_import@ext_image_dma_buf_import-transcode-nv12-as-r8-gr88,Fail spec@arb_pipeline_statistics_query@arb_pipeline_statistics_query-clip,Fail - -# uprev Piglit in Mesa -spec@!opengl 1.1@large-tex,Fail -spec@!opengl 1.1@large-tex@test_clear_tex_sub_image,Fail - diff --git a/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt index 5c7240bf42b..8e8b6347e41 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt @@ -37,7 +37,3 @@ spec@ext_image_dma_buf_import@ext_image_dma_buf_import-sample_yvu420,Fail spec@ext_image_dma_buf_import@ext_image_dma_buf_import-sample_yvyu,Fail spec@ext_image_dma_buf_import@ext_image_dma_buf_import-transcode-nv12-as-r8-gr88,Fail -# uprev Piglit in Mesa -spec@!opengl 1.1@large-tex,Fail -spec@!opengl 1.1@large-tex@test_clear_tex_sub_image,Fail - diff --git a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt index b49333ae19c..6ef58121a17 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt @@ -3,8 +3,6 @@ glx@glx-multi-window-single-context,Fail spec@egl_mesa_configless_context@basic,Fail # uprev Piglit in Mesa -spec@!opengl 1.1@large-tex,Fail -spec@!opengl 1.1@large-tex@test_clear_tex_sub_image,Fail spec@arb_query_buffer_object@qbo@query-GL_GEOMETRY_SHADER_INVOCATIONS-ASYNC-GL_INT,Fail spec@arb_query_buffer_object@qbo@query-GL_GEOMETRY_SHADER_INVOCATIONS-ASYNC-GL_UNSIGNED_INT,Fail spec@arb_query_buffer_object@qbo@query-GL_GEOMETRY_SHADER_INVOCATIONS-ASYNC-GL_UNSIGNED_INT64_ARB,Fail diff --git a/src/gallium/drivers/zink/ci/zink-tu-a750-fails.txt b/src/gallium/drivers/zink/ci/zink-tu-a750-fails.txt index 384a05c7c3a..eeca6dfe50c 100644 --- a/src/gallium/drivers/zink/ci/zink-tu-a750-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-tu-a750-fails.txt @@ -209,6 +209,4 @@ spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp@sRGB decode ful # uprev Piglit in Mesa spec@!opengl 1.1@large-tex,Fail -spec@!opengl 1.1@large-tex@test_clear_tex_sub_image,Fail spec@!opengl 1.1@large-tex@test_image_load_store,Fail - diff --git a/src/gallium/drivers/zink/zink_clear.c b/src/gallium/drivers/zink/zink_clear.c index 831c1a01880..aa29cab408a 100644 --- a/src/gallium/drivers/zink/zink_clear.c +++ b/src/gallium/drivers/zink/zink_clear.c @@ -438,6 +438,20 @@ set_clear_fb(struct pipe_context *pctx, struct pipe_surface *psurf, struct pipe_ pctx->set_framebuffer_state(pctx, &fb_state); } +static int +surf_matches_fb(struct zink_context *ctx, struct pipe_surface *psurf) +{ + if (util_format_is_depth_or_stencil(psurf->format)) { + return pipe_surface_equal(psurf, &ctx->fb_state.zsbuf) ? PIPE_MAX_COLOR_BUFS : -1; + } else { + for (unsigned i = 0; i < ctx->fb_state.nr_cbufs; i++) { + if (pipe_surface_equal(psurf, &ctx->fb_state.cbufs[i])) + return i; + } + } + return -1; +} + void zink_clear_texture_dynamic(struct pipe_context *pctx, struct pipe_resource *pres, @@ -488,10 +502,21 @@ zink_clear_texture_dynamic(struct pipe_context *pctx, util_format_unpack_s_8uint(pres->format, &stencil, data, 1); } - zink_blit_barriers(ctx, NULL, res, full_clear); - VkCommandBuffer cmdbuf = zink_get_cmdbuf(ctx, NULL, res); - if (cmdbuf == ctx->bs->cmdbuf && ctx->in_rp) - zink_batch_no_rp(ctx); + VkCommandBuffer cmdbuf; + bool needs_rp = false; + int idx = surf_matches_fb(ctx, &psurf); + if (res->fb_bind_count && idx != -1) { + cmdbuf = ctx->bs->cmdbuf; + if (!ctx->in_rp) + zink_batch_rp(ctx); + } else { + zink_blit_barriers(ctx, NULL, res, full_clear); + cmdbuf = zink_get_cmdbuf(ctx, NULL, res); + if (cmdbuf == ctx->bs->cmdbuf && ctx->in_rp) + zink_batch_no_rp(ctx); + zink_batch_reference_resource_rw(ctx, res, true); + needs_rp = true; + } if (res->aspect & VK_IMAGE_ASPECT_COLOR_BIT) { memcpy(&att.clearValue, &color, sizeof(float) * 4); @@ -505,22 +530,26 @@ zink_clear_texture_dynamic(struct pipe_context *pctx, if (res->aspect & VK_IMAGE_ASPECT_STENCIL_BIT) info.pStencilAttachment = &att; } - VKCTX(CmdBeginRendering)(cmdbuf, &info); - if (!full_clear) { + if (needs_rp) + VKCTX(CmdBeginRendering)(cmdbuf, &info); + if (!full_clear || !needs_rp) { VkClearRect rect; rect.rect = info.renderArea; - rect.baseArrayLayer = box->z; + rect.baseArrayLayer = 0; rect.layerCount = box->depth; VkClearAttachment clear_att; clear_att.aspectMask = res->aspect; - clear_att.colorAttachment = 0; + if (needs_rp) + clear_att.colorAttachment = idx == -1 ? 0 : idx; + else if (!util_format_is_depth_or_stencil(pres->format)) + clear_att.colorAttachment = ffs(res->fb_binds) - 1; clear_att.clearValue = att.clearValue; VKCTX(CmdClearAttachments)(cmdbuf, 1, &clear_att, 1, &rect); } - VKCTX(CmdEndRendering)(cmdbuf); - zink_batch_reference_resource_rw(ctx, res, true); + if (needs_rp) + VKCTX(CmdEndRendering)(cmdbuf); } void