lavapipe: tolerate NULL UBO and SSBO descriptors
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Mon, 26 Apr 2021 14:44:27 +0000 (16:44 +0200)
committerMarge Bot <emma+marge@anholt.net>
Tue, 10 May 2022 20:30:08 +0000 (20:30 +0000)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16137>

src/gallium/frontends/lavapipe/lvp_descriptor_set.c
src/gallium/frontends/lavapipe/lvp_execute.c

index 458d50c..b007e3e 100644 (file)
@@ -556,9 +556,7 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSets(
       case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
       case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
          for (uint32_t j = 0; j < write->descriptorCount; j++) {
-            assert(write->pBufferInfo[j].buffer);
             LVP_FROM_HANDLE(lvp_buffer, buffer, write->pBufferInfo[j].buffer);
-            assert(buffer);
             desc[j] = (struct lvp_descriptor) {
                .type = write->descriptorType,
                .info.offset = write->pBufferInfo[j].offset,
index eb53253..2052e3a 100644 (file)
@@ -1278,16 +1278,22 @@ static void handle_descriptor(struct rendering_state *state,
          return;
       idx += array_idx;
       idx += dyn_info->stage[stage].const_buffer_count;
-      state->const_buffer[p_stage][idx].buffer = descriptor->buffer->bo;
-      state->const_buffer[p_stage][idx].buffer_offset = descriptor->offset + descriptor->buffer->offset;
+      if (!descriptor->buffer) {
+         state->const_buffer[p_stage][idx].buffer = NULL;
+         state->const_buffer[p_stage][idx].buffer_offset = 0;
+         state->const_buffer[p_stage][idx].buffer_size = 0;
+      } else {
+         state->const_buffer[p_stage][idx].buffer = descriptor->buffer->bo;
+         state->const_buffer[p_stage][idx].buffer_offset = descriptor->offset + descriptor->buffer->offset;
+         if (descriptor->range == VK_WHOLE_SIZE)
+            state->const_buffer[p_stage][idx].buffer_size = descriptor->buffer->bo->width0 - state->const_buffer[p_stage][idx].buffer_offset;
+         else
+            state->const_buffer[p_stage][idx].buffer_size = descriptor->range;
+      }
       if (is_dynamic) {
          uint32_t offset = dyn_info->dynamic_offsets[dyn_info->dyn_index + binding->dynamic_index + array_idx];
          state->const_buffer[p_stage][idx].buffer_offset += offset;
       }
-      if (descriptor->range == VK_WHOLE_SIZE)
-         state->const_buffer[p_stage][idx].buffer_size = descriptor->buffer->bo->width0 - state->const_buffer[p_stage][idx].buffer_offset;
-      else
-         state->const_buffer[p_stage][idx].buffer_size = descriptor->range;
       if (state->num_const_bufs[p_stage] <= idx)
          state->num_const_bufs[p_stage] = idx + 1;
       state->constbuf_dirty[p_stage] = true;
@@ -1300,16 +1306,22 @@ static void handle_descriptor(struct rendering_state *state,
          return;
       idx += array_idx;
       idx += dyn_info->stage[stage].shader_buffer_count;
-      state->sb[p_stage][idx].buffer = descriptor->buffer->bo;
-      state->sb[p_stage][idx].buffer_offset = descriptor->offset + descriptor->buffer->offset;
+      if (!descriptor->buffer) {
+         state->sb[p_stage][idx].buffer = NULL;
+         state->sb[p_stage][idx].buffer_offset = 0;
+         state->sb[p_stage][idx].buffer_size = 0;
+      } else {
+         state->sb[p_stage][idx].buffer = descriptor->buffer->bo;
+         state->sb[p_stage][idx].buffer_offset = descriptor->offset + descriptor->buffer->offset;
+         if (descriptor->range == VK_WHOLE_SIZE)
+            state->sb[p_stage][idx].buffer_size = descriptor->buffer->bo->width0 - state->sb[p_stage][idx].buffer_offset;
+         else
+            state->sb[p_stage][idx].buffer_size = descriptor->range;
+      }
       if (is_dynamic) {
          uint32_t offset = dyn_info->dynamic_offsets[dyn_info->dyn_index + binding->dynamic_index + array_idx];
          state->sb[p_stage][idx].buffer_offset += offset;
       }
-      if (descriptor->range == VK_WHOLE_SIZE)
-         state->sb[p_stage][idx].buffer_size = descriptor->buffer->bo->width0 - state->sb[p_stage][idx].buffer_offset;
-      else
-         state->sb[p_stage][idx].buffer_size = descriptor->range;
       if (state->num_shader_buffers[p_stage] <= idx)
          state->num_shader_buffers[p_stage] = idx + 1;
       state->sb_dirty[p_stage] = true;