Updated spirv-cross.

This commit is contained in:
Бранимир Караџић
2019-10-11 20:39:44 -07:00
parent 70cbb974c4
commit 00c86fd291
16 changed files with 438 additions and 13 deletions

View File

@@ -0,0 +1,9 @@
#version 450
layout(location = 0) out float FragColor;
void main()
{
FragColor = 30.0;
}

View File

@@ -0,0 +1,27 @@
struct T
{
float c;
};
struct T_1
{
float b;
};
static const T _18 = { 40.0f };
RWByteAddressBuffer _7 : register(u0);
RWByteAddressBuffer _10 : register(u1);
void comp_main()
{
T v = _18;
_7.Store(40, asuint(v.c));
_10.Store(480, asuint(v.c));
}
[numthreads(1, 1, 1)]
void main()
{
comp_main();
}

View File

@@ -0,0 +1,38 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct T
{
float a;
};
struct T_1
{
float b;
};
struct SSBO1
{
T_1 foo[1];
};
struct T_2
{
float c;
char _m0_final_padding[12];
};
struct SSBO2
{
T_2 bar[1];
};
kernel void main0(device SSBO1& _7 [[buffer(0)]], device SSBO2& _10 [[buffer(1)]])
{
T v = T{ 40.0 };
_7.foo[10].b = v.a;
_10.bar[30].c = v.a;
}

View File

