From 89d709a43ec55c0522f41fd1d439b4af8593b2b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20No=C3=ABl?= Date: Tue, 15 Oct 2024 22:30:46 +0200 Subject: [PATCH] virgl: Propagate the GL_MAX_stage_SHADER_STORAGE_BLOCKS for each stage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some hardware have a higher number in the computer stage than in others, let's simply propagate everything when possible. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12003 Signed-off-by: Corentin Noël Part-of: --- src/gallium/drivers/virgl/virgl_screen.c | 11 ++++++++--- src/gallium/drivers/virgl/virgl_winsys.h | 1 + src/virtio/virtio-gpu/virgl_hw.h | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index ca6b2cbf8b8..92897ef043d 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -456,11 +456,16 @@ virgl_get_shader_param(struct pipe_screen *screen, if (vscreen->caps.caps.v2.host_feature_check_version < 12) return 4096 * sizeof(float[4]); return VIRGL_SHADER_STAGE_CAP_V2(max_const_buffer_size, shader); - case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS: - if (shader == PIPE_SHADER_FRAGMENT || shader == PIPE_SHADER_COMPUTE) + case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS: { + int max_shader_buffers = VIRGL_SHADER_STAGE_CAP_V2(max_shader_storage_blocks, shader); + if (max_shader_buffers != INT_MAX) { + return max_shader_buffers; + } else if (shader == PIPE_SHADER_FRAGMENT || shader == PIPE_SHADER_COMPUTE) { return vscreen->caps.caps.v2.max_shader_buffer_frag_compute; - else + } else { return vscreen->caps.caps.v2.max_shader_buffer_other_stages; + } + } case PIPE_SHADER_CAP_MAX_SHADER_IMAGES: if (shader == PIPE_SHADER_FRAGMENT || shader == PIPE_SHADER_COMPUTE) return vscreen->caps.caps.v2.max_shader_image_frag_compute; diff --git a/src/gallium/drivers/virgl/virgl_winsys.h b/src/gallium/drivers/virgl/virgl_winsys.h index 3d83ac728f2..bea877632cb 100644 --- a/src/gallium/drivers/virgl/virgl_winsys.h +++ b/src/gallium/drivers/virgl/virgl_winsys.h @@ -183,6 +183,7 @@ static inline void virgl_ws_fill_new_caps_defaults(struct virgl_drm_caps *caps) caps->caps.v2.max_shader_sampler_views = 16; for (int shader_type = 0; shader_type < PIPE_SHADER_TYPES; shader_type++) { caps->caps.v2.max_const_buffer_size[shader_type] = 4096 * sizeof(float[4]); + caps->caps.v2.max_shader_storage_blocks[shader_type] = INT_MAX; } } diff --git a/src/virtio/virtio-gpu/virgl_hw.h b/src/virtio/virtio-gpu/virgl_hw.h index 1c55a47bf0c..e2b324b5b5d 100644 --- a/src/virtio/virtio-gpu/virgl_hw.h +++ b/src/virtio/virtio-gpu/virgl_hw.h @@ -770,6 +770,7 @@ struct virgl_caps_v2 { uint32_t max_uniform_block_size; uint32_t max_tcs_outputs; uint32_t max_tes_outputs; + uint32_t max_shader_storage_blocks[6]; // PIPE_SHADER_TYPES }; union virgl_caps {