summaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2014-12-18nir: Add some documentationnir-v1.0.1nir-review-v1Jason Ekstrand1-10/+43
Signed-off-by: Jason Ekstrand <jason.ekstrand@intel.com> Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
2014-12-18nir/lower_variables: Follow the Cytron paper more closelyJason Ekstrand1-26/+70
Previously, our variable renaming algorithm, while similar to the one in the Cytron paper, was not the same. While I'm pretty sure it was correct, it will be easier for readers of the code in the variable renaming pass if it follows more closely. This commit removes the automatic stack popping we were doing and replaces it with explicit popping like Cytron does.
2014-12-18nir/print: Various cleanups recommended by EricJason Ekstrand1-33/+12
Cc: Eric Anholt <eric@anholt.net>
2014-12-18nir/lower_variables: Add a bunch of comments and re-arrange a few thingsJason Ekstrand1-57/+170
This commit seeks to make the lower_variables pass much more clear by adding a pile of comments and re-arranging a few things. There are no functional or algorithmic changes.
2014-12-17nir: Rename parallel_copy_copy to parallel_copy_entry and add a foreach macroJason Ekstrand4-46/+55
parallel_copy_copy was a silly name. Also, things were getting long and annoying, so I added a foreach macro. For historical reasons, several of the original iterations over parallel copy entries in from_ssa used the _safe variants of the loop. However, all of these no longer ever remove an entry so it's ok to make them all use the normal iterator.
2014-12-17nir/from_ssa: Clean up parallel copy handling and document it betterJason Ekstrand3-66/+92
Previously, we were doing a lazy creation of the parallel copy instructions. This is confusing, hard to get right, and involves some extra state tracking of the copies. This commit adds an extra walk over the basic blocks to add the block-end parallel copies up front. This should be much less confusing and, consequently, easier to get right. This commit also adds more comments about parallel copies to help explain what all is going on. As a consequence of these changes, we can now remove the at_end parameter from nir_parallel_copy_instr.
2014-12-17nir: Rename nir_block_following_if to nir_block_get_following_ifJason Ekstrand5-5/+5
The new name is a little longer but less confusing.
2014-12-17i965/fs_nir: Handle sample ID, position, and mask betterJason Ekstrand2-12/+71
Before, we were emitting the full pile of setup instructions for sample_id and sample_pos every time they were used. With this commit, we emit them in their own pass once at the beginning of the shader and simply emit uses later on. When it comes time for setting up VS, we can put setup for its special values in the same pass.
2014-12-17nir/opcodes: Remove the per_component info fieldJason Ekstrand3-37/+33
Originally, this field was intended for determining if the given instruction acted per-component or if it had mismatching source and destination sizes that would have to be interpreted specially. However, we can easily derive this from output_size == 0, so it's not really that useful. Also, the values we were setting in nir_opcodes.h for this field were completely bogus and it was never used. Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
2014-12-17nir/search: Use nir_op_infos to determine if an operation is commutativeJason Ekstrand1-33/+2
Prior to this commit, we had a big switch statement for this. Now it's baked into the opcode metadata so we can just use that.
2014-12-17nir/opcodes: Add algebraic properties metadataJason Ekstrand3-71/+89
This commit adds some algebraic properties to the metadata of each opcode in NIR. In particular, you now know, just from the metadata, if a given opcode is commutative or associative. This will be useful for algebraic transformation passes that want to be able to match a + b as well as b + a in one go.
2014-12-17nir: Make load_const SSA-onlyJason Ekstrand16-162/+54
As it was, we weren't ever using load_const in a non-SSA way. This allows us to substantially simplify the load_const instruction. If we ever need a non-SSA constant load, we can do a load_const and an imov.
2014-12-17nir: Make nir_ssa_undef_instr_create take a number of componentsJason Ekstrand4-13/+11
2014-12-17i965/nir: Move the other lowering passes to before out-of-SSAJason Ekstrand1-6/+6
2014-12-17nir/lower_system_values: Handle SSA destinationsJason Ekstrand1-1/+14
2014-12-17nir/lower_atomics: Use/support SSAJason Ekstrand2-21/+35
Previously, lower_atomics was non-SSA only. We assert-failed if the destination of an atomic operation intrinsic was an SSA def and we used temporary registers for computing offsets. This commit changes both of these behaviors. We now use SSA values for computing offsets (so we can optimize them) and we handle SSA destinations. We also move the pass to run before we go out of SSA on i965 as it now generates SSA values.
2014-12-17nir/live_variables: Use the new ssa_def iteratorJason Ekstrand1-19/+13
2014-12-17nir: Use nir_foreach_ssa_def for setting up ssa destinationsJason Ekstrand1-13/+11
Before, we were using foreach_dest and switching on whether the destination was an SSA value. This works, except not all destinations are SSA values so we have to special-case ssa_undef instructions. Now that we have a foreach_ssa_def function, we can iterate over all of the register destinations in one pass and iterate over the SSA destinations in a second. This way, if we add other ssa-only instructions, we won't have to worry about adding them to the special case we have for ssa_undef.
2014-12-17nir: Add a foreach_ssa_def functionJason Ekstrand2-0/+44
There are some functions whose destinations are SSA-only and so aren't a nir_dest. This provides a function that is capable of iterating over the SSA definitions defined by those functions. If you want registers, you should use the old iterator.
2014-12-17nir/lower_variables: Use a real dominance DFS for variable renamingJason Ekstrand1-4/+5
Previously, we were just iterating over the program "in order" which kind-of approximates a DFS, but not really. In particular, we got the following case wrong: loop { a = 3; if (foo) { a = 5; } else { break; } use(a); } where use(a) would get 3 instead of 5 because of premature popping of the SSA def stack. Now, since we do an actaul DFS, we should evaluate use(a) immediately after a = 5 and we should be ok.
2014-12-17nir: Remove predicationJason Ekstrand10-321/+18
We stopped generating predicates in glsl_to_nir some time ago. Right now, it's all dead untested code that I'm not convinced always worked in the first place. If we decide we want them back, we can revert this patch.
2014-12-17nir: Make bcsel a fully vector operationJason Ekstrand5-6/+15
Previously, the condition was a scalar that applied to all components simultaneously. As of this commit, the condition is a vector and each component is switched seperately.
2014-12-17nir: Call nir_metadata_preserve more placesJason Ekstrand8-2/+27
2014-12-17nir/metadata: Rename metadata_dirty to metadata_preserveJason Ekstrand8-16/+18
nir_metadata_dirty was a terrible name because the parameter it takes is the metadata to be preserved. This is really confusing because it looks like it's doing the opposite of what it is actually doing. Now it's named sensibly.
2014-12-17i965/fs_nir: Add support for indirect texture arraysJason Ekstrand1-2/+22
2014-12-17nir: Rework the way samplers are loweredJason Ekstrand1-75/+74
2014-12-17nir: Add a sampler index indirect to nir_tex_instrJason Ekstrand4-0/+28
2014-12-17nir: Use a source for uniform buffer indices instead of an indexJason Ekstrand3-55/+76
In GLSL-to-NIR we were just setting the base index to 0 whenever there was an indirect so having it expressed as a sum makes no sense. Also, while a base offset may make sense for the memory location (first element in the array, etc.) it makes less sense for the actual uniform buffer index. This may change later, but it seems to make more sense for now.
2014-12-17nir: Constant fold array indirectsJason Ekstrand1-8/+76
2014-12-17nir: Make texture instruction names more consistentJason Ekstrand11-25/+25
This commit renames nir_instr_as_texture to nir_instr_as_tex and renames nir_instr_type_texture to nir_instr_type_tex to be consistent with nir_tex_instr.
2014-12-17nir: Remove the ffma peepholeJason Ekstrand2-190/+0
This is no longer needed because it's now part of the algebraic optimization pass
2014-12-17nir: Add a basic constant folding passJason Ekstrand4-0/+287
2014-12-17nir: Add an algebraic optimization passJason Ekstrand5-3/+84
This pass uses the previously built algebraic transformations framework and should act as an example for anyone else wanting to make an algebraic transformation pass for NIR.
2014-12-17nir: Add infastructure for generating algebraic transformation passesJason Ekstrand1-0/+249
This commit builds on the nir_search.h infastructure by adds a bit of python code that makes it stupid easy to write an algebraic transformation pass. The nir_algebraic.py file contains four python classes that correspond directly to the datastructures in nir_search.c and allow you to easily generate the C code to represent them. Given a list of search-and-replace operations, it can then generate a function that applies those transformations to a shader. The transformations can be specified manually, or they can be specified using nested tuples. The nested tuples make a neat little language for specifying expression trees and search-and-replace operations in a very readable and easy-to-edit fasion. The generated code is also fairly efficient. Insteady of blindly calling nir_replace_instr with every single transformation and on every single instruction, it uses a switch statement on the instruction opcode to do a first-order culling and only calls nir_replace_instr if the opcode is known to match the first opcode in the search expression.
2014-12-17nir: Add an expression matching frameworkJason Ekstrand3-0/+419
This framework provides a simple way to do simple search-and-replace operations on NIR code. The nir_search.h header provides four simple data structures for representing expressions: nir_value and four subtypes: nir_variable, nir_constant, and nir_expression. An expression tree can then be represented by nesting these data structures as needed. The nir_replace_instr function takes an instruction, an expression, and a value; if the instruction matches the expression, it is replaced with a new chain of instructions to generate the given replacement value. The framework keeps track of swizzles on sources and automatically generates the currect swizzles for the replacement value.
2014-12-17nir/glsl: Emit abs, neg, and sat operations instead of source modifiersJason Ekstrand1-6/+3
2014-12-17nir: Make the type casting operations static inline functionsJason Ekstrand1-32/+32
Previously, the casting operations were macros. While this is usually fine, the casting macro used the input parameter twice leading to strange behavior when you passed the result of another function into it. Since we know the source and destination types explicitly, we don't loose anything by making it a function. Also, this gives us a nice little macro for creating cast function that will hopefully prevent mistyping.
2014-12-17nir: Add a lowering pass for adding source modifiers where possibleJason Ekstrand4-0/+188
2014-12-17nir: Add neg, abs, and sat opcodesJason Ekstrand1-0/+5
2014-12-17i965/fs_nir: Implement the ARB_gpu_shader5 interpolation intrinsicsJason Ekstrand1-0/+102
2014-12-17i965/fs_nir: Add a has_indirect flag and clean up some of the input/output codeJason Ekstrand1-63/+14
2014-12-17nir: Add a helper for getting a constant value from an SSA sourceJason Ekstrand2-0/+20
2014-12-17nir/glsl: Add support for gpu_shader5 interpolation instrinsicsJason Ekstrand1-1/+79
2014-12-17nir: Add gpu_shader5 interpolation intrinsicsJason Ekstrand2-27/+21
2014-12-17nir/validate: Validate intrinsic source/destination sizesJason Ekstrand1-0/+26
2014-12-17nir: Vectorize intrinsicsJason Ekstrand9-315/+123
We used to have the number of components built into the intrinsic. This meant that all of our load/store intrinsics had vec1, vec2, vec3, and vec4 variants. This lead to piles of switch statements to generate the correct texture names, and introspection to figure out the number of components. We can make things much nicer by allowing "vectorized" intrinsics.
2014-12-17nir: Remove the old variable lowering codeJason Ekstrand2-1250/+0
2014-12-17nir/validate: Ensure that outputs are write-only and inputs are read-onlyJason Ekstrand1-0/+23
2014-12-17i965/fs_nir: Use the new variable lowering codeJason Ekstrand1-19/+25
This commit switches us over to the new variable lowering code which is capable of properly handling lowering indirects as we go.
2014-12-17nir/glsl: Generate SSA NIRJason Ekstrand1-129/+117
With this commit, the GLSL IR -> NIR pass generates NIR in more-or-less SSA form. It's SSA in the sense that it doesn't have any registers, but it isn't really useful SSA because it still has a pile of load/store intrinsics that we will need to get rid of.