@@ -0,0 +1,18 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct SSBO
{
float4 a[16];
float4 b[16];
};
constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(1u);
kernel void main0(device SSBO& _14 [[buffer(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]])
{
_14.b[gl_GlobalInvocationID.x] = float4(_14.a[gl_GlobalInvocationID.x].x);
}

View File

@@ -0,0 +1,30 @@
#version 450
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
struct T
{
float c;
};
struct T_1
{
float b;
};
layout(binding = 0, std430) buffer SSBO1
{
T_1 foo[];
} _7;
layout(binding = 1, std140) buffer SSBO2
{
T bar[];
} _10;
void main()
{
T v = T(40.0);
_7.foo[10].b = v.c;
_10.bar[30].c = v.c;
}

View File

@@ -0,0 +1,23 @@
#version 450
struct T
{
float a;
};
struct T_1
{
float b;
};
layout(location = 0) out float FragColor;
void main()
{
T foo;
foo.a = 10.0;
T_1 bar;
bar.b = 20.0;
FragColor = foo.a + bar.b;
}

View File

@@ -0,0 +1,77 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 37
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpSource GLSL 450
OpName %main "main"
OpName %T "T"
OpMemberName %T 0 "a"
OpName %v "v"
OpName %T_0 "T"
OpMemberName %T_0 0 "b"
OpName %SSBO1 "SSBO1"
OpMemberName %SSBO1 0 "foo"
OpName %_ ""
OpName %T_1 "T"
OpMemberName %T_1 0 "c"
OpName %SSBO2 "SSBO2"
OpMemberName %SSBO2 0 "bar"
OpName %__0 ""
OpMemberDecorate %T_0 0 Offset 0
OpDecorate %_runtimearr_T_0 ArrayStride 4
OpMemberDecorate %SSBO1 0 Offset 0
OpDecorate %SSBO1 BufferBlock
OpDecorate %_ DescriptorSet 0
OpDecorate %_ Binding 0
OpMemberDecorate %T_1 0 Offset 0
OpDecorate %_runtimearr_T_1 ArrayStride 16
OpMemberDecorate %SSBO2 0 Offset 0
OpDecorate %SSBO2 BufferBlock
OpDecorate %__0 DescriptorSet 0
OpDecorate %__0 Binding 1
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%T = OpTypeStruct %float
%_ptr_Function_T = OpTypePointer Function %T
%float_40 = OpConstant %float 40
%11 = OpConstantComposite %T %float_40
%T_0 = OpTypeStruct %float
%_runtimearr_T_0 = OpTypeRuntimeArray %T_0
%SSBO1 = OpTypeStruct %_runtimearr_T_0
%_ptr_Uniform_SSBO1 = OpTypePointer Uniform %SSBO1
%_ = OpVariable %_ptr_Uniform_SSBO1 Uniform
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%int_10 = OpConstant %int 10
%_ptr_Uniform_T_0 = OpTypePointer Uniform %T_0
%_ptr_Uniform_float = OpTypePointer Uniform %float
%T_1 = OpTypeStruct %float
%_runtimearr_T_1 = OpTypeRuntimeArray %T_1
%SSBO2 = OpTypeStruct %_runtimearr_T_1
%_ptr_Uniform_SSBO2 = OpTypePointer Uniform %SSBO2
%__0 = OpVariable %_ptr_Uniform_SSBO2 Uniform
%int_30 = OpConstant %int 30
%_ptr_Uniform_T_1 = OpTypePointer Uniform %T_1
%main = OpFunction %void None %3
%5 = OpLabel
%v = OpVariable %_ptr_Function_T Function
OpStore %v %11
%20 = OpLoad %T %v
%22 = OpAccessChain %_ptr_Uniform_T_0 %_ %int_0 %int_10
%23 = OpCompositeExtract %float %20 0
%25 = OpAccessChain %_ptr_Uniform_float %22 %int_0
OpStore %25 %23
%32 = OpLoad %T %v
%34 = OpAccessChain %_ptr_Uniform_T_1 %__0 %int_0 %int_30
%35 = OpCompositeExtract %float %32 0
%36 = OpAccessChain %_ptr_Uniform_float %34 %int_0
OpStore %36 %35
OpReturn
OpFunctionEnd

View File

@@ -0,0 +1,77 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 37
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpSource GLSL 450
OpName %main "main"
OpName %T "T"
OpMemberName %T 0 "a"
OpName %v "v"
OpName %T_0 "T"
OpMemberName %T_0 0 "b"
OpName %SSBO1 "SSBO1"
OpMemberName %SSBO1 0 "foo"
OpName %_ ""
OpName %T_1 "T"
OpMemberName %T_1 0 "c"
OpName %SSBO2 "SSBO2"
OpMemberName %SSBO2 0 "bar"
OpName %__0 ""
OpMemberDecorate %T_0 0 Offset 0
OpDecorate %_runtimearr_T_0 ArrayStride 4
OpMemberDecorate %SSBO1 0 Offset 0
OpDecorate %SSBO1 BufferBlock
OpDecorate %_ DescriptorSet 0
OpDecorate %_ Binding 0
OpMemberDecorate %T_1 0 Offset 0
OpDecorate %_runtimearr_T_1 ArrayStride 16
OpMemberDecorate %SSBO2 0 Offset 0
OpDecorate %SSBO2 BufferBlock
OpDecorate %__0 DescriptorSet 0
OpDecorate %__0 Binding 1
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%T = OpTypeStruct %float
%_ptr_Function_T = OpTypePointer Function %T
%float_40 = OpConstant %float 40
%11 = OpConstantComposite %T %float_40
%T_0 = OpTypeStruct %float
%_runtimearr_T_0 = OpTypeRuntimeArray %T_0
%SSBO1 = OpTypeStruct %_runtimearr_T_0
%_ptr_Uniform_SSBO1 = OpTypePointer Uniform %SSBO1
%_ = OpVariable %_ptr_Uniform_SSBO1 Uniform
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%int_10 = OpConstant %int 10
%_ptr_Uniform_T_0 = OpTypePointer Uniform %T_0
%_ptr_Uniform_float = OpTypePointer Uniform %float
%T_1 = OpTypeStruct %float
%_runtimearr_T_1 = OpTypeRuntimeArray %T_1
%SSBO2 = OpTypeStruct %_runtimearr_T_1
%_ptr_Uniform_SSBO2 = OpTypePointer Uniform %SSBO2
%__0 = OpVariable %_ptr_Uniform_SSBO2 Uniform
%int_30 = OpConstant %int 30
%_ptr_Uniform_T_1 = OpTypePointer Uniform %T_1
%main = OpFunction %void None %3
%5 = OpLabel
%v = OpVariable %_ptr_Function_T Function
OpStore %v %11
%20 = OpLoad %T %v
%22 = OpAccessChain %_ptr_Uniform_T_0 %_ %int_0 %int_10
%23 = OpCompositeExtract %float %20 0
%25 = OpAccessChain %_ptr_Uniform_float %22 %int_0
OpStore %25 %23
%32 = OpLoad %T %v
%34 = OpAccessChain %_ptr_Uniform_T_1 %__0 %int_0 %int_30
%35 = OpCompositeExtract %float %32 0
%36 = OpAccessChain %_ptr_Uniform_float %34 %int_0
OpStore %36 %35
OpReturn
OpFunctionEnd

View File

@@ -0,0 +1,13 @@
#version 450
layout(local_size_x = 1) in;
layout(std140, binding = 0) buffer SSBO
{
float a[16];
vec4 b[16];
};
void main()
{
b[gl_GlobalInvocationID.x] = vec4(a[gl_GlobalInvocationID.x]);
}

View File

@@ -0,0 +1,77 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 37
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpSource GLSL 450
OpName %main "main"
OpName %T "T"
OpMemberName %T 0 "a"
OpName %v "v"
OpName %T_0 "T"
OpMemberName %T_0 0 "b"
OpName %SSBO1 "SSBO1"
OpMemberName %SSBO1 0 "foo"
OpName %_ ""
OpName %T_1 "T"
OpMemberName %T_1 0 "c"
OpName %SSBO2 "SSBO2"
OpMemberName %SSBO2 0 "bar"
OpName %__0 ""
OpMemberDecorate %T_0 0 Offset 0
OpDecorate %_runtimearr_T_0 ArrayStride 4
OpMemberDecorate %SSBO1 0 Offset 0
OpDecorate %SSBO1 BufferBlock
OpDecorate %_ DescriptorSet 0
OpDecorate %_ Binding 0
OpMemberDecorate %T_1 0 Offset 0
OpDecorate %_runtimearr_T_1 ArrayStride 16
OpMemberDecorate %SSBO2 0 Offset 0
OpDecorate %SSBO2 BufferBlock
OpDecorate %__0 DescriptorSet 0
OpDecorate %__0 Binding 1
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%T = OpTypeStruct %float
%_ptr_Function_T = OpTypePointer Function %T
%float_40 = OpConstant %float 40
%11 = OpConstantComposite %T %float_40
%T_0 = OpTypeStruct %float
%_runtimearr_T_0 = OpTypeRuntimeArray %T_0
%SSBO1 = OpTypeStruct %_runtimearr_T_0
%_ptr_Uniform_SSBO1 = OpTypePointer Uniform %SSBO1
%_ = OpVariable %_ptr_Uniform_SSBO1 Uniform
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%int_10 = OpConstant %int 10
%_ptr_Uniform_T_0 = OpTypePointer Uniform %T_0
%_ptr_Uniform_float = OpTypePointer Uniform %float
%T_1 = OpTypeStruct %float
%_runtimearr_T_1 = OpTypeRuntimeArray %T_1
%SSBO2 = OpTypeStruct %_runtimearr_T_1
%_ptr_Uniform_SSBO2 = OpTypePointer Uniform %SSBO2
%__0 = OpVariable %_ptr_Uniform_SSBO2 Uniform
%int_30 = OpConstant %int 30
%_ptr_Uniform_T_1 = OpTypePointer Uniform %T_1
%main = OpFunction %void None %3
%5 = OpLabel
%v = OpVariable %_ptr_Function_T Function
OpStore %v %11
%20 = OpLoad %T %v
%22 = OpAccessChain %_ptr_Uniform_T_0 %_ %int_0 %int_10
%23 = OpCompositeExtract %float %20 0
%25 = OpAccessChain %_ptr_Uniform_float %22 %int_0
OpStore %25 %23
%32 = OpLoad %T %v
%34 = OpAccessChain %_ptr_Uniform_T_1 %__0 %int_0 %int_30
%35 = OpCompositeExtract %float %32 0
%36 = OpAccessChain %_ptr_Uniform_float %34 %int_0
OpStore %36 %35
OpReturn
OpFunctionEnd

View File

@@ -0,0 +1,19 @@
#version 450
layout(location = 0) out float FragColor;
struct T
{
float a;
};
void main()
{
T foo;
struct T { float b; };
T bar;
foo.a = 10.0;
bar.b = 20.0;
FragColor = foo.a + bar.b;
}

View File

@@ -53,7 +53,7 @@
typedef unsigned int SpvId;
#define SPV_VERSION 0x10400
#define SPV_VERSION 0x10500
#define SPV_REVISION 1
static const unsigned int SpvMagicNumber = 0x07230203;

View File

@@ -49,7 +49,7 @@ namespace spv {
typedef unsigned int Id;
#define SPV_VERSION 0x10400
#define SPV_VERSION 0x10500
#define SPV_REVISION 1
static const unsigned int MagicNumber = 0x07230203;

View File

@@ -3032,7 +3032,7 @@ string CompilerGLSL::to_composite_constructor_expression(uint32_t id)
return to_rerolled_array_expression(to_enclosed_expression(id), type);
}
else
return to_expression(id);
return to_unpacked_expression(id);
}
string CompilerGLSL::to_expression(uint32_t id, bool register_expression_read)
@@ -8265,14 +8265,14 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
if (type_is_empty(out_type) && !backend.supports_empty_struct)
constructor_op += "0";
else if (splat)
constructor_op += to_expression(elems[0]);
constructor_op += to_unpacked_expression(elems[0]);
else
constructor_op += build_composite_combiner(result_type, elems, length);
constructor_op += " }";
}
else if (swizzle_splat && !composite)
{
constructor_op = remap_swizzle(get<SPIRType>(result_type), 1, to_expression(elems[0]));
constructor_op = remap_swizzle(get<SPIRType>(result_type), 1, to_unpacked_expression(elems[0]));
}
else
{
@@ -8280,7 +8280,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
if (type_is_empty(out_type) && !backend.supports_empty_struct)
constructor_op += "0";
else if (splat)
constructor_op += to_expression(elems[0]);
constructor_op += to_unpacked_expression(elems[0]);
else
constructor_op += build_composite_combiner(result_type, elems, length);
constructor_op += ")";
@@ -10228,6 +10228,12 @@ void CompilerGLSL::append_global_func_args(const SPIRFunction &func, uint32_t in
string CompilerGLSL::to_member_name(const SPIRType &type, uint32_t index)
{
if (type.type_alias != TypeID(0) &&
!has_extended_decoration(type.type_alias, SPIRVCrossDecorationBufferBlockRepacked))
{
return to_member_name(get<SPIRType>(type.type_alias), index);
}
auto &memb = ir.meta[type.self].members;
if (index < memb.size() && !memb[index].alias.empty())
return memb[index].alias;
@@ -12776,6 +12782,14 @@ void CompilerGLSL::fixup_type_alias()
// This is not allowed, drop the type_alias.
type.type_alias = 0;
}
else if (type.type_alias && !type_is_block_like(this->get<SPIRType>(type.type_alias)))
{
// If the alias master is not a block-like type, there is no reason to use type aliasing.
// This case can happen if two structs are declared with the same name, but they are unrelated.
// Aliases are only used to deal with aliased types for structs which are used in different buffer types
// which all create a variant of the same struct with different DecorationOffset values.
type.type_alias = 0;
}
});
}

