summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* glsl2: Add and use new variable mode ir_var_temporaryIan Romanick2010-07-2018-47/+109
| | | | | | | | | | | | | | | | | 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'.
* ir_to_mesa: Validate the linked shaders as well.Eric Anholt2010-07-201-0/+2
| | | | This caught the failure in cloning of ir_dereference_record.
* glsl2: Check that nodes in a valid tree aren't error-type.Eric Anholt2010-07-201-1/+2
| | | | | We're good at propagating error types around, but finding when the first one was triggered can be painful if we aren't paying attention.
* glsl2: strdup the field names used in dereference_record.Eric Anholt2010-07-201-2/+2
| | | | | Otherwise, after linking and freeing the old data, the pointer would dangle. Partial fix for glsl1-struct*.
* glsl2: talloc the glsl_struct_field[] we use to look up structure types.Eric Anholt2010-07-203-4/+17
| | | | | | | | | | Since the types are singletons across the lifetime of the compiler, repeatedly compiling a program with the same structure type defined would drop a copy of the array on the floor per compile. This is a bit tricky because the static GLSL types are not called with the talloc-based new, so we have to use the global type context, which may not be initialized yet.
* glsl2: Don't claim a match on structure types with different field names.Eric Anholt2010-07-201-2/+5
| | | | | | We regularly do lookups on the field names of the structure to find the types within the struct, so returning a structure type with bad names will lead to lots of error types being found.
* glsl2: Add support for the .length() method on arrays.Kenneth Graunke2010-07-201-0/+22
| | | | | | Fixes piglit test glsl-array-length, and provides proper error messages for negative piglit tests array-length-110.frag, array-length-unsized.frag, and array-length-args.frag.
* glsl2: Remove incorrect assertion in the parser.Kenneth Graunke2010-07-201-6/+0
| | | | | | | | | | | This assertion is triggered by method calls (i.e. array.length()), where subexpressions[1] is an ast_function_call expression. Since the assertion itself had a comment saying it could be removed eventually, simply do so. Causes negative glslparser tests array-length-110.frag, array-length-args.frag, and array-length-unsized.frag to pass, but only because the length() method is not supported yet.
* glsl2: Disallow non-constant array indexing for unsized arrays.Kenneth Graunke2010-07-201-0/+2
| | | | Fixes piglit test unsized-array-non-const-index.vert.
* ir_constant_expression: Remove pointless use of variable_referenced.Kenneth Graunke2010-07-201-4/+1
| | | | | ir_dereference_variable always references an ir_variable, so there's no point in calling a function and NULL-checking the result.
* ir_constant_expression: Use "this" pointer directly.Kenneth Graunke2010-07-201-68/+64
| | | | | In ir_expression's signature, I replaced ir->operands[i] with op[i] as it is more concise; an assertion already ensures these are equal.
* ir_constant_expression: Convert from a visitor to a virtual function.Kenneth Graunke2010-07-202-169/+60
| | | | | | | | | The constant_expression_wrapper was already the only external API, and much of the internal code used it anyway. Also, it wouldn't ever visit non-rvalue ir_instructions, so using a visitor seemed a bit unnecessary. This uses "ir_foo *ir = this;" lines to avoid code churn. These should be removed.
* glsl2: Move constant_expression_value method to ir_rvalue.Kenneth Graunke2010-07-202-3/+3
| | | | | This prevents top-level callers from asking for the value of something that is guaranteed not to have one.
* glcpp: Avoid accidental token pasting in preprocessed result.Carl Worth2010-07-205-5/+43
| | | | | | | | | | | | | | | | | | | | | Consider this test case: #define EMPTY int foo = 1+EMPTY+4; The expression should compile as the sequence of tokens 1, PLUS, UNARY_POSITIVE, 4. But glcpp has been failing for this case since it results in the string "1++4" which a compiler correctly sees as a syntax error, (1, POST_INCREMENT, 4). We fix this by changing any macro with an empty definition to result in a single SPACE token rather than nothing. This then gives "1+ +4" which compiles correctly. This commit does touch up the two existing test cases which already have empty macros, (to add the space to the expected result). It also adds a new test case to exercise the above scenario.
* glcpp: Add missing include in xtalloc.cCarl Worth2010-07-201-1/+1
| | | | | Without this, the compiler was legitimately complaining about missing declarations for all of the functions being defined here.
* glcpp: Add static keyword to several functions in the parser.Carl Worth2010-07-201-3/+3
| | | | This quiets warnings about missing declarations otherwise.
* glcpp: Avoid warnings in generated flex code.Carl Worth2010-07-201-1/+12
| | | | | | | | | | | We define the YY_NO_INPUT macro to avoid one needless function being generated. for the other needless functions, (yyunput and yy_top_state), we add a new UNREACHABLE start condition and call these functions from an action there. This doesn't change functionality at all, (since we never enter the UNREACHABLE start condition), but makes the compiler stop complaining about these two functions being defined but not used.
* glcpp-lex: Declare some generated functions to eliminate compiler warnings.Carl Worth2010-07-201-0/+5
| | | | | | It's really a bug in flex that these functions are generated with neither a declaration nor the 'static' keyword, but we can at least avoid the warnings this way.
* glcpp: Fix support for nested #ifdef and nested #ifndefCarl Worth2010-07-203-2/+85
| | | | | | | | | | | Previously, if the outer #ifdef/#ifndef evaluated to false, the inner directive would not be parsed correctly, (the identifier as the subject of the #ifdef/#ifndef would inadvertently be skipped along with the other content correctly being skipped). We fix this by setting the lexing_if state in each case here. We also add a new test to the test suite to ensure that this case is tested.
* glcpp: Support #if(expression) with no intervening space.Carl Worth2010-07-203-1/+8
| | | | And add a test case to ensure that this works.
* glcpp: Fix use-after-free error from #undef directive.Carl Worth2010-07-201-4/+1
| | | | | | By taking advantage of the recently-added hash_table_remove function. With this change, all existing tests are now valgrind-clean.
* hash_table: Add new hash_table_remove function.Carl Worth2010-07-202-0/+21
| | | | To allow for the removal of a single element from a hash table.
* glcpp: Make test suite test for valgrind cleanliness.Carl Worth2010-07-201-1/+21
| | | | | | As it turns out, 4 of our current tests are not valgrind clean, (use after free errors or so), so this will be helpful for investigating and fixing those.
* glcpp: Make test suite report final count of passed/total tests.Carl Worth2010-07-201-2/+22
| | | | And report PASS or FAIL for each test along the way as well.
* Build a standalone glcpp binary.Carl Worth2010-07-201-3/+17
| | | | | This is convenient for testing the preprocessor independent of the rest of mesa, (just run glcpp-test in the src/glsl/glcpp/tests).
* glcpp: Delete copies of hash_table.c, hash_table.h, and other headers.Carl Worth2010-07-205-526/+0
| | | | | | | | | | These were only ever intended to exist in the original, standalone implementation of glcpp, (with the idea of dropping them as soon as the code moved into mesa). The current build system wasn't compiling this C file, but the presence of the header files could cause problems if the two copies diverge in the future. We head those problems off by deleting al of these redundant files.
* glsl2: Fix handling of out values in function inlining.Eric Anholt2010-07-201-3/+6
| | | | | | | | | | The parameters[i] is our inlined variables representing the parameters, so they are always ir_var_auto. Walk the signature params in handling "out" values like we do for "in" values to find the mode. Fixes (with the previous 2 commits): glsl1-function call with in, out params glsl1-function call with inout params
* glsl2: Don't mark a variable as constant if it was used as an out param.Eric Anholt2010-07-201-0/+23
|
* glsl2: Always insert function calls into the instruction stream.Eric Anholt2010-07-201-1/+24
| | | | | | If they have a return value, this means putting it into a temporary and making a deref of the temp be the rvalue, since we don't know if the rvalue will be used or not.
* glsl2: Add definitions of the builtin constants present in GLSL 1.10.Eric Anholt2010-07-204-9/+77
| | | | | Fixes: glsl1-built-in constants
* glsl2: Fix asin() implementation.Eric Anholt2010-07-202-122/+138
| | | | | | | | | | I'd flipped around the order of two operations in paren-balancing adventures, and left out the multiply by sign(x) required for negative x. Fixes: glsl1-acos(vec4) function glsl1-asin(vec4) function glsl1-atan(vec4) function
* glsl2: notEqual() produces a boolean value, not the base type of the args.Eric Anholt2010-07-202-36/+36
| | | | | | Fixes: glsl1-vector relational (bvec2 ==,!=) glsl1-vector relational (vec4 !=)
* glsl2: Constant-fold assignment conditions.Eric Anholt2010-07-201-0/+13
|
* glsl2: Don't validate IR if there were compilation errorsIan Romanick2010-07-201-3/+3
|
* ir_to_mesa: Fix swizzled writemasks with swapped component ordering.Eric Anholt2010-07-201-34/+27
| | | | | | | | I hadn't noticed you could do this, but glsl1 tests caught it. Fixes: glsl1-Swizzled writemask glsl1-Swizzled writemask (2) glsl1-Swizzled writemask (rgba) glsl1-Swizzled writemask (stpq)
* linker: Remove the FINISHME comment for intrastage linkingIan Romanick2010-07-191-1/+2
|
* linker: Remove redundant check for 'main' in shadersIan Romanick2010-07-191-10/+0
| | | | This is now handled in link_intrastage_shaders.
* linker: Track and validate GLSL versions used in shadersIan Romanick2010-07-194-0/+27
|
* glsl2: Use Elements macroIan Romanick2010-07-192-11/+18
|
* linker: Recursively resolve function calls in imported functionsIan Romanick2010-07-191-3/+46
|
* linker: look up function signatures during linking instead of using calleeIan Romanick2010-07-191-24/+59
| | | | | | | Instead of using ir_call::callee, search for the signature in the linked shader. This will allow resolving calls from functions imported from other shaders. The ir_call::callee pointer in the imported function will still reference a signature in the original shader.
* linker: Pull find_matching_signature out of call_link_visitorIan Romanick2010-07-191-21/+27
| | | | | | The list of shaders to search needs to be provided as an explicit parameter to support coming changes. At that point there is no reason for it to be in the class. Also, fix some of the 'const' decorators.
* glsl2: Explicitly walk lists in ir_function::parameter_lists_matchIan Romanick2010-07-192-25/+23
| | | | | | Give ir_function::parameter_lists_match_exist similar treatment. Make the parameters const, and propogate the constness as far as it will trivially go.
* linker: Add comment about bug in initializer handlingIan Romanick2010-07-191-0/+8
|
* linker: First bits of intrastage, intershader function linkingIan Romanick2010-07-194-0/+214
| | | | | | This handles the easy case of linking a function in a different compilation unit that doesn't call any functions or reference any global variables.
* ir_function_signature: Make actual_parameters publicIan Romanick2010-07-191-3/+3
|
* linker: Remove some unnecessary includesIan Romanick2010-07-191-2/+0
|
* exec_list: Fix foreach_list_safe.Kenneth Graunke2010-07-192-13/+8
| | | | | | | | It now works correctly when nodes are removed, as it was originally intended to do; it no longer processes nodes added to the list before the current node, nor those added immediately after the current node. This matches the behavior of Linux's list_for_each_safe.
* linker: Use foreach_list_safe in move_non_declarationsIan Romanick2010-07-191-1/+1
| | | | | | The node being processed may be removed from the list and put in a different list. Not using the safe version caused list processing to change streams after moving a node.
* linker: Move global instructions from the linked shader firstIan Romanick2010-07-191-4/+8
| | | | | | For the shader containing 'main', use the linked shader (i.e., the clone of the original shader that contained main) as the source for global instructions to move into main.