Making the base e functions IR operations is not a clear win. i965
doesn't support it, it doesn't look like r600 supports it, but r500
does. It should be easily supportable as a lowering pass, though.
Following a discussion in #dri-devel, I think this makes more sense
than implementing it as RSQ RCP CMP as Mesa did. The i965 has a
hardware sqrt that should work, and AMD is suppposed to be able to
implement it as RSQ RCP with an alternate floating point mode so that
the 0.0 case is handled like we want.
As a result, the following tests pass:
glslparsertest/array3.frag
glslparsertest/CGStandardLibrary.frag
glslparsertest/ConstantConversions.frag
glslparsertest/constructor1.frag
glslparsertest/constructor2.frag
glslparsertest/constructor3.V110.frag
glslparsertest/dataType4.frag
glslparsertest/dataType5.frag
glslparsertest/dataType13.frag
glslparsertest/dataType19.frag
glslparsertest/matrix.V110.frag
glslparsertest/parser7.frag
glslparsertest/swizzle3.frag
The following tests also pass, but it is just by dumb luck. In these
cases the shader fails to compile, but it fails for the wrong reason:
glslparsertest/array6.frag
glslparsertest/comma2.frag
glslparsertest/conditional1.frag
glslparsertest/conditional2.frag
glslparsertest/conditional3.frag
glslparsertest/constFunc.frag
glslparsertest/ParseTest3.frag
glslparsertest/ParseTest4.frag
glslparsertest/varying3.frag
glslparsertest/parser8.frag (also segfaults)
glslparsertest/parser9.frag (also segfaults)
The following tests now fail. As far as I can tell, these are all
cases where the shader was failing to compile, but it was failing for
the wrong reason.
glslparsertest/CorrectMatComma.frag
glslparsertest/CorrectModule.frag
glslparsertest/CorrectSwizzle2.vert
glslparsertest/shaders/glsl-fs-bug25902.frag
All of the scalar, vector, and matrix constructors *except* "from
bool" constructors should be handled. Array and structure
constructors are also not yet handled.
For numeric types, vector_elements and matrix_columns must be at least
1. Previously matrix_columns was 0 for vectors, and both were 0 for
scalars. This change simplifies things in some places.
Also turn generate_swizzle into a static "create" method of the new
class; we'll want to use it for the IR reader as well.
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Also make a slight change to ir_variable. The ir_dereference tracks
the number of nested dereferences. If an ir_variable is visited and
the count is non-zero, just print the name of the variable.