Skip to content

Commit

Permalink
Fix size of struct with POD pointer in it
Browse files Browse the repository at this point in the history
  • Loading branch information
spencer-lunarg committed Dec 16, 2024
1 parent 281b55e commit 6557f3c
Show file tree
Hide file tree
Showing 10 changed files with 654 additions and 9 deletions.
4 changes: 4 additions & 0 deletions common/output_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1017,6 +1017,10 @@ std::string ToStringComponentType(const SpvReflectTypeDescription& type, uint32_
ss << type.traits.numeric.vector.component_count;
}

if (type.type_flags & SPV_REFLECT_TYPE_FLAG_REF) {
ss << "*";
}

return ss.str();
}

Expand Down
17 changes: 9 additions & 8 deletions spirv_reflect.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,13 @@

// clang-format off
enum {
SPIRV_STARTING_WORD_INDEX = 5,
SPIRV_WORD_SIZE = sizeof(uint32_t),
SPIRV_BYTE_WIDTH = 8,
SPIRV_MINIMUM_FILE_SIZE = SPIRV_STARTING_WORD_INDEX * SPIRV_WORD_SIZE,
SPIRV_DATA_ALIGNMENT = 4 * SPIRV_WORD_SIZE, // 16
SPIRV_ACCESS_CHAIN_INDEX_OFFSET = 4,
SPIRV_STARTING_WORD_INDEX = 5,
SPIRV_WORD_SIZE = sizeof(uint32_t),
SPIRV_BYTE_WIDTH = 8,
SPIRV_MINIMUM_FILE_SIZE = SPIRV_STARTING_WORD_INDEX * SPIRV_WORD_SIZE,
SPIRV_DATA_ALIGNMENT = 4 * SPIRV_WORD_SIZE, // 16
SPIRV_ACCESS_CHAIN_INDEX_OFFSET = 4,
SPIRV_PHYSICAL_STORAGE_POINTER_SIZE = 8, // Pointers are defined as 64-bit
};

