Mesa (main): lavapipe: tolerate NULL UBO and SSBO descriptors

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue May 10 21:08:01 UTC 2022


Module: Mesa
Branch: main
Commit: bca9020b75b9a17bbec5726027c08ec4f50a4b05
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=bca9020b75b9a17bbec5726027c08ec4f50a4b05

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
Date:   Mon Apr 26 16:44:27 2021 +0200

lavapipe: tolerate NULL UBO and SSBO descriptors

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16137>

---

 .../frontends/lavapipe/lvp_descriptor_set.c        |  2 --
 src/gallium/frontends/lavapipe/lvp_execute.c       | 36 ++++++++++++++--------
 2 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
index 458d50c7845..b007e3e8db3 100644
--- a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
+++ b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
@@ -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,
diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c
index eb53253b45b..2052e3a0fb9 100644
--- a/src/gallium/frontends/lavapipe/lvp_execute.c
+++ b/src/gallium/frontends/lavapipe/lvp_execute.c
@@ -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;



More information about the mesa-commit mailing list