Merge pull request #378 from KhronosGroup/fix-371

Fix swizzling of scalar integers in HLSL.
This commit is contained in:
Hans-Kristian Arntzen 2018-01-04 13:42:27 +01:00 коммит произвёл GitHub
Родитель 81395b067d 4590c63b40
Коммит c4e787ccf8
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
26 изменённых файлов: 211 добавлений и 79 удалений

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

@ -62,25 +62,25 @@ void comp_main()
_28.Store(UBO_index0 * 4 + UBO_index1 * 8 + 144, asuint(2.0f));
_28.Store(UBO_index0 * 4 + UBO_index1 * 8 + 192, asuint(3.0f));
_28.Store(UBO_index0 * 4 + UBO_index1 * 16 + 240, asuint(4.0f));
_28.Store(UBO_index0 * 4 + 64, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f).x));
_28.Store(UBO_index0 * 4 + 80, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f).y));
_28.Store(UBO_index0 * 4 + 96, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f).z));
_28.Store(UBO_index0 * 4 + 112, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f).w));
_28.Store(UBO_index0 * 4 + 144, asuint(float2(2.0f, 2.0f).x));
_28.Store(UBO_index0 * 4 + 152, asuint(float2(2.0f, 2.0f).y));
_28.Store(UBO_index0 * 4 + 192, asuint(float3(3.0f, 3.0f, 3.0f).x));
_28.Store(UBO_index0 * 4 + 200, asuint(float3(3.0f, 3.0f, 3.0f).y));
_28.Store(UBO_index0 * 4 + 208, asuint(float3(3.0f, 3.0f, 3.0f).z));
_28.Store(UBO_index0 * 4 + 240, asuint(float2(4.0f, 4.0f).x));
_28.Store(UBO_index0 * 4 + 256, asuint(float2(4.0f, 4.0f).y));
_28.Store(UBO_index0 * 4 + 64, asuint(1.0f.x));
_28.Store(UBO_index0 * 4 + 80, asuint(1.0f.xxxx.y));
_28.Store(UBO_index0 * 4 + 96, asuint(1.0f.xxxx.z));
_28.Store(UBO_index0 * 4 + 112, asuint(1.0f.xxxx.w));
_28.Store(UBO_index0 * 4 + 144, asuint(2.0f.x));
_28.Store(UBO_index0 * 4 + 152, asuint(2.0f.xx.y));
_28.Store(UBO_index0 * 4 + 192, asuint(3.0f.x));
_28.Store(UBO_index0 * 4 + 200, asuint(3.0f.xxx.y));
_28.Store(UBO_index0 * 4 + 208, asuint(3.0f.xxx.z));
_28.Store(UBO_index0 * 4 + 240, asuint(4.0f.x));
_28.Store(UBO_index0 * 4 + 256, asuint(4.0f.xx.y));
_28.Store(UBO_index0 * 16 + UBO_index1 * 4 + 0, asuint(1.0f));
_28.Store(UBO_index0 * 8 + UBO_index1 * 4 + 128, asuint(2.0f));
_28.Store(UBO_index0 * 16 + UBO_index1 * 4 + 160, asuint(3.0f));
_28.Store(UBO_index0 * 8 + UBO_index1 * 4 + 216, asuint(4.0f));
_28.Store4(UBO_index0 * 16 + 0, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f)));
_28.Store2(UBO_index0 * 8 + 128, asuint(float2(2.0f, 2.0f)));
_28.Store3(UBO_index0 * 16 + 160, asuint(float3(3.0f, 3.0f, 3.0f)));
_28.Store2(UBO_index0 * 8 + 216, asuint(float2(4.0f, 4.0f)));
_28.Store4(UBO_index0 * 16 + 0, asuint(1.0f.xxxx));
_28.Store2(UBO_index0 * 8 + 128, asuint(2.0f.xx));
_28.Store3(UBO_index0 * 16 + 160, asuint(3.0f.xxx));
_28.Store2(UBO_index0 * 8 + 216, asuint(4.0f.xx));
}
[numthreads(1, 1, 1)]

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

