glsl: lower samplers with highp coordinates correctly
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Reviewed-by: Rob Clark <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5002>
This commit is contained in:
@@ -449,6 +449,24 @@ is_lowerable_builtin(ir_call *ir,
|
|||||||
return desc->channel[i].size <= 10; /* unorm/snorm */
|
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())
|
if (!ir->callee->is_builtin())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@@ -921,12 +921,33 @@ TESTS = [
|
|||||||
}
|
}
|
||||||
""",
|
""",
|
||||||
r'\(expression +uint +/'),
|
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",
|
Test("f32 texture sample",
|
||||||
"""
|
"""
|
||||||
precision mediump float;
|
precision mediump float;
|
||||||
|
|
||||||
uniform sampler2D tex;
|
uniform sampler2D tex;
|
||||||
uniform vec2 coord;
|
// highp shouldn't affect the return value of texture2D
|
||||||
|
uniform highp vec2 coord;
|
||||||
uniform float divisor;
|
uniform float divisor;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
@@ -942,7 +963,8 @@ TESTS = [
|
|||||||
precision mediump int;
|
precision mediump int;
|
||||||
|
|
||||||
uniform mediump isampler2D tex;
|
uniform mediump isampler2D tex;
|
||||||
uniform vec2 coord;
|
// highp shouldn't affect the return value of texture
|
||||||
|
uniform highp vec2 coord;
|
||||||
uniform int divisor;
|
uniform int divisor;
|
||||||
|
|
||||||
out highp ivec4 color;
|
out highp ivec4 color;
|
||||||
@@ -960,7 +982,8 @@ TESTS = [
|
|||||||
precision mediump int;
|
precision mediump int;
|
||||||
|
|
||||||
uniform mediump usampler2D tex;
|
uniform mediump usampler2D tex;
|
||||||
uniform vec2 coord;
|
// highp shouldn't affect the return value of texture
|
||||||
|
uniform highp vec2 coord;
|
||||||
uniform uint divisor;
|
uniform uint divisor;
|
||||||
|
|
||||||
out highp uvec4 color;
|
out highp uvec4 color;
|
||||||
@@ -996,7 +1019,8 @@ TESTS = [
|
|||||||
precision mediump int;
|
precision mediump int;
|
||||||
|
|
||||||
layout(rgba16f) readonly uniform mediump image2D img;
|
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;
|
uniform float divisor;
|
||||||
|
|
||||||
out highp vec4 color;
|
out highp vec4 color;
|
||||||
@@ -1014,7 +1038,8 @@ TESTS = [
|
|||||||
precision mediump int;
|
precision mediump int;
|
||||||
|
|
||||||
layout(rgba16i) readonly uniform mediump iimage2D img;
|
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;
|
uniform int divisor;
|
||||||
|
|
||||||
out highp ivec4 color;
|
out highp ivec4 color;
|
||||||
@@ -1032,7 +1057,8 @@ TESTS = [
|
|||||||
precision mediump int;
|
precision mediump int;
|
||||||
|
|
||||||
layout(rgba16ui) readonly uniform mediump uimage2D img;
|
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;
|
uniform uint divisor;
|
||||||
|
|
||||||
out highp uvec4 color;
|
out highp uvec4 color;
|
||||||
|
Reference in New Issue
Block a user