Fix unpacking of packed but not remapped types on load.

This commit is contained in:
Hans-Kristian Arntzen 2019-07-19 14:50:35 +02:00
parent b66a53a979
commit 6c1f97b4a9
8 changed files with 17 additions and 13 deletions

View File

@ -16,7 +16,7 @@ kernel void main0(device foo& _8 [[buffer(0)]], uint3 gl_LocalInvocationID [[thr
{ {
_8.bar = gl_LocalInvocationID.x; _8.bar = gl_LocalInvocationID.x;
_8.baz = float3(gl_GlobalInvocationID); _8.baz = float3(gl_GlobalInvocationID);
_8.blah = uchar4(uint4(uint4(_8.blah).xyz + gl_WorkGroupID, 0u)); _8.blah = uchar4(uint4(uint4(uchar4(_8.blah)).xyz + gl_WorkGroupID, 0u));
_8.wibble = half2(float2(_8.wibble) * float2(gl_NumWorkGroups.xy)); _8.wibble = half2(float2(half2(_8.wibble)) * float2(gl_NumWorkGroups.xy));
} }

View File

@ -33,7 +33,7 @@ vertex main0_out main0(main0_in in [[stage_in]], constant UBO& _18 [[buffer(0)]]
main0_out out = {}; main0_out out = {};
out.gl_Position = _18.uMVP * in.aVertex; out.gl_Position = _18.uMVP * in.aVertex;
out.vColor = float4(0.0); out.vColor = float4(0.0);
float3 L = in.aVertex.xyz - _18.light.Position; float3 L = in.aVertex.xyz - float3(_18.light.Position);
out.vColor += ((_18.light.Color * fast::clamp(1.0 - (length(L) / _18.light.Radius), 0.0, 1.0)) * dot(in.aNormal, normalize(L))); out.vColor += ((_18.light.Color * fast::clamp(1.0 - (length(L) / _18.light.Radius), 0.0, 1.0)) * dot(in.aNormal, normalize(L)));
return out; return out;
} }

View File

@ -43,7 +43,7 @@ vertex main0_out main0(main0_in in [[stage_in]], constant UBO& _21 [[buffer(0)]]
Light_1 light; Light_1 light;
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
light.Position = _21.lights[i].Position; light.Position = float3(_21.lights[i].Position);
light.Radius = _21.lights[i].Radius; light.Radius = _21.lights[i].Radius;
light.Color = _21.lights[i].Color; light.Color = _21.lights[i].Color;
float3 L = in.aVertex.xyz - light.Position; float3 L = in.aVertex.xyz - light.Position;

View File

@ -35,7 +35,7 @@ vertex main0_out main0(main0_in in [[stage_in]], constant UBO& _21 [[buffer(0)]]
out.vColor = float4(0.0); out.vColor = float4(0.0);
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
float3 L = in.aVertex.xyz - _21.lights[i].Position; float3 L = in.aVertex.xyz - float3(_21.lights[i].Position);
out.vColor += ((_21.lights[i].Color * fast::clamp(1.0 - (length(L) / _21.lights[i].Radius), 0.0, 1.0)) * dot(in.aNormal, normalize(L))); out.vColor += ((_21.lights[i].Color * fast::clamp(1.0 - (length(L) / _21.lights[i].Radius), 0.0, 1.0)) * dot(in.aNormal, normalize(L)));
} }
return out; return out;

View File

@ -45,7 +45,7 @@ vertex main0_out main0(main0_in in [[stage_in]], constant _15& _17 [[buffer(0)]]
_13 = normalize(transpose(_17._m1) * float4(in.m_25.xyz, 0.0)); _13 = normalize(transpose(_17._m1) * float4(in.m_25.xyz, 0.0));
break; break;
} while (false); } while (false);
float4 _39 = _44._m0 * float4(_44._m3 + (in.m_25.xyz * (_44._m6 + _44._m7)), 1.0); float4 _39 = _44._m0 * float4(float3(_44._m3) + (in.m_25.xyz * (_44._m6 + _44._m7)), 1.0);
out.m_72 = _13; out.m_72 = _13;
float4 _74 = _39; float4 _74 = _39;
_74.y = -_39.y; _74.y = -_39.y;

View File

@ -31,7 +31,7 @@ vertex main0_out main0(main0_in in [[stage_in]], constant UBO& _18 [[buffer(0)]]
main0_out out = {}; main0_out out = {};
out.gl_Position = _18.mvp * in.aVertex; out.gl_Position = _18.mvp * in.aVertex;
out.vNormal = in.aNormal; out.vNormal = in.aNormal;
out.vColor = _18.color * _18.opacity; out.vColor = float3(_18.color) * _18.opacity;
out.vSize = _18.targSize * _18.opacity; out.vSize = _18.targSize * _18.opacity;
return out; return out;
} }

View File