@ -12,7 +12,7 @@ struct SPIRV_Cross_Output
void frag_main()
{
FragColor = (uSampler.Sample(_uSampler_sampler, float2(1.0f, 1.0f)) + uSampler.Load(int3(int2(10, 10), 0))).x + uSamplerShadow.SampleCmp(_uSamplerShadow_sampler, float3(1.0f, 1.0f, 1.0f).xy, 1.0f);
FragColor = (uSampler.Sample(_uSampler_sampler, 1.0f.xx) + uSampler.Load(int3(int2(10, 10), 0))).x + uSamplerShadow.SampleCmp(_uSamplerShadow_sampler, 1.0f.xxx.xy, 1.0f);
}
SPIRV_Cross_Output main()

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

@ -11,7 +11,7 @@ struct SPIRV_Cross_Output
void frag_main()
{
FragColor = uDepth.SampleCmp(uSampler, float3(1.0f, 1.0f, 1.0f).xy, 1.0f) + uDepth.Sample(uSampler1, float2(1.0f, 1.0f)).x;
FragColor = uDepth.SampleCmp(uSampler, 1.0f.xxx.xy, 1.0f) + uDepth.Sample(uSampler1, 1.0f.xx).x;
}
SPIRV_Cross_Output main()

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

@ -13,10 +13,10 @@ struct SPIRV_Cross_Output
void frag_main()
{
RT0 = float4(1.0f, 1.0f, 1.0f, 1.0f);
RT1 = float4(2.0f, 2.0f, 2.0f, 2.0f);
RT2 = float4(3.0f, 3.0f, 3.0f, 3.0f);
RT3 = float4(4.0f, 4.0f, 4.0f, 4.0f);
RT0 = 1.0f.xxxx;
RT1 = 2.0f.xxxx;
RT2 = 3.0f.xxxx;
RT3 = 4.0f.xxxx;
}
SPIRV_Cross_Output main()

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

@ -0,0 +1,41 @@
static float4 Float;
static float vFloat;
static int4 Int;
static int vInt;
static float4 Float2;
static int4 Int2;
struct SPIRV_Cross_Input
{
nointerpolation float vFloat : TEXCOORD0;
nointerpolation int vInt : TEXCOORD1;
};
struct SPIRV_Cross_Output
{
float4 Float : SV_Target0;
int4 Int : SV_Target1;
float4 Float2 : SV_Target2;
int4 Int2 : SV_Target3;
};
void frag_main()
{
Float = vFloat.xxxx * 2.0f;
Int = vInt.xxxx * int4(2, 2, 2, 2);
Float2 = 10.0f.xxxx;
Int2 = int4(10, 10, 10, 10);
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
vFloat = stage_input.vFloat;
vInt = stage_input.vInt;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.Float = Float;
stage_output.Int = Int;
stage_output.Float2 = Float2;
stage_output.Int2 = Int2;
return stage_output;
}

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

@ -13,7 +13,7 @@ struct SPIRV_Cross_Output
void frag_main()
{
FragColor = float4(0.0f, 0.0f, 0.0f, EvaluateAttributeSnapped(interpolant, float2(0.100000001490116119384765625f, 0.100000001490116119384765625f)).x) + float4(0.0f, 0.0f, 0.0f, ddx_coarse(interpolant.x));
FragColor = float4(0.0f, 0.0f, 0.0f, EvaluateAttributeSnapped(interpolant, 0.100000001490116119384765625f.xx).x) + float4(0.0f, 0.0f, 0.0f, ddx_coarse(interpolant.x));
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)

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

@ -44,21 +44,21 @@ Foo _70;
void vert_main()
{
gl_Position = ((float4(1.0f, 1.0f, 1.0f, 1.0f) + Input2) + Input4) + Input0;
gl_Position = ((1.0f.xxxx + Input2) + Input4) + Input0;
vLocation0 = 0.0f;
vLocation1 = 1.0f;
vLocation2[0] = 2.0f;
vLocation2[1] = 2.0f;
Foo _65 = _70;
_65.a = float3(1.0f, 1.0f, 1.0f);
_65.a = 1.0f.xxx;
Foo _67 = _65;
_67.b = float3(1.0f, 1.0f, 1.0f);
_67.b = 1.0f.xxx;
Foo _69 = _67;
_69.c = float3(1.0f, 1.0f, 1.0f);
_69.c = 1.0f.xxx;
vLocation4 = _69;
vLocation9 = 9.0f;
vout.color = float3(2.0f, 2.0f, 2.0f);
vout.foo = float3(4.0f, 4.0f, 4.0f);
vout.color = 2.0f.xxx;
vout.foo = 4.0f.xxx;
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input, out VertexOut stage_outputvout)

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

