lavapipe: Implement VK_EXT_pipeline_library_group_handles

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28187>
This commit is contained in:
Konstantin Seurer 2024-03-14 19:22:19 +01:00 committed by Marge Bot
parent 1f729d9e2d
commit cede129119
3 changed files with 17 additions and 6 deletions

View File

@ -211,6 +211,7 @@ static const struct vk_device_extension_table lvp_device_extensions_supported =
#endif #endif
.EXT_pipeline_creation_feedback = true, .EXT_pipeline_creation_feedback = true,
.EXT_pipeline_creation_cache_control = true, .EXT_pipeline_creation_cache_control = true,
.EXT_pipeline_library_group_handles = true,
.EXT_post_depth_coverage = true, .EXT_post_depth_coverage = true,
.EXT_private_data = true, .EXT_private_data = true,
.EXT_primitives_generated_query = true, .EXT_primitives_generated_query = true,
@ -502,6 +503,9 @@ lvp_get_features(const struct lvp_physical_device *pdevice,
.rayTracingPipelineTraceRaysIndirect = true, .rayTracingPipelineTraceRaysIndirect = true,
.rayTraversalPrimitiveCulling = true, .rayTraversalPrimitiveCulling = true,
/* VK_EXT_pipeline_library_group_handles */
.pipelineLibraryGroupHandles = true,
/* VK_EXT_shader_object */ /* VK_EXT_shader_object */
.shaderObject = true, .shaderObject = true,
@ -1653,6 +1657,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateDevice(
util_dynarray_init(&device->bda_texture_handles, NULL); util_dynarray_init(&device->bda_texture_handles, NULL);
util_dynarray_init(&device->bda_image_handles, NULL); util_dynarray_init(&device->bda_image_handles, NULL);
device->group_handle_alloc = 1;
*pDevice = lvp_device_to_handle(device); *pDevice = lvp_device_to_handle(device);
return VK_SUCCESS; return VK_SUCCESS;

View File

@ -213,6 +213,8 @@ struct lvp_device {
struct lp_texture_handle *null_image_handle; struct lp_texture_handle *null_image_handle;
struct util_dynarray bda_texture_handles; struct util_dynarray bda_texture_handles;
struct util_dynarray bda_image_handles; struct util_dynarray bda_image_handles;
uint32_t group_handle_alloc;
}; };
void lvp_device_get_cache_uuid(void *uuid); void lvp_device_get_cache_uuid(void *uuid);

View File

@ -15,6 +15,9 @@
#include "spirv/spirv.h" #include "spirv/spirv.h"
#include "util/mesa-sha1.h"
#include "util/simple_mtx.h"
static void static void
lvp_init_ray_tracing_groups(struct lvp_pipeline *pipeline, lvp_init_ray_tracing_groups(struct lvp_pipeline *pipeline,
const VkRayTracingPipelineCreateInfoKHR *create_info) const VkRayTracingPipelineCreateInfoKHR *create_info)
@ -24,8 +27,6 @@ lvp_init_ray_tracing_groups(struct lvp_pipeline *pipeline,
const VkRayTracingShaderGroupCreateInfoKHR *group_info = create_info->pGroups + i; const VkRayTracingShaderGroupCreateInfoKHR *group_info = create_info->pGroups + i;
struct lvp_ray_tracing_group *dst = pipeline->rt.groups + i; struct lvp_ray_tracing_group *dst = pipeline->rt.groups + i;
dst->handle.index = i;
dst->recursive_index = VK_SHADER_UNUSED_KHR; dst->recursive_index = VK_SHADER_UNUSED_KHR;
dst->ahit_index = VK_SHADER_UNUSED_KHR; dst->ahit_index = VK_SHADER_UNUSED_KHR;
dst->isec_index = VK_SHADER_UNUSED_KHR; dst->isec_index = VK_SHADER_UNUSED_KHR;
@ -50,7 +51,7 @@ lvp_init_ray_tracing_groups(struct lvp_pipeline *pipeline,
} }
if (group_info->intersectionShader != VK_SHADER_UNUSED_KHR) { if (group_info->intersectionShader != VK_SHADER_UNUSED_KHR) {
dst->isec_index = group_info->intersectionShader; dst->isec_index = group_info->intersectionShader;
if (group_info->anyHitShader != VK_SHADER_UNUSED_KHR) if (group_info->anyHitShader != VK_SHADER_UNUSED_KHR)
dst->ahit_index = group_info->anyHitShader; dst->ahit_index = group_info->anyHitShader;
} }
@ -58,6 +59,8 @@ lvp_init_ray_tracing_groups(struct lvp_pipeline *pipeline,
default: default:
unreachable("Unimplemented VkRayTracingShaderGroupTypeKHR"); unreachable("Unimplemented VkRayTracingShaderGroupTypeKHR");
} }
dst->handle.index = p_atomic_inc_return(&pipeline->device->group_handle_alloc);
} }
if (!create_info->pLibraryInfo) if (!create_info->pLibraryInfo)
@ -70,7 +73,7 @@ lvp_init_ray_tracing_groups(struct lvp_pipeline *pipeline,
const struct lvp_ray_tracing_group *src = library->rt.groups + group_index; const struct lvp_ray_tracing_group *src = library->rt.groups + group_index;
struct lvp_ray_tracing_group *dst = pipeline->rt.groups + i; struct lvp_ray_tracing_group *dst = pipeline->rt.groups + i;
dst->handle.index = i; dst->handle = src->handle;
if (src->recursive_index != VK_SHADER_UNUSED_KHR) if (src->recursive_index != VK_SHADER_UNUSED_KHR)
dst->recursive_index = stage_base_index + src->recursive_index; dst->recursive_index = stage_base_index + src->recursive_index;
@ -1147,12 +1150,12 @@ lvp_create_ray_tracing_pipeline(VkDevice _device, const VkAllocationCallbacks *a
goto fail; goto fail;
} }
lvp_init_ray_tracing_groups(pipeline, create_info);
result = lvp_compile_ray_tracing_stages(pipeline, create_info); result = lvp_compile_ray_tracing_stages(pipeline, create_info);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
goto fail; goto fail;
lvp_init_ray_tracing_groups(pipeline, create_info);
VkPipelineCreateFlags2KHR create_flags = vk_rt_pipeline_create_flags(create_info); VkPipelineCreateFlags2KHR create_flags = vk_rt_pipeline_create_flags(create_info);
if (!(create_flags & VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR)) { if (!(create_flags & VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR)) {
lvp_compile_ray_tracing_pipeline(pipeline, create_info); lvp_compile_ray_tracing_pipeline(pipeline, create_info);