From ac6dddb8501ddce23f78ed0ee5ceab605d5c6418 Mon Sep 17 00:00:00 2001 From: Feng Jiang Date: Wed, 25 Jun 2025 13:49:51 +0800 Subject: [PATCH] virgl: Make max_hw_atomic_counter_buffers less than PIPE_MAX_HW_ATOMIC_BUFFERS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The values of gl_constants.MaxAtomicBufferBindings and gl_program_constants.MaxAtomicBuffers are derived from pipe_shader_caps.max_hw_atomic_counter_buffers, which is synchronized with the host's GL_MAX_*_ATOMIC_COUNTER_BUFFERS. Based on the definition of struct virgl_context and other factors, the current virgl driver can only support a maximum of 32 atomic buffers. If no restrictions are imposed on pipe_shader_caps.max_hw_atomic_counter_buffers, an error like the following will occur in the vm when the host's GL_MAX_*_ATOMIC_COUNTER_BUFFERS exceeds 32. Thread 1 "glmark2-drm" received signal SIGABRT, Aborted. Download failed: Invalid argument. Continuing without source file ./nptl/./nptl/pthread_kill.c. __pthread_kill_implementation (no_tid=0, signo=6, threadid=) at ./nptl/pthread_kill.c:44 warning: 44 ./nptl/pthread_kill.c: No such file or directory #0 __pthread_kill_implementation (no_tid=0, signo=6, threadid=) at ./nptl/pthread_kill.c:44 #1 __pthread_kill_internal (signo=6, threadid=) at ./nptl/pthread_kill.c:78 #2 __GI___pthread_kill (threadid=, signo=signo@entry=6) at ./nptl/pthread_kill.c:89 #3 0x00007ffff784527e in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #4 0x00007ffff78288ff in __GI_abort () at ./stdlib/abort.c:79 #5 0x00007ffff782881b in __assert_fail_base (fmt=0x7ffff79d01e8 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x7ffff63f686a "start + count <= 32", file=file@entry=0x7ffff63f6854 "../src/util/ bitscan.h", line=line@entry=306, function=function@entry=0x7ffff6d4c020 <__PRETTY_FUNCTION__.16> "u_bit_cons ecutive") at ./assert/assert.c:96 #6 0x00007ffff783b517 in __assert_fail (assertion=assertion@entry=0x7ffff63f686a "start + count <= 32", file =file@entry=0x7ffff63f6854 "../src/util/bitscan.h", line=line@entry=306, function=function@entry=0x7ffff6d4c020 <__PRETTY_FUNCTION__.16> "u_bit_consecutive") at ./assert/assert.c:105 #7 0x00007ffff5250ef5 in u_bit_consecutive (count=48, start=0) at ../src/util/bitscan.h:306 #8 0x00007ffff5252337 in u_bit_consecutive (count=48, start=0) at ../src/gallium/auxiliary/util/u_inlines.h:75 #9 virgl_set_hw_atomic_buffers (ctx=, start_slot=0, count=48, buffers=0x7fffffffd9b0) at ../src/ gallium/drivers/virgl/virgl_context.c:1351 #10 0x00007ffff4a58faf in st_bind_hw_atomic_buffers (st=) at ../src/mesa/state_tracker/st_atom_ atomicbuf.c:168 #11 0x0000000000000000 in ?? () Signed-off-by: Feng Jiang Reviewed-by: Corentin Noël Part-of: --- src/gallium/drivers/virgl/virgl_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index 6bc7767d78e..b57e0d5e74b 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -254,7 +254,7 @@ virgl_init_shader_caps(struct virgl_screen *vscreen) caps->max_hw_atomic_counters = VIRGL_SHADER_STAGE_CAP_V2(max_atomic_counters, i); caps->max_hw_atomic_counter_buffers = - VIRGL_SHADER_STAGE_CAP_V2(max_atomic_counter_buffers, i); + MIN2(VIRGL_SHADER_STAGE_CAP_V2(max_atomic_counter_buffers, i), PIPE_MAX_HW_ATOMIC_BUFFERS); } }