Mesa (main): radv: re-order shader stages directly in radv_create_shaders()
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Apr 8 17:09:40 UTC 2022
Module: Mesa
Branch: main
Commit: 1387593fbfbd1d38543c4098beb91f4a125cdb87
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1387593fbfbd1d38543c4098beb91f4a125cdb87
Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date: Thu Apr 7 16:01:10 2022 +0200
radv: re-order shader stages directly in radv_create_shaders()
We will have to access pStages::pNext for modules and this will also
allow to rework feedback creation.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15794>
---
src/amd/vulkan/radv_pipeline.c | 80 ++++++++++++++++++++----------------
src/amd/vulkan/radv_pipeline_cache.c | 28 ++++++-------
src/amd/vulkan/radv_private.h | 4 +-
src/amd/vulkan/radv_shader.h | 3 +-
4 files changed, 62 insertions(+), 53 deletions(-)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 0a955a67f73..4182a5de6d7 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -4127,7 +4127,8 @@ VkResult
radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout *pipeline_layout,
struct radv_device *device, struct radv_pipeline_cache *cache,
const struct radv_pipeline_key *pipeline_key,
- const VkPipelineShaderStageCreateInfo **pStages,
+ const VkPipelineShaderStageCreateInfo *pStages,
+ uint32_t stageCount,
const VkPipelineCreateFlags flags, const uint8_t *custom_hash,
VkPipelineCreationFeedback *pipeline_feedback,
VkPipelineCreationFeedback **stage_feedbacks)
@@ -4154,17 +4155,26 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
radv_start_feedback(pipeline_feedback);
- for (unsigned i = 0; i < MESA_VULKAN_SHADER_STAGES; ++i) {
- if (pStages[i]) {
- modules[i] = vk_shader_module_from_handle(pStages[i]->module);
- if (modules[i]->nir)
- _mesa_sha1_compute(modules[i]->nir->info.name, strlen(modules[i]->nir->info.name),
- modules[i]->sha1);
+ for (uint32_t i = 0; i < stageCount; i++) {
+ const VkPipelineShaderStageCreateInfo *sinfo = &pStages[i];
+ gl_shader_stage stage = vk_to_mesa_shader_stage(sinfo->stage);
- pipeline->active_stages |= mesa_to_vk_shader_stage(i);
- if (i < MESA_SHADER_FRAGMENT || i == MESA_SHADER_MESH)
- pipeline->graphics.last_vgt_api_stage = i;
+ modules[stage] = vk_shader_module_from_handle(sinfo->module);
+
+ if (modules[stage]->nir) {
+ _mesa_sha1_compute(modules[stage]->nir->info.name, strlen(modules[stage]->nir->info.name),
+ modules[stage]->sha1);
}
+
+ pipeline->active_stages |= sinfo->stage;
+ }
+
+ for (uint32_t i = 0; i < MESA_VULKAN_SHADER_STAGES; i++) {
+ if (!modules[i])
+ continue;
+
+ if (i < MESA_SHADER_FRAGMENT || i == MESA_SHADER_MESH)
+ pipeline->graphics.last_vgt_api_stage = i;
}
ASSERTED bool primitive_shading =
@@ -4183,7 +4193,7 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
if (custom_hash)
memcpy(hash, custom_hash, 20);
else {
- radv_hash_shaders(hash, pStages, pipeline_layout, pipeline_key,
+ radv_hash_shaders(hash, pStages, stageCount, pipeline_layout, pipeline_key,
radv_get_hash_flags(device, keep_statistic_info));
}
@@ -4203,25 +4213,32 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
return VK_PIPELINE_COMPILE_REQUIRED;
}
+ for (uint32_t i = 0; i < stageCount; i++) {
+ const VkPipelineShaderStageCreateInfo *sinfo = &pStages[i];
+ gl_shader_stage stage = vk_to_mesa_shader_stage(sinfo->stage);
+
+ radv_start_feedback(stage_feedbacks[stage]);
+
+ nir[stage] = radv_shader_compile_to_nir(device, modules[stage], sinfo ? sinfo->pName : "main",
+ stage, sinfo ? sinfo->pSpecializationInfo : NULL,
+ pipeline_key);
+
+ radv_stop_feedback(stage_feedbacks[stage], false);
+ }
+
if (!modules[MESA_SHADER_FRAGMENT] && !modules[MESA_SHADER_COMPUTE]) {
nir_builder fs_b = radv_meta_init_shader(MESA_SHADER_FRAGMENT, "noop_fs");
fs_m = vk_shader_module_from_nir(fs_b.shader);
modules[MESA_SHADER_FRAGMENT] = &fs_m;
noop_fs = true;
- }
-
- for (unsigned i = 0; i < MESA_VULKAN_SHADER_STAGES; ++i) {
- const VkPipelineShaderStageCreateInfo *stage = pStages[i];
-
- if (!modules[i])
- continue;
- radv_start_feedback(stage_feedbacks[i]);
+ radv_start_feedback(stage_feedbacks[MESA_SHADER_FRAGMENT]);
- nir[i] = radv_shader_compile_to_nir(device, modules[i], stage ? stage->pName : "main", i,
- stage ? stage->pSpecializationInfo : NULL, pipeline_key);
+ nir[MESA_SHADER_FRAGMENT] = radv_shader_compile_to_nir(device, modules[MESA_SHADER_FRAGMENT],
+ "main", MESA_SHADER_FRAGMENT, NULL,
+ pipeline_key);
- radv_stop_feedback(stage_feedbacks[i], false);
+ radv_stop_feedback(stage_feedbacks[MESA_SHADER_FRAGMENT], false);
}
/* Force per-vertex VRS. */
@@ -6495,13 +6512,9 @@ radv_graphics_pipeline_init(struct radv_pipeline *pipeline, struct radv_device *
VkPipelineCreationFeedback *pipeline_feedback =
creation_feedback ? creation_feedback->pPipelineCreationFeedback : NULL;
- const VkPipelineShaderStageCreateInfo *pStages[MESA_VULKAN_SHADER_STAGES] = {
- 0,
- };
VkPipelineCreationFeedback *stage_feedbacks[MESA_VULKAN_SHADER_STAGES] = {0};
for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
gl_shader_stage stage = ffs(pCreateInfo->pStages[i].stage) - 1;
- pStages[stage] = &pCreateInfo->pStages[i];
if (creation_feedback)
stage_feedbacks[stage] = &creation_feedback->pPipelineStageCreationFeedbacks[i];
}
@@ -6509,8 +6522,9 @@ radv_graphics_pipeline_init(struct radv_pipeline *pipeline, struct radv_device *
struct radv_pipeline_key key =
radv_generate_graphics_pipeline_key(pipeline, pCreateInfo, &blend);
- result = radv_create_shaders(pipeline, pipeline_layout, device, cache, &key, pStages,
- pCreateInfo->flags, NULL, pipeline_feedback, stage_feedbacks);
+ result = radv_create_shaders(pipeline, pipeline_layout, device, cache, &key, pCreateInfo->pStages,
+ pCreateInfo->stageCount, pCreateInfo->flags, NULL, pipeline_feedback,
+ stage_feedbacks);
if (result != VK_SUCCESS)
return result;
@@ -6810,9 +6824,6 @@ radv_compute_pipeline_create(VkDevice _device, VkPipelineCache _cache,
RADV_FROM_HANDLE(radv_device, device, _device);
RADV_FROM_HANDLE(radv_pipeline_cache, cache, _cache);
RADV_FROM_HANDLE(radv_pipeline_layout, pipeline_layout, pCreateInfo->layout);
- const VkPipelineShaderStageCreateInfo *pStages[MESA_VULKAN_SHADER_STAGES] = {
- 0,
- };
VkPipelineCreationFeedback *stage_feedbacks[MESA_VULKAN_SHADER_STAGES] = {0};
struct radv_pipeline *pipeline;
VkResult result;
@@ -6839,12 +6850,11 @@ radv_compute_pipeline_create(VkDevice _device, VkPipelineCache _cache,
if (creation_feedback)
stage_feedbacks[MESA_SHADER_COMPUTE] = &creation_feedback->pPipelineStageCreationFeedbacks[0];
- pStages[MESA_SHADER_COMPUTE] = &pCreateInfo->stage;
-
struct radv_pipeline_key key = radv_generate_compute_pipeline_key(pipeline, pCreateInfo);
- result = radv_create_shaders(pipeline, pipeline_layout, device, cache, &key, pStages,
- pCreateInfo->flags, custom_hash, pipeline_feedback, stage_feedbacks);
+ result = radv_create_shaders(pipeline, pipeline_layout, device, cache, &key, &pCreateInfo->stage,
+ 1, pCreateInfo->flags, custom_hash, pipeline_feedback,
+ stage_feedbacks);
if (result != VK_SUCCESS) {
radv_pipeline_destroy(device, pipeline, pAllocator);
return result;
diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c
index 2eaac7d4f1f..d3ab551f668 100644
--- a/src/amd/vulkan/radv_pipeline_cache.c
+++ b/src/amd/vulkan/radv_pipeline_cache.c
@@ -118,9 +118,9 @@ entry_size(struct cache_entry *entry)
}
void
-radv_hash_shaders(unsigned char *hash, const VkPipelineShaderStageCreateInfo **stages,
- const struct radv_pipeline_layout *layout, const struct radv_pipeline_key *key,
- uint32_t flags)
+radv_hash_shaders(unsigned char *hash, const VkPipelineShaderStageCreateInfo *stages,
+ uint32_t stageCount, const struct radv_pipeline_layout *layout,
+ const struct radv_pipeline_key *key, uint32_t flags)
{
struct mesa_sha1 ctx;
@@ -130,18 +130,16 @@ radv_hash_shaders(unsigned char *hash, const VkPipelineShaderStageCreateInfo **s
if (layout)
_mesa_sha1_update(&ctx, layout->sha1, sizeof(layout->sha1));
- for (int i = 0; i < MESA_VULKAN_SHADER_STAGES; ++i) {
- if (stages[i]) {
- RADV_FROM_HANDLE(vk_shader_module, module, stages[i]->module);
- const VkSpecializationInfo *spec_info = stages[i]->pSpecializationInfo;
-
- _mesa_sha1_update(&ctx, module->sha1, sizeof(module->sha1));
- _mesa_sha1_update(&ctx, stages[i]->pName, strlen(stages[i]->pName));
- if (spec_info && spec_info->mapEntryCount) {
- _mesa_sha1_update(&ctx, spec_info->pMapEntries,
- spec_info->mapEntryCount * sizeof spec_info->pMapEntries[0]);
- _mesa_sha1_update(&ctx, spec_info->pData, spec_info->dataSize);
- }
+ for (uint32_t i = 0; i < stageCount; i++) {
+ RADV_FROM_HANDLE(vk_shader_module, module, stages[i].module);
+ const VkSpecializationInfo *spec_info = stages[i].pSpecializationInfo;
+
+ _mesa_sha1_update(&ctx, module->sha1, sizeof(module->sha1));
+ _mesa_sha1_update(&ctx, stages[i].pName, strlen(stages[i].pName));
+ if (spec_info && spec_info->mapEntryCount) {
+ _mesa_sha1_update(&ctx, spec_info->pMapEntries,
+ spec_info->mapEntryCount * sizeof spec_info->pMapEntries[0]);
+ _mesa_sha1_update(&ctx, spec_info->pData, spec_info->dataSize);
}
}
_mesa_sha1_update(&ctx, &flags, 4);
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 9906b792537..416e50daf30 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1745,8 +1745,8 @@ struct radv_event {
struct radv_pipeline_key;
-void radv_hash_shaders(unsigned char *hash, const VkPipelineShaderStageCreateInfo **stages,
- const struct radv_pipeline_layout *layout,
+void radv_hash_shaders(unsigned char *hash, const VkPipelineShaderStageCreateInfo *stages,
+ uint32_t stageCount, const struct radv_pipeline_layout *layout,
const struct radv_pipeline_key *key, uint32_t flags);
void radv_hash_rt_shaders(unsigned char *hash, const VkRayTracingPipelineCreateInfoKHR *pCreateInfo,
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index 394d6199e60..3ca783facae 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -525,7 +525,8 @@ VkResult radv_create_shaders(struct radv_pipeline *pipeline,
struct radv_pipeline_layout *pipeline_layout,
struct radv_device *device, struct radv_pipeline_cache *cache,
const struct radv_pipeline_key *key,
- const VkPipelineShaderStageCreateInfo **pStages,
+ const VkPipelineShaderStageCreateInfo *pStages,
+ uint32_t stageCount,
const VkPipelineCreateFlags flags, const uint8_t *custom_hash,
VkPipelineCreationFeedback *pipeline_feedback,
VkPipelineCreationFeedback **stage_feedbacks);
More information about the mesa-commit
mailing list