summaryrefslogtreecommitdiff
path: root/src/glsl/ir.cpp
AgeCommit message (Collapse)Author
2010-08-24glsl: Include main/core.h.Chia-I Wu
Make glsl include only main/core.h from core mesa.
2010-08-23mesa: Add new ir_unop_any() expression operation.Eric Anholt
The previous any() implementation would generate arg0.x || arg0.y || arg0.z. Having an expression operation for this makes it easy for the backend to generate something easier (DPn + SNE for 915 FS, .any predication on 965 VS)
2010-08-17ir_constant: Don't assert on out-of-bounds array accessesIan Romanick
Several optimization paths, including constant folding, can lead to accessing an ir_constant array with an out of bounds index. The GLSL spec lets us produce "undefined" results, but it does not let us crash. Fixes piglit test case glsl-array-bounds-01 and glsl-array-bounds-03.
2010-08-04glsl2: Remove the shader_in/shader_out tracking separate from var->mode.Eric Anholt
I introduced this for ir_dead_code to distinguish function parameter outvals from varying outputs. Only, since ast_to_hir's current_function is unset when setting up function parameters (they're needed for making the function signature in the first place), all function parameter outvals were marked as shader outputs anyway. This meant that an inlined function's cloned outval was marked as a shader output and couldn't be dead-code eliminated. Instead, since ir_dead_code doesn't even look at function parameters, just use var->mode. The longest Mesa IR coming out of ir_to_mesa for Yo Frankie drops from 725 instructions to 636.
2010-08-04glsl2: Add ir_assignment::write_mask and associated methodsIan Romanick
Replace swizzles on the LHS with additional swizzles on the RHS and a write mask in the assignment instruction. As part of this add ir_assignment::set_lhs. Ideally we'd make ir_assignment::lhs private to prevent erroneous writes, but that would require a lot of code butchery at this point. Add ir_assignment constructor that takes an explicit write mask. This is required for ir_assignment::clone, but it can also be used in other places. Without this, ir_assignment clones lose their write masks, and incorrect IR is generated in optimization passes. Add ir_assignment::whole_variable_written method. This method gets the variable on the LHS if the whole variable is written or NULL otherwise. This is different from ir->lhs->whole_variable_referenced() because the latter has no knowledge of the write mask stored in the ir_assignment. Gut all code from ir_to_mesa that handled swizzles on the LHS of assignments. There is probably some other refactoring that could be done here, but that can be left for another day.
2010-08-02glsl2: Initialize the ARB_fcc fields of ir_variable.Eric Anholt
Fixes intermittent failure in glsl-arb-fragment-coord-conventions.
2010-07-30glsl2: Initialize ir_function_signature::is_built_in.Kenneth Graunke
Fixes a valgrind error.
2010-07-29glsl2: Fix spelling of "sentinel."Eric Anholt
2010-07-28glsl2: Add new ir_constant::zero static method.Kenneth Graunke
This conveniently creates a zero value of whatever type you want.
2010-07-27glsl2: When stealing var->constant_value, steal its children as well.Eric Anholt
Fixes: glsl1-GLSL 1.20 uniform array constructor
2010-07-26glsl2: Also steal the constant components of aggregate-typed ir_constants.Eric Anholt
2010-07-26glsl2: Steal ir_variable's constant_value field.Kenneth Graunke
Fixes a link-time crash in glsl-vs-cross-3.
2010-07-22glsl2: Initialize ir_instruction::type and ir_rvalue::type.Kenneth Graunke
Top-level instructions now get NULL as their default type (since type is irrelevant for things like ir_function), while ir_rvalues get error_type by default. This should make it easier to tell if we've forgotten to set a type. It also fixes some "Conditional jump or move depends on uninitialized value" errors in valgrind caused by ir_validate examining the type of top level ir_instructions, which weren't set.
2010-07-21ir_constant_expression: Add support for array == and !=.Kenneth Graunke
Piglit parser tests const-array-03.frag and const-array-04.frag now generate the correct code.
2010-07-21glsl2: Extend ir_constant to store constant arrays, and generate them.Kenneth Graunke
Since GLSL permits arrays of structures, we need to store each element as an ir_constant*, not just ir_constant_data. Fixes parser tests const-array-01.frag, const-array-03.frag, const-array-04.frag, const-array-05.frag, though 03 and 04 generate the wrong code.
2010-07-20glsl2: Implement utility routine to talloc reparent an IR treeIan Romanick
2010-07-20glsl2: Add and use new variable mode ir_var_temporaryIan Romanick
This is quite a large patch because breaking it into smaller pieces would result in the tree being intermitently broken. The big changes are: * Add the ir_var_temporary variable mode * Change the ir_variable constructor to take the mode as a parameter and correctly specify the mode for all ir_varables. * Change the linker to not cross validate ir_var_temporary variables. * Change the linker to pull all ir_var_temporary variables from global scope into 'main'.
2010-07-20glsl2: strdup the field names used in dereference_record.Eric Anholt
Otherwise, after linking and freeing the old data, the pointer would dangle. Partial fix for glsl1-struct*.
2010-07-19glsl2: Give IR nodes a type field.Eric Anholt
This is a big deal for debugging if nothing else ("what class is this ir_instruction, really?"), but is also nice for avoiding building a whole visitor or an if (node->as_whatever() || node->as_other_thing()) chain.
2010-07-18glsl2: Remove the const disease from function signature's callee.Eric Anholt
2010-07-18glsl2: Make cross() be an expression operation.Eric Anholt
ARB_fp, ARB_vp, Mesa IR, and the 965 vertex shader all have instructions for cross. Shaves 12 Mesa instructions off of a 66-instruction shader I have.
2010-07-12ir_function_signature: Add method to get the function owning a signatureIan Romanick
There is no setter function, the getter returns a constant pointer, and ir_function_signature::_function is private for a reason. The only way to make a connection between a function and function signature is via ir_function::add_signature. This helps ensure that certain invariants (i.e., a function signature is in the list of signatures for its _function) are met.
2010-07-12ir_call: Add method to set the function signature being calledIan Romanick
2010-07-01glsl2: Add ir_unop_fract as an expression type.Eric Anholt
Most backends will prefer seeing this to seeing (a - floor(a)), so represent it explicitly.
2010-06-30glsl2: Make function names and variable names be children of the node.Eric Anholt
This avoids losing their memory when the parser state is freed.
2010-06-29ir_swizzle: Add new constructor, refactor constructorsIan Romanick
Adds a new constructor that takes an array of component values. Refactors the meat of the two constructors to an init_mask method.
2010-06-24glsl2: Move the compiler to the subdirectory it will live in in Mesa.Eric Anholt