Mesa (main): panvk: Use the vk_pipeline_layout base struct
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jun 29 21:01:19 UTC 2022
Module: Mesa
Branch: main
Commit: 73eecffabdd37fc2a181dfe38e35e4240812611e
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=73eecffabdd37fc2a181dfe38e35e4240812611e
Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date: Tue Jun 28 14:40:32 2022 -0500
panvk: Use the vk_pipeline_layout base struct
Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17286>
---
src/panfrost/vulkan/panvk_descriptor_set.c | 40 +++----------------
src/panfrost/vulkan/panvk_device.c | 9 ++---
src/panfrost/vulkan/panvk_private.h | 46 +++++++++-------------
src/panfrost/vulkan/panvk_vX_cs.c | 4 +-
.../vulkan/panvk_vX_nir_lower_descriptors.c | 23 ++++++++---
5 files changed, 48 insertions(+), 74 deletions(-)
diff --git a/src/panfrost/vulkan/panvk_descriptor_set.c b/src/panfrost/vulkan/panvk_descriptor_set.c
index 057f13a98a6..bf380e9c849 100644
--- a/src/panfrost/vulkan/panvk_descriptor_set.c
+++ b/src/panfrost/vulkan/panvk_descriptor_set.c
@@ -129,21 +129,19 @@ panvk_CreatePipelineLayout(VkDevice _device,
struct panvk_pipeline_layout *layout;
struct mesa_sha1 ctx;
- layout = vk_object_zalloc(&device->vk, NULL, sizeof(*layout),
- VK_OBJECT_TYPE_PIPELINE_LAYOUT);
+ layout = vk_pipeline_layout_zalloc(&device->vk, sizeof(*layout),
+ pCreateInfo);
if (layout == NULL)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
- layout->num_sets = pCreateInfo->setLayoutCount;
_mesa_sha1_init(&ctx);
unsigned sampler_idx = 0, tex_idx = 0, ubo_idx = 0;
unsigned dyn_ubo_idx = 0, dyn_ssbo_idx = 0, img_idx = 0;
for (unsigned set = 0; set < pCreateInfo->setLayoutCount; set++) {
- VK_FROM_HANDLE(panvk_descriptor_set_layout, set_layout,
- pCreateInfo->pSetLayouts[set]);
- vk_descriptor_set_layout_ref(&set_layout->vk);
- layout->sets[set].layout = set_layout;
+ const struct panvk_descriptor_set_layout *set_layout =
+ vk_to_panvk_descriptor_set_layout(layout->vk.set_layouts[set]);
+
layout->sets[set].sampler_offset = sampler_idx;
layout->sets[set].tex_offset = tex_idx;
layout->sets[set].ubo_offset = ubo_idx;
@@ -158,7 +156,7 @@ panvk_CreatePipelineLayout(VkDevice _device,
img_idx += set_layout->num_imgs;
for (unsigned b = 0; b < set_layout->binding_count; b++) {
- struct panvk_descriptor_set_binding_layout *binding_layout =
+ const struct panvk_descriptor_set_binding_layout *binding_layout =
&set_layout->bindings[b];
if (binding_layout->immutable_samplers) {
@@ -199,36 +197,10 @@ panvk_CreatePipelineLayout(VkDevice _device,
_mesa_sha1_final(&ctx, layout->sha1);
- p_atomic_set(&layout->refcount, 1);
-
*pPipelineLayout = panvk_pipeline_layout_to_handle(layout);
return VK_SUCCESS;
}
-void
-panvk_pipeline_layout_destroy(struct panvk_device *device,
- struct panvk_pipeline_layout *layout)
-{
- for (unsigned i = 0; i < layout->num_sets; i++)
- vk_descriptor_set_layout_unref(&device->vk, &layout->sets[i].layout->vk);
-
- vk_object_free(&device->vk, NULL, layout);
-}
-
-void
-panvk_DestroyPipelineLayout(VkDevice _device,
- VkPipelineLayout _pipelineLayout,
- const VkAllocationCallbacks *pAllocator)
-{
- VK_FROM_HANDLE(panvk_device, device, _device);
- VK_FROM_HANDLE(panvk_pipeline_layout, pipeline_layout, _pipelineLayout);
-
- if (!pipeline_layout)
- return;
-
- panvk_pipeline_layout_unref(device, pipeline_layout);
-}
-
VkResult
panvk_CreateDescriptorPool(VkDevice _device,
const VkDescriptorPoolCreateInfo *pCreateInfo,
diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c
index 1f79558e1ad..4664c93111c 100644
--- a/src/panfrost/vulkan/panvk_device.c
+++ b/src/panfrost/vulkan/panvk_device.c
@@ -936,19 +936,18 @@ static void
panvk_ref_pipeline_layout(struct vk_device *dev,
VkPipelineLayout layout)
{
- VK_FROM_HANDLE(panvk_pipeline_layout, playout, layout);
+ VK_FROM_HANDLE(vk_pipeline_layout, playout, layout);
- panvk_pipeline_layout_ref(playout);
+ vk_pipeline_layout_ref(playout);
}
static void
panvk_unref_pipeline_layout(struct vk_device *dev,
VkPipelineLayout layout)
{
- struct panvk_device *device = container_of(dev, struct panvk_device, vk);
- VK_FROM_HANDLE(panvk_pipeline_layout, playout, layout);
+ VK_FROM_HANDLE(vk_pipeline_layout, playout, layout);
- panvk_pipeline_layout_unref(device, playout);
+ vk_pipeline_layout_unref(dev, playout);
}
VkResult
diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h
index 04975db7efa..60ad91c1d30 100644
--- a/src/panfrost/vulkan/panvk_private.h
+++ b/src/panfrost/vulkan/panvk_private.h
@@ -59,6 +59,7 @@
#include "vk_log.h"
#include "vk_object.h"
#include "vk_physical_device.h"
+#include "vk_pipeline_layout.h"
#include "vk_queue.h"
#include "vk_sync.h"
#include "wsi_common.h"
@@ -395,9 +396,15 @@ struct panvk_descriptor_set_layout {
struct panvk_descriptor_set_binding_layout bindings[0];
};
+static inline const struct panvk_descriptor_set_layout *
+vk_to_panvk_descriptor_set_layout(const struct vk_descriptor_set_layout *layout)
+{
+ return container_of(layout, const struct panvk_descriptor_set_layout, vk);
+}
+
struct panvk_pipeline_layout {
- struct vk_object_base base;
- int32_t refcount;
+ struct vk_pipeline_layout vk;
+
unsigned char sha1[20];
unsigned num_samplers;
@@ -413,7 +420,6 @@ struct panvk_pipeline_layout {
} push_constants;
struct {
- struct panvk_descriptor_set_layout *layout;
unsigned sampler_offset;
unsigned tex_offset;
unsigned ubo_offset;
@@ -423,37 +429,19 @@ struct panvk_pipeline_layout {
} sets[MAX_SETS];
};
-void
-panvk_pipeline_layout_destroy(struct panvk_device *dev,
- struct panvk_pipeline_layout *layout);
-
-static inline void
-panvk_pipeline_layout_unref(struct panvk_device *dev,
- struct panvk_pipeline_layout *layout)
-{
- if (layout && p_atomic_dec_zero(&layout->refcount))
- panvk_pipeline_layout_destroy(dev, layout);
-}
-
-static inline struct panvk_pipeline_layout *
-panvk_pipeline_layout_ref(struct panvk_pipeline_layout *layout)
-{
- if (layout)
- p_atomic_inc(&layout->refcount);
-
- return layout;
-}
-
static unsigned
panvk_pipeline_layout_ubo_start(const struct panvk_pipeline_layout *layout,
unsigned set, bool is_dynamic)
{
+ const struct panvk_descriptor_set_layout *set_layout =
+ vk_to_panvk_descriptor_set_layout(layout->vk.set_layouts[set]);
+
unsigned offset = PANVK_NUM_BUILTIN_UBOS +
layout->sets[set].ubo_offset +
layout->sets[set].dyn_ubo_offset;
if (is_dynamic)
- offset += layout->sets[set].layout->num_ubos;
+ offset += set_layout->num_ubos;
return offset;
}
@@ -463,8 +451,10 @@ panvk_pipeline_layout_ubo_index(const struct panvk_pipeline_layout *layout,
unsigned set, unsigned binding,
unsigned array_index)
{
- struct panvk_descriptor_set_binding_layout *binding_layout =
- &layout->sets[set].layout->bindings[binding];
+ const struct panvk_descriptor_set_layout *set_layout =
+ vk_to_panvk_descriptor_set_layout(layout->vk.set_layouts[set]);
+ const struct panvk_descriptor_set_binding_layout *binding_layout =
+ &set_layout->bindings[binding];
const bool is_dynamic =
binding_layout->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
@@ -1085,7 +1075,7 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_image, vk.base, VkImage, VK_OBJECT_TYPE_IMA
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_image_view, vk.base, VkImageView, VK_OBJECT_TYPE_IMAGE_VIEW);
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline_cache, base, VkPipelineCache, VK_OBJECT_TYPE_PIPELINE_CACHE)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline, base, VkPipeline, VK_OBJECT_TYPE_PIPELINE)
-VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline_layout, base, VkPipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT)
+VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline_layout, vk.base, VkPipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_render_pass, base, VkRenderPass, VK_OBJECT_TYPE_RENDER_PASS)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_sampler, base, VkSampler, VK_OBJECT_TYPE_SAMPLER)
diff --git a/src/panfrost/vulkan/panvk_vX_cs.c b/src/panfrost/vulkan/panvk_vX_cs.c
index fb535c905d6..15068f68073 100644
--- a/src/panfrost/vulkan/panvk_vX_cs.c
+++ b/src/panfrost/vulkan/panvk_vX_cs.c
@@ -328,9 +328,9 @@ panvk_per_arch(emit_ubos)(const struct panvk_pipeline *pipeline,
memset(&ubos[PANVK_PUSH_CONST_UBO_INDEX], 0, sizeof(*ubos));
}
- for (unsigned s = 0; s < pipeline->layout->num_sets; s++) {
+ for (unsigned s = 0; s < pipeline->layout->vk.set_count; s++) {
const struct panvk_descriptor_set_layout *set_layout =
- pipeline->layout->sets[s].layout;
+ vk_to_panvk_descriptor_set_layout(pipeline->layout->vk.set_layouts[s]);
const struct panvk_descriptor_set *set = state->sets[s];
unsigned ubo_start =
diff --git a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c
index 5c30cafffa5..bc0cb1fbafe 100644
--- a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c
+++ b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c
@@ -59,6 +59,19 @@ addr_format_for_desc_type(VkDescriptorType desc_type,
}
}
+static const struct panvk_descriptor_set_layout *
+get_set_layout(uint32_t set, const struct apply_descriptors_ctx *ctx)
+{
+ return vk_to_panvk_descriptor_set_layout(ctx->layout->vk.set_layouts[set]);
+}
+
+static const struct panvk_descriptor_set_binding_layout *
+get_binding_layout(uint32_t set, uint32_t binding,
+ const struct apply_descriptors_ctx *ctx)
+{
+ return &get_set_layout(set, ctx)->bindings[binding];
+}
+
/** Build a Vulkan resource index
*
* A "resource index" is the term used by our SPIR-V parser and the relevant
@@ -85,7 +98,7 @@ build_res_index(nir_builder *b, uint32_t set, uint32_t binding,
const struct apply_descriptors_ctx *ctx)
{
const struct panvk_descriptor_set_layout *set_layout =
- ctx->layout->sets[set].layout;
+ get_set_layout(set, ctx);
const struct panvk_descriptor_set_binding_layout *bind_layout =
&set_layout->bindings[binding];
@@ -349,7 +362,7 @@ load_resource_deref_desc(nir_builder *b, nir_deref_instr *deref,
&index_imm, &index_ssa);
const struct panvk_descriptor_set_layout *set_layout =
- ctx->layout->sets[set].layout;
+ get_set_layout(set, ctx);
const struct panvk_descriptor_set_binding_layout *bind_layout =
&set_layout->bindings[binding];
@@ -466,7 +479,7 @@ lower_tex(nir_builder *b, nir_tex_instr *tex,
&index_imm, &index_ssa);
const struct panvk_descriptor_set_binding_layout *bind_layout =
- &ctx->layout->sets[set].layout->bindings[binding];
+ get_binding_layout(set, binding, ctx);
tex->sampler_index = ctx->layout->sets[set].sampler_offset +
bind_layout->sampler_idx + index_imm;
@@ -489,7 +502,7 @@ lower_tex(nir_builder *b, nir_tex_instr *tex,
&index_imm, &index_ssa);
const struct panvk_descriptor_set_binding_layout *bind_layout =
- &ctx->layout->sets[set].layout->bindings[binding];
+ get_binding_layout(set, binding, ctx);
tex->texture_index = ctx->layout->sets[set].tex_offset +
bind_layout->tex_idx + index_imm;
@@ -513,7 +526,7 @@ get_img_index(nir_builder *b, nir_deref_instr *deref,
get_resource_deref_binding(deref, &set, &binding, &index_imm, &index_ssa);
const struct panvk_descriptor_set_binding_layout *bind_layout =
- &ctx->layout->sets[set].layout->bindings[binding];
+ get_binding_layout(set, binding, ctx);
assert(bind_layout->type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE ||
bind_layout->type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER ||
bind_layout->type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER);
More information about the mesa-commit
mailing list