diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index dd30f09da8d..262ed5bf0cd 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -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 {