Module: Mesa Branch: main Commit: bca9020b75b9a17bbec5726027c08ec4f50a4b05 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bca9020b75b9a17bbec5726027c08ec4f50a4b05
Author: Erik Faye-Lund <[email protected]> Date: Mon Apr 26 16:44:27 2021 +0200 lavapipe: tolerate NULL UBO and SSBO descriptors Reviewed-by: Dave Airlie <[email protected]> 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;
