From f098d26e91bd92d7aaabdc596d6087f90321efb6 Mon Sep 17 00:00:00 2001 From: "Thomas H.P. Andersen" Date: Sat, 17 Sep 2022 11:22:45 +0200 Subject: [PATCH] nvk: use common pipeline layout code Part-of: --- src/nouveau/vulkan/meson.build | 2 - src/nouveau/vulkan/nvk_cmd_buffer.c | 14 +++-- src/nouveau/vulkan/nvk_compute_pipeline.c | 3 +- .../vulkan/nvk_descriptor_set_layout.c | 17 +++++ .../vulkan/nvk_descriptor_set_layout.h | 9 +++ src/nouveau/vulkan/nvk_graphics_pipeline.c | 3 +- src/nouveau/vulkan/nvk_nir.h | 4 +- .../vulkan/nvk_nir_lower_descriptors.c | 16 +++-- src/nouveau/vulkan/nvk_pipeline.c | 1 - src/nouveau/vulkan/nvk_pipeline_layout.c | 62 ------------------- src/nouveau/vulkan/nvk_pipeline_layout.h | 26 -------- src/nouveau/vulkan/nvk_private.h | 1 + src/nouveau/vulkan/nvk_shader.c | 3 +- src/nouveau/vulkan/nvk_shader.h | 3 +- 14 files changed, 51 insertions(+), 113 deletions(-) delete mode 100644 src/nouveau/vulkan/nvk_pipeline_layout.c delete mode 100644 src/nouveau/vulkan/nvk_pipeline_layout.h diff --git a/src/nouveau/vulkan/meson.build b/src/nouveau/vulkan/meson.build index 3073d62780b..d369d3101b3 100644 --- a/src/nouveau/vulkan/meson.build +++ b/src/nouveau/vulkan/meson.build @@ -44,8 +44,6 @@ nvk_files = files( 'nvk_physical_device.h', 'nvk_pipeline.c', 'nvk_pipeline.h', - 'nvk_pipeline_layout.c', - 'nvk_pipeline_layout.h', 'nvk_private.h', 'nvk_queue.c', 'nvk_queue.h', diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index 7485e05aad8..8b625c65735 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -5,7 +5,6 @@ #include "nvk_descriptor_set_layout.h" #include "nvk_device.h" #include "nvk_pipeline.h" -#include "nvk_pipeline_layout.h" #include "nvk_physical_device.h" #include "nouveau_context.h" @@ -282,7 +281,7 @@ nvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer, const uint32_t *pDynamicOffsets) { VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); - VK_FROM_HANDLE(nvk_pipeline_layout, pipeline_layout, layout); + VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout, layout); struct nvk_descriptor_state *desc = nvk_get_descriptors_state(cmd, pipelineBindPoint); @@ -291,7 +290,7 @@ nvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer, unsigned set_idx = i + firstSet; VK_FROM_HANDLE(nvk_descriptor_set, set, pDescriptorSets[i]); const struct nvk_descriptor_set_layout *set_layout = - pipeline_layout->set[set_idx].layout; + vk_to_nvk_descriptor_set_layout(pipeline_layout->set_layouts[set_idx]); if (desc->sets[set_idx] != set) { if (set->bo) @@ -306,7 +305,7 @@ nvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer, if (set_layout->dynamic_buffer_count > 0) { const uint32_t dynamic_buffer_start = - pipeline_layout->set[set_idx].dynamic_buffer_start; + nvk_descriptor_set_layout_dynbuf_start(pipeline_layout, set_idx); for (uint32_t j = 0; j < set_layout->dynamic_buffer_count; j++) { struct nvk_buffer_address addr = set->dynamic_buffers[j]; @@ -353,7 +352,7 @@ nvk_CmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer, const VkWriteDescriptorSet *pDescriptorWrites) { VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); - VK_FROM_HANDLE(nvk_pipeline_layout, pipeline_layout, layout); + VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout, layout); struct nvk_descriptor_state *desc = nvk_get_descriptors_state(cmd, pipelineBindPoint); @@ -371,8 +370,11 @@ nvk_CmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer, /* Pushing descriptors replaces whatever sets are bound */ desc->sets[set] = NULL; + struct nvk_descriptor_set_layout *set_layout = + vk_to_nvk_descriptor_set_layout(pipeline_layout->set_layouts[set]); + nvk_push_descriptor_set_update(desc->push[set], - pipeline_layout->set[set].layout, + set_layout, descriptorWriteCount, pDescriptorWrites); desc->push_dirty |= BITFIELD_BIT(set); } diff --git a/src/nouveau/vulkan/nvk_compute_pipeline.c b/src/nouveau/vulkan/nvk_compute_pipeline.c index 8bb2defbef9..69c14868580 100644 --- a/src/nouveau/vulkan/nvk_compute_pipeline.c +++ b/src/nouveau/vulkan/nvk_compute_pipeline.c @@ -1,7 +1,6 @@ #include "nvk_private.h" #include "nvk_device.h" #include "nvk_pipeline.h" -#include "nvk_pipeline_layout.h" #include "nvk_shader.h" #include "nouveau_bo.h" @@ -70,7 +69,7 @@ nvk_compute_pipeline_create(struct nvk_device *device, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipeline) { - VK_FROM_HANDLE(nvk_pipeline_layout, pipeline_layout, pCreateInfo->layout); + VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout, pCreateInfo->layout); struct nvk_physical_device *pdevice = nvk_device_physical(device); struct nvk_compute_pipeline *pipeline; VkResult result; diff --git a/src/nouveau/vulkan/nvk_descriptor_set_layout.c b/src/nouveau/vulkan/nvk_descriptor_set_layout.c index 5edd908089c..011f6c5600c 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set_layout.c +++ b/src/nouveau/vulkan/nvk_descriptor_set_layout.c @@ -227,3 +227,20 @@ nvk_CreateDescriptorSetLayout(VkDevice _device, return VK_SUCCESS; } + +uint8_t +nvk_descriptor_set_layout_dynbuf_start(const struct vk_pipeline_layout *pipeline_layout, + int set_layout_idx) +{ + uint8_t dynamic_buffer_start = 0; + + assert(set_layout_idx <= pipeline_layout->set_count); + + for (uint32_t i = 0; i < set_layout_idx; i++) { + const struct nvk_descriptor_set_layout *set_layout = + vk_to_nvk_descriptor_set_layout(pipeline_layout->set_layouts[i]); + + dynamic_buffer_start += set_layout->dynamic_buffer_count; + } + return dynamic_buffer_start; +} diff --git a/src/nouveau/vulkan/nvk_descriptor_set_layout.h b/src/nouveau/vulkan/nvk_descriptor_set_layout.h index ac6edc7ca6f..d5316756013 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set_layout.h +++ b/src/nouveau/vulkan/nvk_descriptor_set_layout.h @@ -60,4 +60,13 @@ void nvk_descriptor_stride_align_for_type(VkDescriptorType type, const VkMutableDescriptorTypeListVALVE *type_list, uint32_t *stride, uint32_t *align); +static inline struct nvk_descriptor_set_layout * +vk_to_nvk_descriptor_set_layout(struct vk_descriptor_set_layout *layout) +{ + return container_of(layout, struct nvk_descriptor_set_layout, vk); +} + +uint8_t +nvk_descriptor_set_layout_dynbuf_start(const struct vk_pipeline_layout *pipeline_layout, + int set_layout_idx); #endif diff --git a/src/nouveau/vulkan/nvk_graphics_pipeline.c b/src/nouveau/vulkan/nvk_graphics_pipeline.c index 2a3840ab002..3c7810a3f93 100644 --- a/src/nouveau/vulkan/nvk_graphics_pipeline.c +++ b/src/nouveau/vulkan/nvk_graphics_pipeline.c @@ -1,7 +1,6 @@ #include "nvk_pipeline.h" #include "nvk_device.h" -#include "nvk_pipeline_layout.h" #include "nvk_shader.h" #include "nv_push.h" #include "vk_nir.h" @@ -199,7 +198,7 @@ nvk_graphics_pipeline_create(struct nvk_device *device, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipeline) { - VK_FROM_HANDLE(nvk_pipeline_layout, pipeline_layout, pCreateInfo->layout); + VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout, pCreateInfo->layout); struct nvk_physical_device *pdevice = nvk_device_physical(device); struct nvk_graphics_pipeline *pipeline; VkResult result = VK_SUCCESS; diff --git a/src/nouveau/vulkan/nvk_nir.h b/src/nouveau/vulkan/nvk_nir.h index 86c905ec425..340015ac9cc 100644 --- a/src/nouveau/vulkan/nvk_nir.h +++ b/src/nouveau/vulkan/nvk_nir.h @@ -3,10 +3,8 @@ #include "compiler/nir/nir.h" -struct nvk_pipeline_layout; - bool nvk_nir_lower_descriptors(nir_shader *nir, - const struct nvk_pipeline_layout *layout, + const struct vk_pipeline_layout *layout, bool robust_buffer_access); #endif diff --git a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c index d065e3c0979..114f65348f7 100644 --- a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c +++ b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c @@ -2,13 +2,12 @@ #include "nvk_descriptor_set.h" #include "nvk_descriptor_set_layout.h" #include "nvk_nir.h" -#include "nvk_pipeline_layout.h" #include "nir_builder.h" #include "nir_deref.h" struct lower_descriptors_ctx { - const struct nvk_pipeline_layout *layout; + const struct vk_pipeline_layout *layout; bool clamp_desc_array_bounds; nir_address_format desc_addr_format; nir_address_format ubo_addr_format; @@ -33,8 +32,12 @@ load_descriptor(nir_builder *b, unsigned num_components, unsigned bit_size, const struct lower_descriptors_ctx *ctx) { assert(set < NVK_MAX_SETS); + + const struct vk_pipeline_layout *layout = ctx->layout; + const struct nvk_descriptor_set_layout *set_layout = + vk_to_nvk_descriptor_set_layout(layout->set_layouts[set]); const struct nvk_descriptor_set_binding_layout *binding_layout = - &ctx->layout->set[set].layout->binding[binding]; + &set_layout->binding[binding]; if (ctx->clamp_desc_array_bounds) index = nir_umin(b, index, nir_imm_int(b, binding_layout->array_size - 1)); @@ -43,8 +46,11 @@ load_descriptor(nir_builder *b, unsigned num_components, unsigned bit_size, case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { /* Get the index in the root descriptor table dynamic_buffers array. */ + uint8_t dynamic_buffer_start = + nvk_descriptor_set_layout_dynbuf_start(layout, set); + index = nir_iadd_imm(b, index, - ctx->layout->set[set].dynamic_buffer_start + + dynamic_buffer_start + binding_layout->dynamic_buffer_index); nir_ssa_def *root_desc_offset = @@ -298,7 +304,7 @@ lower_descriptors_instr(nir_builder *b, nir_instr *instr, bool nvk_nir_lower_descriptors(nir_shader *nir, - const struct nvk_pipeline_layout *layout, + const struct vk_pipeline_layout *layout, bool robust_buffer_access) { struct lower_descriptors_ctx ctx = { diff --git a/src/nouveau/vulkan/nvk_pipeline.c b/src/nouveau/vulkan/nvk_pipeline.c index b59ea287018..d6052a0c96c 100644 --- a/src/nouveau/vulkan/nvk_pipeline.c +++ b/src/nouveau/vulkan/nvk_pipeline.c @@ -2,7 +2,6 @@ #include "nvk_private.h" #include "nvk_device.h" #include "nvk_pipeline.h" -#include "nvk_pipeline_layout.h" #include "vk_pipeline_cache.h" diff --git a/src/nouveau/vulkan/nvk_pipeline_layout.c b/src/nouveau/vulkan/nvk_pipeline_layout.c deleted file mode 100644 index f36a18fc4ea..00000000000 --- a/src/nouveau/vulkan/nvk_pipeline_layout.c +++ /dev/null @@ -1,62 +0,0 @@ -#include "nvk_pipeline_layout.h" - -#include "nvk_descriptor_set_layout.h" -#include "nvk_device.h" - -#include "util/mesa-sha1.h" - -VKAPI_ATTR VkResult VKAPI_CALL -nvk_CreatePipelineLayout(VkDevice _device, - const VkPipelineLayoutCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkPipelineLayout *pPipelineLayout) -{ - VK_FROM_HANDLE(nvk_device, device, _device); - struct nvk_pipeline_layout *layout; - - layout = vk_object_alloc(&device->vk, pAllocator, sizeof(*layout), - VK_OBJECT_TYPE_PIPELINE_LAYOUT); - if (layout == NULL) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - - layout->num_sets = pCreateInfo->setLayoutCount; - - uint8_t dynamic_buffer_count = 0; - for (uint32_t s = 0; s < pCreateInfo->setLayoutCount; s++) { - VK_FROM_HANDLE(nvk_descriptor_set_layout, set_layout, - pCreateInfo->pSetLayouts[s]); - vk_descriptor_set_layout_ref(&set_layout->vk); - layout->set[s].layout = set_layout; - layout->set[s].dynamic_buffer_start = dynamic_buffer_count; - dynamic_buffer_count += set_layout->dynamic_buffer_count; - } - - struct mesa_sha1 sha1_ctx; - _mesa_sha1_init(&sha1_ctx); - _mesa_sha1_update(&sha1_ctx, &layout->num_sets, sizeof(layout->num_sets)); - for (uint32_t s = 0; s < pCreateInfo->setLayoutCount; s++) { - _mesa_sha1_update(&sha1_ctx, layout->set[s].layout->sha1, - sizeof(layout->set[s].layout->sha1)); - } - _mesa_sha1_final(&sha1_ctx, layout->sha1); - - *pPipelineLayout = nvk_pipeline_layout_to_handle(layout); - - return VK_SUCCESS; -} - -VKAPI_ATTR void VKAPI_CALL -nvk_DestroyPipelineLayout(VkDevice _device, VkPipelineLayout pipelineLayout, - const VkAllocationCallbacks *pAllocator) -{ - VK_FROM_HANDLE(nvk_device, device, _device); - VK_FROM_HANDLE(nvk_pipeline_layout, layout, pipelineLayout); - - if (!layout) - return; - - for (uint32_t s = 0; s < layout->num_sets; s++) - vk_descriptor_set_layout_unref(&device->vk, &layout->set[s].layout->vk); - - vk_object_free(&device->vk, pAllocator, layout); -} diff --git a/src/nouveau/vulkan/nvk_pipeline_layout.h b/src/nouveau/vulkan/nvk_pipeline_layout.h deleted file mode 100644 index 6895f92a0b6..00000000000 --- a/src/nouveau/vulkan/nvk_pipeline_layout.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef NVK_PIPELINE_LAYOUT -#define NVK_PIPELINE_LAYOUT 1 - -#include "nvk_private.h" - -#include "vulkan/runtime/vk_object.h" - -struct nvk_descriptor_set_layout; - -struct nvk_pipeline_layout { - struct vk_object_base base; - - unsigned char sha1[20]; - - uint32_t num_sets; - - struct { - struct nvk_descriptor_set_layout *layout; - uint8_t dynamic_buffer_start; - } set[NVK_MAX_SETS]; -}; - -VK_DEFINE_HANDLE_CASTS(nvk_pipeline_layout, base, VkPipelineLayout, - VK_OBJECT_TYPE_PIPELINE_LAYOUT) - -#endif diff --git a/src/nouveau/vulkan/nvk_private.h b/src/nouveau/vulkan/nvk_private.h index fd7ef3dabe1..b1c0f0452a4 100644 --- a/src/nouveau/vulkan/nvk_private.h +++ b/src/nouveau/vulkan/nvk_private.h @@ -10,6 +10,7 @@ #include "vulkan/runtime/vk_log.h" #include "vulkan/util/vk_alloc.h" #include "vulkan/util/vk_util.h" +#include "vulkan/runtime/vk_pipeline_layout.h" #include #include diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index 3ea63ff8502..55947d0c0c1 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -2,7 +2,6 @@ #include "nvk_device.h" #include "nvk_shader.h" #include "nvk_physical_device.h" -#include "nvk_pipeline_layout.h" #include "nvk_nir.h" #include "nouveau_bo.h" @@ -154,7 +153,7 @@ assign_io_locations(nir_shader *nir) void nvk_lower_nir(struct nvk_device *device, nir_shader *nir, - const struct nvk_pipeline_layout *layout) + const struct vk_pipeline_layout *layout) { NIR_PASS(_, nir, nir_split_struct_vars, nir_var_function_temp); NIR_PASS(_, nir, nir_lower_vars_to_ssa); diff --git a/src/nouveau/vulkan/nvk_shader.h b/src/nouveau/vulkan/nvk_shader.h index e6fbfde30f5..c8d8c0df795 100644 --- a/src/nouveau/vulkan/nvk_shader.h +++ b/src/nouveau/vulkan/nvk_shader.h @@ -9,7 +9,6 @@ struct vk_shader_module; struct nvk_device; -struct nvk_pipeline_layout; struct nvk_physical_device; #define GF100_SHADER_HEADER_SIZE (20 * 4) @@ -75,7 +74,7 @@ nvk_physical_device_spirv_options(const struct nvk_physical_device *pdevice); void nvk_lower_nir(struct nvk_device *device, nir_shader *nir, - const struct nvk_pipeline_layout *layout); + const struct vk_pipeline_layout *layout); VkResult nvk_compile_nir(struct nvk_physical_device *device, nir_shader *nir,