@ -9,7 +9,7 @@ struct SPIRV_Cross_Output
void vert_main()
{
gl_Position = float4(1.0f, 1.0f, 1.0f, 1.0f);
gl_Position = 1.0f.xxxx;
m = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 1.0f));
}

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

@ -6,7 +6,7 @@ struct SPIRV_Cross_Output
void vert_main()
{
gl_Position = float4(1.0f, 1.0f, 1.0f, 1.0f);
gl_Position = 1.0f.xxxx;
}
SPIRV_Cross_Output main()

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

@ -7,7 +7,7 @@ struct SPIRV_Cross_Output
void vert_main()
{
gl_Position = float4(1.0f, 1.0f, 1.0f, 1.0f);
gl_Position = 1.0f.xxxx;
gl_PointSize = 10.0f;
}

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

@ -25,7 +25,7 @@ struct SPIRV_Cross_Output
void vert_main()
{
gl_Position = float4(1.0f, 1.0f, 1.0f, 1.0f);
gl_Position = 1.0f.xxxx;
vFlat = 0.0f;
vCentroid = 1.0f;
vSample = 2.0f;

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

@ -70,17 +70,17 @@ void write_dynamic_index_row()
_28.Store(UBO_index0 * 4 + UBO_index1 * 8 + 144, asuint(2.0f));
_28.Store(UBO_index0 * 4 + UBO_index1 * 8 + 192, asuint(3.0f));
_28.Store(UBO_index0 * 4 + UBO_index1 * 16 + 240, asuint(4.0f));
_28.Store(UBO_index0 * 4 + 64, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f).x));
_28.Store(UBO_index0 * 4 + 80, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f).y));
_28.Store(UBO_index0 * 4 + 96, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f).z));
_28.Store(UBO_index0 * 4 + 112, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f).w));
_28.Store(UBO_index0 * 4 + 144, asuint(float2(2.0f, 2.0f).x));
_28.Store(UBO_index0 * 4 + 152, asuint(float2(2.0f, 2.0f).y));
_28.Store(UBO_index0 * 4 + 192, asuint(float3(3.0f, 3.0f, 3.0f).x));
_28.Store(UBO_index0 * 4 + 200, asuint(float3(3.0f, 3.0f, 3.0f).y));
_28.Store(UBO_index0 * 4 + 208, asuint(float3(3.0f, 3.0f, 3.0f).z));
_28.Store(UBO_index0 * 4 + 240, asuint(float2(4.0f, 4.0f).x));
_28.Store(UBO_index0 * 4 + 256, asuint(float2(4.0f, 4.0f).y));
_28.Store(UBO_index0 * 4 + 64, asuint(1.0f.x));
_28.Store(UBO_index0 * 4 + 80, asuint(1.0f.xxxx.y));
_28.Store(UBO_index0 * 4 + 96, asuint(1.0f.xxxx.z));
_28.Store(UBO_index0 * 4 + 112, asuint(1.0f.xxxx.w));
_28.Store(UBO_index0 * 4 + 144, asuint(2.0f.x));
_28.Store(UBO_index0 * 4 + 152, asuint(2.0f.xx.y));
_28.Store(UBO_index0 * 4 + 192, asuint(3.0f.x));
_28.Store(UBO_index0 * 4 + 200, asuint(3.0f.xxx.y));
_28.Store(UBO_index0 * 4 + 208, asuint(3.0f.xxx.z));
_28.Store(UBO_index0 * 4 + 240, asuint(4.0f.x));
_28.Store(UBO_index0 * 4 + 256, asuint(4.0f.xx.y));
}
void write_dynamic_index_col()
@ -89,10 +89,10 @@ void write_dynamic_index_col()
_28.Store(UBO_index0 * 8 + UBO_index1 * 4 + 128, asuint(2.0f));
_28.Store(UBO_index0 * 16 + UBO_index1 * 4 + 160, asuint(3.0f));
_28.Store(UBO_index0 * 8 + UBO_index1 * 4 + 216, asuint(4.0f));
_28.Store4(UBO_index0 * 16 + 0, asuint(float4(1.0f, 1.0f, 1.0f, 1.0f)));
_28.Store2(UBO_index0 * 8 + 128, asuint(float2(2.0f, 2.0f)));
_28.Store3(UBO_index0 * 16 + 160, asuint(float3(3.0f, 3.0f, 3.0f)));
_28.Store2(UBO_index0 * 8 + 216, asuint(float2(4.0f, 4.0f)));
_28.Store4(UBO_index0 * 16 + 0, asuint(1.0f.xxxx));
_28.Store2(UBO_index0 * 8 + 128, asuint(2.0f.xx));
_28.Store3(UBO_index0 * 16 + 160, asuint(3.0f.xxx));
_28.Store2(UBO_index0 * 8 + 216, asuint(4.0f.xx));
}
void read_dynamic_index_row()

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

