return desc->channel[i].size <= 10; /* unorm/snorm */
    }
 
+   /* Handle special calls. */
+   if (ir->callee->is_builtin() && ir->actual_parameters.length()) {
+      ir_rvalue *param = (ir_rvalue*)ir->actual_parameters.get_head();
+      ir_variable *var = param->variable_referenced();
+
+      /* Handle builtin wrappers around ir_texture opcodes. These wrappers will
+       * be inlined by lower_precision() if we return true here, so that we can
+       * get to ir_texture later and do proper lowering.
+       *
+       * We should lower the type of the return value if the sampler type
+       * uses lower precision. The function parameters don't matter.
+       */
+      if (var && var->type->without_array()->is_sampler()) {
+         return var->data.precision == GLSL_PRECISION_MEDIUM ||
+                var->data.precision == GLSL_PRECISION_LOW;
+      }
+   }
+
    if (!ir->callee->is_builtin())
       return false;
 
 
          }
          """,
          r'\(expression +uint +/'),
+    Test("f32 sampler array",
+         """
+         #version 320 es
+         precision mediump float;
+         precision mediump int;
+
+         uniform sampler2D tex[2];
+         // highp shouldn't affect the return value of texture2D
+         uniform highp vec2 coord;
+         uniform float divisor;
+         uniform int index;
+
+         out highp vec4 color;
+
+         void main()
+         {
+                 color = texture2D(tex[index], coord) / divisor;
+         }
+         """,
+         r'\(expression +f16vec4 +/.*\(tex +f16vec4 +'),
     Test("f32 texture sample",
          """
          precision mediump float;
 
          uniform sampler2D tex;
-         uniform vec2 coord;
+         // highp shouldn't affect the return value of texture2D
+         uniform highp vec2 coord;
          uniform float divisor;
 
          void main()
          precision mediump int;
 
          uniform mediump isampler2D tex;
-         uniform vec2 coord;
+         // highp shouldn't affect the return value of texture
+         uniform highp vec2 coord;
          uniform int divisor;
 
          out highp ivec4 color;
          precision mediump int;
 
          uniform mediump usampler2D tex;
-         uniform vec2 coord;
+         // highp shouldn't affect the return value of texture
+         uniform highp vec2 coord;
          uniform uint divisor;
 
          out highp uvec4 color;
          precision mediump int;
 
          layout(rgba16f) readonly uniform mediump image2D img;
-         uniform ivec2 coord;
+         // highp shouldn't affect the return value of imageLoad
+         uniform highp ivec2 coord;
          uniform float divisor;
 
          out highp vec4 color;
          precision mediump int;
 
          layout(rgba16i) readonly uniform mediump iimage2D img;
-         uniform ivec2 coord;
+         // highp shouldn't affect the return value of imageLoad
+         uniform highp ivec2 coord;
          uniform int divisor;
 
          out highp ivec4 color;
          precision mediump int;
 
          layout(rgba16ui) readonly uniform mediump uimage2D img;
-         uniform ivec2 coord;
+         // highp shouldn't affect the return value of imageLoad
+         uniform highp ivec2 coord;
          uniform uint divisor;
 
          out highp uvec4 color;