From 6d14cad330a34e15db6dae184c45c98c3256eeae Mon Sep 17 00:00:00 2001 From: Vldly <27299-vladly@users.noreply.gitlab.freedesktop.org> Date: Thu, 14 Nov 2024 20:41:38 +0000 Subject: [PATCH] freedreno: Fix resource tracking on repeated map with discard In two functions implementing resource discard rebind_resource is called on resource before its track record is reset. This prevents update of dirty_resource or dirty_shader_resource because of conditions in needs_dirty_resource. With rsc->track reset and dirty_resource bits missing further calls to transfer_map will not try to reallocate resource storage when needed. A way to reproduce the issue in both functions is by executing at least 3 draws modifying bound texture or VBO each time. This patch fixes those cases and some related piglit tests on a5xx and should fix it on other GPUs. Also it fixes rendering in Firefox and vsraytrace (except vertical line at right edge). Fixes: 0a62a874fc5 ("freedreno: Re-work dirty-resource tracking") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10374 Reviewed-by: Rob Clark Part-of: --- src/freedreno/ci/freedreno-a307-fails.txt | 10 ---------- src/freedreno/ci/freedreno-a530-fails.txt | 11 ----------- src/gallium/drivers/freedreno/freedreno_resource.c | 5 +++-- 3 files changed, 3 insertions(+), 23 deletions(-) diff --git a/src/freedreno/ci/freedreno-a307-fails.txt b/src/freedreno/ci/freedreno-a307-fails.txt index a367b5fb133..fea28360db7 100644 --- a/src/freedreno/ci/freedreno-a307-fails.txt +++ b/src/freedreno/ci/freedreno-a307-fails.txt @@ -357,9 +357,6 @@ spec@arb_transform_feedback3@gl_nextbuffer-gl_nextbuffer,Fail spec@arb_transform_feedback_instanced@draw-auto instanced,Fail spec@arb_uniform_buffer_object@rendering-array,Fail spec@arb_uniform_buffer_object@execution@std140-array-struct-array-struct,Fail -spec@arb_vertex_buffer_object@vbo-subdata-many drawarrays,Fail -spec@arb_vertex_buffer_object@vbo-subdata-many drawelements,Fail -spec@arb_vertex_buffer_object@vbo-subdata-many drawrangeelements,Fail spec@egl 1.4@eglterminate then unbind context,Fail spec@egl_chromium_sync_control@conformance,Fail spec@egl_chromium_sync_control@conformance@eglGetSyncValuesCHROMIUM_msc_and_sbc_test,Fail @@ -846,7 +843,6 @@ spec@glsl-1.40@uniform_buffer@two-stages,Fail # new failures since 2023/02/08 (CTS uprevs, regressions etc.) shaders@glsl-max-varyings >max_varying_components,Fail -spec@!opengl 1.0@gl-1.0-ortho-pos,Fail spec@!opengl 1.1@line-smooth-stipple,Fail spec@!opengl 1.1@teximage-colors gl_alpha16@Exact upload-download of GL_ALPHA16,Fail spec@!opengl 1.1@texwrap 1d,Fail @@ -932,8 +928,6 @@ spec@arb_internalformat_query2@max dimensions related pname checks@GL_MAX_HEIGHT spec@arb_internalformat_query2@max dimensions related pname checks@GL_MAX_LAYERS,Fail spec@arb_internalformat_query2@max dimensions related pname checks@GL_MAX_WIDTH,Fail spec@arb_map_buffer_range@copybuffersubdata offset=0,Fail -spec@arb_map_buffer_range@map_invalidate_buffer_bit offset=0,Fail -spec@arb_map_buffer_range@map_invalidate_range_bit offset=0,Fail spec@arb_occlusion_query@occlusion_query,Fail spec@arb_occlusion_query@occlusion_query_conform,Fail spec@arb_occlusion_query@occlusion_query_conform@GetObjivAval_multi2,Fail @@ -1048,10 +1042,6 @@ spec@arb_texture_rg@texwrap formats@GL_R16- NPOT,Fail spec@arb_texture_rg@texwrap formats@GL_R8- NPOT,Fail spec@arb_texture_rg@texwrap formats@GL_RG16- NPOT,Fail spec@arb_texture_rg@texwrap formats@GL_RG8- NPOT,Fail -spec@arb_uniform_buffer_object@rendering,Fail -spec@arb_uniform_buffer_object@rendering-dsa,Fail -spec@arb_uniform_buffer_object@rendering-dsa-offset,Fail -spec@arb_uniform_buffer_object@rendering-offset,Fail spec@ati_texture_compression_3dc@texwrap formats,Fail spec@ati_texture_compression_3dc@texwrap formats@GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI- NPOT,Fail spec@ext_image_dma_buf_import@ext_image_dma_buf_import-sample_vyuy,Fail diff --git a/src/freedreno/ci/freedreno-a530-fails.txt b/src/freedreno/ci/freedreno-a530-fails.txt index 77019b393ac..5e18c23e6c7 100644 --- a/src/freedreno/ci/freedreno-a530-fails.txt +++ b/src/freedreno/ci/freedreno-a530-fails.txt @@ -119,8 +119,6 @@ spec@arb_draw_indirect@gl_vertexid used with gldrawelementsindirect,Fail spec@arb_enhanced_layouts@linker@component-layout@intrastage-vs,Fail spec@arb_enhanced_layouts@linker@component-layout@vs-to-fs,Fail spec@arb_map_buffer_alignment@arb_map_buffer_alignment-map-invalidate-range,Fail -spec@arb_map_buffer_range@map_invalidate_buffer_bit offset=0,Fail -spec@arb_map_buffer_range@map_invalidate_range_bit offset=0,Fail spec@arb_occlusion_query@occlusion_query_order,Fail spec@arb_point_sprite@arb_point_sprite-interactions 1.0,Fail spec@arb_separate_shader_objects@400 combinations by location,Fail @@ -286,18 +284,9 @@ spec@khr_texture_compression_astc@miptree-gles srgb-sd,Fail spec@khr_texture_compression_astc@miptree-gles srgb-sd@sRGB skip decode,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gl hdr,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gl hdr@HDR Profile,Fail -spec@arb_vertex_buffer_object@vbo-subdata-many drawarrays,Fail -spec@arb_vertex_buffer_object@vbo-subdata-many drawelements,Fail -spec@arb_vertex_buffer_object@vbo-subdata-many drawrangeelements,Fail -spec@arb_uniform_buffer_object@rendering,Fail -spec@arb_uniform_buffer_object@rendering-dsa,Fail -spec@arb_uniform_buffer_object@rendering-dsa-offset,Fail -spec@arb_uniform_buffer_object@rendering-offset,Fail -spec@!opengl 1.0@gl-1.0-ortho-pos,Fail # Regressions since ???: spec@!opengl 1.1@copyteximage 1d,Fail -spec@arb_shader_atomic_counters@respecify-buffer,Fail spec@arb_timer_query@timestamp-get,Fail # glcts uprev diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index e9b15506213..828983519cc 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -417,7 +417,6 @@ fd_try_shadow_resource(struct fd_context *ctx, struct fd_resource *rsc, * should empty/destroy rsc->batches hashset) */ fd_bc_invalidate_resource(rsc, false); - rebind_resource(rsc); fd_screen_lock(ctx->screen); @@ -459,6 +458,8 @@ fd_try_shadow_resource(struct fd_context *ctx, struct fd_resource *rsc, fd_screen_unlock(ctx->screen); + rebind_resource(rsc); + struct pipe_blit_info blit = {}; blit.dst.resource = prsc; blit.dst.format = prsc->format; @@ -740,8 +741,8 @@ invalidate_resource(struct fd_resource *rsc, unsigned usage) assert_dt unsigned op = translate_usage(usage); if (needs_flush || resource_busy(rsc, op)) { - rebind_resource(rsc); realloc_bo(rsc, fd_bo_size(rsc->bo)); + rebind_resource(rsc); } else { util_range_set_empty(&rsc->valid_buffer_range); }