@ -12,7 +12,7 @@ struct SPIRV_Cross_Output
float4 samp2(Texture2D<float4> s, SamplerState _s_sampler)
{
return s.Sample(_s_sampler, float2(1.0f, 1.0f)) + s.Load(int3(int2(10, 10), 0));
return s.Sample(_s_sampler, 1.0f.xx) + s.Load(int3(int2(10, 10), 0));
}
float4 samp3(Texture2D<float4> s, SamplerState _s_sampler)
@ -22,7 +22,7 @@ float4 samp3(Texture2D<float4> s, SamplerState _s_sampler)
float samp4(Texture2D<float4> s, SamplerComparisonState _s_sampler)
{
return s.SampleCmp(_s_sampler, float3(1.0f, 1.0f, 1.0f).xy, float3(1.0f, 1.0f, 1.0f).z);
return s.SampleCmp(_s_sampler, 1.0f.xxx.xy, 1.0f.xxx.z);
}
float samp(Texture2D<float4> s0, SamplerState _s0_sampler, Texture2D<float4> s1, SamplerComparisonState _s1_sampler)

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

@ -11,12 +11,12 @@ struct SPIRV_Cross_Output
float samp2(Texture2D<float4> t, SamplerComparisonState s)
{
return t.SampleCmp(s, float3(1.0f, 1.0f, 1.0f).xy, float3(1.0f, 1.0f, 1.0f).z);
return t.SampleCmp(s, 1.0f.xxx.xy, 1.0f.xxx.z);
}
float samp3(Texture2D<float4> t, SamplerState s)
{
return t.Sample(s, float2(1.0f, 1.0f)).x;
return t.Sample(s, 1.0f.xx).x;
}
float samp(Texture2D<float4> t, SamplerComparisonState s, SamplerState s1)

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

@ -13,10 +13,10 @@ struct SPIRV_Cross_Output
void frag_main()
{
RT0 = float4(1.0f, 1.0f, 1.0f, 1.0f);
RT1 = float4(2.0f, 2.0f, 2.0f, 2.0f);
RT2 = float4(3.0f, 3.0f, 3.0f, 3.0f);
RT3 = float4(4.0f, 4.0f, 4.0f, 4.0f);
RT0 = 1.0f.xxxx;
RT1 = 2.0f.xxxx;
RT2 = 3.0f.xxxx;
RT3 = 4.0f.xxxx;
}
SPIRV_Cross_Output main()

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

