Skip to content

Commit

Permalink
Merge pull request #169 from greg-lunarg/br1
Browse files Browse the repository at this point in the history
Fix usage for push constants
  • Loading branch information
chaoticbob committed Apr 12, 2023
2 parents 7c9c841 + 56d6806 commit a7c7b8a
Show file tree
Hide file tree
Showing 6 changed files with 235 additions and 6 deletions.
23 changes: 21 additions & 2 deletions spirv_reflect.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.
//
Expand Down Expand Up @@ -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;
Expand Down
13 changes: 13 additions & 0 deletions tests/hlsl/pushconstant.hlsl
Original file line number Diff line number Diff line change
@@ -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);
}
Binary file added tests/hlsl/pushconstant.spv
Binary file not shown.
196 changes: 196 additions & 0 deletions tests/hlsl/pushconstant.spv.yaml
Original file line number Diff line number Diff line change
@@ -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"
...
8 changes: 4 additions & 4 deletions tests/multi_entrypoint/multi_entrypoint.spv.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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"
...
1 change: 1 addition & 0 deletions tests/test-spirv-reflect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit a7c7b8a

Please sign in to comment.