virgl: obtain supported number of shader sampler views from host

Modern games may use more than 16 sampler views, so get what the host
actually supports, and default to 16 on old hosts that don't pass the
value.

Since the possible maximal value of PIPE_MAX_SHADER_SAMPLER_VIEWS doesn't
fit into an uint32_t remove the binding flags, they were only used for
releasing the sampler views, and this can be achieved differently.

v2: Fix compilation error

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: John Bates <jbates@chromium.org> (v1)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13646>
This commit is contained in:
Gert Wollny
2021-11-03 14:54:21 +01:00
committed by Marge Bot
parent 55e1dc8b64
commit 63c4c559cb
5 changed files with 15 additions and 16 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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:

View File

@@ -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);

View File

@@ -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 {