@ -16,7 +16,7 @@ void partial_inout(inout float4 x)
void complete_inout(out float4 x)
{
x = float4(50.0f, 50.0f, 50.0f, 50.0f);
x = 50.0f.xxxx;
}
void branchy_inout(inout float4 v)
@ -24,7 +24,7 @@ void branchy_inout(inout float4 v)
v.y = 20.0f;
if (UBO_some_value == 20)
{
v = float4(50.0f, 50.0f, 50.0f, 50.0f);
v = 50.0f.xxxx;
}
}
@ -32,11 +32,11 @@ void branchy_inout_2(out float4 v)
{
if (UBO_some_value == 20)
{
v = float4(50.0f, 50.0f, 50.0f, 50.0f);
v = 50.0f.xxxx;
}
else
{
v = float4(70.0f, 70.0f, 70.0f, 70.0f);
v = 70.0f.xxxx;
}
v.y = 20.0f;
}
@ -48,7 +48,7 @@ void partial_inout(inout B b)
void frag_main()
{
float4 a = float4(10.0f, 10.0f, 10.0f, 10.0f);
float4 a = 10.0f.xxxx;
float4 param = a;
partial_inout(param);
a = param;

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

@ -0,0 +1,41 @@
static float4 Float;
static float vFloat;
static int4 Int;
static int vInt;
static float4 Float2;
static int4 Int2;
struct SPIRV_Cross_Input
{
nointerpolation float vFloat : TEXCOORD0;
nointerpolation int vInt : TEXCOORD1;
};
struct SPIRV_Cross_Output
{
float4 Float : SV_Target0;
int4 Int : SV_Target1;
float4 Float2 : SV_Target2;
int4 Int2 : SV_Target3;
};
void frag_main()
{
Float = vFloat.xxxx * 2.0f;
Int = vInt.xxxx * int4(2, 2, 2, 2);
Float2 = 10.0f.xxxx;
Int2 = int4(10, 10, 10, 10);
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
vFloat = stage_input.vFloat;
vInt = stage_input.vInt;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.Float = Float;
stage_output.Int = Int;
stage_output.Float2 = Float2;
stage_output.Int2 = Int2;
return stage_output;
}

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

@ -13,7 +13,7 @@ struct SPIRV_Cross_Output
void frag_main()
{
float4 color = float4(0.0f, 0.0f, 0.0f, EvaluateAttributeSnapped(interpolant, float2(0.100000001490116119384765625f, 0.100000001490116119384765625f)).x);
float4 color = float4(0.0f, 0.0f, 0.0f, EvaluateAttributeSnapped(interpolant, 0.100000001490116119384765625f.xx).x);
color += float4(0.0f, 0.0f, 0.0f, ddx_coarse(interpolant.x));
FragColor = color;
}

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

@ -42,19 +42,19 @@ struct SPIRV_Cross_Output
void vert_main()
{
gl_Position = ((float4(1.0f, 1.0f, 1.0f, 1.0f) + Input2) + Input4) + Input0;
gl_Position = ((1.0f.xxxx + Input2) + Input4) + Input0;
vLocation0 = 0.0f;
vLocation1 = 1.0f;
vLocation2[0] = 2.0f;
vLocation2[1] = 2.0f;
Foo foo;
foo.a = float3(1.0f, 1.0f, 1.0f);
foo.b = float3(1.0f, 1.0f, 1.0f);
foo.c = float3(1.0f, 1.0f, 1.0f);
foo.a = 1.0f.xxx;
foo.b = 1.0f.xxx;
foo.c = 1.0f.xxx;
vLocation4 = foo;
vLocation9 = 9.0f;
vout.color = float3(2.0f, 2.0f, 2.0f);
vout.foo = float3(4.0f, 4.0f, 4.0f);
vout.color = 2.0f.xxx;
vout.foo = 4.0f.xxx;
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input, out VertexOut stage_outputvout)

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

@ -9,7 +9,7 @@ struct SPIRV_Cross_Output
void vert_main()
{
gl_Position = float4(1.0f, 1.0f, 1.0f, 1.0f);
gl_Position = 1.0f.xxxx;
m = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 1.0f));
}

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

@ -6,7 +6,7 @@ struct SPIRV_Cross_Output
void vert_main()
{
gl_Position = float4(1.0f, 1.0f, 1.0f, 1.0f);
gl_Position = 1.0f.xxxx;
}
SPIRV_Cross_Output main()

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

@ -7,7 +7,7 @@ struct SPIRV_Cross_Output
void vert_main()
{
gl_Position = float4(1.0f, 1.0f, 1.0f, 1.0f);
gl_Position = 1.0f.xxxx;
gl_PointSize = 10.0f;
}

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

