diff options
author | Hai Nguyen <379079+chaoticbob@users.noreply.github.com> | 2023-04-12 12:42:36 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-12 12:42:36 -0400 |
commit | a7c7b8a99f8fa7e21ec37f591a427196262659c4 (patch) | |
tree | 3f00af2508a1634b96474bb55a5340d709e57ef1 | |
parent | 7c9c841fa9f40c09d334d5db6629ba318e46efaf (diff) | |
parent | 56d6806ad1b6a210c4f745804a072189ad25c537 (diff) | |
download | SPIRV-Reflect-a7c7b8a99f8fa7e21ec37f591a427196262659c4.tar.gz |
Merge pull request #169 from greg-lunarg/br1
Fix usage for push constants
-rw-r--r-- | spirv_reflect.c | 23 | ||||
-rw-r--r-- | tests/hlsl/pushconstant.hlsl | 13 | ||||
-rw-r--r-- | tests/hlsl/pushconstant.spv | bin | 0 -> 652 bytes | |||
-rw-r--r-- | tests/hlsl/pushconstant.spv.yaml | 196 | ||||
-rw-r--r-- | tests/multi_entrypoint/multi_entrypoint.spv.yaml | 8 | ||||
-rw-r--r-- | tests/test-spirv-reflect.cpp | 1 |
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 Binary files differnew file mode 100644 index 0000000..2747116 --- /dev/null +++ b/tests/hlsl/pushconstant.spv 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", |