Skip to content

Commit

Permalink
Print Spec Constant value in type array by default
Browse files Browse the repository at this point in the history
  • Loading branch information
spencer-lunarg committed Dec 25, 2023
1 parent 4aedb50 commit 12143f6
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 20 deletions.
2 changes: 0 additions & 2 deletions common/output_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1723,7 +1723,6 @@ void SpvReflectToYaml::WriteBlockVariable(std::ostream& os, const SpvReflectBloc
os << t2 << "matrix: { ";
os << "column_count: " << bv.numeric.matrix.column_count << ", ";
os << "row_count: " << bv.numeric.matrix.row_count << ", ";
;
os << "stride: " << bv.numeric.matrix.stride << " }" << std::endl;
// } SpvReflectNumericTraits;

Expand Down Expand Up @@ -1946,7 +1945,6 @@ void SpvReflectToYaml::WriteInterfaceVariable(std::ostream& os, const SpvReflect
os << t2 << "matrix: { ";
os << "column_count: " << iv.numeric.matrix.column_count << ", ";
os << "row_count: " << iv.numeric.matrix.row_count << ", ";
;
os << "stride: " << iv.numeric.matrix.stride << " }" << std::endl;
// } SpvReflectNumericTraits;

Expand Down
38 changes: 21 additions & 17 deletions spirv_reflect.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ typedef struct SpvReflectPrvDecorations {
SpvReflectPrvStringDecoration semantic;
uint32_t array_stride;
uint32_t matrix_stride;
uint32_t spec_id;
SpvBuiltIn built_in;
} SpvReflectPrvDecorations;

Expand Down Expand Up @@ -506,7 +507,8 @@ static void ApplyArrayTraits(const SpvReflectTypeDescription* p_type, SpvReflect
}

static bool IsSpecConstant(const SpvReflectPrvNode* p_node) {
return (p_node->op == SpvOpSpecConstant || p_node->op == SpvOpSpecConstantOp);
return (p_node->op == SpvOpSpecConstant || p_node->op == SpvOpSpecConstantOp || p_node->op == SpvOpSpecConstantTrue ||
p_node->op == SpvOpSpecConstantFalse);
}

static SpvReflectPrvNode* FindNode(SpvReflectPrvParser* p_parser, uint32_t result_id) {
Expand Down Expand Up @@ -704,6 +706,7 @@ static SpvReflectResult ParseNodes(SpvReflectPrvParser* p_parser) {
p_parser->nodes[i].decorations.component.value = (uint32_t)INVALID_VALUE;
p_parser->nodes[i].decorations.offset.value = (uint32_t)INVALID_VALUE;
p_parser->nodes[i].decorations.uav_counter_buffer.value = (uint32_t)INVALID_VALUE;
p_parser->nodes[i].decorations.spec_id = (uint32_t)INVALID_VALUE;
p_parser->nodes[i].decorations.built_in = (SpvBuiltIn)INVALID_VALUE;
}
// Mark source file id node
Expand Down Expand Up @@ -945,7 +948,8 @@ static SpvReflectResult ParseNodes(SpvReflectPrvParser* p_parser) {
CHECKED_READU32(p_parser, p_node->word_offset + SPIRV_ACCESS_CHAIN_INDEX_OFFSET + index_index, index_id);
// Find OpConstant node that contains index value
SpvReflectPrvNode* p_index_value_node = FindNode(p_parser, index_id);
if ((p_index_value_node != NULL) && (p_index_value_node->op == SpvOpConstant)) {
if ((p_index_value_node != NULL) &&
(p_index_value_node->op == SpvOpConstant || p_index_value_node->op == SpvOpSpecConstant)) {
// Read index value
uint32_t index_value = UINT32_MAX;
CHECKED_READU32(p_parser, p_index_value_node->word_offset + 3, index_value);
Expand Down Expand Up @@ -1403,6 +1407,7 @@ static SpvReflectResult ParseDecorations(SpvReflectPrvParser* p_parser) {
case SpvDecorationDescriptorSet:
case SpvDecorationOffset:
case SpvDecorationInputAttachmentIndex:
case SpvDecorationSpecId:
case SpvDecorationWeightTextureQCOM:
case SpvDecorationBlockMatchTextureQCOM:
case SpvReflectDecorationHlslCounterBufferGOOGLE:
Expand Down Expand Up @@ -1539,6 +1544,11 @@ static SpvReflectResult ParseDecorations(SpvReflectPrvParser* p_parser) {
p_target_decorations->input_attachment_index.word_offset = word_offset;
} break;

case SpvDecorationSpecId: {
uint32_t word_offset = p_node->word_offset + member_offset + 3;
CHECKED_READU32(p_parser, word_offset, p_target_decorations->spec_id);
} break;

case SpvReflectDecorationHlslCounterBufferGOOGLE: {
uint32_t word_offset = p_node->word_offset + member_offset + 3;
CHECKED_READU32(p_parser, word_offset, p_target_decorations->uav_counter_buffer.value);
Expand Down Expand Up @@ -1721,22 +1731,16 @@ static SpvReflectResult ParseType(SpvReflectPrvParser* p_parser, SpvReflectPrvNo
SpvReflectPrvNode* p_length_node = FindNode(p_parser, length_id);
if (IsNotNull(p_length_node)) {
uint32_t dim_index = p_type->traits.array.dims_count;
if (IsSpecConstant(p_length_node)) {
p_type->traits.array.dims[dim_index] = (uint32_t)SPV_REFLECT_ARRAY_DIM_SPEC_CONSTANT;
p_type->traits.array.spec_constant_op_ids[dim_index] = length_id;
uint32_t length = 0;
IF_READU32(result, p_parser, p_length_node->word_offset + 3, length);
if (result == SPV_REFLECT_RESULT_SUCCESS) {
p_type->traits.array.dims[dim_index] = length;
p_type->traits.array.dims_count += 1;
p_type->traits.array.spec_constant_op_ids[dim_index] =
IsSpecConstant(p_length_node) ? p_length_node->decorations.spec_id : (uint32_t)INVALID_VALUE;
} else {
uint32_t length = 0;
IF_READU32(result, p_parser, p_length_node->word_offset + 3, length);
if (result == SPV_REFLECT_RESULT_SUCCESS) {
// Write the array dim and increment the count and offset
p_type->traits.array.dims[dim_index] = length;
p_type->traits.array.spec_constant_op_ids[dim_index] = (uint32_t)SPV_REFLECT_ARRAY_DIM_SPEC_CONSTANT;
p_type->traits.array.dims_count += 1;
} else {
result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;
SPV_REFLECT_ASSERT(false);
}
result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;
SPV_REFLECT_ASSERT(false);
}
// Parse next dimension or element type
SpvReflectPrvNode* p_next_node = FindNode(p_parser, element_type_id);
Expand All @@ -1757,7 +1761,7 @@ static SpvReflectResult ParseType(SpvReflectPrvParser* p_parser, SpvReflectPrvNo
p_type->traits.array.stride = p_node->decorations.array_stride;
uint32_t dim_index = p_type->traits.array.dims_count;
p_type->traits.array.dims[dim_index] = (uint32_t)SPV_REFLECT_ARRAY_DIM_RUNTIME;
p_type->traits.array.spec_constant_op_ids[dim_index] = 0;
p_type->traits.array.spec_constant_op_ids[dim_index] = (uint32_t)INVALID_VALUE;
p_type->traits.array.dims_count += 1;
// Parse next dimension or element type
SpvReflectPrvNode* p_next_node = FindNode(p_parser, element_type_id);
Expand Down
1 change: 0 additions & 1 deletion spirv_reflect.h
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,6 @@ typedef struct SpvReflectImageTraits {

typedef enum SpvReflectArrayDimType {
SPV_REFLECT_ARRAY_DIM_RUNTIME = 0, // OpTypeRuntimeArray
SPV_REFLECT_ARRAY_DIM_SPEC_CONSTANT = 0xFFFFFFFF // specialization constant
} SpvReflectArrayDimType;

typedef struct SpvReflectArrayTraits {
Expand Down

0 comments on commit 12143f6

Please sign in to comment.