@ -25,7 +25,7 @@ struct SPIRV_Cross_Output
void vert_main()
{
gl_Position = float4(1.0f, 1.0f, 1.0f, 1.0f);
gl_Position = 1.0f.xxxx;
vFlat = 0.0f;
vCentroid = 1.0f;
vSample = 2.0f;

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

@ -0,0 +1,16 @@
#version 450
layout(location = 0) flat in float vFloat;
layout(location = 1) flat in int vInt;
layout(location = 0) out vec4 Float;
layout(location = 1) out ivec4 Int;
layout(location = 2) out vec4 Float2;
layout(location = 3) out ivec4 Int2;
void main()
{
Float = vec4(vFloat) * 2.0;
Int = ivec4(vInt) * 2;
Float2 = vec4(10.0);
Int2 = ivec4(10);
}

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

@ -2495,12 +2495,16 @@ string CompilerGLSL::constant_expression_vector(const SPIRConstant &c, uint32_t
type.columns = 1;
string res;
if (c.vector_size() > 1)
res += type_to_glsl(type) + "(";
bool splat = backend.use_constructor_splatting && c.vector_size() > 1;
bool swizzle_splat = backend.can_swizzle_scalar && c.vector_size() > 1;
if (splat)
if (type.basetype != SPIRType::Float && type.basetype != SPIRType::Double)
{
// Cannot swizzle literal integers as a special case.
swizzle_splat = false;
}
if (splat || swizzle_splat)
{
// Cannot use constant splatting if we have specialization constants somewhere in the vector.
for (uint32_t i = 0; i < c.vector_size(); i++)
@ -2508,37 +2512,55 @@ string CompilerGLSL::constant_expression_vector(const SPIRConstant &c, uint32_t
if (options.vulkan_semantics && c.specialization_constant_id(vector, i) != 0)
{
splat = false;
swizzle_splat = false;
break;
}
}
}
if (splat)
if (splat || swizzle_splat)
{
if (type.width == 64)
{
uint64_t ident = c.scalar_u64(vector, 0);
for (uint32_t i = 1; i < c.vector_size(); i++)
{
if (ident != c.scalar_u64(vector, i))
{
splat = false;
swizzle_splat = false;
break;
}
}
}
else
{
uint32_t ident = c.scalar(vector, 0);
for (uint32_t i = 1; i < c.vector_size(); i++)
{
if (ident != c.scalar(vector, i))
{
splat = false;
swizzle_splat = false;
}
}
}
}
if (c.vector_size() > 1 && !swizzle_splat)
res += type_to_glsl(type) + "(";
switch (type.basetype)
{
case SPIRType::Float:
if (splat)
if (splat || swizzle_splat)
{
res += convert_to_string(c.scalar_f32(vector, 0));
if (backend.float_literal_suffix)
res += "f";
if (swizzle_splat)
res = remap_swizzle(get<SPIRType>(c.constant_type), 1, res);
}
else
{
@ -2558,11 +2580,14 @@ string CompilerGLSL::constant_expression_vector(const SPIRConstant &c, uint32_t
break;
case SPIRType::Double:
if (splat)
if (splat || swizzle_splat)
{
res += convert_to_string(c.scalar_f64(vector, 0));
if (backend.double_literal_suffix)
res += "lf";
if (swizzle_splat)
res = remap_swizzle(get<SPIRType>(c.constant_type), 1, res);
}
else
{
@ -2708,7 +2733,7 @@ string CompilerGLSL::constant_expression_vector(const SPIRConstant &c, uint32_t
SPIRV_CROSS_THROW("Invalid constant expression basetype.");
}
if (c.vector_size() > 1)
if (c.vector_size() > 1 && !swizzle_splat)
res += ")";
return res;
@ -5373,6 +5398,13 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
bool splat = in_type.vecsize == 1 && in_type.columns == 1 && !composite && backend.use_constructor_splatting;
bool swizzle_splat = in_type.vecsize == 1 && in_type.columns == 1 && backend.can_swizzle_scalar;
if (ids[elems[0]].get_type() == TypeConstant &&
(in_type.basetype != SPIRType::Float && in_type.basetype != SPIRType::Double))
{
// Cannot swizzle literal integers as a special case.
swizzle_splat = false;
}
if (splat || swizzle_splat)
{
uint32_t input = elems[0];

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

@ -2778,6 +2778,7 @@ void CompilerHLSL::write_access_chain(const SPIRAccessChain &chain, uint32_t val
store_expr += ".";
store_expr += index_to_swizzle(r);
}
remove_duplicate_swizzle(store_expr);
auto bitcast_op = bitcast_glsl_op(target_type, type);
if (!bitcast_op.empty())
@ -2824,6 +2825,7 @@ void CompilerHLSL::write_access_chain(const SPIRAccessChain &chain, uint32_t val
for (uint32_t c = 0; c < type.columns; c++)
{
auto store_expr = join(to_enclosed_expression(value), "[", c, "].", index_to_swizzle(r));
remove_duplicate_swizzle(store_expr);
auto bitcast_op = bitcast_glsl_op(target_type, type);
if (!bitcast_op.empty())
store_expr = join(bitcast_op, "(", store_expr, ")");