On 22 August 2013 16:08, Matt Turner <matts...@gmail.com> wrote: > --- > src/glsl/builtins/ir/frexp.ir | 25 > +++++++++++++++++++++++++ > src/glsl/builtins/ir/ldexp.ir | 25 > +++++++++++++++++++++++++ > src/glsl/builtins/profiles/ARB_gpu_shader5.glsl | 10 ++++++++++ > 3 files changed, 60 insertions(+) > create mode 100644 src/glsl/builtins/ir/frexp.ir > create mode 100644 src/glsl/builtins/ir/ldexp.ir > > diff --git a/src/glsl/builtins/ir/frexp.ir b/src/glsl/builtins/ir/frexp.ir > new file mode 100644 > index 0000000..a514994 > --- /dev/null > +++ b/src/glsl/builtins/ir/frexp.ir > @@ -0,0 +1,25 @@ > +((function frexp > + (signature float > + (parameters > + (declare (in) float x) > + (declare (out) int exp)) > + ((return (expression float frexp (var_ref x) (var_ref exp))))) >
Having an ir_expression that writes to one of its parameters is going to break assumptions in a lot of our optimization passes. For example, if opt_tree_grafting encounters this code: uniform float u; void main() { int exp; float f = frexp(u, out exp); float g = float(exp)/256.0; float h = float(exp) + 1.0; gl_FragColor = vec4(f, g, h, g + h); } it may try to optimize it to this: uniform float u; void main() { int exp; float g = float(exp)/256.0; float h = float(exp) + 1.0; gl_FragColor = vec4(frexp(u, out exp), g, h, g + h); } I think what we need to do is either: 1. Punt on the frexp_to_arith lowering pass for now, and instead just put the lowered code right here, or 2. In patch 7, replace ir_binop_frexp with two unary ops, one that computes the mantissa (return value of frexp()), and one that computes the integer exponent. Then this code will be effectively: float frexp(float x, out int exp) { exp = ir_unop_frexp_mantissa(x); return ir_unop_frexp_exponent(x); } I'm leaning toward option 1, because I suspect it will generate more efficient code (option 2 is likely to cause the if test in frexp_to_arith to be duplicated). > + > + (signature vec2 > + (parameters > + (declare (in) vec2 x) > + (declare (out) ivec2 exp)) > + ((return (expression vec2 frexp (var_ref x) (var_ref exp))))) > + > + (signature vec3 > + (parameters > + (declare (in) vec3 x) > + (declare (out) ivec3 exp)) > + ((return (expression vec3 frexp (var_ref x) (var_ref exp))))) > + > + (signature vec4 > + (parameters > + (declare (in) vec4 x) > + (declare (out) ivec4 exp)) > + ((return (expression vec4 frexp (var_ref x) (var_ref exp))))) > +)) > diff --git a/src/glsl/builtins/ir/ldexp.ir b/src/glsl/builtins/ir/ldexp.ir > new file mode 100644 > index 0000000..dd25f5a > --- /dev/null > +++ b/src/glsl/builtins/ir/ldexp.ir > @@ -0,0 +1,25 @@ > +((function ldexp > + (signature float > + (parameters > + (declare (in) float x) > + (declare (in) int exp)) > + ((return (expression float ldexp (var_ref x) (var_ref exp))))) > Note: ldexp is fine as a binop, since both its parameters are inputs. > + > + (signature vec2 > + (parameters > + (declare (in) vec2 x) > + (declare (in) ivec2 exp)) > + ((return (expression vec2 ldexp (var_ref x) (var_ref exp))))) > + > + (signature vec3 > + (parameters > + (declare (in) vec3 x) > + (declare (in) ivec3 exp)) > + ((return (expression vec3 ldexp (var_ref x) (var_ref exp))))) > + > + (signature vec4 > + (parameters > + (declare (in) vec4 x) > + (declare (in) ivec4 exp)) > + ((return (expression vec4 ldexp (var_ref x) (var_ref exp))))) > +)) > diff --git a/src/glsl/builtins/profiles/ARB_gpu_shader5.glsl > b/src/glsl/builtins/profiles/ARB_gpu_shader5.glsl > index 3f76283..36fc0de 100644 > --- a/src/glsl/builtins/profiles/ARB_gpu_shader5.glsl > +++ b/src/glsl/builtins/profiles/ARB_gpu_shader5.glsl > @@ -59,3 +59,13 @@ float fma(float a, float b, float c); > vec2 fma(vec2 a, vec2 b, vec2 c); > vec3 fma(vec3 a, vec3 b, vec3 c); > vec4 fma(vec4 a, vec4 b, vec4 c); > + > +float frexp(float x, out int exp); > +vec2 frexp(vec2 x, out ivec2 exp); > +vec3 frexp(vec3 x, out ivec3 exp); > +vec4 frexp(vec4 x, out ivec4 exp); > + > +float ldexp(float x, int exp); > +vec2 ldexp(vec2 x, ivec2 exp); > +vec3 ldexp(vec3 x, ivec3 exp); > +vec4 ldexp(vec4 x, ivec4 exp); > -- > 1.8.3.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev