summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHai Nguyen <379079+chaoticbob@users.noreply.github.com>2023-04-12 12:42:36 -0400
committerGitHub <noreply@github.com>2023-04-12 12:42:36 -0400
commita7c7b8a99f8fa7e21ec37f591a427196262659c4 (patch)
tree3f00af2508a1634b96474bb55a5340d709e57ef1
parent7c9c841fa9f40c09d334d5db6629ba318e46efaf (diff)
parent56d6806ad1b6a210c4f745804a072189ad25c537 (diff)
downloadSPIRV-Reflect-a7c7b8a99f8fa7e21ec37f591a427196262659c4.tar.gz
Merge pull request #169 from greg-lunarg/br1
Fix usage for push constants
-rw-r--r--spirv_reflect.c23
-rw-r--r--tests/hlsl/pushconstant.hlsl13
-rw-r--r--tests/hlsl/pushconstant.spvbin0 -> 652 bytes
-rw-r--r--tests/hlsl/pushconstant.spv.yaml196
-rw-r--r--tests/multi_entrypoint/multi_entrypoint.spv.yaml8
-rw-r--r--tests/test-spirv-reflect.cpp1
6 files changed, 235 insertions, 6 deletions
diff --git a/spirv_reflect.c b/spirv_reflect.c
index b296a11..a2f18ad 100644
--- a/spirv_reflect.c
+++ b/spirv_reflect.c
@@ -2429,7 +2429,7 @@ static SpvReflectResult ParseDescriptorBlockVariableSizes(
static void MarkSelfAndAllMemberVarsAsUsed(SpvReflectBlockVariable* p_var)
{
- // Clear the current variable's USED flag
+ // Clear the current variable's UNUSED flag
p_var->flags &= ~SPV_REFLECT_VARIABLE_FLAGS_UNUSED;
SpvOp op_type = p_var->type_description->op;
@@ -2496,7 +2496,7 @@ static SpvReflectResult ParseDescriptorBlockVariableUsage(
}
// Only continue parsing if there's remaining indices in the access
- // chain. If the end of the access chain has been reach then all
+ // chain. If the end of the access chain has been reached then all
// remaining variables (including those in struct hierarchies)
// are considered USED.
//
@@ -3449,6 +3449,25 @@ static SpvReflectResult ParsePushConstantBlocks(
if (result != SPV_REFLECT_RESULT_SUCCESS) {
return result;
}
+
+ for (uint32_t access_chain_index = 0;
+ access_chain_index < p_parser->access_chain_count;
+ ++access_chain_index) {
+ SpvReflectPrvAccessChain* p_access_chain =
+ &(p_parser->access_chains[access_chain_index]);
+ // Skip any access chains that aren't touching this push constant block
+ if (p_push_constant->spirv_id != p_access_chain->base_id) {
+ continue;
+ }
+ result = ParseDescriptorBlockVariableUsage(
+ p_parser, p_module, p_access_chain, 0, (SpvOp)INVALID_VALUE,
+ p_push_constant);
+ if (result != SPV_REFLECT_RESULT_SUCCESS) {
+ return result;
+ }
+ }
+
+ p_push_constant->name = p_node->name;
result = ParseDescriptorBlockVariableSizes(p_parser, p_module, true, false, false, p_push_constant);
if (result != SPV_REFLECT_RESULT_SUCCESS) {
return result;
diff --git a/tests/hlsl/pushconstant.hlsl b/tests/hlsl/pushconstant.hlsl
new file mode 100644
index 0000000..092d33f
--- /dev/null
+++ b/tests/hlsl/pushconstant.hlsl
@@ -0,0 +1,13 @@
+
+struct Constants_t {
+ float3 Scale;
+ float Time;
+ float2 UvOffsets;
+};
+
+[[vk::push_constant]] Constants_t g_PushConstants;
+
+float4 main(float4 pos : POSITION) : SV_Position
+{
+ return float4(g_PushConstants.Time, 0, 0, 0);
+}
diff --git a/tests/hlsl/pushconstant.spv b/tests/hlsl/pushconstant.spv
new file mode 100644
index 0000000..2747116
--- /dev/null
+++ b/tests/hlsl/pushconstant.spv
Binary files differ
diff --git a/tests/hlsl/pushconstant.spv.yaml b/tests/hlsl/pushconstant.spv.yaml
new file mode 100644
index 0000000..2b86051
--- /dev/null
+++ b/tests/hlsl/pushconstant.spv.yaml
@@ -0,0 +1,196 @@
+%YAML 1.0
+---
+all_type_descriptions:
+ - &td0
+ id: 9
+ op: 23
+ type_name:
+ struct_member_name: "Scale"
+ storage_class: 0 # UniformConstant
+ type_flags: 0x00000108 # VECTOR FLOAT
+ decoration_flags: 0x00000000 # NONE
+ traits:
+ numeric:
+ scalar: { width: 32, signedness: 0 }
+ vector: { component_count: 3 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ image: { dim: 0, depth: 0, arrayed: 0, ms: 0, sampled: 0, image_format: 0 } # dim=1D image_format=Unknown
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 0
+ members:
+ - &td1
+ id: 7
+ op: 22
+ type_name:
+ struct_member_name: "Time"
+ storage_class: 0 # UniformConstant
+ type_flags: 0x00000008 # FLOAT
+ decoration_flags: 0x00000000 # NONE
+ traits:
+ numeric:
+ scalar: { width: 32, signedness: 0 }
+ vector: { component_count: 0 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ image: { dim: 0, depth: 0, arrayed: 0, ms: 0, sampled: 0, image_format: 0 } # dim=1D image_format=Unknown
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 0
+ members:
+ - &td2
+ id: 10
+ op: 23
+ type_name:
+ struct_member_name: "UvOffsets"
+ storage_class: 0 # UniformConstant
+ type_flags: 0x00000108 # VECTOR FLOAT
+ decoration_flags: 0x00000000 # NONE
+ traits:
+ numeric:
+ scalar: { width: 32, signedness: 0 }
+ vector: { component_count: 2 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ image: { dim: 0, depth: 0, arrayed: 0, ms: 0, sampled: 0, image_format: 0 } # dim=1D image_format=Unknown
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 0
+ members:
+ - &td3
+ id: 4
+ op: 30
+ type_name: "type.PushConstant.Constants_t"
+ struct_member_name:
+ storage_class: -1 # NOT APPLICABLE
+ type_flags: 0x10080000 # STRUCT EXTERNAL_BLOCK
+ decoration_flags: 0x00000001 # BLOCK
+ traits:
+ numeric:
+ scalar: { width: 0, signedness: 0 }
+ vector: { component_count: 0 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ image: { dim: 0, depth: 0, arrayed: 0, ms: 0, sampled: 0, image_format: 0 } # dim=1D image_format=Unknown
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 3
+ members:
+ - *td0
+ - *td1
+ - *td2
+ - &td4
+ id: 12
+ op: 23
+ type_name:
+ struct_member_name:
+ storage_class: -1 # NOT APPLICABLE
+ type_flags: 0x00000108 # VECTOR FLOAT
+ decoration_flags: 0x00000000 # NONE
+ traits:
+ numeric:
+ scalar: { width: 32, signedness: 0 }
+ vector: { component_count: 4 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ image: { dim: 0, depth: 0, arrayed: 0, ms: 0, sampled: 0, image_format: 0 } # dim=1D image_format=Unknown
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 0
+ members:
+all_block_variables:
+ - &bv0
+ name: "Scale"
+ offset: 0
+ absolute_offset: 0
+ size: 12
+ padded_size: 12
+ decorations: 0x00000000 # NONE
+ numeric:
+ scalar: { width: 32, signedness: 0 }
+ vector: { component_count: 3 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 0
+ members:
+ type_description: *td0
+ - &bv1
+ name: "Time"
+ offset: 12
+ absolute_offset: 12
+ size: 4
+ padded_size: 4
+ decorations: 0x00000000 # NONE
+ numeric:
+ scalar: { width: 32, signedness: 0 }
+ vector: { component_count: 0 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 0
+ members:
+ type_description: *td1
+ - &bv2
+ name: "UvOffsets"
+ offset: 16
+ absolute_offset: 16
+ size: 8
+ padded_size: 16
+ decorations: 0x00000000 # NONE
+ numeric:
+ scalar: { width: 32, signedness: 0 }
+ vector: { component_count: 2 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 0
+ members:
+ type_description: *td2
+ - &bv3
+ name: "g_PushConstants"
+ offset: 0
+ absolute_offset: 0
+ size: 32
+ padded_size: 32
+ decorations: 0x00000000 # NONE
+ numeric:
+ scalar: { width: 0, signedness: 0 }
+ vector: { component_count: 0 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 3
+ members:
+ - *bv0
+ - *bv1
+ - *bv2
+ type_description: *td3
+all_descriptor_bindings:
+all_interface_variables:
+ - &iv0
+ spirv_id: 2
+ name:
+ location: 4294967295
+ storage_class: 3 # Output
+ semantic:
+ decoration_flags: 0x00000010 # BUILT_IN
+ built_in: 0 # Position
+ numeric:
+ scalar: { width: 32, signedness: 0 }
+ vector: { component_count: 4 }
+ matrix: { column_count: 0, row_count: 0, stride: 0 }
+ array: { dims_count: 0, dims: [], stride: 0 }
+ member_count: 0
+ members:
+ format: 109 # VK_FORMAT_R32G32B32A32_SFLOAT
+ type_description: *td4
+ word_offset: { location: 0 }
+module:
+ generator: 14 # Google spiregg
+ entry_point_name: "main"
+ entry_point_id: 1
+ source_language: 5 # HLSL
+ source_language_version: 600
+ spirv_execution_model: 0 # Vertex
+ shader_stage: 0x00000001 # VS
+ descriptor_binding_count: 0
+ descriptor_bindings:
+ descriptor_set_count: 0
+ descriptor_sets:
+ input_variable_count: 0,
+ input_variables:
+ output_variable_count: 1,
+ output_variables:
+ - *iv0 #
+ push_constant_count: 1,
+ push_constants:
+ - *bv3 # "g_PushConstants"
+...
diff --git a/tests/multi_entrypoint/multi_entrypoint.spv.yaml b/tests/multi_entrypoint/multi_entrypoint.spv.yaml
index 4f83b71..e69e8e9 100644
--- a/tests/multi_entrypoint/multi_entrypoint.spv.yaml
+++ b/tests/multi_entrypoint/multi_entrypoint.spv.yaml
@@ -255,7 +255,7 @@ all_block_variables:
members:
type_description: *td3
- &bv4
- name: "PushConstantVert"
+ name: "push_constant_vert"
offset: 0
absolute_offset: 0
size: 16
@@ -286,7 +286,7 @@ all_block_variables:
members:
type_description: *td5
- &bv6
- name: "PushConstantFrag"
+ name: "push_constant_frag"
offset: 0
absolute_offset: 0
size: 16
@@ -455,6 +455,6 @@ module:
- *iv4 # "oUV"
push_constant_count: 2,
push_constants:
- - *bv4 # "PushConstantVert"
- - *bv6 # "PushConstantFrag"
+ - *bv4 # "push_constant_vert"
+ - *bv6 # "push_constant_frag"
...
diff --git a/tests/test-spirv-reflect.cpp b/tests/test-spirv-reflect.cpp
index 7f00104..5397e8c 100644
--- a/tests/test-spirv-reflect.cpp
+++ b/tests/test-spirv-reflect.cpp
@@ -812,6 +812,7 @@ const std::vector<const char*> all_spirv_paths = {
"../tests/hlsl/counter_buffers.spv",
"../tests/hlsl/localsize.spv",
"../tests/hlsl/matrix_major_order_hlsl.spv",
+ "../tests/hlsl/pushconstant.spv",
"../tests/hlsl/semantics.spv",
"../tests/hlsl/structuredbuffer.spv",
"../tests/issues/77/hlsl/array_from_ubo.spv",