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 {