From 6212cff00a48af375fefb3f7c5ab3974b199f600 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 25 Jul 2022 10:38:53 -0400 Subject: [PATCH] lavapipe: use gallium buffer descriptor types directly this cleans up a bit of code Reviewed-by: Konstantin Seurer Acked-by: Dave Airlie Part-of: --- .../frontends/lavapipe/lvp_descriptor_set.c | 52 +++++++++++++++---- src/gallium/frontends/lavapipe/lvp_execute.c | 49 +++++++---------- src/gallium/frontends/lavapipe/lvp_private.h | 7 +-- 3 files changed, 63 insertions(+), 45 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c index 62ccab91d88..7c9350c5d54 100644 --- a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c +++ b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c @@ -495,18 +495,32 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSets( break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: + for (uint32_t j = 0; j < write->descriptorCount; j++) { + LVP_FROM_HANDLE(lvp_buffer, buffer, write->pBufferInfo[j].buffer); + desc[j] = (struct lvp_descriptor) { + .type = write->descriptorType, + .info.ubo.buffer_offset = buffer ? write->pBufferInfo[j].offset : 0, + .info.ubo.buffer = buffer ? buffer->bo : NULL, + .info.ubo.buffer_size = buffer ? write->pBufferInfo[j].range : 0, + }; + if (buffer && write->pBufferInfo[j].range == VK_WHOLE_SIZE) + desc[j].info.ubo.buffer_size = buffer->bo->width0 - desc[j].info.ubo.buffer_offset; + } + break; + + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: for (uint32_t j = 0; j < write->descriptorCount; j++) { LVP_FROM_HANDLE(lvp_buffer, buffer, write->pBufferInfo[j].buffer); desc[j] = (struct lvp_descriptor) { .type = write->descriptorType, - .info.offset = write->pBufferInfo[j].offset, - .info.buffer = buffer, - .info.range = write->pBufferInfo[j].range, + .info.ssbo.buffer_offset = buffer ? write->pBufferInfo[j].offset : 0, + .info.ssbo.buffer = buffer ? buffer->bo : NULL, + .info.ssbo.buffer_size = buffer ? write->pBufferInfo[j].range : 0, }; - + if (buffer && write->pBufferInfo[j].range == VK_WHOLE_SIZE) + desc[j].info.ssbo.buffer_size = buffer->bo->width0 - desc[j].info.ssbo.buffer_offset; } break; @@ -736,16 +750,32 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSetWithTemplate(VkDevice _device, } case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: { VkDescriptorBufferInfo *info = (VkDescriptorBufferInfo *)pSrc; + LVP_FROM_HANDLE(lvp_buffer, buffer, info->buffer); desc[idx] = (struct lvp_descriptor) { .type = entry->descriptorType, - .info.offset = info->offset, - .info.buffer = lvp_buffer_from_handle(info->buffer), - .info.range = info->range, + .info.ubo.buffer_offset = buffer ? info->offset : 0, + .info.ubo.buffer = buffer ? buffer->bo : NULL, + .info.ubo.buffer_size = buffer ? info->range : 0, }; + if (buffer && info->range == VK_WHOLE_SIZE) + desc[idx].info.ubo.buffer_size = buffer->bo->width0 - desc[idx].info.ubo.buffer_offset; + break; + } + + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { + VkDescriptorBufferInfo *info = (VkDescriptorBufferInfo *)pSrc; + LVP_FROM_HANDLE(lvp_buffer, buffer, info->buffer); + desc[idx] = (struct lvp_descriptor) { + .type = entry->descriptorType, + .info.ssbo.buffer_offset = buffer ? info->offset : 0, + .info.ssbo.buffer = buffer ? buffer->bo : NULL, + .info.ssbo.buffer_size = buffer ? info->range : 0, + }; + if (buffer && info->range == VK_WHOLE_SIZE) + desc[idx].info.ssbo.buffer_size = buffer->bo->width0 - desc[idx].info.ssbo.buffer_offset; break; } default: diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index 9c8e2648b76..6fbd28e51ce 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -1291,18 +1291,7 @@ static void handle_descriptor(struct rendering_state *state, return; idx += array_idx; idx += dyn_info->stage[stage].const_buffer_count; - 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; - 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; - } + state->const_buffer[p_stage][idx] = descriptor->ubo; 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; @@ -1320,18 +1309,7 @@ static void handle_descriptor(struct rendering_state *state, return; idx += array_idx; idx += dyn_info->stage[stage].shader_buffer_count; - 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; - 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; - } + state->sb[p_stage][idx] = descriptor->ssbo; 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; @@ -3314,13 +3292,26 @@ static struct lvp_cmd_push_descriptor_set *create_push_descriptor_set(struct vk_ info->buffer_view = lvp_buffer_view_from_handle(in_cmd->descriptor_writes[i].pTexelBufferView[j]); break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: { + LVP_FROM_HANDLE(lvp_buffer, buffer, in_cmd->descriptor_writes[i].pBufferInfo[j].buffer); + info->ubo.buffer = buffer ? buffer->bo : NULL; + info->ubo.buffer_offset = buffer ? in_cmd->descriptor_writes[i].pBufferInfo[j].offset : 0; + info->ubo.buffer_size = buffer ? in_cmd->descriptor_writes[i].pBufferInfo[j].range : 0; + if (buffer && in_cmd->descriptor_writes[i].pBufferInfo[j].range == VK_WHOLE_SIZE) + info->ubo.buffer_size = info->ubo.buffer->width0 - info->ubo.buffer_offset; + break; + } case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { + LVP_FROM_HANDLE(lvp_buffer, buffer, in_cmd->descriptor_writes[i].pBufferInfo[j].buffer); + info->ssbo.buffer = buffer ? buffer->bo : NULL; + info->ssbo.buffer_offset = buffer ? in_cmd->descriptor_writes[i].pBufferInfo[j].offset : 0; + info->ssbo.buffer_size = buffer ? in_cmd->descriptor_writes[i].pBufferInfo[j].range : 0; + if (buffer && in_cmd->descriptor_writes[i].pBufferInfo[j].range == VK_WHOLE_SIZE) + info->ssbo.buffer_size = info->ssbo.buffer->width0 - info->ssbo.buffer_offset; + break; + } default: - info->buffer = lvp_buffer_from_handle(in_cmd->descriptor_writes[i].pBufferInfo[j].buffer); - info->offset = in_cmd->descriptor_writes[i].pBufferInfo[j].offset; - info->range = in_cmd->descriptor_writes[i].pBufferInfo[j].range; break; } } diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index cc0e210c9f2..ea8a81e7322 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -331,11 +331,8 @@ union lvp_descriptor_info { struct pipe_sampler_state *sampler; struct lvp_image_view *iview; }; - struct { - struct lvp_buffer *buffer; - VkDeviceSize offset; - VkDeviceSize range; - }; + struct pipe_shader_buffer ssbo; + struct pipe_constant_buffer ubo; struct lvp_buffer_view *buffer_view; uint8_t *uniform; };