View File

@@ -5773,10 +5773,10 @@ void CompilerMSL::emit_array_copy(const string &lhs, uint32_t rhs_id, StorageCla
else
add_spv_func_and_recompile(SPVFuncImplArrayCopy);
bool lhs_thread =
lhs_storage == StorageClassOutput || lhs_storage == StorageClassFunction || lhs_storage == StorageClassGeneric || lhs_storage == StorageClassPrivate;
bool rhs_thread =
rhs_storage == StorageClassInput || rhs_storage == StorageClassFunction || rhs_storage == StorageClassGeneric || rhs_storage == StorageClassPrivate;
bool lhs_thread = lhs_storage == StorageClassOutput || lhs_storage == StorageClassFunction ||
lhs_storage == StorageClassGeneric || lhs_storage == StorageClassPrivate;
bool rhs_thread = rhs_storage == StorageClassInput || rhs_storage == StorageClassFunction ||
rhs_storage == StorageClassGeneric || rhs_storage == StorageClassPrivate;
const char *tag = nullptr;
if (lhs_thread && is_constant)

View File

@@ -443,9 +443,12 @@ void CompilerReflection::emit_entry_points()
get_work_group_size_specialization_constants(spec_x, spec_y, spec_z);
json_stream->emit_json_key_array("workgroup_size");
json_stream->emit_json_array_value(spec_x.id != ID(0) ? spec_x.constant_id : spv_entry.workgroup_size.x);
json_stream->emit_json_array_value(spec_y.id != ID(0) ? spec_y.constant_id : spv_entry.workgroup_size.y);
json_stream->emit_json_array_value(spec_z.id != ID(0) ? spec_z.constant_id : spv_entry.workgroup_size.z);
json_stream->emit_json_array_value(spec_x.id != ID(0) ? spec_x.constant_id :
spv_entry.workgroup_size.x);
json_stream->emit_json_array_value(spec_y.id != ID(0) ? spec_y.constant_id :
spv_entry.workgroup_size.y);
json_stream->emit_json_array_value(spec_z.id != ID(0) ? spec_z.constant_id :
spv_entry.workgroup_size.z);
json_stream->end_json_array();
json_stream->emit_json_key_array("workgroup_size_is_spec_constant_id");