mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 09:08:10 +02:00
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:
parent
60c9a45562
commit
bca9020b75
2 changed files with 24 additions and 14 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue