Skip to content

Commit

Permalink
Merge pull request #132 from marton-unity/metal-fixes
Browse files Browse the repository at this point in the history
[Metal] Propagate constant precision in array initializers, initialize temp/auto variables to 0
  • Loading branch information
aras-p committed Sep 1, 2016
2 parents e13953a + babeaa0 commit c54ef21
Show file tree
Hide file tree
Showing 65 changed files with 1,103 additions and 961 deletions.
5 changes: 5 additions & 0 deletions src/glsl/ast_to_hir.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3046,6 +3046,11 @@ process_initializer(ir_variable *var, ast_declaration *decl,
if (type->qualifier.flags.q.constant) {
ir_constant *constant_value = rhs->constant_expression_value();
constant_value->set_precision((glsl_precision)type->qualifier.precision);
if (constant_value->type->is_array()) {
for (unsigned i = 0; i < constant_value->type->length; i++) {
constant_value->get_array_element(i)->set_precision((glsl_precision)type->qualifier.precision);
}
}
}

/* Calculate the constant value if this is a const or uniform
Expand Down
20 changes: 18 additions & 2 deletions src/glsl/ir_print_metal_visitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,20 @@ void ir_print_metal_visitor::visit(ir_variable *ir)
buffer.asprintf_append (" = ");
visit (ir->constant_value);
}

if ((ir->data.mode == ir_var_auto || ir->data.mode == ir_var_temporary) && (ir->type->matrix_columns == 1)) {
switch (ir->type->base_type) {
case GLSL_TYPE_INT:
case GLSL_TYPE_FLOAT:
buffer.asprintf_append (" = 0");
break;
case GLSL_TYPE_BOOL:
buffer.asprintf_append (" = false");
break;
default:
break;
}
}
}


Expand Down Expand Up @@ -1099,9 +1113,10 @@ void ir_print_metal_visitor::visit(ir_expression *ir)
else if (op0cast)
{
print_cast (buffer, arg_prec, ir->operands[0]);
buffer.asprintf_append ("(");
}
ir->operands[0]->accept(this);
if (op0castTo1)
if (op0castTo1 || op0cast)
{
buffer.asprintf_append (")");
}
Expand All @@ -1120,9 +1135,10 @@ void ir_print_metal_visitor::visit(ir_expression *ir)
else if (op1cast)
{
print_cast (buffer, arg_prec, ir->operands[1]);
buffer.asprintf_append ("(");
}
ir->operands[1]->accept(this);
if (op1castTo0)
if (op1castTo0 || op1cast)
{
buffer.asprintf_append (")");
}
Expand Down
2 changes: 1 addition & 1 deletion tests/fragment/array-const-outES3Metal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ struct xlatMtlShaderUniform {
fragment xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]], constant xlatMtlShaderUniform& _mtl_u [[buffer(0)]])
{
xlatMtlShaderOutput _mtl_o;
half4 c_1;
half4 c_1 = 0;
c_1.zw = half2(float2(0.0, 0.0));
c_1.xy = half2(float2(-0.3441301, 0.05004501));
_mtl_o._fragData = c_1;
Expand Down
2 changes: 1 addition & 1 deletion tests/fragment/array-constconst-outES3Metal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ struct xlatMtlShaderUniform {
fragment xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]], constant xlatMtlShaderUniform& _mtl_u [[buffer(0)]])
{
xlatMtlShaderOutput _mtl_o;
half4 c_1;
half4 c_1 = 0;
c_1.zw = half2(float2(0.0, 0.0));
c_1.xy = half2(float2(-0.3441301, 0.05004501));
_mtl_o._fragData = c_1;
Expand Down
2 changes: 1 addition & 1 deletion tests/fragment/ast-outES3Metal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ struct xlatMtlShaderUniform {
fragment xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]], constant xlatMtlShaderUniform& _mtl_u [[buffer(0)]])
{
xlatMtlShaderOutput _mtl_o;
float a_2;
float a_2 = 0;
if ((_mtl_i.gl_FragCoord.x == 1.0)) {
discard_fragment();
};
Expand Down
64 changes: 32 additions & 32 deletions tests/fragment/bug-loop-undeclaredinductor-outES3Metal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,57 +18,57 @@ fragment xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]]
, texture2d<half> _MainTex [[texture(0)]], sampler _mtlsmp__MainTex [[sampler(0)]])
{
xlatMtlShaderOutput _mtl_o;
half4 t_1;
half4 tmpvar_2;
half4 t_1 = 0;
half4 tmpvar_2 = 0;
tmpvar_2 = _MainTex.sample(_mtlsmp__MainTex, (float2)(_mtl_i.xlv_TEXCOORD0));
t_1 = tmpvar_2;
if ((_mtl_u._NumPasses > (half)0.0)) {
half passes_3;
if ((_mtl_u._NumPasses > (half)(0.0))) {
half passes_3 = 0;
passes_3 = _mtl_u._NumPasses;
float i_4;
half3 res_5;
float i_4 = 0;
half3 res_5 = 0;
res_5 = tmpvar_2.xyz;
i_4 = 0.0;
while (true) {
if ((i_4 >= 4.0)) {
break;
};
if ((i_4 == (float)passes_3)) {
if ((i_4 == (float)(passes_3))) {
break;
};
if ((i_4 == 0.0)) {
half3 tmpvar_6;
half val_7;
val_7 = ((_mtl_u._ContrastShift.x * (half)3.0) + (half)12.0);
half tmpvar_8;
tmpvar_8 = pow ((cos(val_7) + (half)1.0), val_7);
tmpvar_6 = ((res_5 - (half)0.5) * tmpvar_8);
half3 tmpvar_6 = 0;
half val_7 = 0;
val_7 = ((_mtl_u._ContrastShift.x * (half)(3.0)) + (half)(12.0));
half tmpvar_8 = 0;
tmpvar_8 = pow ((cos(val_7) + (half)(1.0)), val_7);
tmpvar_6 = ((res_5 - (half)(0.5)) * tmpvar_8);
res_5 = tmpvar_6;
} else {
if ((i_4 == 1.0)) {
half3 tmpvar_9;
half val_10;
val_10 = ((_mtl_u._SaturationShift.y * (half)3.0) + (half)12.0);
half tmpvar_11;
tmpvar_11 = pow ((cos(val_10) + (half)1.0), val_10);
tmpvar_9 = ((res_5 - (half)0.5) * tmpvar_11);
half3 tmpvar_9 = 0;
half val_10 = 0;
val_10 = ((_mtl_u._SaturationShift.y * (half)(3.0)) + (half)(12.0));
half tmpvar_11 = 0;
tmpvar_11 = pow ((cos(val_10) + (half)(1.0)), val_10);
tmpvar_9 = ((res_5 - (half)(0.5)) * tmpvar_11);
res_5 = tmpvar_9;
} else {
if ((i_4 == 2.0)) {
half3 tmpvar_12;
half val_13;
val_13 = ((_mtl_u._HueShift.z * (half)3.0) + (half)12.0);
half tmpvar_14;
tmpvar_14 = pow ((cos(val_13) + (half)1.0), val_13);
tmpvar_12 = ((res_5 - (half)0.5) * tmpvar_14);
half3 tmpvar_12 = 0;
half val_13 = 0;
val_13 = ((_mtl_u._HueShift.z * (half)(3.0)) + (half)(12.0));
half tmpvar_14 = 0;
tmpvar_14 = pow ((cos(val_13) + (half)(1.0)), val_13);
tmpvar_12 = ((res_5 - (half)(0.5)) * tmpvar_14);
res_5 = tmpvar_12;
} else {
half3 tmpvar_15;
half val_16;
val_16 = ((_mtl_u._LuminosityShift.x * (half)3.0) + (half)12.0);
half tmpvar_17;
tmpvar_17 = pow ((cos(val_16) + (half)1.0), val_16);
tmpvar_15 = ((res_5 - (half)0.5) * tmpvar_17);
half3 tmpvar_15 = 0;
half val_16 = 0;
val_16 = ((_mtl_u._LuminosityShift.x * (half)(3.0)) + (half)(12.0));
half tmpvar_17 = 0;
tmpvar_17 = pow ((cos(val_16) + (half)(1.0)), val_16);
tmpvar_15 = ((res_5 - (half)(0.5)) * tmpvar_17);
res_5 = tmpvar_15;
};
};
Expand All @@ -77,7 +77,7 @@ fragment xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]]
};
t_1.xyz = res_5;
};
half4 tmpvar_18;
half4 tmpvar_18 = 0;
tmpvar_18.w = half(1.0);
tmpvar_18.xyz = t_1.xyz;
_mtl_o._fragData = tmpvar_18;
Expand Down
2 changes: 1 addition & 1 deletion tests/fragment/bug-sampler-highp-outES3Metal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ fragment xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]]
, texture2d<float> _CameraDepthTexture [[texture(0)]], sampler _mtlsmp__CameraDepthTexture [[sampler(0)]])
{
xlatMtlShaderOutput _mtl_o;
float4 tmpvar_1;
float4 tmpvar_1 = 0;
tmpvar_1 = _CameraDepthTexture.sample(_mtlsmp__CameraDepthTexture, (float2)(_mtl_i.varUV), level(0.0)).xxxx;
_mtl_o._fragData = half4(tmpvar_1);
return _mtl_o;
Expand Down
78 changes: 39 additions & 39 deletions tests/fragment/bug-sampler-highpfull-outES3Metal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,99 +23,99 @@ fragment xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]]
, texture2d<half> _NoiseTex [[texture(4)]], sampler _mtlsmp__NoiseTex [[sampler(4)]])
{
xlatMtlShaderOutput _mtl_o;
float2 tmpvar_1;
float2 tmpvar_1 = 0;
tmpvar_1 = _mtl_i.xlv_TEXCOORD0;
float4 jitteredDir_3;
float4 sum_4;
float weight_5;
float zx_6;
float2 vx_7;
float2 x_8;
float2 xf_9;
float4 jitteredDir_3 = 0;
float4 sum_4 = 0;
float weight_5 = 0;
float zx_6 = 0;
float2 vx_7 = 0;
float2 x_8 = 0;
float2 xf_9 = 0;
xf_9 = _mtl_i.xlv_TEXCOORD0;
x_8 = _mtl_i.xlv_TEXCOORD0;
if ((_mtl_u._MainTex_TexelSize.y < 0.0)) {
xf_9.y = (1.0 - _mtl_i.xlv_TEXCOORD0.y);
};
half4 tmpvar_10;
half4 tmpvar_10 = 0;
tmpvar_10 = _NeighbourMaxTex.sample(_mtlsmp__NeighbourMaxTex, (float2)(xf_9), level(0.0));
float2 tmpvar_11;
float2 tmpvar_11 = 0;
tmpvar_11 = float2(tmpvar_10.xy);
half4 tmpvar_12;
half4 tmpvar_12 = 0;
tmpvar_12 = _MainTex.sample(_mtlsmp__MainTex, (float2)(_mtl_i.xlv_TEXCOORD0), level(0.0));
float4 tmpvar_13;
float4 tmpvar_13 = 0;
tmpvar_13 = float4(tmpvar_12);
half4 tmpvar_14;
half4 tmpvar_14 = 0;
tmpvar_14 = _VelTex.sample(_mtlsmp__VelTex, (float2)(xf_9), level(0.0));
float2 tmpvar_15;
float2 tmpvar_15 = 0;
tmpvar_15 = float2(tmpvar_14.xy);
vx_7 = tmpvar_15;
float4 tmpvar_16;
float4 tmpvar_16 = 0;
tmpvar_16.zw = float2(0.0, 0.0);
tmpvar_16.xy = _mtl_i.xlv_TEXCOORD0;
float4 coord_17;
float4 coord_17 = 0;
coord_17 = (tmpvar_16 * 11.0);
half4 tmpvar_18;
half4 tmpvar_18 = 0;
tmpvar_18 = _NoiseTex.sample(_mtlsmp__NoiseTex, (float2)(coord_17.xy), level(coord_17.w));
float4 tmpvar_19;
tmpvar_19 = float4(((tmpvar_18 * (half)2.0) - (half)1.0));
float4 tmpvar_19 = 0;
tmpvar_19 = float4(((tmpvar_18 * (half)(2.0)) - (half)(1.0)));
zx_6 = -((1.0/((
(_mtl_u._ZBufferParams.x * _CameraDepthTexture.sample(_mtlsmp__CameraDepthTexture, (float2)(_mtl_i.xlv_TEXCOORD0), level(0.0)).x)
+ _mtl_u._ZBufferParams.y))));
weight_5 = 1.0;
sum_4 = tmpvar_13;
float4 tmpvar_20;
float4 tmpvar_20 = 0;
tmpvar_20 = (tmpvar_11.xyxy + (tmpvar_19 * (_mtl_u._MainTex_TexelSize.xyxy * _mtl_u._Jitter)).xyyz);
jitteredDir_3 = ((max (
abs(tmpvar_20.xyxy)
,
((_mtl_u._MainTex_TexelSize.xyxy * _mtl_u._MaxVelocity) * 0.15)
) * sign(tmpvar_20.xyxy)) * float4(1.0, 1.0, -1.0, -1.0));
for (int l_2 = 0; l_2 < 12; l_2++) {
float zy_21;
float4 yf_22;
float4 tmpvar_23;
float zy_21 = 0;
float4 yf_22 = 0;
float4 tmpvar_23 = 0;
tmpvar_23 = (tmpvar_1.xyxy + ((jitteredDir_3.xyxy * _xlat_mtl_const1[l_2].xyxy) * float4(1.0, 1.0, -1.0, -1.0)));
yf_22 = tmpvar_23;
if ((_mtl_u._MainTex_TexelSize.y < 0.0)) {
yf_22.yw = (1.0 - tmpvar_23.yw);
};
half4 tmpvar_24;
half4 tmpvar_24 = 0;
tmpvar_24 = _VelTex.sample(_mtlsmp__VelTex, (float2)(yf_22.xy), level(0.0));
float2 tmpvar_25;
float2 tmpvar_25 = 0;
tmpvar_25 = float2(tmpvar_24.xy);
zy_21 = -((1.0/((
(_mtl_u._ZBufferParams.x * _CameraDepthTexture.sample(_mtlsmp__CameraDepthTexture, (float2)(tmpvar_23.xy), level(0.0)).x)
+ _mtl_u._ZBufferParams.y))));
float2 x_26;
float2 x_26 = 0;
x_26 = (x_8 - tmpvar_23.xy);
float2 x_27;
float2 x_27 = 0;
x_27 = (tmpvar_23.xy - x_8);
float tmpvar_28;
float tmpvar_28 = 0;
tmpvar_28 = sqrt(dot (tmpvar_25, tmpvar_25));
float2 x_29;
float2 x_29 = 0;
x_29 = (tmpvar_23.xy - x_8);
float edge0_30;
float edge0_30 = 0;
edge0_30 = (0.95 * tmpvar_28);
float tmpvar_31;
float tmpvar_31 = 0;
tmpvar_31 = clamp (((
sqrt(dot (x_29, x_29))
- edge0_30) / (
(1.05 * tmpvar_28)
- edge0_30)), 0.0, 1.0);
float tmpvar_32;
float tmpvar_32 = 0;
tmpvar_32 = sqrt(dot (vx_7, vx_7));
float2 x_33;
float2 x_33 = 0;
x_33 = (x_8 - tmpvar_23.xy);
float edge0_34;
float edge0_34 = 0;
edge0_34 = (0.95 * tmpvar_32);
float tmpvar_35;
float tmpvar_35 = 0;
tmpvar_35 = clamp (((
sqrt(dot (x_33, x_33))
- edge0_34) / (
(1.05 * tmpvar_32)
- edge0_34)), 0.0, 1.0);
float tmpvar_36;
float tmpvar_36 = 0;
tmpvar_36 = (((
clamp ((1.0 - ((zy_21 - zx_6) / _mtl_u._SoftZDistance)), 0.0, 1.0)
*
Expand All @@ -141,14 +141,14 @@ fragment xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]]
(2.0 * tmpvar_35)
))))
) * 2.0));
half4 tmpvar_37;
half4 tmpvar_37 = 0;
tmpvar_37 = _MainTex.sample(_mtlsmp__MainTex, (float2)(tmpvar_23.xy), level(0.0));
float4 tmpvar_38;
float4 tmpvar_38 = 0;
tmpvar_38 = float4(tmpvar_37);
sum_4 = (sum_4 + (tmpvar_38 * tmpvar_36));
weight_5 = (weight_5 + tmpvar_36);
};
float4 tmpvar_39;
float4 tmpvar_39 = 0;
tmpvar_39 = (sum_4 / weight_5);
_mtl_o._fragData = half4(tmpvar_39);
return _mtl_o;
Expand Down
10 changes: 5 additions & 5 deletions tests/fragment/builtin-vars-outES3Metal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ struct xlatMtlShaderUniform {
fragment xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]], constant xlatMtlShaderUniform& _mtl_u [[buffer(0)]])
{
xlatMtlShaderOutput _mtl_o;
half4 c_1;
c_1 = half4(((float4)_mtl_i.uv + _mtl_i.gl_FragCoord));
float tmpvar_2;
half4 c_1 = 0;
c_1 = half4(((float4)(_mtl_i.uv) + _mtl_i.gl_FragCoord));
float tmpvar_2 = 0;
if (_mtl_i.gl_FrontFacing) {
tmpvar_2 = 1.0;
} else {
tmpvar_2 = 0.0;
};
c_1.x = (c_1.x + (half)tmpvar_2);
c_1.xy = half2(((float2)c_1.xy + _mtl_i.gl_PointCoord));
c_1.x = (c_1.x + (half)(tmpvar_2));
c_1.xy = half2(((float2)(c_1.xy) + _mtl_i.gl_PointCoord));
_mtl_o._fragData = c_1;
return _mtl_o;
}
Expand Down
1 change: 1 addition & 0 deletions tests/fragment/const-precision-inES3.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ mediump vec4 frag( in v2f i ) {
h += ha[j];
f += fa[j];
f += (p * ha[0]);
f += (ha[1] * p);
}
return vec4( h.xy, f.xy);
}
Expand Down
3 changes: 2 additions & 1 deletion tests/fragment/const-precision-outES3.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ void main ()
h_6 = (h_6 + vec3[3](vec3(1.0, 2.0, 3.0), vec3(4.0, 5.0, 6.0), vec3(7.0, 8.0, 9.0))[j_3]);
f_5 = (f_5 + vec3[3](vec3(11.0, 12.0, 13.0), vec3(14.0, 15.0, 16.0), vec3(17.0, 18.0, 19.0))[j_3]);
f_5 = (f_5 + (p_4 * vec3(1.0, 2.0, 3.0)));
f_5 = (f_5 + (vec3(4.0, 5.0, 6.0) * p_4));
};
highp vec4 tmpvar_8;
tmpvar_8.xy = h_6.xy;
Expand All @@ -28,6 +29,6 @@ void main ()
}


// stats: 12 alu 0 tex 2 flow
// stats: 14 alu 0 tex 2 flow
// inputs: 1
// #0: xlv_TEXCOORD0 (medium float) 2x1 [-1]
Loading

0 comments on commit c54ef21

Please sign in to comment.