Mesa (main): lavapipe: 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: a579d33352c4cea4fe28288675aa463debe5982f
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a579d33352c4cea4fe28288675aa463debe5982f
Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date: Tue Jun 28 14:12:16 2022 -0500
lavapipe: Use the vk_pipeline_layout base struct
Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17286>
---
.../frontends/lavapipe/lvp_descriptor_set.c | 75 ++++++----------------
src/gallium/frontends/lavapipe/lvp_device.c | 7 +-
src/gallium/frontends/lavapipe/lvp_execute.c | 40 +++++++-----
.../frontends/lavapipe/lvp_lower_vulkan_resource.c | 66 ++++++++++++-------
src/gallium/frontends/lavapipe/lvp_pipeline.c | 39 ++++++-----
src/gallium/frontends/lavapipe/lvp_private.h | 39 +++--------
6 files changed, 122 insertions(+), 144 deletions(-)
diff --git a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
index 263a595796c..fa0b4282b95 100644
--- a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
+++ b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
@@ -228,28 +228,16 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreatePipelineLayout(
LVP_FROM_HANDLE(lvp_device, device, _device);
struct lvp_pipeline_layout *layout;
- assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO);
+ layout = vk_pipeline_layout_zalloc(&device->vk, sizeof(*layout),
+ pCreateInfo);
- layout = vk_zalloc(&device->vk.alloc, sizeof(*layout), 8,
- VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
- if (layout == NULL)
- return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
-
- vk_object_base_init(&device->vk, &layout->base,
- VK_OBJECT_TYPE_PIPELINE_LAYOUT);
- layout->ref_cnt = 1;
- layout->num_sets = pCreateInfo->setLayoutCount;
- if (pCreateInfo->flags & VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT)
- layout->independent_sets = true;
-
- for (uint32_t set = 0; set < pCreateInfo->setLayoutCount; set++) {
- LVP_FROM_HANDLE(lvp_descriptor_set_layout, set_layout,
- pCreateInfo->pSetLayouts[set]);
- if (layout->independent_sets && (!layout->num_sets || !set_layout)) {
- layout->set[set].layout = NULL;
+ for (uint32_t set = 0; set < layout->vk.set_count; set++) {
+ if (layout->vk.set_layouts[set] == NULL)
continue;
- }
- layout->set[set].layout = set_layout;
+
+ const struct lvp_descriptor_set_layout *set_layout =
+ vk_to_lvp_descriptor_set_layout(layout->vk.set_layouts[set]);
+
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
layout->stage[i].uniform_block_size += set_layout->stage[i].uniform_block_size;
for (unsigned j = 0; j < set_layout->stage[i].uniform_block_count; j++) {
@@ -258,7 +246,6 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreatePipelineLayout(
}
layout->stage[i].uniform_block_count += set_layout->stage[i].uniform_block_count;
}
- vk_descriptor_set_layout_ref(&set_layout->vk);
}
#ifndef NDEBUG
@@ -277,13 +264,19 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreatePipelineLayout(
uint16_t sampler_count = 0;
uint16_t sampler_view_count = 0;
uint16_t image_count = 0;
- for (unsigned j = 0; j < layout->num_sets; j++) {
- if (layout->set[j].layout && layout->set[j].layout->shader_stages & array[i]) {
- const_buffer_count += layout->set[j].layout->stage[i].const_buffer_count;
- shader_buffer_count += layout->set[j].layout->stage[i].shader_buffer_count;
- sampler_count += layout->set[j].layout->stage[i].sampler_count;
- sampler_view_count += layout->set[j].layout->stage[i].sampler_view_count;
- image_count += layout->set[j].layout->stage[i].image_count;
+ for (unsigned j = 0; j < layout->vk.set_count; j++) {
+ if (layout->vk.set_layouts[j] == NULL)
+ continue;
+
+ const struct lvp_descriptor_set_layout *set_layout =
+ vk_to_lvp_descriptor_set_layout(layout->vk.set_layouts[j]);
+
+ if (set_layout->shader_stages & array[i]) {
+ const_buffer_count += set_layout->stage[i].const_buffer_count;
+ shader_buffer_count += set_layout->stage[i].shader_buffer_count;
+ sampler_count += set_layout->stage[i].sampler_count;
+ sampler_view_count += set_layout->stage[i].sampler_view_count;
+ image_count += set_layout->stage[i].image_count;
}
}
assert(const_buffer_count <= device->physical_device->device_limits.maxPerStageDescriptorUniformBuffers);
@@ -307,32 +300,6 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreatePipelineLayout(
return VK_SUCCESS;
}
-void lvp_pipeline_layout_destroy(struct lvp_device *device,
- struct lvp_pipeline_layout *pipeline_layout)
-{
- assert(pipeline_layout->ref_cnt == 0);
-
- for (uint32_t i = 0; i < pipeline_layout->num_sets; i++)
- vk_descriptor_set_layout_unref(&device->vk, &pipeline_layout->set[i].layout->vk);
-
- vk_object_base_finish(&pipeline_layout->base);
- vk_free(&device->vk.alloc, pipeline_layout);
-}
-
-VKAPI_ATTR void VKAPI_CALL lvp_DestroyPipelineLayout(
- VkDevice _device,
- VkPipelineLayout _pipelineLayout,
- const VkAllocationCallbacks* pAllocator)
-{
- LVP_FROM_HANDLE(lvp_device, device, _device);
- LVP_FROM_HANDLE(lvp_pipeline_layout, pipeline_layout, _pipelineLayout);
-
- if (!_pipelineLayout)
- return;
-
- lvp_pipeline_layout_unref(device, pipeline_layout);
-}
-
VkResult
lvp_descriptor_set_create(struct lvp_device *device,
struct lvp_descriptor_set_layout *layout,
diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c
index 080522d54e0..1f15f26ebba 100644
--- a/src/gallium/frontends/lavapipe/lvp_device.c
+++ b/src/gallium/frontends/lavapipe/lvp_device.c
@@ -1498,16 +1498,15 @@ ref_pipeline_layout(struct vk_device *vk_device, VkPipelineLayout _layout)
{
LVP_FROM_HANDLE(lvp_pipeline_layout, layout, _layout);
- lvp_pipeline_layout_ref(layout);
+ vk_pipeline_layout_ref(&layout->vk);
}
static void
-unref_pipeline_layout(struct vk_device *vk_device, VkPipelineLayout _layout)
+unref_pipeline_layout(struct vk_device *device, VkPipelineLayout _layout)
{
- struct lvp_device *device = container_of(vk_device, struct lvp_device, vk);
LVP_FROM_HANDLE(lvp_pipeline_layout, layout, _layout);
- lvp_pipeline_layout_unref(device, layout);
+ vk_pipeline_layout_unref(device, &layout->vk);
}
VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateDevice(
diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c
index e62389114f2..fbf0eb36f91 100644
--- a/src/gallium/frontends/lavapipe/lvp_execute.c
+++ b/src/gallium/frontends/lavapipe/lvp_execute.c
@@ -1387,8 +1387,12 @@ static void handle_set_stage(struct rendering_state *state,
}
static void increment_dyn_info(struct dyn_info *dyn_info,
- struct lvp_descriptor_set_layout *layout, bool inc_dyn)
+ const struct vk_descriptor_set_layout *vk_layout,
+ bool inc_dyn)
{
+ const struct lvp_descriptor_set_layout *layout =
+ vk_to_lvp_descriptor_set_layout(vk_layout);
+
for (gl_shader_stage stage = MESA_SHADER_VERTEX; stage < MESA_SHADER_STAGES; stage++) {
dyn_info->stage[stage].const_buffer_count += layout->stage[stage].const_buffer_count;
dyn_info->stage[stage].shader_buffer_count += layout->stage[stage].shader_buffer_count;
@@ -1410,14 +1414,14 @@ static void handle_compute_descriptor_sets(struct vk_cmd_queue_entry *cmd,
int i;
for (i = 0; i < bds->first_set; i++) {
- increment_dyn_info(dyn_info, layout->set[i].layout, false);
+ increment_dyn_info(dyn_info, layout->vk.set_layouts[i], false);
}
for (i = 0; i < bds->descriptor_set_count; i++) {
const struct lvp_descriptor_set *set = lvp_descriptor_set_from_handle(bds->descriptor_sets[i]);
if (set->layout->shader_stages & VK_SHADER_STAGE_COMPUTE_BIT)
handle_set_stage(state, dyn_info, set, MESA_SHADER_COMPUTE, PIPE_SHADER_COMPUTE);
- increment_dyn_info(dyn_info, layout->set[bds->first_set + i].layout, true);
+ increment_dyn_info(dyn_info, layout->vk.set_layouts[bds->first_set + i], true);
}
}
@@ -1440,12 +1444,13 @@ static void handle_descriptor_sets(struct vk_cmd_queue_entry *cmd,
}
for (i = 0; i < bds->first_set; i++) {
- increment_dyn_info(&dyn_info, layout->set[i].layout, false);
+ increment_dyn_info(&dyn_info, layout->vk.set_layouts[i], false);
}
for (i = 0; i < bds->descriptor_set_count; i++) {
- if (!layout->set[bds->first_set + i].layout)
+ if (!layout->vk.set_layouts[bds->first_set + i])
continue;
+
const struct lvp_descriptor_set *set = lvp_descriptor_set_from_handle(bds->descriptor_sets[i]);
if (!set)
continue;
@@ -1471,7 +1476,7 @@ static void handle_descriptor_sets(struct vk_cmd_queue_entry *cmd,
if (set->layout->shader_stages & VK_SHADER_STAGE_FRAGMENT_BIT)
handle_set_stage(state, &dyn_info, set, MESA_SHADER_FRAGMENT, PIPE_SHADER_FRAGMENT);
- increment_dyn_info(&dyn_info, layout->set[bds->first_set + i].layout, true);
+ increment_dyn_info(&dyn_info, layout->vk.set_layouts[bds->first_set + i], true);
}
}
@@ -3088,17 +3093,19 @@ static void handle_compute_push_descriptor_set(struct lvp_cmd_push_descriptor_se
struct dyn_info *dyn_info,
struct rendering_state *state)
{
- struct lvp_descriptor_set_layout *layout = pds->layout->set[pds->set].layout;
+ const struct lvp_descriptor_set_layout *layout =
+ vk_to_lvp_descriptor_set_layout(pds->layout->vk.set_layouts[pds->set]);
if (!(layout->shader_stages & VK_SHADER_STAGE_COMPUTE_BIT))
return;
for (unsigned i = 0; i < pds->set; i++) {
- increment_dyn_info(dyn_info, pds->layout->set[i].layout, false);
+ increment_dyn_info(dyn_info, pds->layout->vk.set_layouts[i], false);
}
unsigned info_idx = 0;
for (unsigned i = 0; i < pds->descriptor_write_count; i++) {
struct lvp_write_descriptor *desc = &pds->descriptors[i];
- struct lvp_descriptor_set_binding_layout *binding = &layout->binding[desc->dst_binding];
+ const struct lvp_descriptor_set_binding_layout *binding =
+ &layout->binding[desc->dst_binding];
if (!binding->valid)
continue;
@@ -3195,13 +3202,11 @@ static struct lvp_cmd_push_descriptor_set *create_push_descriptor_set(struct vk_
static void handle_push_descriptor_set_generic(struct vk_cmd_push_descriptor_set_khr *_pds,
struct rendering_state *state)
{
- struct lvp_cmd_push_descriptor_set *pds;
- struct lvp_descriptor_set_layout *layout;
- struct dyn_info dyn_info;
-
- pds = create_push_descriptor_set(_pds);
- layout = pds->layout->set[pds->set].layout;
+ struct lvp_cmd_push_descriptor_set *pds = create_push_descriptor_set(_pds);
+ const struct lvp_descriptor_set_layout *layout =
+ vk_to_lvp_descriptor_set_layout(pds->layout->vk.set_layouts[pds->set]);
+ struct dyn_info dyn_info;
memset(&dyn_info.stage, 0, sizeof(dyn_info.stage));
dyn_info.dyn_index = 0;
if (pds->bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) {
@@ -3209,13 +3214,14 @@ static void handle_push_descriptor_set_generic(struct vk_cmd_push_descriptor_set
}
for (unsigned i = 0; i < pds->set; i++) {
- increment_dyn_info(&dyn_info, pds->layout->set[i].layout, false);
+ increment_dyn_info(&dyn_info, pds->layout->vk.set_layouts[i], false);
}
unsigned info_idx = 0;
for (unsigned i = 0; i < pds->descriptor_write_count; i++) {
struct lvp_write_descriptor *desc = &pds->descriptors[i];
- struct lvp_descriptor_set_binding_layout *binding = &layout->binding[desc->dst_binding];
+ const struct lvp_descriptor_set_binding_layout *binding =
+ &layout->binding[desc->dst_binding];
if (!binding->valid)
continue;
diff --git a/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c b/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c
index afc200c57a3..9a6de4df02b 100644
--- a/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c
+++ b/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c
@@ -76,13 +76,28 @@ lower_uniform_block_access(const nir_instr *instr, const void *data_cb)
return deref->modes == nir_var_mem_ubo;
}
+static const struct lvp_descriptor_set_layout *
+get_set_layout(const struct lvp_pipeline_layout *layout, uint32_t set)
+{
+ return container_of(layout->vk.set_layouts[set],
+ const struct lvp_descriptor_set_layout, vk);
+}
+
+static const struct lvp_descriptor_set_binding_layout *
+get_binding_layout(const struct lvp_pipeline_layout *layout,
+ uint32_t set, uint32_t binding)
+{
+ return &get_set_layout(layout, set)->binding[binding];
+}
+
static nir_ssa_def *
lower_block_instr(nir_builder *b, nir_instr *instr, void *data_cb)
{
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
nir_binding nb = nir_chase_binding(intrin->src[0]);
- struct lvp_pipeline_layout *layout = data_cb;
- struct lvp_descriptor_set_binding_layout *binding = &layout->set[nb.desc_set].layout->binding[nb.binding];
+ const struct lvp_pipeline_layout *layout = data_cb;
+ const struct lvp_descriptor_set_binding_layout *binding =
+ get_binding_layout(layout, nb.desc_set, nb.binding);
if (binding->type != VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK)
return NULL;
if (!binding->array_size)
@@ -91,7 +106,7 @@ lower_block_instr(nir_builder *b, nir_instr *instr, void *data_cb)
assert(intrin->src[0].ssa->num_components == 2);
unsigned value = 0;
for (unsigned s = 0; s < nb.desc_set; s++)
- value += layout->set[s].layout->stage[b->shader->info.stage].uniform_block_size;
+ value += get_set_layout(layout, s)->stage[b->shader->info.stage].uniform_block_size;
if (layout->push_constant_stages & BITFIELD_BIT(b->shader->info.stage))
value += layout->push_constant_size;
value += binding->stage[b->shader->info.stage].uniform_block_offset;
@@ -111,8 +126,9 @@ static nir_ssa_def *lower_vri_intrin_vri(struct nir_builder *b,
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
unsigned desc_set_idx = nir_intrinsic_desc_set(intrin);
unsigned binding_idx = nir_intrinsic_binding(intrin);
- struct lvp_pipeline_layout *layout = data_cb;
- struct lvp_descriptor_set_binding_layout *binding = &layout->set[desc_set_idx].layout->binding[binding_idx];
+ const struct lvp_pipeline_layout *layout = data_cb;
+ const struct lvp_descriptor_set_binding_layout *binding =
+ get_binding_layout(data_cb, desc_set_idx, binding_idx);
int value = 0;
bool is_ubo = (binding->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ||
binding->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC);
@@ -122,12 +138,12 @@ static nir_ssa_def *lower_vri_intrin_vri(struct nir_builder *b,
return nir_imm_ivec2(b, 0, 0);
for (unsigned s = 0; s < desc_set_idx; s++) {
- if (!layout->set[s].layout)
+ if (!layout->vk.set_layouts[s])
continue;
if (is_ubo)
- value += layout->set[s].layout->stage[b->shader->info.stage].const_buffer_count;
+ value += get_set_layout(layout, s)->stage[b->shader->info.stage].const_buffer_count;
else
- value += layout->set[s].layout->stage[b->shader->info.stage].shader_buffer_count;
+ value += get_set_layout(layout, s)->stage[b->shader->info.stage].shader_buffer_count;
}
if (is_ubo)
value += binding->stage[b->shader->info.stage].const_buffer_index + 1;
@@ -180,15 +196,16 @@ lower_vri_instr_tex_deref(nir_tex_instr *tex,
unsigned desc_set_idx = var->data.descriptor_set;
unsigned binding_idx = var->data.binding;
int value = 0;
- struct lvp_descriptor_set_binding_layout *binding = &layout->set[desc_set_idx].layout->binding[binding_idx];
+ const struct lvp_descriptor_set_binding_layout *binding =
+ get_binding_layout(layout, desc_set_idx, binding_idx);
nir_tex_instr_remove_src(tex, deref_src_idx);
for (unsigned s = 0; s < desc_set_idx; s++) {
- if (!layout->set[s].layout)
+ if (!layout->vk.set_layouts[s])
continue;
if (deref_src_type == nir_tex_src_sampler_deref)
- value += layout->set[s].layout->stage[stage].sampler_count;
+ value += get_set_layout(layout, s)->stage[stage].sampler_count;
else
- value += layout->set[s].layout->stage[stage].sampler_view_count;
+ value += get_set_layout(layout, s)->stage[stage].sampler_view_count;
}
if (deref_src_type == nir_tex_src_sampler_deref)
value += binding->stage[stage].sampler_index;
@@ -243,21 +260,21 @@ static void lower_vri_instr_tex(struct nir_builder *b,
static void lower_vri_intrin_image(struct nir_builder *b,
nir_intrinsic_instr *intrin, void *data_cb)
{
- struct lvp_pipeline_layout *layout = data_cb;
+ const struct lvp_pipeline_layout *layout = data_cb;
gl_shader_stage stage = b->shader->info.stage;
nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
nir_variable *var = nir_deref_instr_get_variable(deref);
unsigned desc_set_idx = var->data.descriptor_set;
unsigned binding_idx = var->data.binding;
- struct lvp_descriptor_set_binding_layout *binding =
- &layout->set[desc_set_idx].layout->binding[binding_idx];
+ const struct lvp_descriptor_set_binding_layout *binding =
+ get_binding_layout(layout, desc_set_idx, binding_idx);
int value = 0;
for (unsigned s = 0; s < desc_set_idx; s++) {
- if (!layout->set[s].layout)
+ if (!layout->vk.set_layouts[s])
continue;
- value += layout->set[s].layout->stage[stage].image_count;
+ value += get_set_layout(layout, s)->stage[stage].image_count;
}
value += binding->stage[stage].image_index;
@@ -344,22 +361,23 @@ void lvp_lower_pipeline_layout(const struct lvp_device *device,
glsl_get_base_type(glsl_without_array(type));
unsigned desc_set_idx = var->data.descriptor_set;
unsigned binding_idx = var->data.binding;
- struct lvp_descriptor_set_binding_layout *binding = &layout->set[desc_set_idx].layout->binding[binding_idx];
+ const struct lvp_descriptor_set_binding_layout *binding =
+ get_binding_layout(layout, desc_set_idx, binding_idx);
int value = 0;
var->data.descriptor_set = 0;
if (base_type == GLSL_TYPE_SAMPLER || base_type == GLSL_TYPE_TEXTURE) {
if (binding->type == VK_DESCRIPTOR_TYPE_SAMPLER) {
for (unsigned s = 0; s < desc_set_idx; s++) {
- if (!layout->set[s].layout)
+ if (!layout->vk.set_layouts[s])
continue;
- value += layout->set[s].layout->stage[shader->info.stage].sampler_count;
+ value += get_set_layout(layout, s)->stage[shader->info.stage].sampler_count;
}
value += binding->stage[shader->info.stage].sampler_index;
} else {
for (unsigned s = 0; s < desc_set_idx; s++) {
- if (!layout->set[s].layout)
+ if (!layout->vk.set_layouts[s])
continue;
- value += layout->set[s].layout->stage[shader->info.stage].sampler_view_count;
+ value += get_set_layout(layout, s)->stage[shader->info.stage].sampler_view_count;
}
value += binding->stage[shader->info.stage].sampler_view_index;
}
@@ -368,9 +386,9 @@ void lvp_lower_pipeline_layout(const struct lvp_device *device,
if (base_type == GLSL_TYPE_IMAGE) {
var->data.descriptor_set = 0;
for (unsigned s = 0; s < desc_set_idx; s++) {
- if (!layout->set[s].layout)
+ if (!layout->vk.set_layouts[s])
continue;
- value += layout->set[s].layout->stage[shader->info.stage].image_count;
+ value += get_set_layout(layout, s)->stage[shader->info.stage].image_count;
}
value += binding->stage[shader->info.stage].image_index;
var->data.binding = value;
diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c
index dfbe54dcbec..890e4ac0795 100644
--- a/src/gallium/frontends/lavapipe/lvp_pipeline.c
+++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c
@@ -63,7 +63,7 @@ lvp_pipeline_destroy(struct lvp_device *device, struct lvp_pipeline *pipeline)
ralloc_free(pipeline->pipeline_nir[i]);
if (pipeline->layout)
- lvp_pipeline_layout_unref(device, pipeline->layout);
+ vk_pipeline_layout_unref(&device->vk, &pipeline->layout->vk);
ralloc_free(pipeline->mem_ctx);
vk_object_base_finish(&pipeline->base);
@@ -1302,20 +1302,29 @@ merge_layouts(struct lvp_pipeline *dst, struct lvp_pipeline_layout *src)
}
#ifndef NDEBUG
/* verify that layouts match */
- const struct lvp_pipeline_layout *smaller = dst->layout->num_sets < src->num_sets ? dst->layout : src;
+ const struct lvp_pipeline_layout *smaller = dst->layout->vk.set_count < src->vk.set_count ? dst->layout : src;
const struct lvp_pipeline_layout *bigger = smaller == dst->layout ? src : dst->layout;
- for (unsigned i = 0; i < smaller->num_sets; i++) {
- assert(!smaller->set[i].layout || !bigger->set[i].layout ||
- !smaller->set[i].layout->binding_count || !bigger->set[i].layout->binding_count ||
- smaller->set[i].layout == bigger->set[i].layout ||
- layouts_equal(smaller->set[i].layout, bigger->set[i].layout));
+ for (unsigned i = 0; i < smaller->vk.set_count; i++) {
+ if (!smaller->vk.set_layouts[i] || !bigger->vk.set_layouts[i] ||
+ smaller->vk.set_layouts[i] == bigger->vk.set_layouts[i])
+ continue;
+
+ const struct lvp_descriptor_set_layout *smaller_set_layout =
+ vk_to_lvp_descriptor_set_layout(smaller->vk.set_layouts[i]);
+ const struct lvp_descriptor_set_layout *bigger_set_layout =
+ vk_to_lvp_descriptor_set_layout(bigger->vk.set_layouts[i]);
+
+ assert(!smaller_set_layout->binding_count ||
+ !bigger_set_layout->binding_count ||
+ layouts_equal(smaller_set_layout, bigger_set_layout));
}
#endif
- for (unsigned i = 0; i < src->num_sets; i++) {
- if (!dst->layout->set[i].layout)
- dst->layout->set[i].layout = src->set[i].layout;
+ for (unsigned i = 0; i < src->vk.set_count; i++) {
+ if (!dst->layout->vk.set_layouts[i])
+ dst->layout->vk.set_layouts[i] = src->vk.set_layouts[i];
}
- dst->layout->num_sets = MAX2(dst->layout->num_sets, src->num_sets);
+ dst->layout->vk.set_count = MAX2(dst->layout->vk.set_count,
+ src->vk.set_count);
dst->layout->push_constant_size += src->push_constant_size;
dst->layout->push_constant_stages |= src->push_constant_stages;
}
@@ -1346,9 +1355,9 @@ lvp_graphics_pipeline_init(struct lvp_pipeline *pipeline,
struct lvp_pipeline_layout *layout = lvp_pipeline_layout_from_handle(pCreateInfo->layout);
if (layout)
- lvp_pipeline_layout_ref(layout);
+ vk_pipeline_layout_ref(&layout->vk);
- if (!layout || !layout->independent_sets)
+ if (!layout || !(layout->vk.create_flags & VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT))
/* this is a regular pipeline with no partials: directly reuse */
pipeline->layout = layout;
else if (pipeline->stages & layout_stages) {
@@ -1381,7 +1390,7 @@ lvp_graphics_pipeline_init(struct lvp_pipeline *pipeline,
if (p->stages & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT)
pipeline->force_min_sample = p->force_min_sample;
if (p->stages & layout_stages) {
- if (!layout || layout->independent_sets)
+ if (!layout || (layout->vk.create_flags & VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT))
merge_layouts(pipeline, p->layout);
}
pipeline->stages |= p->stages;
@@ -1607,7 +1616,7 @@ lvp_compute_pipeline_init(struct lvp_pipeline *pipeline,
pCreateInfo->stage.module);
pipeline->device = device;
pipeline->layout = lvp_pipeline_layout_from_handle(pCreateInfo->layout);
- lvp_pipeline_layout_ref(pipeline->layout);
+ vk_pipeline_layout_ref(&pipeline->layout->vk);
pipeline->force_min_sample = false;
pipeline->mem_ctx = ralloc_context(NULL);
diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h
index f42d8055699..ce3f553a604 100644
--- a/src/gallium/frontends/lavapipe/lvp_private.h
+++ b/src/gallium/frontends/lavapipe/lvp_private.h
@@ -68,6 +68,7 @@ typedef uint32_t xcb_window_t;
#include "vk_command_buffer.h"
#include "vk_command_pool.h"
#include "vk_descriptor_set_layout.h"
+#include "vk_pipeline_layout.h"
#include "vk_queue.h"
#include "vk_sync.h"
#include "vk_sync_timeline.h"
@@ -320,6 +321,12 @@ struct lvp_descriptor_set_layout {
struct lvp_descriptor_set_binding_layout binding[0];
};
+static inline const struct lvp_descriptor_set_layout *
+vk_to_lvp_descriptor_set_layout(const struct vk_descriptor_set_layout *layout)
+{
+ return container_of(layout, const struct lvp_descriptor_set_layout, vk);
+}
+
union lvp_descriptor_info {
struct {
struct lvp_sampler *sampler;
@@ -398,16 +405,8 @@ lvp_descriptor_set_destroy(struct lvp_device *device,
struct lvp_descriptor_set *set);
struct lvp_pipeline_layout {
- struct vk_object_base base;
+ struct vk_pipeline_layout vk;
- /* Pipeline layouts can be destroyed at almost any time */
- uint32_t ref_cnt;
-
- struct {
- struct lvp_descriptor_set_layout *layout;
- } set[MAX_SETS];
-
- uint32_t num_sets;
uint32_t push_constant_size;
VkShaderStageFlags push_constant_stages;
struct {
@@ -415,28 +414,8 @@ struct lvp_pipeline_layout {
uint16_t uniform_block_count;
uint16_t uniform_block_sizes[MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BLOCKS * MAX_SETS];
} stage[MESA_SHADER_STAGES];
- bool independent_sets;
};
-void lvp_pipeline_layout_destroy(struct lvp_device *device,
- struct lvp_pipeline_layout *layout);
-
-static inline void
-lvp_pipeline_layout_ref(struct lvp_pipeline_layout *layout)
-{
- assert(layout && layout->ref_cnt >= 1);
- p_atomic_inc(&layout->ref_cnt);
-}
-
-static inline void
-lvp_pipeline_layout_unref(struct lvp_device *device,
- struct lvp_pipeline_layout *layout)
-{
- assert(layout && layout->ref_cnt >= 1);
- if (p_atomic_dec_zero(&layout->ref_cnt))
- lvp_pipeline_layout_destroy(device, layout);
-}
-
struct lvp_access_info {
uint32_t images_read;
uint32_t images_written;
@@ -571,7 +550,7 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline_cache, base, VkPipelineCache,
VK_OBJECT_TYPE_PIPELINE_CACHE)
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline, base, VkPipeline,
VK_OBJECT_TYPE_PIPELINE)
-VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline_layout, base, VkPipelineLayout,
+VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_pipeline_layout, vk.base, VkPipelineLayout,
VK_OBJECT_TYPE_PIPELINE_LAYOUT)
VK_DEFINE_NONDISP_HANDLE_CASTS(lvp_query_pool, base, VkQueryPool,
VK_OBJECT_TYPE_QUERY_POOL)
More information about the mesa-commit
mailing list