summaryrefslogtreecommitdiffstats
path: root/src/glsl
Commit message (Collapse)AuthorAgeFilesLines
* linker: Check that initializers for global variables matchIan Romanick2011-11-037-7/+81
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This requires tracking a couple extra fields in ir_variable: * A flag to indicate that a variable had an initializer. * For non-const variables, a field to track the constant value of the variable's initializer. For variables non-constant initalizers, ir_variable::has_initializer will be true, but ir_variable::constant_initializer will be NULL. The linker can use the values of these fields to check adherence to the GLSL 4.20 rules for shared global variables: "If a shared global has multiple initializers, the initializers must all be constant expressions, and they must all have the same value. Otherwise, a link error will result. (A shared global having only one initializer does not require that initializer to be a constant expression.)" Previous to 4.20 the GLSL spec simply said that initializers must have the same value. In this case of non-constant initializers, this was impossible to determine. As a result, no vendor actually implemented that behavior. The 4.20 behavior matches the behavior of NVIDIA's shipping implementations. NOTE: This is candidate for the 7.11 branch. This patch also needs the preceding patch "glsl: Refactor generate_ARB_draw_buffers_variables to use add_builtin_constant" Signed-off-by: Ian Romanick <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=34687 Reviewed-by: Kenneth Graunke <[email protected]> Acked-by: Paul Berry <[email protected]>
* glsl: Refactor generate_ARB_draw_buffers_variables to use add_builtin_constantIan Romanick2011-11-031-7/+4
| | | | | | | | v2: Remove int cast based on feedback from Ken. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Acked-by: Paul Berry <[email protected]>
* glsl: Put all bitfields in ir_variable together for better packingIan Romanick2011-11-031-8/+8
| | | | | | | | | The diff looks weird because ir_variable::depth_layout was between the last two bitfields in the structure. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Acked-by: Paul Berry <[email protected]>
* linker: Fix the indentation of a block in cross_validate_globalsIan Romanick2011-11-031-25/+32
| | | | | | | | I suspect the indentation got messed up during a code merge. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Acked-by: Paul Berry <[email protected]>
* glsl: add support for GL_OES_EGL_image_externalChia-I Wu2011-11-0315-1/+70
| | | | | | | | | | This extension introduces a new sampler type: samplerExternalOES. texture2D (and texture2DProj) can be used to do a texture look up in an external texture. Reviewed-by: Brian Paul <[email protected]> Acked-by: Jakob Bornecrantz <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
* glsl: Fix type mismatch when incrementing or decrementing uint.Paul Berry2011-11-021-8/+24
| | | | | | | | | | | When converting an expression like "++x" to GLSL IR we were failing to account for the possibility that x might be an unsigned integral type. As a result the user would receive a bogus error message "Could not implicitly convert operands to arithmetic operator". Fixes piglit tests {vs,fs}-{increment,decrement}-uint. Reviewed-by: Kenneth Graunke <[email protected]>
* scons: include src/glsl/Makefile.sourcesChia-I Wu2011-11-021-68/+14
| | | | Reviewed-by: Brian Paul <[email protected]>
* android: include src/glsl/Makefile.sourcesChia-I Wu2011-11-021-86/+10
| | | | | | | | | | This also fixes the build error due to missing link_uniforms.cpp in the source lists. Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Chad Versace <[email protected]> [olv: the missing link_uniforms.cpp was added before this patch is committed]
* glsl: Refactor source lists to Makefile.sourcesChia-I Wu2011-11-022-73/+113
| | | | | | | | With the hope that Android.mk and SConscript can share the file to reduce future breakage. Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Chad Versace <[email protected]>
* Build link_uniforms for androidEugeni Dodonov2011-11-011-0/+1
| | | | | | Otherwise android-x86 build fails. Signed-off-by: Eugeni Dodonov <[email protected]>
* ralloc: Use _vscprintf on MinGW.José Fonseca2011-11-011-1/+7
| | | | | | | | MinGW uses MSVC's runtime DLLs for most of C runtime's functions, and there has same semantics for vsnprintf. Not sure how this worked until now -- maybe one of the internal vsnprintf implementations was taking precedence.
* mesa: Add glsl_type::get_scalar_type() function.Paul Berry2011-10-312-0/+34
| | | | | | | | This function is similar to get_base_type(), but when called on arrays, it returns the scalar type composing the array. For example, glsl_type(vec4[]) => float_type. Acked-by: Kenneth Graunke <[email protected]>
* glsl: Add isinf() and isnan() builtins.Paul Berry2011-10-314-4/+34
| | | | | | | | | | | | | The implementations are as follows: isinf(x) = (abs(x) == +infinity) isnan(x) = (x != x) Note: the latter formula is not necessarily obvious. It works because NaN is the only floating point number that does not equal itself. Fixes piglit tests "isinf-and-isnan fs_basic" and "isinf-and-isnan vs_basic".
* glsl: Add '.ir' extension to builtin IR filesPaul Berry2011-10-3166-3/+9
| | | | | | | | This patch adds the extension '.ir' to all the files in src/glsl/builtins/ir/, and changes generate_builtins.py so that it no longer globs on '*' to find the files to build. This prevents spurious files (such as EMACS' infamous *~ backup files) from breaking the build.
* glsl: Fix copy-paste error in constant_expression_value(ir_binop_nequal)Paul Berry2011-10-311-1/+1
| | | | | | | | | | | The implementation of ir_binop_nequal in constant_expression_value() appears to have been copy-and-pasted from the implementation of ir_binop_equal, but with all instances of '==' changed to '!='. This is correct except for one minor flaw: one of those '==' operators was in an assertion checking that the types of the two arguments were equal. That one needs to stay an '=='. Fixes piglit tests {fs,vs}-inline-notequal.
* glsl: Fix compilation of glsl_lexer.ll with MSVC.Morgan Armand2011-10-291-0/+4
| | | | strtoull is not supported on msvc (as there is no C99 support).
* glsl: Clean-up spurious error message on bad structure definitionsIan Romanick2011-10-281-6/+24
| | | | | | | | | | | | | | | | | | | Previously a shader like int X; struct X { int i; }; void main() { gl_Position = vec4(0.0); } would generate two error message: 0:2(19): error: struct `X' previously defined 0:2(20): error: incomplete declaration The first one is the real error, and the second is spurious. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
* glsl: Generate an error for array-of-array declarationsIan Romanick2011-10-281-2/+14
| | | | | | | | | | | | Other parts of the code already caught things like 'float x[4][2]'. However, nothing caught 'float [4] x[2]'. Fixes piglit test array-multidimensional-new-syntax.vert. NOTE: This is candidate for the 7.11 branch. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
* glsl: Implement GLSL 1.30's literal integer range restrictions.Eric Anholt2011-10-281-8/+45
| | | | | | | | | | | | | | | | From page 22 (28 of PDF) of GLSL 1.30 spec: It is an error to provide a literal integer whose magnitude is too large to store in a variable of matching signed or unsigned type. Unsigned integers have exactly 32 bits of precision. Signed integers use 32 bits, including a sign bit, in two's complement form. Fixes piglit int-literal-too-large-0[123].frag. v2: Take care with INT_MIN, use stroull, and make it a function. Reviewed-by: Paul Berry <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
* glsl: Remove pointless uses of glsl_type::get_base_type().Kenneth Graunke2011-10-282-7/+3
| | | | | | | | These are effectively doing type->get_base_type()->base_type, which is equivalent to type->base_type. Just use that, as it's simpler. Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
* glsl: add ir_variable::determine_interpolation_mode() function.Paul Berry2011-10-272-0/+26
| | | | | | | | This function determines how a variable should be interpolated based both on interpolation qualifiers and the current shade model. Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Eric Anholt <[email protected]>
* glsl: Distinguish between no interpolation qualifier and 'smooth'Paul Berry2011-10-273-2/+9
| | | | | | | | | | | | | | | Previously, we treated the 'smooth' qualifier as equivalent to no qualifier at all. However, this is incorrect for the built-in color variables (gl_FrontColor, gl_BackColor, gl_FrontSecondaryColor, and gl_BackSecondaryColor). For those variables, if there is no qualifier at all, interpolation should be flat if the shade model is GL_FLAT, and smooth if the shade model is GL_SMOOTH. To make this possible, I added a new value to the glsl_interp_qualifier enum, INTERP_QUALIFIER_NONE. Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Eric Anholt <[email protected]>
* mesa: Expose GLSL interpolation qualifiers in gl_fragment_program.Paul Berry2011-10-275-31/+48
| | | | | | | | | | | | | | | | | This patch makes GLSL interpolation qualifiers visible to drivers via the array InterpQualifier[] in gl_fragment_program, so that they can easily be used by driver back-ends to select the correct interpolation mode. Previous to this patch, the GLSL compiler was using the enum ir_variable_interpolation to represent interpolation types. Rather than make a duplicate enum in core mesa to represent the same thing, I moved the enum into mtypes.h and renamed it to be more consistent with the other enums defined there. Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Eric Anholt <[email protected]>
* glsl: Rename remaining internal builtins from gl_MESA* to gl_*MESA.Eric Anholt2011-10-262-9/+9
| | | | | | This matches the usual convention for extension builtin variables. Reviewed-by: Kenneth Graunke <[email protected]>
* ralloc: Move declaration before code.Vinson Lee2011-10-251-1/+2
| | | | Fixes build error with MSVC.
* scons: Add link_uniforms.cpp to SConscript.Vinson Lee2011-10-251-0/+1
|
* linker: Add uniform_field_visitor class to process leaf fields of a uniformIan Romanick2011-10-253-0/+129
| | | | | Signed-off-by: Ian Romanick <[email protected]> Signed-off-by: Kenneth Graunke <[email protected]>
* ralloc: Add new [v]asprintf_rewrite_tail functions.Kenneth Graunke2011-10-252-4/+80
| | | | | | | | | | | | | | | | | | This can be useful if you want to create a bunch of temporary strings with a common prefix. For example, when iterating over uniform structure fields, one might want to create temporary strings like "pallete.primary", "palette.outline", and "pallette.shadow". This could be done by overwriting the '.' with a null-byte and calling ralloc_asprintf_append, but that incurs the cost of strlen("pallete") every time...when this is already known. These new functions allow you rewrite the tail of the string, given a starting index. If the starting index is the length of the string, this is equivalent to appending. Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
* linker: Eliminate more dead code after demoting shader inputs and outputsIan Romanick2011-10-251-4/+22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Consider the following vertex shader and fragment shader: // vertex shader varying vec4 v; uniform vec4 u; void main() { gl_Position = vec4(0.0); v = u; } // fragment shader void main() { gl_FragColor = vec4(0.0); } Since the fragment shader does not use 'v', it is demoted from a varying to a simple global variable. Once that happens, the assignment to 'v' is useless, and it should be removed. In addition, 'u' is no longer active, and it should also be removed. Performing extra dead code elimination after demoting shader inputs and outputs takes care of this. This elimination must occur before assigning uniform locations, or the declaration of 'u' cannot be removed. This change *breaks* the piglit test getuniform-01, but that test is already incorrect. The test uses a vertex shader that assigns to a user-defined varying, but it has no fragment shader. Since Mesa does not support ARB_separate_shader_objects (we only support the EXT version), the linker correctly eliminates the user-defined varying. The cascading effect is that the uniform queried by the C code of the test is also (correctly) eliminated. Signed-off-by: Ian Romanick <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41980 Tested-by: Brian Paul <[email protected]> Cc: Bryan Cain <[email protected]> Cc: Vinson Lee <[email protected]> Cc: José Fonseca <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Yuanhan Liu <[email protected]>
* glsl: Add uniform_locations_assigned parameter to do_dead_code opt passIan Romanick2011-10-256-12/+39
| | | | | | | | | | | | | | | | | Setting this flag prevents declarations of uniforms from being removed from the IR. Since the IR is directly used by several API functions that query uniforms in shaders, uniform declarations cannot be removed after the locations have been set. However, it should still be safe to reorder the declarations (this is not tested). Signed-off-by: Ian Romanick <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41980 Tested-by: Brian Paul <[email protected]> Reviewed-by: Bryan Cain <[email protected]> Cc: Vinson Lee <[email protected]> Cc: José Fonseca <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Yuanhan Liu <[email protected]>
* glsl: Fix gl_NormalMatrix swizzle setup to match i965's invariants.Eric Anholt2011-10-241-3/+3
| | | | | | | | | | | | | | | | | | | | A driver trying to set up builtin uniforms is faced with a problem: How do I walk the ir_variable structure (representing an array of structs, or array of matrices, or struct, or whatever), and set up driver structures so that dereference of that uniform gets the corresponding ParameterValues[] entry. The rule in general is that each corresponding vector-sized field of an array of structs is one builtin uniform state slot. i965 relied on another invariant: each state slot has a number of unique channel swizzles corresponding to the number of elements in the field's vector, to avoid needing to walk the glsl_type in parallel to get at vector_elements. All of the builtin uniforms followed this behavior, except for gl_NormalMatrix. That's a mat3 (so 3 vec3s), but it was swizzled as 3 vec4s. Fixes piglit glsl-fs-normalmatrix. Reviewed-by: Paul Berry <[email protected]>
* glsl: Add gl_MaxVaryingComponents in GLSL 1.30.Eric Anholt2011-10-241-0/+2
| | | | | | | | | This is the new name for gl_MaxVaryingFloats now that non-float varyings exist. Fixes piglit glsl-1.30/execution/maximums/gl_MaxVaryingFloats Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
* glsl: Add support for constant expression evaluation on round(), roundEven().Eric Anholt2011-10-231-0/+29
| | | | | | | | | | | | v2: Avoid the C99 rounding functions, because I don't trust get/setting the C99 rounding mode from inside our library not having other side effects. Instead, open-code roundEven() behavior around Mesa's IROUND, which we're already testing for C99 rounding mode safety. Fixes glsl-1.30/compiler/built-in-functions/round* Reviewed-by: Kenneth Graunke <[email protected]>
* glsl: Short-circuit lower_if_to_cond_assign when MaxIfDepth is UINT_MAX.Kenneth Graunke2011-10-211-0/+3
| | | | | | | | | | Setting MaxIfDepth to UINT_MAX effectively means "don't lower anything." Explicitly checking for this common case allows us to avoid walking the IR, computing nesting levels, and so on. Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Bryan Cain <[email protected]>
* ir_to_mesa: Move some things outside the 'extern "C"' blocksIan Romanick2011-10-183-7/+0
| | | | | | | | | | | Having a few of these includes or forward declarations inside the 'extern "C"' block can cause problems later. Specifically, it prevents C++ linkage functions from being added to ir_to_mesa.h and makes G++ angry if 'struct foo' is seen both inside and outside an 'extern "C"'. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
* glsl: Stop tree grafting if a variable is overwritten as an 'out' param.Kenneth Graunke2011-10-181-11/+28
| | | | | | | | | | | | | | | While reviewing some compiler cleanups I'd sent out, Paul noticed that tree grafting wasn't taking "out" parameters into account. Further investigation revealed that it isn't strictly necessary: ir_call ends basic blocks, and tree grafting currently only operates on basic blocks. So calls already kill grafts. However, just to be safe, this patch makes "out" parameters explicitly kill grafts. Paul and I both prefer this. It's a bit clearer. Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Paul Berry <[email protected]>
* mesa: Add a flag for shader programs to allow SSO linkage in GLES2.Eric Anholt2011-10-181-1/+2
| | | | | | | | On converting fixed function programs to generate GLSL, the linker became cranky that we were trying to make something that wasn't a linked vertex+fragment program. Given that the Mesa GLES2 drivers also support desktop GL with EXT_sso, just telling the linker to shut up seems like the easiest solution.
* glsl: Add gl_CurrentAttrib{Vert,Frag}MESA internal builtin uniforms.Eric Anholt2011-10-181-1/+24
| | | | | These will be used by the FF VS/FS to represent the current attributes when they don't have an active vertex array.
* linker: Fix a slightly incorrect commentIan Romanick2011-10-101-1/+4
| | | | | Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
* glsl: Remove unused method ir_variable::component_slotsIan Romanick2011-10-072-16/+0
| | | | | | Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
* glsl: Remove version check when looking for identifiers containing "__".Jason Wood2011-10-061-2/+1
| | | | Signed-off-by: Kenneth Graunke <[email protected]>
* glsl: Consider "__" in identifers as reserved.Eric Anholt2011-10-051-0/+13
| | | | | | Fixes double-underscore-*.frag. Reviewed-by: Kenneth Graunke <[email protected]>
* mesa: Add a gl_vert_result for gl_ClipVertex.Paul Berry2011-10-051-19/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Before this patch, clip planes didn't work properly in Mesa when using vertex shaders, because Mesa assigned both gl_ClipVertex and gl_Position to the same gl_vert_result (VERT_RESULT_HPOS). As a result, backends couldn't distinguish between the two variables, so any shader that wrote different values to them would fail to work properly. This patch paves the way for proper support of gl_ClipVertex by creating a new enumerated value in gl_vert_result for it (VERT_RESULT_CLIP_VERTEX). After this patch, a back-end may add support for gl_ClipVertex using the following algorithm: - If using a user-supplied GLSL vertex shader: - If the bit corresponding to VERT_RESULT_CLIP_VERTEX is set in gl_program::OutputsWritten: - Clip using the vertex shader output VERT_RESULT_CLIP_VERTEX and the clip planes defined in gl_context::Transform.EyeUserPlane. - Else: - Clip using the vertex shader output VERT_RESULT_HPOS and the clip planes defined in gl_context::Transform.EyeUserPlane. - Else (either using fixed function or an ARB vertex program): - Clip using the vertex shader output VERT_RESULT_HPOS and the clip planes defined in gl_context::Transform._ClipUserPlane (*) where (*) represents the normal Mesa behavior before this patch. An example of implementing the above algorithm can be found in the patch that follows this one, which implements gl_ClipVertex in i965 Gen6. Reviewed-by: Kenneth Graunke <[email protected]>
* glsl: Remove unneeded headers.Stéphane Marchesin2011-10-042-2/+0
|
* linker: Use gl_shader_program::AttributeBindings for attrib locationsIan Romanick2011-10-041-74/+64
| | | | | Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
* glsl: Delete symbol table in post-link shadersIan Romanick2011-10-041-0/+8
| | | | | | | | | | The symbol table in the linked shaders may contain references to variables that were removed (e.g., unused uniforms). Since it may contain junk, there is no possible valid use. Delete it and set the pointer to NULL. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
* mesa: Remove ARB_draw_buffers extension enable flagIan Romanick2011-10-041-1/+0
| | | | | | | | | | | | | All drivers in Mesa have supported this extension for eons. This extension is an optional features in desktop OpenGL (via GL_ARB_draw_buffers) and OpenGL ES 2.x (via GL_NV_draw_buffers). The extension is not usable in OpenGL ES 1.x. There is no glDrawBuffers* entry point in OpenGL ES 1.x contexts, and glGet*v generate errors when MAX_DRAW_BUFFERS or DRAW_BUFFERi is queried. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Brian Paul <[email protected]>
* glcpp: Add a test for #elif with an undefined macro.Carl Worth2011-09-302-0/+8
| | | | | | | | | | | | | | | | | | As written, this test correctly raises an error for #elif being used with an undefined macro (and not as an argument to "defined"). If the preceding #if were '#if 1' then this diagnositc would correctly be hidden. That allows code such as the following to not raise an error: #ifndef MAYBE_UNDEFINED #elif MAYBE_UNDEFINED < 5 ... #endif So this test case is working as expected already. We add it here just to improve test coverage. Reviewed-by: Kenneth Graunke <[email protected]> Signed-off-by: Carl Worth <[email protected]>
* glcpp: Raise error if defining any macro containing two consecutive underscoresCarl Worth2011-09-303-3/+7
| | | | | | | | | | | | | | | | | | The specification reserves any macro name containing two consecutive underscores, (anywhere within the name). Previously, we only raised this error for macro names that started with two underscores. Fix the implementation to check for two underscores anywhere, and also update the corresponding 086-reserved-macro-names test. This also fixes the following two piglit tests: spec/glsl-1.30/preprocessor/reserved/double-underscore-02.frag spec/glsl-1.30/preprocessor/reserved/double-underscore-03.frag Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Eric Anholt <[email protected]> Signed-off-by: Carl Worth <[email protected]>
* glcpp: Implement token pasting for non-function-like macrosCarl Worth2011-09-301-36/+47
| | | | | | | | | | | | | | | | | | | | This is as simple as abstracting one existing block of code into a function call and then adding a single call to that function for the case of a non-function-like macro. This fixes the recently-added 097-paste-with-non-function-macro test as well as the following piglit tests: spec/glsl-1.30/preprocessor/concat/concat-01.frag spec/glsl-1.30/preprocessor/concat/concat-02.frag Also, the concat-04.frag test now passes for the right reason. The test is intended to fail the compilation, but before this commit it was failing compilation (and hence passing the test) for the wrong reason. Reviewed-by: Kenneth Graunke <[email protected]> Signed-off-by: Carl Worth <[email protected]>