mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 11:40:10 +01:00
vulkan/runtime: keep the set layouts on the stack until pipeline creation
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36647>
This commit is contained in:
parent
ab0bcefab1
commit
8e93938c3f
1 changed files with 28 additions and 18 deletions
|
|
@ -1190,6 +1190,8 @@ vk_graphics_pipeline_compile_shaders(struct vk_device *device,
|
||||||
const struct vk_graphics_pipeline_link_info *link_info,
|
const struct vk_graphics_pipeline_link_info *link_info,
|
||||||
uint32_t stage_count,
|
uint32_t stage_count,
|
||||||
struct vk_pipeline_stage *stages,
|
struct vk_pipeline_stage *stages,
|
||||||
|
uint32_t set_layout_count,
|
||||||
|
struct vk_descriptor_set_layout **set_layouts,
|
||||||
VkPipelineCreationFeedback *stage_feedbacks)
|
VkPipelineCreationFeedback *stage_feedbacks)
|
||||||
{
|
{
|
||||||
const struct vk_device_shader_ops *ops = device->shader_ops;
|
const struct vk_device_shader_ops *ops = device->shader_ops;
|
||||||
|
|
@ -1239,10 +1241,10 @@ vk_graphics_pipeline_compile_shaders(struct vk_device *device,
|
||||||
|
|
||||||
struct mesa_blake3 blake3_ctx;
|
struct mesa_blake3 blake3_ctx;
|
||||||
_mesa_blake3_init(&blake3_ctx);
|
_mesa_blake3_init(&blake3_ctx);
|
||||||
for (uint32_t i = 0; i < pipeline->set_layout_count; i++) {
|
for (uint32_t i = 0; i < set_layout_count; i++) {
|
||||||
if (pipeline->set_layouts[i] != NULL) {
|
if (set_layouts[i] != NULL) {
|
||||||
_mesa_blake3_update(&blake3_ctx, pipeline->set_layouts[i]->blake3,
|
_mesa_blake3_update(&blake3_ctx, set_layouts[i]->blake3,
|
||||||
sizeof(pipeline->set_layouts[i]->blake3));
|
sizeof(set_layouts[i]->blake3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pipeline_layout != NULL) {
|
if (pipeline_layout != NULL) {
|
||||||
|
|
@ -1436,8 +1438,8 @@ vk_graphics_pipeline_compile_shaders(struct vk_device *device,
|
||||||
.next_stage_mask = next_stage,
|
.next_stage_mask = next_stage,
|
||||||
.nir = nir,
|
.nir = nir,
|
||||||
.robustness = &stage->precomp->rs,
|
.robustness = &stage->precomp->rs,
|
||||||
.set_layout_count = pipeline->set_layout_count,
|
.set_layout_count = set_layout_count,
|
||||||
.set_layouts = pipeline->set_layouts,
|
.set_layouts = set_layouts,
|
||||||
.push_constant_range_count = push_range != NULL,
|
.push_constant_range_count = push_range != NULL,
|
||||||
.push_constant_ranges = push_range != NULL ? push_range : NULL,
|
.push_constant_ranges = push_range != NULL ? push_range : NULL,
|
||||||
};
|
};
|
||||||
|
|
@ -1678,6 +1680,9 @@ vk_create_graphics_pipeline(struct vk_device *device,
|
||||||
all_state = &all_state_tmp;
|
all_state = &all_state_tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t set_layout_count = 0;
|
||||||
|
struct vk_descriptor_set_layout *set_layouts[MESA_VK_MAX_DESCRIPTOR_SETS] = { 0 };
|
||||||
|
|
||||||
/* If we have libraries, import them first. */
|
/* If we have libraries, import them first. */
|
||||||
if (libs_info) {
|
if (libs_info) {
|
||||||
for (uint32_t i = 0; i < libs_info->libraryCount; i++) {
|
for (uint32_t i = 0; i < libs_info->libraryCount; i++) {
|
||||||
|
|
@ -1689,16 +1694,14 @@ vk_create_graphics_pipeline(struct vk_device *device,
|
||||||
|
|
||||||
vk_graphics_pipeline_state_merge(state, &lib_gfx_pipeline->lib.state);
|
vk_graphics_pipeline_state_merge(state, &lib_gfx_pipeline->lib.state);
|
||||||
|
|
||||||
pipeline->set_layout_count = MAX2(pipeline->set_layout_count,
|
set_layout_count = MAX2(set_layout_count,
|
||||||
lib_gfx_pipeline->set_layout_count);
|
lib_gfx_pipeline->set_layout_count);
|
||||||
for (uint32_t i = 0; i < lib_gfx_pipeline->set_layout_count; i++) {
|
for (uint32_t i = 0; i < lib_gfx_pipeline->set_layout_count; i++) {
|
||||||
if (lib_gfx_pipeline->set_layouts[i] == NULL)
|
if (lib_gfx_pipeline->set_layouts[i] == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (pipeline->set_layouts[i] == NULL) {
|
if (set_layouts[i] == NULL)
|
||||||
pipeline->set_layouts[i] =
|
set_layouts[i] = lib_gfx_pipeline->set_layouts[i];
|
||||||
vk_descriptor_set_layout_ref(lib_gfx_pipeline->set_layouts[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < lib_gfx_pipeline->stage_count; i++) {
|
for (uint32_t i = 0; i < lib_gfx_pipeline->stage_count; i++) {
|
||||||
|
|
@ -1735,16 +1738,13 @@ vk_create_graphics_pipeline(struct vk_device *device,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pipeline_layout != NULL) {
|
if (pipeline_layout != NULL) {
|
||||||
pipeline->set_layout_count = MAX2(pipeline->set_layout_count,
|
set_layout_count = MAX2(set_layout_count, pipeline_layout->set_count);
|
||||||
pipeline_layout->set_count);
|
|
||||||
for (uint32_t i = 0; i < pipeline_layout->set_count; i++) {
|
for (uint32_t i = 0; i < pipeline_layout->set_count; i++) {
|
||||||
if (pipeline_layout->set_layouts[i] == NULL)
|
if (pipeline_layout->set_layouts[i] == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (pipeline->set_layouts[i] == NULL) {
|
if (set_layouts[i] == NULL)
|
||||||
pipeline->set_layouts[i] =
|
set_layouts[i] = pipeline_layout->set_layouts[i];
|
||||||
vk_descriptor_set_layout_ref(pipeline_layout->set_layouts[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1849,10 +1849,20 @@ vk_create_graphics_pipeline(struct vk_device *device,
|
||||||
pipeline_layout, state,
|
pipeline_layout, state,
|
||||||
&link_info,
|
&link_info,
|
||||||
stage_count, stages,
|
stage_count, stages,
|
||||||
|
set_layout_count, set_layouts,
|
||||||
stage_feedbacks);
|
stage_feedbacks);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
goto fail_stages;
|
goto fail_stages;
|
||||||
|
|
||||||
|
/* Keep a reference on the set layouts */
|
||||||
|
pipeline->set_layout_count = set_layout_count;
|
||||||
|
for (uint32_t i = 0; i < set_layout_count; i++) {
|
||||||
|
if (set_layouts[i] == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pipeline->set_layouts[i] = vk_descriptor_set_layout_ref(set_layouts[i]);
|
||||||
|
}
|
||||||
|
|
||||||
/* Throw away precompiled shaders unless the client explicitly asks us to
|
/* Throw away precompiled shaders unless the client explicitly asks us to
|
||||||
* keep them.
|
* keep them.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue