Mesa (master): radv: implement CREATE_REQUIRE_FULL_SUBGROUPS_BIT with cswave32
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jan 7 15:23:03 UTC 2021
Module: Mesa
Branch: master
Commit: 5bb94ab050247208af2afae26315bc7ecf9168c5
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5bb94ab050247208af2afae26315bc7ecf9168c5
Author: Rhys Perry <pendingchaos02 at gmail.com>
Date: Thu Dec 3 17:37:32 2020 +0000
radv: implement CREATE_REQUIRE_FULL_SUBGROUPS_BIT with cswave32
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7918>
---
src/amd/vulkan/radv_pipeline.c | 22 ++++++++++++++++------
src/amd/vulkan/radv_private.h | 1 +
2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index d48c2782d57..0f376781e2f 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -2769,7 +2769,19 @@ radv_fill_shader_keys(struct radv_device *device,
keys[MESA_SHADER_FRAGMENT].fs.is_dual_src = key->is_dual_src;
if (nir[MESA_SHADER_COMPUTE]) {
- keys[MESA_SHADER_COMPUTE].cs.subgroup_size = key->compute_subgroup_size;
+ unsigned subgroup_size = key->compute_subgroup_size;
+ unsigned req_subgroup_size = subgroup_size;
+ bool require_full_subgroups = key->require_full_subgroups;
+
+ if (!subgroup_size)
+ subgroup_size = device->physical_device->cs_wave_size;
+
+ if (require_full_subgroups && !req_subgroup_size) {
+ /* don't use wave32 pretending to be wave64 */
+ subgroup_size = RADV_SUBGROUP_SIZE;
+ }
+
+ keys[MESA_SHADER_COMPUTE].cs.subgroup_size = subgroup_size;
}
}
@@ -2782,11 +2794,7 @@ radv_get_wave_size(struct radv_device *device,
if (stage == MESA_SHADER_GEOMETRY && !key->vs_common_out.as_ngg)
return 64;
else if (stage == MESA_SHADER_COMPUTE) {
- if (key->cs.subgroup_size) {
- /* Return the required subgroup size if specified. */
- return key->cs.subgroup_size;
- }
- return device->physical_device->cs_wave_size;
+ return key->cs.subgroup_size;
}
else if (stage == MESA_SHADER_FRAGMENT)
return device->physical_device->ps_wave_size;
@@ -5528,6 +5536,8 @@ radv_generate_compute_pipeline_key(struct radv_pipeline *pipeline,
assert(subgroup_size->requiredSubgroupSize == 32 ||
subgroup_size->requiredSubgroupSize == 64);
key.compute_subgroup_size = subgroup_size->requiredSubgroupSize;
+ } else if (stage->flags & VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT) {
+ key.require_full_subgroups = true;
}
return key;
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index d03537c5851..8625a2449dc 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -411,6 +411,7 @@ struct radv_pipeline_key {
* VK_EXT_subgroup_size_control.
*/
uint8_t compute_subgroup_size;
+ bool require_full_subgroups;
};
struct radv_shader_binary;
More information about the mesa-commit
mailing list