radv: move the serialized NIR to radv_graphics_lib_pipeline

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22356>
This commit is contained in:
Samuel Pitoiset
2023-04-07 10:53:38 +02:00
committed by Marge Bot
parent 4672c6c43b
commit 3b5ea90f1d
2 changed files with 17 additions and 13 deletions

View File

@@ -964,18 +964,18 @@ radv_graphics_pipeline_import_lib(const struct radv_device *device,
if (import_nir) { if (import_nir) {
/* Import the NIR shaders (after SPIRV->NIR). */ /* Import the NIR shaders (after SPIRV->NIR). */
for (uint32_t s = 0; s < ARRAY_SIZE(lib->base.base.shaders); s++) { for (uint32_t s = 0; s < ARRAY_SIZE(lib->base.base.shaders); s++) {
if (!lib->base.retained_shaders[s].serialized_nir_size) if (!lib->retained_shaders[s].serialized_nir_size)
continue; continue;
/* Deserialize the NIR shader. */ /* Deserialize the NIR shader. */
const struct nir_shader_compiler_options *options = const struct nir_shader_compiler_options *options =
&device->physical_device->nir_options[s]; &device->physical_device->nir_options[s];
struct blob_reader blob_reader; struct blob_reader blob_reader;
blob_reader_init(&blob_reader, lib->base.retained_shaders[s].serialized_nir, blob_reader_init(&blob_reader, lib->retained_shaders[s].serialized_nir,
lib->base.retained_shaders[s].serialized_nir_size); lib->retained_shaders[s].serialized_nir_size);
pipeline->retained_shaders[s].nir = nir_deserialize(NULL, options, &blob_reader); pipeline->retained_shaders[s].nir = nir_deserialize(NULL, options, &blob_reader);
memcpy(pipeline->retained_shaders[s].shader_sha1, lib->base.retained_shaders[s].shader_sha1, memcpy(pipeline->retained_shaders[s].shader_sha1, lib->retained_shaders[s].shader_sha1,
sizeof(pipeline->retained_shaders[s].shader_sha1)); sizeof(pipeline->retained_shaders[s].shader_sha1));
} }
} else { } else {
@@ -2781,7 +2781,7 @@ radv_pipeline_get_nir(struct radv_device *device, struct radv_graphics_pipeline
} }
static void static void
radv_pipeline_retain_shaders(struct radv_graphics_pipeline *pipeline, radv_pipeline_retain_shaders(struct radv_graphics_lib_pipeline *gfx_pipeline_lib,
struct radv_pipeline_stage *stages) struct radv_pipeline_stage *stages)
{ {
for (unsigned s = 0; s < MESA_VULKAN_SHADER_STAGES; s++) { for (unsigned s = 0; s < MESA_VULKAN_SHADER_STAGES; s++) {
@@ -2795,10 +2795,10 @@ radv_pipeline_retain_shaders(struct radv_graphics_pipeline *pipeline,
blob_init(&blob); blob_init(&blob);
nir_serialize(&blob, stages[s].nir, true); nir_serialize(&blob, stages[s].nir, true);
blob_finish_get_buffer(&blob, &pipeline->retained_shaders[s].serialized_nir, blob_finish_get_buffer(&blob, &gfx_pipeline_lib->retained_shaders[s].serialized_nir,
&pipeline->retained_shaders[s].serialized_nir_size); &gfx_pipeline_lib->retained_shaders[s].serialized_nir_size);
memcpy(pipeline->retained_shaders[s].shader_sha1, stages[s].shader_sha1, memcpy(gfx_pipeline_lib->retained_shaders[s].shader_sha1, stages[s].shader_sha1,
sizeof(stages[s].shader_sha1)); sizeof(stages[s].shader_sha1));
stages[s].feedback.duration += os_time_get_nano() - stage_start; stages[s].feedback.duration += os_time_get_nano() - stage_start;
@@ -3290,7 +3290,7 @@ radv_graphics_pipeline_compile(struct radv_graphics_pipeline *pipeline,
} }
radv_pipeline_get_nir(device, pipeline, stages, pipeline_key); radv_pipeline_get_nir(device, pipeline, stages, pipeline_key);
radv_pipeline_retain_shaders(pipeline, stages); radv_pipeline_retain_shaders(radv_pipeline_to_graphics_lib(&pipeline->base), stages);
} }
result = VK_SUCCESS; result = VK_SUCCESS;
@@ -3316,7 +3316,7 @@ radv_graphics_pipeline_compile(struct radv_graphics_pipeline *pipeline,
radv_pipeline_get_nir(device, pipeline, stages, pipeline_key); radv_pipeline_get_nir(device, pipeline, stages, pipeline_key);
if (retain_shaders) { if (retain_shaders) {
radv_pipeline_retain_shaders(pipeline, stages); radv_pipeline_retain_shaders(radv_pipeline_to_graphics_lib(&pipeline->base), stages);
} }
VkShaderStageFlagBits active_nir_stages = 0; VkShaderStageFlagBits active_nir_stages = 0;
@@ -4914,7 +4914,7 @@ radv_destroy_graphics_lib_pipeline(struct radv_device *device,
radv_pipeline_layout_finish(device, &pipeline->layout); radv_pipeline_layout_finish(device, &pipeline->layout);
for (unsigned i = 0; i < MESA_VULKAN_SHADER_STAGES; ++i) { for (unsigned i = 0; i < MESA_VULKAN_SHADER_STAGES; ++i) {
free(pipeline->base.retained_shaders[i].serialized_nir); free(pipeline->retained_shaders[i].serialized_nir);
} }
radv_destroy_graphics_pipeline(device, &pipeline->base); radv_destroy_graphics_pipeline(device, &pipeline->base);

View File

@@ -2298,8 +2298,6 @@ struct radv_graphics_pipeline {
bool retain_shaders; bool retain_shaders;
struct { struct {
nir_shader *nir; nir_shader *nir;
void *serialized_nir;
size_t serialized_nir_size;
unsigned char shader_sha1[SHA1_DIGEST_LENGTH]; unsigned char shader_sha1[SHA1_DIGEST_LENGTH];
} retained_shaders[MESA_VULKAN_SHADER_STAGES]; } retained_shaders[MESA_VULKAN_SHADER_STAGES];
@@ -2342,6 +2340,12 @@ struct radv_graphics_lib_pipeline {
struct vk_graphics_pipeline_state graphics_state; struct vk_graphics_pipeline_state graphics_state;
VkGraphicsPipelineLibraryFlagsEXT lib_flags; VkGraphicsPipelineLibraryFlagsEXT lib_flags;
struct {
void *serialized_nir;
size_t serialized_nir_size;
unsigned char shader_sha1[SHA1_DIGEST_LENGTH];
} retained_shaders[MESA_VULKAN_SHADER_STAGES];
}; };
struct radv_ray_tracing_pipeline { struct radv_ray_tracing_pipeline {