lavapipe: tolerate NULL UBO and SSBO descriptors

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16137>
This commit is contained in:
Erik Faye-Lund 2021-04-26 16:44:27 +02:00 committed by Marge Bot
parent 60c9a45562
commit bca9020b75
2 changed files with 24 additions and 14 deletions

View 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,

View 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;