enum {
Expand Down Expand Up @@ -2733,8 +2734,8 @@ static SpvReflectResult ParseDescriptorBlockVariableSizes(SpvReflectPrvParser* p

// If we found a struct, we need to fall through and get the size of it or else we grab the size here
if (p_member_type->op != SpvOpTypeStruct) {
// TODO - we need to rework this loop as a function to get size for each type
// (or maybe determine this size doesn't matter if not a struct in the pointer)
// If we hit this, we are seeing a POD pointer and the size is fixed
p_member_var->size = SPIRV_PHYSICAL_STORAGE_POINTER_SIZE;
break;
}
FALLTHROUGH;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ all_block_variables:
name:
offset: 0
absolute_offset: 0
size: 0
size: 8
padded_size: 8
decorations: 0x00000000 # NONE
numeric:
Expand Down
15 changes: 15 additions & 0 deletions tests/push_constants/pointer_in_struct.slang
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
RWStructuredBuffer<int> result;

struct Data{
int a;
int* b;
int c;
};
[[vk::push_constant]] Data pc;

[shader("compute")]
[numthreads(1,1,1)]
void computeMain(uint3 threadId : SV_DispatchThreadID)
{
result[0] = pc.b[2] + pc.c;
}
Binary file added tests/push_constants/pointer_in_struct.spv
Binary file not shown.
250 changes: 250 additions & 0 deletions tests/push_constants/pointer_in_struct.spv.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
%YAML 1.1
---
all_type_descriptions:
- &td0
id: 10
op: 29
type_name:
struct_member_name:
storage_class: 0 # UniformConstant
type_flags: 0x20000004 # ARRAY INT
decoration_flags: 0x00000000 # NONE
traits:
numeric:
scalar: { width: 32, signedness: 1 }
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: 1, dims: [0,], stride: 4 }
member_count: 0
members:
- &td1
id: 9
op: 30
type_name: "RWStructuredBuffer"
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: 1
members:
- *td0
- &td2
id: 5
op: 21
type_name:
struct_member_name: "a"
storage_class: 0 # UniformConstant
type_flags: 0x00000004 # INT
decoration_flags: 0x00000000 # NONE
traits:
numeric:
scalar: { width: 32, signedness: 1 }
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:
- &td3
id: 14
op: 32
type_name:
struct_member_name: "b"
storage_class: 5349 # PhysicalStorageBuffer
type_flags: 0x40000004 # REF INT
decoration_flags: 0x00000000 # NONE
traits:
numeric:
scalar: { width: 32, signedness: 1 }
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:
- &td4
id: 5
op: 21
type_name:
struct_member_name: "c"
storage_class: 0 # UniformConstant
type_flags: 0x00000004 # INT
decoration_flags: 0x00000000 # NONE
traits:
numeric:
scalar: { width: 32, signedness: 1 }
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:
- &td5
id: 13
op: 30
type_name: "Data_std140"
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:
- *td2
- *td3
- *td4
all_block_variables:
- &bv0
name:
offset: 0
absolute_offset: 0
size: 0
padded_size: 0
decorations: 0x00000000 # NONE
numeric:
scalar: { width: 32, signedness: 1 }
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: *td0
- &bv1
name: "result"
offset: 0
absolute_offset: 0
size: 0
padded_size: 0
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: 1
members:
- *bv0
type_description: *td1
- &bv2
name: "a"
offset: 0
absolute_offset: 0
size: 4
padded_size: 4
decorations: 0x00000000 # NONE
numeric:
scalar: { width: 32, signedness: 1 }
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: *td2
- &bv3
name: "b"
offset: 8
absolute_offset: 8
size: 8
padded_size: 8
decorations: 0x00000000 # NONE
numeric:
scalar: { width: 32, signedness: 1 }
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: *td3
- &bv4
name: "c"
offset: 16
absolute_offset: 16
size: 4
padded_size: 4
decorations: 0x00000000 # NONE
numeric:
scalar: { width: 32, signedness: 1 }
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: *td4
- &bv5
name: "pc"
offset: 0
absolute_offset: 0
size: 20
padded_size: 20
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:
- *bv2
- *bv3
- *bv4
type_description: *td5
all_descriptor_bindings:
- &db0
spirv_id: 12
name: "result"
binding: 0
input_attachment_index: 0
set: 0
decoration_flags: 0x00000000 # NONE
descriptor_type: 7 # VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
resource_type: 8 # UAV
image: { dim: 0, depth: 0, arrayed: 0, ms: 0, sampled: 0, image_format: 0 } # dim=1D image_format=Unknown
block: *bv1 # "result"
array: { dims_count: 0, dims: [] }
accessed: 1
uav_counter_id: 4294967295
uav_counter_binding:
type_description: *td1
word_offset: { binding: 109, set: 113 }
all_interface_variables:
module:
generator: 0 # ???
entry_point_name: "main"
entry_point_id: 2
source_language: 11 # Unknown
source_language_version: 1
spirv_execution_model: 5 # GLCompute
shader_stage: 0x00000020 # CS
descriptor_binding_count: 1
descriptor_bindings:
- *db0 # "result"
descriptor_set_count: 1
descriptor_sets:
- set: 0
binding_count: 1
bindings:
- *db0 # "result"
input_variable_count: 0,
input_variables:
output_variable_count: 0,
output_variables:
push_constant_count: 1,
push_constants:
- *bv5 # "pc"
specialization_constant_count: 0,
specialization_constants:
...
20 changes: 20 additions & 0 deletions tests/push_constants/pointer_in_struct_2.slang
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
RWStructuredBuffer<int> result;

struct Data2{
int x;
int* y;
};

struct Data{
int a;
Data2* b;
int c;
};
[[vk::push_constant]] Data pc;

[shader("compute")]
[numthreads(1,1,1)]
void computeMain(uint3 threadId : SV_DispatchThreadID)
{
result[0] = pc.b[2].y[2] + pc.c;
}
Binary file added tests/push_constants/pointer_in_struct_2.spv
Binary file not shown.
Loading

0 comments on commit 6557f3c

Please sign in to comment.