[Mesa-dev] [PATCH 6/9] radv/ac: mark used descriptor sets in shader info.

Dave Airlie airlied at gmail.com
Tue Apr 18 03:57:09 UTC 2017


From: Dave Airlie <airlied at redhat.com>

This pre calculates the used descriptor sets.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/amd/common/ac_shader_info.c | 34 ++++++++++++++++++++++++++++++++++
 src/amd/common/ac_shader_info.h |  1 +
 2 files changed, 35 insertions(+)

diff --git a/src/amd/common/ac_shader_info.c b/src/amd/common/ac_shader_info.c
index b319bb1..e1732f2 100644
--- a/src/amd/common/ac_shader_info.c
+++ b/src/amd/common/ac_shader_info.c
@@ -23,6 +23,12 @@
 #include "nir.h"
 #include "ac_shader_info.h"
 #include "ac_nir_to_llvm.h"
+
+static void mark_sampler_desc(nir_variable *var, struct ac_shader_info *info)
+{
+	info->desc_set_used_mask = (1 << var->data.descriptor_set);
+}
+
 static void
 gather_intrinsic_info(nir_intrinsic_instr *instr, struct ac_shader_info *info)
 {
@@ -40,12 +46,37 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, struct ac_shader_info *info)
 	case nir_intrinsic_load_num_work_groups:
 		info->cs.grid_components_used = instr->num_components;
 		break;
+	case nir_intrinsic_vulkan_resource_index:
+		info->desc_set_used_mask |= (1 << nir_intrinsic_desc_set(instr));
+		break;
+	case nir_intrinsic_image_load:
+	case nir_intrinsic_image_store:
+	case nir_intrinsic_image_atomic_add:
+	case nir_intrinsic_image_atomic_min:
+	case nir_intrinsic_image_atomic_max:
+	case nir_intrinsic_image_atomic_and:
+	case nir_intrinsic_image_atomic_or:
+	case nir_intrinsic_image_atomic_xor:
+	case nir_intrinsic_image_atomic_exchange:
+	case nir_intrinsic_image_atomic_comp_swap:
+	case nir_intrinsic_image_size:
+		mark_sampler_desc(instr->variables[0]->var, info);
+		break;
 	default:
 		break;
 	}
 }
 
 static void
+gather_tex_info(nir_tex_instr *instr, struct ac_shader_info *info)
+{
+	if (instr->sampler)
+		mark_sampler_desc(instr->sampler->var, info);
+	if (instr->texture)
+		mark_sampler_desc(instr->texture->var, info);
+}
+
+static void
 gather_info_block(nir_block *block, struct ac_shader_info *info)
 {
 	nir_foreach_instr(instr, block) {
@@ -53,6 +84,9 @@ gather_info_block(nir_block *block, struct ac_shader_info *info)
 		case nir_instr_type_intrinsic:
 			gather_intrinsic_info(nir_instr_as_intrinsic(instr), info);
 			break;
+		case nir_instr_type_tex:
+			gather_tex_info(nir_instr_as_tex(instr), info);
+			break;
 		default:
 			break;
 		}
diff --git a/src/amd/common/ac_shader_info.h b/src/amd/common/ac_shader_info.h
index 3d644ab..ddfa175 100644
--- a/src/amd/common/ac_shader_info.h
+++ b/src/amd/common/ac_shader_info.h
@@ -29,6 +29,7 @@ struct ac_nir_compiler_options;
 
 struct ac_shader_info {
 	bool needs_push_constants;
+	uint32_t desc_set_used_mask;
 	struct {
 		bool has_vertex_buffers; /* needs vertex buffers and base/start */
 		bool needs_base_vertex_start_instance;
-- 
2.9.3



More information about the mesa-dev mailing list