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