Fix HLSL regression with struct declaration.

It actually worked surprisingly. Fix it properly.
This commit is contained in:
Hans-Kristian Arntzen 2018-01-23 16:36:20 +01:00
Родитель 921c555cf3
Коммит 06041985d0
7 изменённых файлов: 129 добавлений и 1 удалений

Просмотреть файл

@ -0,0 +1,44 @@
struct VOut
{
float4 a;
float4 b;
float4 c;
float4 d;
};
static VOut vout;
static float4 a;
static float4 b;
static float4 c;
static float4 d;
struct SPIRV_Cross_Input
{
float4 a : TEXCOORD0;
float4 b : TEXCOORD1;
float4 c : TEXCOORD2;
float4 d : TEXCOORD3;
};
struct SPIRV_Cross_Output
{
VOut vout : TEXCOORD0;
};
void vert_main()
{
VOut _26 = { a, b, c, d };
vout = _26;
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
a = stage_input.a;
b = stage_input.b;
c = stage_input.c;
d = stage_input.d;
vert_main();
SPIRV_Cross_Output stage_output;
stage_output.vout = vout;
return stage_output;
}

Просмотреть файл

@ -0,0 +1,50 @@
struct VOut
{
float4 a;
float4 b;
float4 c;
float4 d;
};
static VOut vout;
static float4 a;
static float4 b;
static float4 c;
static float4 d;
struct SPIRV_Cross_Input
{
float4 a : TEXCOORD0;
float4 b : TEXCOORD1;
float4 c : TEXCOORD2;
float4 d : TEXCOORD3;
};
struct SPIRV_Cross_Output
{
VOut vout : TEXCOORD0;
};
void emit_result(VOut v)
{
vout = v;
}
void vert_main()
{
VOut _26 = { a, b, c, d };
VOut param = _26;
emit_result(param);
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
a = stage_input.a;
b = stage_input.b;
c = stage_input.c;
d = stage_input.d;
vert_main();
SPIRV_Cross_Output stage_output;
stage_output.vout = vout;
return stage_output;
}

Просмотреть файл

@ -0,0 +1,26 @@
#version 310 es
layout(location = 0) in vec4 a;
layout(location = 1) in vec4 b;
layout(location = 2) in vec4 c;
layout(location = 3) in vec4 d;
struct VOut
{
vec4 a;
vec4 b;
vec4 c;
vec4 d;
};
layout(location = 0) out VOut vout;
void emit_result(VOut v)
{
vout = v;
}
void main()
{
emit_result(VOut(a, b, c, d));
}

Просмотреть файл

@ -5481,12 +5481,16 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
} }
} }
if (out_type.basetype == SPIRType::Struct && !backend.can_declare_struct_inline)
forward = false;
string constructor_op; string constructor_op;
if (backend.use_initializer_list && composite) if (backend.use_initializer_list && composite)
{ {
// Only use this path if we are building composites. // Only use this path if we are building composites.
// This path cannot be used for arithmetic. // This path cannot be used for arithmetic.
constructor_op += type_to_glsl_constructor(get<SPIRType>(result_type)); if (backend.use_typed_initializer_list)
constructor_op += type_to_glsl_constructor(get<SPIRType>(result_type));
constructor_op += "{ "; constructor_op += "{ ";
if (splat) if (splat)
constructor_op += to_expression(elems[0]); constructor_op += to_expression(elems[0]);

Просмотреть файл

@ -313,6 +313,8 @@ protected:
bool flexible_member_array_supported = true; bool flexible_member_array_supported = true;
bool explicit_struct_type = false; bool explicit_struct_type = false;
bool use_initializer_list = false; bool use_initializer_list = false;
bool use_typed_initializer_list = false;
bool can_declare_struct_inline = true;
bool native_row_major_matrix = true; bool native_row_major_matrix = true;
bool use_constructor_splatting = true; bool use_constructor_splatting = true;
bool boolean_mix_support = true; bool boolean_mix_support = true;

Просмотреть файл

@ -3644,6 +3644,7 @@ string CompilerHLSL::compile()
backend.use_constructor_splatting = false; backend.use_constructor_splatting = false;
backend.boolean_mix_support = false; backend.boolean_mix_support = false;
backend.can_swizzle_scalar = true; backend.can_swizzle_scalar = true;
backend.can_declare_struct_inline = false;
update_active_builtins(); update_active_builtins();
analyze_sampler_comparison_states(); analyze_sampler_comparison_states();

Просмотреть файл

@ -69,6 +69,7 @@ string CompilerMSL::compile()
backend.swizzle_is_function = false; backend.swizzle_is_function = false;
backend.shared_is_implied = false; backend.shared_is_implied = false;
backend.use_initializer_list = true; backend.use_initializer_list = true;
backend.use_typed_initializer_list = true;
backend.native_row_major_matrix = false; backend.native_row_major_matrix = false;
backend.flexible_member_array_supported = false; backend.flexible_member_array_supported = false;
backend.force_temp_use_for_two_vector_shuffles = true; backend.force_temp_use_for_two_vector_shuffles = true;