zink: handle null ssbo attachments without crashing
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Fri, 7 Aug 2020 23:12:20 +0000 (19:12 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 28 Jan 2021 14:34:27 +0000 (14:34 +0000)
basically the same as any other null buffer descriptor attachment

Reviewed-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8628>

src/gallium/drivers/zink/zink_draw.c

index dd30f09..262ed5b 100644 (file)
@@ -366,17 +366,23 @@ zink_draw_vbo(struct pipe_context *pctx,
             wds[num_wds].pBufferInfo = buffer_infos + num_buffer_info;
             ++num_buffer_info;
          } else if (shader->bindings[j].type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) {
-            assert(ctx->ssbos[i][index].buffer_size > 0);
-            assert(ctx->ssbos[i][index].buffer_size <= screen->info.props.limits.maxStorageBufferRange);
-            assert(ctx->ssbos[i][index].buffer);
             struct zink_resource *res = zink_resource(ctx->ssbos[i][index].buffer);
-            if (ctx->writable_ssbos[i] & (1 << index))
-               write_desc_resources[num_wds] = res;
-            else
-               read_desc_resources[num_wds] = res;
-            buffer_infos[num_buffer_info].buffer = res->buffer;
-            buffer_infos[num_buffer_info].offset = ctx->ssbos[i][index].buffer_offset;
-            buffer_infos[num_buffer_info].range  = ctx->ssbos[i][index].buffer_size;
+            if (res) {
+               assert(ctx->ssbos[i][index].buffer_size > 0);
+               assert(ctx->ssbos[i][index].buffer_size <= screen->info.props.limits.maxStorageBufferRange);
+               if (ctx->writable_ssbos[i] & (1 << index))
+                  write_desc_resources[num_wds] = res;
+               else
+                  read_desc_resources[num_wds] = res;
+               buffer_infos[num_buffer_info].buffer = res->buffer;
+               buffer_infos[num_buffer_info].offset = ctx->ssbos[i][index].buffer_offset;
+               buffer_infos[num_buffer_info].range  = ctx->ssbos[i][index].buffer_size;
+            } else {
+               assert(screen->info.rb2_feats.nullDescriptor);
+               buffer_infos[num_buffer_info].buffer = VK_NULL_HANDLE;
+               buffer_infos[num_buffer_info].offset = 0;
+               buffer_infos[num_buffer_info].range  = VK_WHOLE_SIZE;
+            }
             wds[num_wds].pBufferInfo = buffer_infos + num_buffer_info;
             ++num_buffer_info;
          } else {