iris: Properly handle new unbind_num_trailing_slots parameters
Commits 0278d1fa323cf1f289..b688ea31fcf7e20436 added a new parameter to set_vertex_buffers(), set_shader_images(), and set_sampler_views() which specifies a number of trailing slots to unbind. They updated the iris functions to do the unbinding, but didn't update the code to mark which things are bound in the bitfields. This meant that later code would assume those unbound slots were bound, and crash on a NULL dereference. All that's needed is to add that slot count when unbinding things in the bitfield. Fixes:0278d1fa32("gallium: add unbind_num_trailing_slots to set_vertex_buffers") Fixes:72ff66c3d7("gallium: add unbind_num_trailing_slots to set_shader_images") Fixes:b688ea31fc("gallium: add unbind_num_trailing_slots to set_sampler_views") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8758>
This commit is contained in:
@@ -2752,7 +2752,8 @@ iris_set_shader_images(struct pipe_context *ctx,
|
||||
struct brw_image_param *image_params = genx->shaders[stage].image_param;
|
||||
#endif
|
||||
|
||||
shs->bound_image_views &= ~u_bit_consecutive(start_slot, count);
|
||||
shs->bound_image_views &=
|
||||
~u_bit_consecutive(start_slot, count + unbind_num_trailing_slots);
|
||||
|
||||
for (unsigned i = 0; i < count; i++) {
|
||||
struct iris_image_view *iv = &shs->image[start_slot + i];
|
||||
@@ -2864,7 +2865,8 @@ iris_set_sampler_views(struct pipe_context *ctx,
|
||||
struct iris_shader_state *shs = &ice->state.shaders[stage];
|
||||
unsigned i;
|
||||
|
||||
shs->bound_sampler_views &= ~u_bit_consecutive(start, count);
|
||||
shs->bound_sampler_views &=
|
||||
~u_bit_consecutive(start, count + unbind_num_trailing_slots);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct pipe_sampler_view *pview = views ? views[i] : NULL;
|
||||
@@ -3441,7 +3443,8 @@ iris_set_vertex_buffers(struct pipe_context *ctx,
|
||||
struct iris_screen *screen = (struct iris_screen *)ctx->screen;
|
||||
struct iris_genx_state *genx = ice->state.genx;
|
||||
|
||||
ice->state.bound_vertex_buffers &= ~u_bit_consecutive64(start_slot, count);
|
||||
ice->state.bound_vertex_buffers &=
|
||||
~u_bit_consecutive64(start_slot, count + unbind_num_trailing_slots);
|
||||
|
||||
for (unsigned i = 0; i < count; i++) {
|
||||
const struct pipe_vertex_buffer *buffer = buffers ? &buffers[i] : NULL;
|
||||
|
||||
Reference in New Issue
Block a user