diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c index 8970c4f37d1..cd6097084b2 100644 --- a/src/gallium/drivers/virgl/virgl_context.c +++ b/src/gallium/drivers/virgl/virgl_context.c @@ -202,14 +202,12 @@ static void virgl_attach_res_sampler_views(struct virgl_context *vctx, struct virgl_winsys *vws = virgl_screen(vctx->base.screen)->vws; const struct virgl_shader_binding_state *binding = &vctx->shader_bindings[shader_type]; - uint32_t remaining_mask = binding->view_enabled_mask; - struct virgl_resource *res; - while (remaining_mask) { - int i = u_bit_scan(&remaining_mask); - assert(binding->views[i] && binding->views[i]->texture); - res = virgl_resource(binding->views[i]->texture); - vws->emit_res(vws, vctx->cbuf, res->hw_res, FALSE); + for (int i = 0; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; ++i) { + if (binding->views[i] && binding->views[i]->texture) { + struct virgl_resource *res = virgl_resource(binding->views[i]->texture); + vws->emit_res(vws, vctx->cbuf, res->hw_res, FALSE); + } } } @@ -1033,7 +1031,6 @@ static void virgl_set_sampler_views(struct pipe_context *ctx, struct virgl_shader_binding_state *binding = &vctx->shader_bindings[shader_type]; - binding->view_enabled_mask &= ~u_bit_consecutive(start_slot, num_views); for (unsigned i = 0; i < num_views; i++) { unsigned idx = start_slot + i; if (views && views[i]) { @@ -1046,7 +1043,6 @@ static void virgl_set_sampler_views(struct pipe_context *ctx, } else { pipe_sampler_view_reference(&binding->views[idx], views[i]); } - binding->view_enabled_mask |= 1 << idx; } else { pipe_sampler_view_reference(&binding->views[idx], NULL); } @@ -1426,10 +1422,11 @@ virgl_release_shader_binding(struct virgl_context *vctx, struct virgl_shader_binding_state *binding = &vctx->shader_bindings[shader_type]; - while (binding->view_enabled_mask) { - int i = u_bit_scan(&binding->view_enabled_mask); - pipe_sampler_view_reference( - (struct pipe_sampler_view **)&binding->views[i], NULL); + for (int i = 0; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; ++i) { + if (binding->views[i]) { + pipe_sampler_view_reference( + (struct pipe_sampler_view **)&binding->views[i], NULL); + } } while (binding->ubo_enabled_mask) { diff --git a/src/gallium/drivers/virgl/virgl_context.h b/src/gallium/drivers/virgl/virgl_context.h index 455af6240d5..c84b992f20b 100644 --- a/src/gallium/drivers/virgl/virgl_context.h +++ b/src/gallium/drivers/virgl/virgl_context.h @@ -53,8 +53,7 @@ struct virgl_rasterizer_state { }; struct virgl_shader_binding_state { - struct pipe_sampler_view *views[16]; - uint32_t view_enabled_mask; + struct pipe_sampler_view *views[PIPE_MAX_SHADER_SAMPLER_VIEWS]; struct pipe_constant_buffer ubos[PIPE_MAX_CONSTANT_BUFFERS]; uint32_t ubo_enabled_mask; diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index ad2022caa24..45458ab1a71 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -412,7 +412,8 @@ virgl_get_shader_param(struct pipe_screen *screen, case PIPE_SHADER_CAP_SUBROUTINES: return 1; case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: - return 16; + return MIN2(vscreen->caps.caps.v2.max_shader_sampler_views, + PIPE_MAX_SHADER_SAMPLER_VIEWS); case PIPE_SHADER_CAP_INTEGERS: return vscreen->caps.caps.v1.glsl_level >= 130; case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: diff --git a/src/gallium/drivers/virgl/virgl_winsys.h b/src/gallium/drivers/virgl/virgl_winsys.h index 0754e0d608e..dfbd10f4261 100644 --- a/src/gallium/drivers/virgl/virgl_winsys.h +++ b/src/gallium/drivers/virgl/virgl_winsys.h @@ -171,6 +171,7 @@ static inline void virgl_ws_fill_new_caps_defaults(struct virgl_drm_caps *caps) caps->caps.v2.max_compute_work_group_invocations = 0; caps->caps.v2.max_compute_shared_memory_size = 0; caps->caps.v2.host_feature_check_version = 0; + caps->caps.v2.max_shader_sampler_views = 16; } extern enum virgl_formats pipe_to_virgl_format(enum pipe_format format); diff --git a/src/virtio/virtio-gpu/virgl_hw.h b/src/virtio/virtio-gpu/virgl_hw.h index 55f974d7883..88f3209be1e 100644 --- a/src/virtio/virtio-gpu/virgl_hw.h +++ b/src/virtio/virtio-gpu/virgl_hw.h @@ -598,6 +598,7 @@ struct virgl_caps_v2 { uint32_t max_video_memory; char renderer[64]; float max_anisotropy; + uint32_t max_shader_sampler_views; }; union virgl_caps {