@ -122,21 +122,21 @@ kernel void main0(device SSBO1& ssbo_scalar [[buffer(0)]], device SSBO0& ssbo_14
{ {
ssbo_scalar.content.m0s[0].a[0] = ssbo_140.content.m0s[0].a[0].xy; ssbo_scalar.content.m0s[0].a[0] = ssbo_140.content.m0s[0].a[0].xy;
ssbo_scalar.content.m0s[0].b = ssbo_140.content.m0s[0].b; ssbo_scalar.content.m0s[0].b = ssbo_140.content.m0s[0].b;
ssbo_scalar.content.m1s[0].a = ssbo_140.content.m1s[0].a; ssbo_scalar.content.m1s[0].a = float3(ssbo_140.content.m1s[0].a);
ssbo_scalar.content.m1s[0].b = ssbo_140.content.m1s[0].b; ssbo_scalar.content.m1s[0].b = ssbo_140.content.m1s[0].b;
ssbo_scalar.content.m2s[0].a[0] = ssbo_140.content.m2s[0].a[0]; ssbo_scalar.content.m2s[0].a[0] = ssbo_140.content.m2s[0].a[0];
ssbo_scalar.content.m2s[0].b = ssbo_140.content.m2s[0].b; ssbo_scalar.content.m2s[0].b = ssbo_140.content.m2s[0].b;
ssbo_scalar.content.m0.a[0] = ssbo_140.content.m0.a[0].xy; ssbo_scalar.content.m0.a[0] = ssbo_140.content.m0.a[0].xy;
ssbo_scalar.content.m0.b = ssbo_140.content.m0.b; ssbo_scalar.content.m0.b = ssbo_140.content.m0.b;
ssbo_scalar.content.m1.a = ssbo_140.content.m1.a; ssbo_scalar.content.m1.a = float3(ssbo_140.content.m1.a);
ssbo_scalar.content.m1.b = ssbo_140.content.m1.b; ssbo_scalar.content.m1.b = ssbo_140.content.m1.b;
ssbo_scalar.content.m2.a[0] = ssbo_140.content.m2.a[0]; ssbo_scalar.content.m2.a[0] = ssbo_140.content.m2.a[0];
ssbo_scalar.content.m2.b = ssbo_140.content.m2.b; ssbo_scalar.content.m2.b = ssbo_140.content.m2.b;
ssbo_scalar.content.m3.a = ssbo_140.content.m3.a; ssbo_scalar.content.m3.a = ssbo_140.content.m3.a;
ssbo_scalar.content.m3.b = ssbo_140.content.m3.b; ssbo_scalar.content.m3.b = ssbo_140.content.m3.b;
ssbo_scalar.content.m4 = ssbo_140.content.m4; ssbo_scalar.content.m4 = ssbo_140.content.m4;
ssbo_scalar.content.m1.a = ssbo_scalar.m2[1] * ssbo_scalar.content.m0.a[0]; ssbo_scalar.content.m1.a = float2x3(float3(ssbo_scalar.m2[1][0]), float3(ssbo_scalar.m2[1][1])) * float2(ssbo_scalar.content.m0.a[0]);
ssbo_scalar.m0 = ssbo_scalar2.m1; ssbo_scalar.m0 = float2x2(float2(ssbo_scalar2.m1[0]), float2(ssbo_scalar2.m1[1]));
ssbo_scalar2.m1[0] = float2(ssbo_scalar.m4[0][0], ssbo_scalar.m4[1][0])); ssbo_scalar2.m1[0] = float2(ssbo_scalar.m4[0][0], ssbo_scalar.m4[1][0]));
ssbo_scalar2.m1[1] = float2(ssbo_scalar.m4[0][1], ssbo_scalar.m4[1][1])); ssbo_scalar2.m1[1] = float2(ssbo_scalar.m4[0][1], ssbo_scalar.m4[1][1]));
ssbo_scalar2.m2[0] = float3(ssbo_scalar.m3[0][0], ssbo_scalar.m3[1][0], ssbo_scalar.m3[2][0])); ssbo_scalar2.m2[0] = float3(ssbo_scalar.m3[0][0], ssbo_scalar.m3[1][0], ssbo_scalar.m3[2][0]));

View File

@ -2840,7 +2840,9 @@ string CompilerGLSL::to_unpacked_expression(uint32_t id, bool register_expressio
// If we need to transpose, it will also take care of unpacking rules. // If we need to transpose, it will also take care of unpacking rules.
auto *e = maybe_get<SPIRExpression>(id); auto *e = maybe_get<SPIRExpression>(id);
bool need_transpose = e && e->need_transpose; bool need_transpose = e && e->need_transpose;
if (!need_transpose && has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID)) bool is_remapped = has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID);
bool is_packed = has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked);
if (!need_transpose && (is_remapped || is_packed))
{ {
return unpack_expression_type(to_expression(id, register_expression_read), expression_type(id), return unpack_expression_type(to_expression(id, register_expression_read), expression_type(id),
get_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID), get_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID),
@ -2855,7 +2857,9 @@ string CompilerGLSL::to_enclosed_unpacked_expression(uint32_t id, bool register_
// If we need to transpose, it will also take care of unpacking rules. // If we need to transpose, it will also take care of unpacking rules.
auto *e = maybe_get<SPIRExpression>(id); auto *e = maybe_get<SPIRExpression>(id);
bool need_transpose = e && e->need_transpose; bool need_transpose = e && e->need_transpose;
if (!need_transpose && has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID)) bool is_remapped = has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID);
bool is_packed = has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked);
if (!need_transpose && (is_remapped || is_packed))
{ {
return unpack_expression_type(to_expression(id, register_expression_read), expression_type(id), return unpack_expression_type(to_expression(id, register_expression_read), expression_type(id),
get_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID), get_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID),