Mesa (master): mesa/cs: Add dispatch API stubs for ARB_compute_shader.
Module: Mesa Branch: master Commit: 79134cb51609724cc4d94ade12dc52a09e2e91db URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=79134cb51609724cc4d94ade12dc52a09e2e91db Author: Paul Berry Date: Mon Jan 6 15:08:04 2014 -0800 mesa/cs: Add dispatch API stubs for ARB_compute_shader. Reviewed-by: Matt Turner --- src/mapi/glapi/gen/ARB_compute_shader.xml | 40 + src/mapi/glapi/gen/Makefile.am|1 + src/mapi/glapi/gen/gl_API.xml |4 ++- src/mapi/glapi/gen/gl_genexec.py |1 + src/mesa/Makefile.sources |1 + src/mesa/SConscript |1 + src/mesa/main/compute.c | 54 + src/mesa/main/compute.h | 38 src/mesa/main/tests/dispatch_sanity.cpp |4 +-- 9 files changed, 141 insertions(+), 3 deletions(-) diff --git a/src/mapi/glapi/gen/ARB_compute_shader.xml b/src/mapi/glapi/gen/ARB_compute_shader.xml new file mode 100644 index 000..1db373e --- /dev/null +++ b/src/mapi/glapi/gen/ARB_compute_shader.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mapi/glapi/gen/Makefile.am b/src/mapi/glapi/gen/Makefile.am index 7354725..9e6fe52 100644 --- a/src/mapi/glapi/gen/Makefile.am +++ b/src/mapi/glapi/gen/Makefile.am @@ -91,6 +91,7 @@ API_XML = \ ARB_base_instance.xml \ ARB_blend_func_extended.xml \ ARB_color_buffer_float.xml \ + ARB_compute_shader.xml \ ARB_copy_buffer.xml \ ARB_debug_output.xml \ ARB_depth_buffer_float.xml \ diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml index 193ee37..0715bbf 100644 --- a/src/mapi/glapi/gen/gl_API.xml +++ b/src/mapi/glapi/gen/gl_API.xml @@ -8466,7 +8466,9 @@ http://www.w3.org/2001/XInclude"/> - +http://www.w3.org/2001/XInclude"/> + + http://www.w3.org/2001/XInclude"/> diff --git a/src/mapi/glapi/gen/gl_genexec.py b/src/mapi/glapi/gen/gl_genexec.py index 982286a..1765a51 100644 --- a/src/mapi/glapi/gen/gl_genexec.py +++ b/src/mapi/glapi/gen/gl_genexec.py @@ -58,6 +58,7 @@ header = """/** #include "main/clear.h" #include "main/clip.h" #include "main/colortab.h" +#include "main/compute.h" #include "main/condrender.h" #include "main/context.h" #include "main/convolve.h" diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources index 3cdcae2..bd02d3e 100644 --- a/src/mesa/Makefile.sources +++ b/src/mesa/Makefile.sources @@ -24,6 +24,7 @@ MAIN_FILES = \ $(SRCDIR)main/clear.c \ $(SRCDIR)main/clip.c \ $(SRCDIR)main/colortab.c \ + $(SRCDIR)main/compute.c \ $(SRCDIR)main/condrender.c \ $(SRCDIR)main/context.c \ $(SRCDIR)main/convolve.c \ diff --git a/src/mesa/SConscript b/src/mesa/SConscript index 5b3358d..b52bbdc 100644 --- a/src/mesa/SConscript +++ b/src/mesa/SConscript @@ -52,6 +52,7 @@ main_sources = [ 'main/clear.c', 'main/clip.c', 'main/colortab.c', +'main/compute.c', 'main/condrender.c', 'main/context.c', 'main/convolve.c', diff --git a/src/mesa/main/compute.c b/src/mesa/main/compute.c new file mode 100644 index 000..575 --- /dev/null +++ b/src/mesa/main/compute.c @@ -0,0 +1,54 @@ +/* + * Copyright © 2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "glheader.h" +#include "compute.h" +#include "context.h" + +void GLAPIENTRY +_mesa_DispatchCompute(GLuint num_groups_x, + GLuint num_groups_y, +
Mesa (master): glsl/cs: update main.cpp to use the ".comp" extension for compute shaders.
Module: Mesa Branch: master Commit: c15064c1691764e858d05065f10007aceec9a7ac URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c15064c1691764e858d05065f10007aceec9a7ac Author: Paul Berry Date: Tue Jan 7 09:00:02 2014 -0800 glsl/cs: update main.cpp to use the ".comp" extension for compute shaders. Reviewed-by: Matt Turner --- src/glsl/main.cpp |2 ++ 1 file changed, 2 insertions(+) diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp index afc15cb..864c929 100644 --- a/src/glsl/main.cpp +++ b/src/glsl/main.cpp @@ -364,6 +364,8 @@ main(int argc, char **argv) shader->Type = GL_GEOMETRY_SHADER; else if (strncmp(".frag", ext, 5) == 0) shader->Type = GL_FRAGMENT_SHADER; + else if (strncmp(".comp", ext, 5) == 0) + shader->Type = GL_COMPUTE_SHADER; else usage_fail(argv[0]); shader->Stage = _mesa_shader_enum_to_shader_stage(shader->Type); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa/cs: Create the gl_compute_program struct, and the code to initialize it.
Module: Mesa Branch: master Commit: 47d480e3e4850ef8934775570444feea503295d7 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=47d480e3e4850ef8934775570444feea503295d7 Author: Paul Berry Date: Tue Jan 7 15:50:39 2014 -0800 mesa/cs: Create the gl_compute_program struct, and the code to initialize it. Reviewed-by: Matt Turner --- src/mesa/main/mtypes.h |7 +++ src/mesa/program/program.c | 20 src/mesa/program/program.h |5 + 3 files changed, 32 insertions(+) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index b793227..6af4db6 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2181,6 +2181,13 @@ struct gl_fragment_program }; +/** Compute program object */ +struct gl_compute_program +{ + struct gl_program Base; /**< base class */ +}; + + /** * State common to vertex and fragment programs. */ diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c index ea8eb0d..fa80bc5 100644 --- a/src/mesa/program/program.c +++ b/src/mesa/program/program.c @@ -279,6 +279,21 @@ _mesa_init_vertex_program( struct gl_context *ctx, struct gl_vertex_program *pro /** + * Initialize a new compute program object. + */ +struct gl_program * +_mesa_init_compute_program(struct gl_context *ctx, + struct gl_compute_program *prog, GLenum target, + GLuint id) +{ + if (prog) + return _mesa_init_program_struct( ctx, &prog->Base, target, id ); + else + return NULL; +} + + +/** * Initialize a new geometry program object. */ struct gl_program * @@ -324,6 +339,11 @@ _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id) CALLOC_STRUCT(gl_geometry_program), target, id); break; + case GL_COMPUTE_PROGRAM_NV: + prog = _mesa_init_compute_program(ctx, +CALLOC_STRUCT(gl_compute_program), +target, id); + break; default: _mesa_problem(ctx, "bad target in _mesa_new_program"); prog = NULL; diff --git a/src/mesa/program/program.h b/src/mesa/program/program.h index 4351e05..ef69824 100644 --- a/src/mesa/program/program.h +++ b/src/mesa/program/program.h @@ -84,6 +84,11 @@ _mesa_init_geometry_program(struct gl_context *ctx, GLenum target, GLuint id); extern struct gl_program * +_mesa_init_compute_program(struct gl_context *ctx, + struct gl_compute_program *prog, + GLenum target, GLuint id); + +extern struct gl_program * _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id); extern void ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl/cs: Change some linker loops to use MESA_SHADER_FRAGMENT as a bound.
Module: Mesa Branch: master Commit: 28e526d5580739e8b4098cd08c644b9157fdc94c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=28e526d5580739e8b4098cd08c644b9157fdc94c Author: Paul Berry Date: Mon Jan 6 19:47:25 2014 -0800 glsl/cs: Change some linker loops to use MESA_SHADER_FRAGMENT as a bound. Linker loops that iterate through all the stages in the pipeline need to use MESA_SHADER_FRAGMENT as a bound, so that we can add an additional MESA_SHADER_COMPUTE stage, without it being erroneously included in the pipeline. Reviewed-by: Matt Turner --- src/glsl/linker.cpp |8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 93b4754..32825ba 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -2098,7 +2098,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) unsigned prev; - for (prev = 0; prev < MESA_SHADER_STAGES; prev++) { + for (prev = 0; prev <= MESA_SHADER_FRAGMENT; prev++) { if (prog->_LinkedShaders[prev] != NULL) break; } @@ -2106,7 +2106,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) /* Validate the inputs of each stage with the output of the preceding * stage. */ - for (unsigned i = prev + 1; i < MESA_SHADER_STAGES; i++) { + for (unsigned i = prev + 1; i <= MESA_SHADER_FRAGMENT; i++) { if (prog->_LinkedShaders[i] == NULL) continue; @@ -2201,7 +2201,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) } unsigned first; - for (first = 0; first < MESA_SHADER_STAGES; first++) { + for (first = 0; first <= MESA_SHADER_FRAGMENT; first++) { if (prog->_LinkedShaders[first] != NULL) break; } @@ -2233,7 +2233,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) * eliminated if they are (transitively) not used in a later stage. */ int last, next; - for (last = MESA_SHADER_STAGES-1; last >= 0; last--) { + for (last = MESA_SHADER_FRAGMENT; last >= 0; last--) { if (prog->_LinkedShaders[last] != NULL) break; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa/cs: Handle compute shaders in _mesa_use_program().
Module: Mesa Branch: master Commit: 9b34ae2e64fd29fd4cd1cf18f7dd09116e02dc96 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9b34ae2e64fd29fd4cd1cf18f7dd09116e02dc96 Author: Paul Berry Date: Tue Jan 7 09:00:02 2014 -0800 mesa/cs: Handle compute shaders in _mesa_use_program(). v2: do cs after the ordered pipeline stages for consistency. Reviewed-by: Matt Turner --- src/mesa/main/shaderapi.c |1 + 1 file changed, 1 insertion(+) diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 519b200..987c48a 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -994,6 +994,7 @@ _mesa_use_program(struct gl_context *ctx, struct gl_shader_program *shProg) use_shader_program(ctx, GL_VERTEX_SHADER, shProg); use_shader_program(ctx, GL_GEOMETRY_SHADER_ARB, shProg); use_shader_program(ctx, GL_FRAGMENT_SHADER, shProg); + use_shader_program(ctx, GL_COMPUTE_SHADER, shProg); _mesa_active_program(ctx, shProg, "glUseProgram"); if (ctx->Driver.UseProgram) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa/cs: Implement MAX_COMPUTE_WORK_GROUP_INVOCATIONS constant.
Module: Mesa Branch: master Commit: c85c50997f073993b86c694dda7c18bbaca30bbf URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c85c50997f073993b86c694dda7c18bbaca30bbf Author: Paul Berry Date: Mon Jan 6 15:11:40 2014 -0800 mesa/cs: Implement MAX_COMPUTE_WORK_GROUP_INVOCATIONS constant. Reviewed-by: Matt Turner v2: Use CONTEXT_INT rather than CONTEXT_ENUM. Reviewed-by: Jordan Justen --- src/glsl/main.cpp |1 + src/glsl/standalone_scaffolding.cpp |1 + src/mesa/main/context.c |1 + src/mesa/main/get.c |1 + src/mesa/main/get_hash_params.py|3 +++ src/mesa/main/mtypes.h |1 + 6 files changed, 8 insertions(+) diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp index bb2054f..94bc1cc 100644 --- a/src/glsl/main.cpp +++ b/src/glsl/main.cpp @@ -53,6 +53,7 @@ initialize_context(struct gl_context *ctx, gl_api api) ctx->Const.MaxComputeWorkGroupSize[0] = 1024; ctx->Const.MaxComputeWorkGroupSize[1] = 1024; ctx->Const.MaxComputeWorkGroupSize[2] = 64; + ctx->Const.MaxComputeWorkGroupInvocations = 1024; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */ diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp index 748d7e9..475fbd8 100644 --- a/src/glsl/standalone_scaffolding.cpp +++ b/src/glsl/standalone_scaffolding.cpp @@ -144,6 +144,7 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api) ctx->Const.MaxComputeWorkGroupSize[0] = 1024; ctx->Const.MaxComputeWorkGroupSize[1] = 1024; ctx->Const.MaxComputeWorkGroupSize[2] = 64; + ctx->Const.MaxComputeWorkGroupInvocations = 1024; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */ diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index abebd82..4cf86bc 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -705,6 +705,7 @@ _mesa_init_constants(struct gl_context *ctx) ctx->Const.MaxComputeWorkGroupSize[0] = 1024; ctx->Const.MaxComputeWorkGroupSize[1] = 1024; ctx->Const.MaxComputeWorkGroupSize[2] = 64; + ctx->Const.MaxComputeWorkGroupInvocations = 1024; } diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index acd4d8c..2833a15 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -390,6 +390,7 @@ EXTRA_EXT(ARB_shader_atomic_counters); EXTRA_EXT(ARB_draw_indirect); EXTRA_EXT(ARB_shader_image_load_store); EXTRA_EXT(ARB_viewport_array); +EXTRA_EXT(ARB_compute_shader); static const int extra_ARB_color_buffer_float_or_glcore[] = { diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py index 3a7f531..2e8a116 100644 --- a/src/mesa/main/get_hash_params.py +++ b/src/mesa/main/get_hash_params.py @@ -751,6 +751,9 @@ descriptor=[ [ "MAX_GEOMETRY_IMAGE_UNIFORMS", "CONTEXT_INT(Const.Program[MESA_SHADER_GEOMETRY].MaxImageUniforms), extra_ARB_shader_image_load_store_and_geometry_shader"], [ "MAX_FRAGMENT_IMAGE_UNIFORMS", "CONTEXT_INT(Const.Program[MESA_SHADER_FRAGMENT].MaxImageUniforms), extra_ARB_shader_image_load_store"], [ "MAX_COMBINED_IMAGE_UNIFORMS", "CONTEXT_INT(Const.MaxCombinedImageUniforms), extra_ARB_shader_image_load_store"], + +# GL_ARB_compute_shader + [ "MAX_COMPUTE_WORK_GROUP_INVOCATIONS", "CONTEXT_INT(Const.MaxComputeWorkGroupInvocations), extra_ARB_compute_shader" ], ]}, # Enums restricted to OpenGL Core profile diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 08c5505..40e2e68 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3381,6 +3381,7 @@ struct gl_constants /** GL_ARB_compute_shader */ GLuint MaxComputeWorkGroupSize[3]; /* Array of x, y, z dimensions */ + GLuint MaxComputeWorkGroupInvocations; }; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/cs: Create the brw_compute_program struct, and the code to initialize it.
Module: Mesa Branch: master Commit: 3bbf93045a494e676f3f79d278701f55a9a41e7a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3bbf93045a494e676f3f79d278701f55a9a41e7a Author: Paul Berry Date: Tue Jan 7 15:51:13 2014 -0800 i965/cs: Create the brw_compute_program struct, and the code to initialize it. v2: Fix comment. Reviewed-by: Jordan Justen --- src/mesa/drivers/dri/i965/brw_context.h |8 src/mesa/drivers/dri/i965/brw_program.c | 11 +++ 2 files changed, 19 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index a0189b7..bee39fa 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -316,6 +316,14 @@ struct brw_fragment_program { GLuint id; /**< serial no. to identify frag progs, never re-used */ }; + +/** Subclass of Mesa compute program */ +struct brw_compute_program { + struct gl_compute_program program; + unsigned id; /**< serial no. to identify compute progs, never re-used */ +}; + + struct brw_shader { struct gl_shader base; diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c index a6a2403..1e35191 100644 --- a/src/mesa/drivers/dri/i965/brw_program.c +++ b/src/mesa/drivers/dri/i965/brw_program.c @@ -113,6 +113,17 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx, } } + case GL_COMPUTE_PROGRAM_NV: { + struct brw_compute_program *prog = CALLOC_STRUCT(brw_compute_program); + if (prog) { + prog->id = get_new_program_id(brw->intelScreen); + + return _mesa_init_compute_program(ctx, &prog->program, target, id); + } else { + return NULL; + } + } + default: assert(!"Unsupported target in brwNewProgram()"); return NULL; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/cs: Allow ARB_compute_shader to be enabled via env var.
Module: Mesa Branch: master Commit: 25268b930dbd9bc89c0cce83746c5ca2f534c016 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=25268b930dbd9bc89c0cce83746c5ca2f534c016 Author: Paul Berry Date: Mon Jan 6 15:12:05 2014 -0800 i965/cs: Allow ARB_compute_shader to be enabled via env var. This will allow testing of compute shader functionality before it is completed. To enable ARB_compute_shader functionality in the i965 driver, set INTEL_COMPUTE_SHADER=1. Reviewed-by: Jordan Justen --- src/mesa/drivers/dri/i965/brw_context.c | 11 ++- src/mesa/drivers/dri/i965/intel_extensions.c |3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index d9d1ae5..6a3a4f1 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -296,10 +296,17 @@ brw_initialize_context_constants(struct brw_context *brw) ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = max_samplers; else ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = 0; + if (getenv("INTEL_COMPUTE_SHADER")) { + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = BRW_MAX_TEX_UNIT; + ctx->Const.MaxUniformBufferBindings += 12; + } else { + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 0; + } ctx->Const.MaxCombinedTextureImageUnits = ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits + ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits + - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits; + ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits + + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits; ctx->Const.MaxTextureLevels = 14; /* 8192 */ if (ctx->Const.MaxTextureLevels > MAX_TEXTURE_LEVELS) @@ -423,9 +430,11 @@ brw_initialize_context_constants(struct brw_context *brw) ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters = MAX_ATOMIC_COUNTERS; ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicCounters = MAX_ATOMIC_COUNTERS; ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicCounters = MAX_ATOMIC_COUNTERS; + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicCounters = MAX_ATOMIC_COUNTERS; ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers = BRW_MAX_ABO; ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicBuffers = BRW_MAX_ABO; ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers = BRW_MAX_ABO; + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers = BRW_MAX_ABO; ctx->Const.MaxCombinedAtomicBuffers = 3 * BRW_MAX_ABO; } diff --git a/src/mesa/drivers/dri/i965/intel_extensions.c b/src/mesa/drivers/dri/i965/intel_extensions.c index 2b5ed0b..a0fd354 100644 --- a/src/mesa/drivers/dri/i965/intel_extensions.c +++ b/src/mesa/drivers/dri/i965/intel_extensions.c @@ -299,6 +299,9 @@ intelInitExtensions(struct gl_context *ctx) */ if (ctx->API == API_OPENGL_CORE) ctx->Extensions.ARB_viewport_array = true; + + if (getenv("INTEL_COMPUTE_SHADER")) + ctx->Extensions.ARB_compute_shader = true; } if (brw->gen == 5 || can_write_oacontrol(brw)) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa/cs: Add a MESA_SHADER_COMPUTE stage and update switch statements.
Module: Mesa Branch: master Commit: c61ec8d8e34e9bf30b3c4c84afa08f0a5b66b932 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c61ec8d8e34e9bf30b3c4c84afa08f0a5b66b932 Author: Paul Berry Date: Mon Jan 6 20:06:05 2014 -0800 mesa/cs: Add a MESA_SHADER_COMPUTE stage and update switch statements. This patch adds MESA_SHADER_COMPUTE to the gl_shader_stage enum. Also, where it is trivial to do so, it adds a compute shader case to switch statements that switch based on the type of shader. This avoids "unhandled switch case" compiler warnings. Reviewed-by: Matt Turner --- src/glsl/ast_to_hir.cpp |9 + src/glsl/builtin_variables.cpp| 17 + src/glsl/standalone_scaffolding.h |2 ++ src/mesa/main/context.c |8 src/mesa/main/mtypes.h|3 ++- src/mesa/main/shaderapi.c |5 + src/mesa/main/shaderobj.h |2 ++ src/mesa/program/prog_print.c |3 +++ src/mesa/program/program.h|4 9 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 8d096ad..fc28703 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -2155,6 +2155,12 @@ validate_explicit_location(const struct ast_type_qualifier *qual, fail = true; break; + + case MESA_SHADER_COMPUTE: + _mesa_glsl_error(loc, state, + "compute shader variables cannot be given " + "explicit locations"); + return; }; if (fail) { @@ -2337,6 +2343,9 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, if (var->data.mode == ir_var_shader_in) var->data.invariant = true; break; + case MESA_SHADER_COMPUTE: + /* Invariance isn't meaningful in compute shaders. */ + break; } } diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp index d6bc3c0..df560fb 100644 --- a/src/glsl/builtin_variables.cpp +++ b/src/glsl/builtin_variables.cpp @@ -356,6 +356,7 @@ public: void generate_vs_special_vars(); void generate_gs_special_vars(); void generate_fs_special_vars(); + void generate_cs_special_vars(); void generate_varyings(); private: @@ -868,6 +869,16 @@ builtin_variable_generator::generate_fs_special_vars() /** + * Generate variables which only exist in compute shaders. + */ +void +builtin_variable_generator::generate_cs_special_vars() +{ + /* TODO: finish this. */ +} + + +/** * Add a single "varying" variable. The variable's type and direction (input * or output) are adjusted as appropriate for the type of shader being * compiled. For geometry shaders using {ARB,EXT}_geometry_shader4, @@ -888,6 +899,9 @@ builtin_variable_generator::add_varying(int slot, const glsl_type *type, case MESA_SHADER_FRAGMENT: add_input(slot, type, name); break; + case MESA_SHADER_COMPUTE: + /* Compute shaders don't have varyings. */ + break; } } @@ -975,5 +989,8 @@ _mesa_glsl_initialize_variables(exec_list *instructions, case MESA_SHADER_FRAGMENT: gen.generate_fs_special_vars(); break; + case MESA_SHADER_COMPUTE: + gen.generate_cs_special_vars(); + break; } } diff --git a/src/glsl/standalone_scaffolding.h b/src/glsl/standalone_scaffolding.h index 327fef2..df783af 100644 --- a/src/glsl/standalone_scaffolding.h +++ b/src/glsl/standalone_scaffolding.h @@ -58,6 +58,8 @@ _mesa_shader_enum_to_shader_stage(GLenum v) return MESA_SHADER_FRAGMENT; case GL_GEOMETRY_SHADER: return MESA_SHADER_GEOMETRY; + case GL_COMPUTE_SHADER: + return MESA_SHADER_COMPUTE; default: assert(!"bad value in _mesa_shader_enum_to_shader_stage()"); return MESA_SHADER_VERTEX; diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index d0a1449..69835a5 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -498,6 +498,14 @@ init_program_limits(struct gl_context *ctx, gl_shader_stage stage, prog->MaxInputComponents = 16 * 4; /* old limit not to break tnl and swrast */ prog->MaxOutputComponents = 16 * 4; /* old limit not to break tnl and swrast */ break; + case MESA_SHADER_COMPUTE: + prog->MaxParameters = 0; /* not meaningful for compute shaders */ + prog->MaxAttribs = 0; /* not meaningful for compute shaders */ + prog->MaxAddressRegs = 0; /* not meaningful for compute shaders */ + prog->MaxUniformComponents = 4 * MAX_UNIFORMS; + prog->MaxInputComponents = 0; /* not meaningful for compute shaders */ + prog->MaxOutputComponents = 0; /* not meaningful for compute shaders */ + break; default: assert(0 && "Bad shader stage in init_program_limits()"); } diff --git a/src/mesa/main/mtypes.h
Mesa (master): mesa/cs: Handle compute shader local size during linking.
Module: Mesa Branch: master Commit: 28ce604b7f2b08b967b6a27051ecab04adaed575 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=28ce604b7f2b08b967b6a27051ecab04adaed575 Author: Paul Berry Date: Wed Jan 8 11:59:28 2014 -0800 mesa/cs: Handle compute shader local size during linking. Reviewed-by: Jordan Justen --- src/glsl/linker.cpp | 64 + src/mesa/main/mtypes.h| 17 src/mesa/main/shaderapi.c |7 + 3 files changed, 88 insertions(+) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 32825ba..6a07e4a 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -1287,6 +1287,69 @@ link_gs_inout_layout_qualifiers(struct gl_shader_program *prog, prog->Geom.VerticesOut = linked_shader->Geom.VerticesOut; } + +/** + * Perform cross-validation of compute shader local_size_{x,y,z} layout + * qualifiers for the attached compute shaders, and propagate them to the + * linked CS and linked shader program. + */ +static void +link_cs_input_layout_qualifiers(struct gl_shader_program *prog, +struct gl_shader *linked_shader, +struct gl_shader **shader_list, +unsigned num_shaders) +{ + for (int i = 0; i < 3; i++) + linked_shader->Comp.LocalSize[i] = 0; + + /* This function is called for all shader stages, but it only has an effect +* for compute shaders. +*/ + if (linked_shader->Stage != MESA_SHADER_COMPUTE) + return; + + /* From the ARB_compute_shader spec, in the section describing local size +* declarations: +* +* If multiple compute shaders attached to a single program object +* declare local work-group size, the declarations must be identical; +* otherwise a link-time error results. Furthermore, if a program +* object contains any compute shaders, at least one must contain an +* input layout qualifier specifying the local work sizes of the +* program, or a link-time error will occur. +*/ + for (unsigned sh = 0; sh < num_shaders; sh++) { + struct gl_shader *shader = shader_list[sh]; + + if (shader->Comp.LocalSize[0] != 0) { + if (linked_shader->Comp.LocalSize[0] != 0) { +for (int i = 0; i < 3; i++) { + if (linked_shader->Comp.LocalSize[i] != + shader->Comp.LocalSize[i]) { + linker_error(prog, "compute shader defined with conflicting " + "local sizes\n"); + return; + } +} + } + for (int i = 0; i < 3; i++) +linked_shader->Comp.LocalSize[i] = shader->Comp.LocalSize[i]; + } + } + + /* Just do the intrastage -> interstage propagation right now, +* since we already know we're in the right type of shader program +* for doing it. +*/ + if (linked_shader->Comp.LocalSize[0] == 0) { + linker_error(prog, "compute shader didn't declare local size\n"); + return; + } + for (int i = 0; i < 3; i++) + prog->Comp.LocalSize[i] = linked_shader->Comp.LocalSize[i]; +} + + /** * Combine a group of shaders for a single stage to generate a linked shader * @@ -1391,6 +1454,7 @@ link_intrastage_shaders(void *mem_ctx, ralloc_steal(linked, linked->UniformBlocks); link_gs_inout_layout_qualifiers(prog, linked, shader_list, num_shaders); + link_cs_input_layout_qualifiers(prog, linked, shader_list, num_shaders); populate_symbol_table(linked); diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 36d98ee..8d81aa1 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2185,6 +2185,11 @@ struct gl_fragment_program struct gl_compute_program { struct gl_program Base; /**< base class */ + + /** +* Size specified using local_size_{x,y,z}. +*/ + unsigned LocalSize[3]; }; @@ -2646,6 +2651,18 @@ struct gl_shader_program 0 if not present. */ } Vert; + /** +* Compute shader state - copied into gl_compute_program by +* _mesa_copy_linked_program_data(). +*/ + struct { + /** + * If this shader contains a compute stage, size specified using + * local_size_{x,y,z}. Otherwise undefined. + */ + unsigned LocalSize[3]; + } Comp; + /* post-link info: */ unsigned NumUserUniformStorage; struct gl_uniform_storage *UniformStorage; diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 987c48a..571e13c 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -1846,6 +1846,13 @@ _mesa_copy_linked_program_data(gl_shader_stage type, dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive; } break; + case MESA_SHADER_COMPUTE: { +
Mesa (master): mesa/cs: Implement MAX_COMPUTE_WORK_GROUP_COUNT constant.
Module: Mesa Branch: master Commit: 0398b69954eb8e73e9ae663ce200170ff70d216d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0398b69954eb8e73e9ae663ce200170ff70d216d Author: Paul Berry Date: Wed Jan 8 01:42:58 2014 -0800 mesa/cs: Implement MAX_COMPUTE_WORK_GROUP_COUNT constant. v2: Document that the 3-element array MaxComputeWorkGroupCount is indexed by dimension. Reviewed-by: Matt Turner Reviewed-by: Jordan Justen --- src/glsl/builtin_variables.cpp |4 src/glsl/glsl_parser_extras.cpp |2 ++ src/glsl/glsl_parser_extras.h |1 + src/glsl/main.cpp |3 +++ src/glsl/standalone_scaffolding.cpp |3 +++ src/mesa/main/context.c |3 +++ src/mesa/main/get.c |8 src/mesa/main/mtypes.h |1 + 8 files changed, 25 insertions(+) diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp index f96d489..3e7a845 100644 --- a/src/glsl/builtin_variables.cpp +++ b/src/glsl/builtin_variables.cpp @@ -682,6 +682,10 @@ builtin_variable_generator::generate_constants() } if (state->is_version(430, 0) || state->ARB_compute_shader_enable) { + add_const_ivec3("gl_MaxComputeWorkGroupCount", + state->Const.MaxComputeWorkGroupCount[0], + state->Const.MaxComputeWorkGroupCount[1], + state->Const.MaxComputeWorkGroupCount[2]); add_const_ivec3("gl_MaxComputeWorkGroupSize", state->Const.MaxComputeWorkGroupSize[0], state->Const.MaxComputeWorkGroupSize[1], diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index d256680..d45e63f 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -124,6 +124,8 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings; /* Compute shader constants */ + for (unsigned i = 0; i < Elements(this->Const.MaxComputeWorkGroupCount); i++) + this->Const.MaxComputeWorkGroupCount[i] = ctx->Const.MaxComputeWorkGroupCount[i]; for (unsigned i = 0; i < Elements(this->Const.MaxComputeWorkGroupSize); i++) this->Const.MaxComputeWorkGroupSize[i] = ctx->Const.MaxComputeWorkGroupSize[i]; diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index 802e0f0..20ed2cf 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -252,6 +252,7 @@ struct _mesa_glsl_parse_state { unsigned MaxAtomicBufferBindings; /* ARB_compute_shader */ + unsigned MaxComputeWorkGroupCount[3]; unsigned MaxComputeWorkGroupSize[3]; } Const; diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp index 94bc1cc..5ea57d5 100644 --- a/src/glsl/main.cpp +++ b/src/glsl/main.cpp @@ -50,6 +50,9 @@ initialize_context(struct gl_context *ctx, gl_api api) */ ctx->Const.GLSLVersion = glsl_version; ctx->Extensions.ARB_ES3_compatibility = true; + ctx->Const.MaxComputeWorkGroupCount[0] = 65535; + ctx->Const.MaxComputeWorkGroupCount[1] = 65535; + ctx->Const.MaxComputeWorkGroupCount[2] = 65535; ctx->Const.MaxComputeWorkGroupSize[0] = 1024; ctx->Const.MaxComputeWorkGroupSize[1] = 1024; ctx->Const.MaxComputeWorkGroupSize[2] = 64; diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp index 475fbd8..6c25010 100644 --- a/src/glsl/standalone_scaffolding.cpp +++ b/src/glsl/standalone_scaffolding.cpp @@ -141,6 +141,9 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api) ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 32; ctx->Const.MaxDrawBuffers = 1; + ctx->Const.MaxComputeWorkGroupCount[0] = 65535; + ctx->Const.MaxComputeWorkGroupCount[1] = 65535; + ctx->Const.MaxComputeWorkGroupCount[2] = 65535; ctx->Const.MaxComputeWorkGroupSize[0] = 1024; ctx->Const.MaxComputeWorkGroupSize[1] = 1024; ctx->Const.MaxComputeWorkGroupSize[2] = 64; diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 4cf86bc..f2f9bb3 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -702,6 +702,9 @@ _mesa_init_constants(struct gl_context *ctx) ctx->Const.MaxVertexAttribBindings = MAX_VERTEX_GENERIC_ATTRIBS; /* GL_ARB_compute_shader */ + ctx->Const.MaxComputeWorkGroupCount[0] = 65535; + ctx->Const.MaxComputeWorkGroupCount[1] = 65535; + ctx->Const.MaxComputeWorkGroupCount[2] = 65535; ctx->Const.MaxComputeWorkGroupSize[0] = 1024; ctx->Const.MaxComputeWorkGroupSize[1] = 1024; ctx->Const.MaxComputeWorkGroupSize[2] = 64; diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index 2833a15..32aa736 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -1929
Mesa (master): main/cs: Implement query for COMPUTE_WORK_GROUP_SIZE.
Module: Mesa Branch: master Commit: f5c5438e1fb9b5b1e83c7081da518d9943fc82e8 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f5c5438e1fb9b5b1e83c7081da518d9943fc82e8 Author: Paul Berry Date: Thu Jan 9 04:03:30 2014 -0800 main/cs: Implement query for COMPUTE_WORK_GROUP_SIZE. v2: Improve error message. Reviewed-by: Jordan Justen --- src/mesa/main/shaderapi.c | 18 ++ 1 file changed, 18 insertions(+) diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 571e13c..65b6b16 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -663,6 +663,24 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, GLint *param *params = shProg->NumAtomicBuffers; return; + case GL_COMPUTE_WORK_GROUP_SIZE: { + int i; + if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_compute_shader) + break; + if (!shProg->LinkStatus) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramiv(program not " + "linked)"); + return; + } + if (shProg->_LinkedShaders[MESA_SHADER_COMPUTE] == NULL) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramiv(no compute " + "shaders)"); + return; + } + for (i = 0; i < 3; i++) + params[i] = shProg->Comp.LocalSize[i]; + return; + } default: break; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl/cs: Handle compute shader local_size_{x,y, z} declaration.
Module: Mesa Branch: master Commit: 0fa74e848fd11c71bb70ea0a69650944e4f07571 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0fa74e848fd11c71bb70ea0a69650944e4f07571 Author: Paul Berry Date: Mon Jan 6 09:09:31 2014 -0800 glsl/cs: Handle compute shader local_size_{x,y,z} declaration. Reviewed-by: Jordan Justen --- src/glsl/ast.h | 34 ++ src/glsl/ast_to_hir.cpp | 79 src/glsl/ast_type.cpp | 14 ++ src/glsl/builtin_variables.cpp | 20 + src/glsl/glsl_lexer.ll |3 +- src/glsl/glsl_parser.yy | 94 ++- src/glsl/glsl_parser_extras.cpp | 51 +++-- src/glsl/glsl_parser_extras.h | 15 +++ src/mesa/main/mtypes.h | 11 + 9 files changed, 285 insertions(+), 36 deletions(-) diff --git a/src/glsl/ast.h b/src/glsl/ast.h index 2d6f3a2..61fd923 100644 --- a/src/glsl/ast.h +++ b/src/glsl/ast.h @@ -460,6 +460,12 @@ struct ast_type_qualifier { unsigned prim_type:1; unsigned max_vertices:1; /** \} */ + + /** + * local_size_{x,y,z} flags for compute shaders. Bit 0 represents + * local_size_x, and so on. + */ + unsigned local_size:3; } /** \brief Set of flags, accessed by name. */ q; @@ -510,6 +516,13 @@ struct ast_type_qualifier { int offset; /** +* Local size specified via GL_ARB_compute_shader's "local_size_{x,y,z}" +* layout qualifier. Element i of this array is only valid if +* flags.q.local_size & (1 << i) is set. +*/ + int local_size[3]; + + /** * Return true if and only if an interpolation qualifier is present. */ bool has_interpolation() const; @@ -989,6 +1002,27 @@ private: const GLenum prim_type; }; + +/** + * AST node representing a decalaration of the input layout for compute + * shaders. + */ +class ast_cs_input_layout : public ast_node +{ +public: + ast_cs_input_layout(const struct YYLTYPE &locp, const unsigned *local_size) + { + memcpy(this->local_size, local_size, sizeof(this->local_size)); + set_location(locp); + } + + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); + +private: + unsigned local_size[3]; +}; + /*@}*/ extern void diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index fc28703..a55c969 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -77,6 +77,7 @@ _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) state->toplevel_ir = instructions; state->gs_input_prim_type_specified = false; + state->cs_input_local_size_specified = false; /* Section 4.2 of the GLSL 1.20 specification states: * "The built-in functions are scoped in a scope outside the global scope @@ -5303,6 +5304,84 @@ ast_gs_input_layout::hir(exec_list *instructions, } +ir_rvalue * +ast_cs_input_layout::hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state) +{ + YYLTYPE loc = this->get_location(); + + /* If any compute input layout declaration preceded this one, make sure it +* was consistent with this one. +*/ + if (state->cs_input_local_size_specified) { + for (int i = 0; i < 3; i++) { + if (state->cs_input_local_size[i] != this->local_size[i]) { +_mesa_glsl_error(&loc, state, + "compute shader input layout does not match" + " previous declaration"); +return NULL; + } + } + } + + /* From the ARB_compute_shader specification: +* +* If the local size of the shader in any dimension is greater +* than the maximum size supported by the implementation for that +* dimension, a compile-time error results. +* +* It is not clear from the spec how the error should be reported if +* the total size of the work group exceeds +* MAX_COMPUTE_WORK_GROUP_INVOCATIONS, but it seems reasonable to +* report it at compile time as well. +*/ + GLuint64 total_invocations = 1; + for (int i = 0; i < 3; i++) { + if (this->local_size[i] > state->ctx->Const.MaxComputeWorkGroupSize[i]) { + _mesa_glsl_error(&loc, state, + "local_size_%c exceeds MAX_COMPUTE_WORK_GROUP_SIZE" + " (%d)", 'x' + i, + state->ctx->Const.MaxComputeWorkGroupSize[i]); + break; + } + total_invocations *= this->local_size[i]; + if (total_invocations > + state->ctx->Const.MaxComputeWorkGroupInvocations) { + _mesa_glsl_error(&loc, state, +
Mesa (master): glsl/cs: Populate default values for ctx->Const.Program[ MESA_SHADER_COMPUTE].
Module: Mesa Branch: master Commit: d861c2963a0b939709981f39e8268822489db86f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d861c2963a0b939709981f39e8268822489db86f Author: Paul Berry Date: Mon Jan 6 20:06:05 2014 -0800 glsl/cs: Populate default values for ctx->Const.Program[MESA_SHADER_COMPUTE]. Reviewed-by: Matt Turner --- src/glsl/main.cpp |4 src/glsl/standalone_scaffolding.cpp |4 2 files changed, 8 insertions(+) diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp index 03b7c78..afc15cb 100644 --- a/src/glsl/main.cpp +++ b/src/glsl/main.cpp @@ -50,6 +50,10 @@ initialize_context(struct gl_context *ctx, gl_api api) */ ctx->Const.GLSLVersion = glsl_version; ctx->Extensions.ARB_ES3_compatibility = true; + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16; + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024; + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */ + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxOutputComponents = 0; /* not used */ switch (ctx->Const.GLSLVersion) { case 100: diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp index 3f88aa1..42c4572 100644 --- a/src/glsl/standalone_scaffolding.cpp +++ b/src/glsl/standalone_scaffolding.cpp @@ -141,6 +141,10 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api) ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 32; ctx->Const.MaxDrawBuffers = 1; + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16; + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024; + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */ + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxOutputComponents = 0; /* not used */ /* Set up default shader compiler options. */ struct gl_shader_compiler_options options; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl/cs: Prohibit user-defined ins/outs in compute shaders.
Module: Mesa Branch: master Commit: 5a79bdab3008a19a770b8b84fdf5582e72db72c9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5a79bdab3008a19a770b8b84fdf5582e72db72c9 Author: Paul Berry Date: Wed Jan 8 01:54:26 2014 -0800 glsl/cs: Prohibit user-defined ins/outs in compute shaders. Reviewed-by: Jordan Justen --- src/glsl/ast_to_hir.cpp |7 +++ 1 file changed, 7 insertions(+) diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index a55c969..c89a26b 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -2282,6 +2282,13 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, var->data.mode = ir_var_uniform; if (!is_parameter && is_varying_var(var, state->stage)) { + /* User-defined ins/outs are not permitted in compute shaders. */ + if (state->stage == MESA_SHADER_COMPUTE) { + _mesa_glsl_error(loc, state, + "user-defined input and output variables are not " + "permitted in compute shaders"); + } + /* This variable is being used to link data between shader stages (in * pre-glsl-1.30 parlance, it's a "varying"). Check that it has a type * that is allowed for such purposes. ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa/cs: Implement MAX_COMPUTE_WORK_GROUP_SIZE constant.
Module: Mesa Branch: master Commit: 347dde82e65663562d6d2930bf861ec8c8079362 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=347dde82e65663562d6d2930bf861ec8c8079362 Author: Paul Berry Date: Mon Jan 6 13:31:58 2014 -0800 mesa/cs: Implement MAX_COMPUTE_WORK_GROUP_SIZE constant. v2: Document that the 3-element array MaxComputeWorkGroupSize is indexed by dimension. Reviewed-by: Matt Turner Reviewed-by: Jordan Justen --- src/glsl/builtin_variables.cpp | 27 +++ src/glsl/glsl_parser_extras.cpp |4 src/glsl/glsl_parser_extras.h |3 +++ src/glsl/main.cpp |3 +++ src/glsl/standalone_scaffolding.cpp |3 +++ src/mesa/main/context.c |5 + src/mesa/main/get.c |8 src/mesa/main/mtypes.h |3 +++ 8 files changed, 56 insertions(+) diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp index df560fb..f96d489 100644 --- a/src/glsl/builtin_variables.cpp +++ b/src/glsl/builtin_variables.cpp @@ -390,6 +390,7 @@ private: enum ir_variable_mode mode, int slot); ir_variable *add_uniform(const glsl_type *type, const char *name); ir_variable *add_const(const char *name, int value); + ir_variable *add_const_ivec3(const char *name, int x, int y, int z); void add_varying(int slot, const glsl_type *type, const char *name, const char *name_as_gs_input); @@ -530,6 +531,25 @@ builtin_variable_generator::add_const(const char *name, int value) } +ir_variable * +builtin_variable_generator::add_const_ivec3(const char *name, int x, int y, +int z) +{ + ir_variable *const var = add_variable(name, glsl_type::ivec3_type, + ir_var_auto, -1); + ir_constant_data data; + memset(&data, 0, sizeof(data)); + data.i[0] = x; + data.i[1] = y; + data.i[2] = z; + var->constant_value = new(var) ir_constant(glsl_type::ivec3_type, &data); + var->constant_initializer = + new(var) ir_constant(glsl_type::ivec3_type, &data); + var->data.has_initializer = true; + return var; +} + + void builtin_variable_generator::generate_constants() { @@ -660,6 +680,13 @@ builtin_variable_generator::generate_constants() add_const("gl_MaxTessControlAtomicCounters", 0); add_const("gl_MaxTessEvaluationAtomicCounters", 0); } + + if (state->is_version(430, 0) || state->ARB_compute_shader_enable) { + add_const_ivec3("gl_MaxComputeWorkGroupSize", + state->Const.MaxComputeWorkGroupSize[0], + state->Const.MaxComputeWorkGroupSize[1], + state->Const.MaxComputeWorkGroupSize[2]); + } } diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 134d836..d256680 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -123,6 +123,10 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, this->Const.MaxCombinedAtomicCounters = ctx->Const.MaxCombinedAtomicCounters; this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings; + /* Compute shader constants */ + for (unsigned i = 0; i < Elements(this->Const.MaxComputeWorkGroupSize); i++) + this->Const.MaxComputeWorkGroupSize[i] = ctx->Const.MaxComputeWorkGroupSize[i]; + this->current_function = NULL; this->toplevel_ir = NULL; this->found_return = false; diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index 6c0034d..802e0f0 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -250,6 +250,9 @@ struct _mesa_glsl_parse_state { unsigned MaxFragmentAtomicCounters; unsigned MaxCombinedAtomicCounters; unsigned MaxAtomicBufferBindings; + + /* ARB_compute_shader */ + unsigned MaxComputeWorkGroupSize[3]; } Const; /** diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp index 864c929..bb2054f 100644 --- a/src/glsl/main.cpp +++ b/src/glsl/main.cpp @@ -50,6 +50,9 @@ initialize_context(struct gl_context *ctx, gl_api api) */ ctx->Const.GLSLVersion = glsl_version; ctx->Extensions.ARB_ES3_compatibility = true; + ctx->Const.MaxComputeWorkGroupSize[0] = 1024; + ctx->Const.MaxComputeWorkGroupSize[1] = 1024; + ctx->Const.MaxComputeWorkGroupSize[2] = 64; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */ diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp index 42c4572..748d7e9 100644 --- a/src/glsl/standalone_scaffolding.cpp +++ b/src/glsl/stan
Mesa (master): glsl/cs: Prohibit mixing of compute and non-compute shaders.
Module: Mesa Branch: master Commit: 1fe274b3d7a8e70dc605e6076d29e00add292508 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1fe274b3d7a8e70dc605e6076d29e00add292508 Author: Paul Berry Date: Wed Jan 8 11:40:23 2014 -0800 glsl/cs: Prohibit mixing of compute and non-compute shaders. Fixes piglit test: spec/ARB_compute_shader/linker/mix_compute_and_non_compute Reviewed-by: Jordan Justen --- src/glsl/linker.cpp |7 +++ 1 file changed, 7 insertions(+) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 6a07e4a..bcd7394 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -2109,6 +2109,13 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) goto done; } + /* Compute shaders have additional restrictions. */ + if (num_shaders[MESA_SHADER_COMPUTE] > 0 && + num_shaders[MESA_SHADER_COMPUTE] != prog->NumShaders) { + linker_error(prog, "Compute shaders may not be linked with any other " + "type of shader\n"); + } + for (unsigned int i = 0; i < MESA_SHADER_STAGES; i++) { if (prog->_LinkedShaders[i] != NULL) ctx->Driver.DeleteShader(ctx, prog->_LinkedShaders[i]); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa/cs: Add extension enable flags for ARB_compute_shader.
Module: Mesa Branch: master Commit: b7d05a58ae3655730f84c9786439e2461cdb77da URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b7d05a58ae3655730f84c9786439e2461cdb77da Author: Paul Berry Date: Mon Jan 6 09:09:07 2014 -0800 mesa/cs: Add extension enable flags for ARB_compute_shader. Reviewed-by: Matt Turner --- src/glsl/glcpp/glcpp-parse.y|3 +++ src/glsl/glsl_parser_extras.cpp |1 + src/glsl/glsl_parser_extras.h |2 ++ src/glsl/standalone_scaffolding.cpp |1 + src/mesa/main/extensions.c |1 + src/mesa/main/mtypes.h |1 + 6 files changed, 9 insertions(+) diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y index 0393ac7..eeafa4d 100644 --- a/src/glsl/glcpp/glcpp-parse.y +++ b/src/glsl/glcpp/glcpp-parse.y @@ -2123,6 +2123,9 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio if (extensions->ARB_viewport_array) add_builtin_define(parser, "GL_ARB_viewport_array", 1); + + if (extensions->ARB_compute_shader) + add_builtin_define(parser, "GL_ARB_compute_shader", 1); } } diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 87784ed..134d836 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -519,6 +519,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = { EXT(ARB_sample_shading, true, false, ARB_sample_shading), EXT(AMD_shader_trinary_minmax, true, false, dummy_true), EXT(ARB_viewport_array, true, false, ARB_viewport_array), + EXT(ARB_compute_shader, true, false, ARB_compute_shader), }; #undef EXT diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index 8a4cbf1..6c0034d 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -356,6 +356,8 @@ struct _mesa_glsl_parse_state { bool AMD_shader_trinary_minmax_warn; bool ARB_viewport_array_enable; bool ARB_viewport_array_warn; + bool ARB_compute_shader_enable; + bool ARB_compute_shader_warn; /*@}*/ /** Extensions supported by the OpenGL implementation. */ diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp index 9179471..3f88aa1 100644 --- a/src/glsl/standalone_scaffolding.cpp +++ b/src/glsl/standalone_scaffolding.cpp @@ -91,6 +91,7 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api) ctx->Extensions.dummy_false = false; ctx->Extensions.dummy_true = true; + ctx->Extensions.ARB_compute_shader = true; ctx->Extensions.ARB_conservative_depth = true; ctx->Extensions.ARB_draw_instanced = true; ctx->Extensions.ARB_ES2_compatibility = true; diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index e48c1a3..5f741fb 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -85,6 +85,7 @@ static const struct extension extension_table[] = { { "GL_ARB_blend_func_extended", o(ARB_blend_func_extended), GL, 2009 }, { "GL_ARB_clear_buffer_object", o(dummy_true), GL, 2012 }, { "GL_ARB_color_buffer_float", o(ARB_color_buffer_float), GL, 2004 }, + { "GL_ARB_compute_shader", o(ARB_compute_shader), GL, 2012 }, { "GL_ARB_copy_buffer", o(dummy_true), GL, 2008 }, { "GL_ARB_conservative_depth", o(ARB_conservative_depth), GL, 2011 }, { "GL_ARB_debug_output",o(dummy_true), GL, 2009 }, diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index b9ac2b3..f591033 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3389,6 +3389,7 @@ struct gl_extensions GLboolean ARB_base_instance; GLboolean ARB_blend_func_extended; GLboolean ARB_color_buffer_float; + GLboolean ARB_compute_shader; GLboolean ARB_conservative_depth; GLboolean ARB_depth_buffer_float; GLboolean ARB_depth_clamp; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Fix continue statements in do-while loops.
Module: Mesa Branch: master Commit: 7f5740899fe8ee2d7fecebf1b9622e06dbc78f43 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7f5740899fe8ee2d7fecebf1b9622e06dbc78f43 Author: Paul Berry Date: Fri Jan 31 09:55:35 2014 -0800 glsl: Fix continue statements in do-while loops. >From the GLSL 4.40 spec, section 6.4 (Jumps): The continue jump is used only in loops. It skips the remainder of the body of the inner most loop of which it is inside. For while and do-while loops, this jump is to the next evaluation of the loop condition-expression from which the loop continues as previously defined. Previously, we incorrectly treated a "continue" statement as jumping to the top of a do-while loop. This patch fixes the problem by replicating the loop condition when converting the "continue" statement to IR. (We already do a similar thing in "for" loops, to ensure that "continue" causes the loop expression to be executed). Fixes piglit tests: - glsl-fs-continue-inside-do-while.shader_test - glsl-vs-continue-inside-do-while.shader_test - glsl-fs-continue-in-switch-in-do-while.shader_test - glsl-vs-continue-in-switch-in-do-while.shader_test Cc: mesa-sta...@lists.freedesktop.org Acked-by: Carl Worth Reviewed-by: Kenneth Graunke Reviewed-by: Matt Turner --- src/glsl/ast_to_hir.cpp | 23 ++- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 950f513..8d096ad 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -4029,17 +4029,22 @@ ast_jump_statement::hir(exec_list *instructions, _mesa_glsl_error(& loc, state, "break may only appear in a loop or a switch"); } else { -/* For a loop, inline the for loop expression again, - * since we don't know where near the end of - * the loop body the normal copy of it - * is going to be placed. +/* For a loop, inline the for loop expression again, since we don't + * know where near the end of the loop body the normal copy of it is + * going to be placed. Same goes for the condition for a do-while + * loop. */ if (state->loop_nesting_ast != NULL && -mode == ast_continue && -state->loop_nesting_ast->rest_expression) { - state->loop_nesting_ast->rest_expression->hir(instructions, - state); -} +mode == ast_continue) { +if (state->loop_nesting_ast->rest_expression) { + state->loop_nesting_ast->rest_expression->hir(instructions, + state); +} +if (state->loop_nesting_ast->mode == +ast_iteration_statement::ast_do_while) { + state->loop_nesting_ast->condition_to_hir(instructions, state); +} + } if (state->switch_state.is_switch_innermost && mode == ast_break) { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Make condition_to_hir() callable from outside ast_iteration_statement.
Module: Mesa Branch: master Commit: 56790856b303ad5ba86d7eb261ade91edaa3ee0b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=56790856b303ad5ba86d7eb261ade91edaa3ee0b Author: Paul Berry Date: Fri Jan 31 09:50:37 2014 -0800 glsl: Make condition_to_hir() callable from outside ast_iteration_statement. In addition to making it public, we also need to change its first argument from an ir_loop * to an exec_list *, so that it can be used to insert the condition anywhere in the IR (rather than just in the body of the loop). This will be necessary in order to make continue statements work properly in do-while loops. Cc: mesa-sta...@lists.freedesktop.org Acked-by: Carl Worth Reviewed-by: Kenneth Graunke Reviewed-by: Matt Turner --- src/glsl/ast.h |3 +-- src/glsl/ast_to_hir.cpp | 10 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/glsl/ast.h b/src/glsl/ast.h index 0bda28d..2d6f3a2 100644 --- a/src/glsl/ast.h +++ b/src/glsl/ast.h @@ -888,14 +888,13 @@ public: ast_node *body; -private: /** * Generate IR from the condition of a loop * * This is factored out of ::hir because some loops have the condition * test at the top (for and while), and others have it at the end (do-while). */ - void condition_to_hir(class ir_loop *, struct _mesa_glsl_parse_state *); + void condition_to_hir(exec_list *, struct _mesa_glsl_parse_state *); }; diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 1bfb4e5..950f513 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -4369,14 +4369,14 @@ ast_case_label::hir(exec_list *instructions, } void -ast_iteration_statement::condition_to_hir(ir_loop *stmt, +ast_iteration_statement::condition_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) { void *ctx = state; if (condition != NULL) { ir_rvalue *const cond = -condition->hir(& stmt->body_instructions, state); +condition->hir(instructions, state); if ((cond == NULL) || !cond->type->is_boolean() || !cond->type->is_scalar()) { @@ -4397,7 +4397,7 @@ ast_iteration_statement::condition_to_hir(ir_loop *stmt, new(ctx) ir_loop_jump(ir_loop_jump::jump_break); if_stmt->then_instructions.push_tail(break_stmt); -stmt->body_instructions.push_tail(if_stmt); +instructions->push_tail(if_stmt); } } } @@ -4432,7 +4432,7 @@ ast_iteration_statement::hir(exec_list *instructions, state->switch_state.is_switch_innermost = false; if (mode != ast_do_while) - condition_to_hir(stmt, state); + condition_to_hir(&stmt->body_instructions, state); if (body != NULL) body->hir(& stmt->body_instructions, state); @@ -4441,7 +4441,7 @@ ast_iteration_statement::hir(exec_list *instructions, rest_expression->hir(& stmt->body_instructions, state); if (mode == ast_do_while) - condition_to_hir(stmt, state); + condition_to_hir(&stmt->body_instructions, state); if (mode != ast_do_while) state->symbols->pop_scope(); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): Update .gitignore for Catalan translations build artifacts
Module: Mesa Branch: master Commit: eab32bb8f19b4a28d976fc9e7c7c54eb6453ed81 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=eab32bb8f19b4a28d976fc9e7c7c54eb6453ed81 Author: Paul Berry Date: Fri Jan 24 13:43:43 2014 -0800 Update .gitignore for Catalan translations build artifacts Causes git to ignore the new build artifacts introduced by commit d5e5367e8992c2e5322d35fba8d86c33a0db6825 (driconf: Add Catalan translations). --- src/mesa/drivers/dri/common/xmlpool/.gitignore |1 + 1 file changed, 1 insertion(+) diff --git a/src/mesa/drivers/dri/common/xmlpool/.gitignore b/src/mesa/drivers/dri/common/xmlpool/.gitignore index 0e0bf17..383df72 100644 --- a/src/mesa/drivers/dri/common/xmlpool/.gitignore +++ b/src/mesa/drivers/dri/common/xmlpool/.gitignore @@ -1,3 +1,4 @@ +ca de es fr ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/gen7: Use to the correct program when uploading transform feedback state.
Module: Mesa Branch: master Commit: 43e77215b13b2f86e461cd8a62b542fc6854dd1c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=43e77215b13b2f86e461cd8a62b542fc6854dd1c Author: Paul Berry Date: Wed Jan 22 05:45:28 2014 -0800 i965/gen7: Use to the correct program when uploading transform feedback state. Transform feedback may come from either the geometry shader or the vertex shader, so we can't use ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX] to find the current post-link transform feedback information. Fortunately we can use ctx->TransformFeedback.CurrentObject->shader_program. Cc: 10.0 Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_state_upload.c |1 + src/mesa/drivers/dri/i965/gen7_sol_state.c | 15 +-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index af554eb..ca256c2 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -305,6 +305,7 @@ void brw_init_state( struct brw_context *brw ) STATIC_ASSERT(BRW_NUM_STATE_BITS <= 8 * sizeof(brw->state.dirty.brw)); ctx->DriverFlags.NewTransformFeedback = BRW_NEW_TRANSFORM_FEEDBACK; + ctx->DriverFlags.NewTransformFeedbackProg = BRW_NEW_TRANSFORM_FEEDBACK; ctx->DriverFlags.NewRasterizerDiscard = BRW_NEW_RASTERIZER_DISCARD; ctx->DriverFlags.NewUniformBuffer = BRW_NEW_UNIFORM_BUFFER; ctx->DriverFlags.NewAtomicBuffer = BRW_NEW_ATOMIC_BUFFER; diff --git a/src/mesa/drivers/dri/i965/gen7_sol_state.c b/src/mesa/drivers/dri/i965/gen7_sol_state.c index 1ca2b74..5d2f243 100644 --- a/src/mesa/drivers/dri/i965/gen7_sol_state.c +++ b/src/mesa/drivers/dri/i965/gen7_sol_state.c @@ -39,14 +39,11 @@ static void upload_3dstate_so_buffers(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; - /* BRW_NEW_VERTEX_PROGRAM */ - const struct gl_shader_program *vs_prog = - ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; - const struct gl_transform_feedback_info *linked_xfb_info = - &vs_prog->LinkedTransformFeedback; /* BRW_NEW_TRANSFORM_FEEDBACK */ struct gl_transform_feedback_object *xfb_obj = ctx->TransformFeedback.CurrentObject; + const struct gl_transform_feedback_info *linked_xfb_info = + &xfb_obj->shader_program->LinkedTransformFeedback; int i; /* Set up the up to 4 output buffers. These are the ranges defined in the @@ -102,12 +99,11 @@ gen7_upload_3dstate_so_decl_list(struct brw_context *brw, const struct brw_vue_map *vue_map) { struct gl_context *ctx = &brw->ctx; - /* BRW_NEW_VERTEX_PROGRAM */ - const struct gl_shader_program *vs_prog = - ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; /* BRW_NEW_TRANSFORM_FEEDBACK */ + struct gl_transform_feedback_object *xfb_obj = + ctx->TransformFeedback.CurrentObject; const struct gl_transform_feedback_info *linked_xfb_info = - &vs_prog->LinkedTransformFeedback; + &xfb_obj->shader_program->LinkedTransformFeedback; uint16_t so_decl[128]; int buffer_mask = 0; int next_offset[4] = {0, 0, 0, 0}; @@ -260,7 +256,6 @@ const struct brw_tracked_state gen7_sol_state = { .dirty = { .mesa = (_NEW_LIGHT), .brw = (BRW_NEW_BATCH | - BRW_NEW_VERTEX_PROGRAM | BRW_NEW_VUE_MAP_GEOM_OUT | BRW_NEW_TRANSFORM_FEEDBACK) }, ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965: Remove *_generator::shader field; use prog field instead.
Module: Mesa Branch: master Commit: 9cee3ff562f3e4b51bfd30338fd1ba7716ac5737 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9cee3ff562f3e4b51bfd30338fd1ba7716ac5737 Author: Paul Berry Date: Wed Jan 22 11:45:39 2014 -0800 i965: Remove *_generator::shader field; use prog field instead. The "shader" field in fs_generator, vec4_generator, and gen8_generator was only used for one purpose; to figure out if we were compiling an assembly program or a GLSL shader (shader is NULL for assembly programs). And it wasn't being used properly: in vec4 shaders we were always initializing it based on prog->_LinkedShaders[MESA_SHADER_FRAGMENT], regardless of whether we were compiling a geometry shader or a vertex shader. This patch simplifies things by using the "prog" field instead; this is also NULL for assembly programs. Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_fs.h|1 - src/mesa/drivers/dri/i965/brw_fs_generator.cpp|6 ++ src/mesa/drivers/dri/i965/brw_vec4.h |1 - src/mesa/drivers/dri/i965/brw_vec4_generator.cpp |6 ++ src/mesa/drivers/dri/i965/gen8_fs_generator.cpp |6 ++ src/mesa/drivers/dri/i965/gen8_generator.h|1 - src/mesa/drivers/dri/i965/gen8_vec4_generator.cpp |5 ++--- 7 files changed, 8 insertions(+), 18 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 9bc6982..2ccb8c4 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -617,7 +617,6 @@ private: struct brw_wm_compile *c; struct gl_shader_program *prog; - struct gl_shader *shader; const struct gl_fragment_program *fp; unsigned dispatch_width; /**< 8 or 16 */ diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp index 121f733..6d211e1 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp @@ -46,8 +46,6 @@ fs_generator::fs_generator(struct brw_context *brw, { ctx = &brw->ctx; - shader = prog ? prog->_LinkedShaders[MESA_SHADER_FRAGMENT] : NULL; - mem_ctx = c; p = rzalloc(mem_ctx, struct brw_compile); @@ -1332,7 +1330,7 @@ fs_generator::generate_code(exec_list *instructions, FILE *dump_file) const void *last_annotation_ir = NULL; if (unlikely(INTEL_DEBUG & DEBUG_WM)) { - if (shader) { + if (prog) { printf("Native code for fragment shader %d (SIMD%d dispatch):\n", prog->Name, dispatch_width); } else if (fp) { @@ -1373,7 +1371,7 @@ fs_generator::generate_code(exec_list *instructions, FILE *dump_file) last_annotation_ir = inst->ir; if (last_annotation_ir) { printf(" "); - if (shader) + if (prog) ((ir_instruction *)inst->ir)->print(); else { const prog_instruction *fpi; diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h index 4a5b577..e17b5cd 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.h +++ b/src/mesa/drivers/dri/i965/brw_vec4.h @@ -652,7 +652,6 @@ private: struct brw_compile *p; struct gl_shader_program *shader_prog; - struct gl_shader *shader; const struct gl_program *prog; struct brw_vec4_prog_data *prog_data; diff --git a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp index 1e6520d..94d1e79 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp @@ -142,8 +142,6 @@ vec4_generator::vec4_generator(struct brw_context *brw, : brw(brw), shader_prog(shader_prog), prog(prog), prog_data(prog_data), mem_ctx(mem_ctx), debug_flag(debug_flag) { - shader = shader_prog ? shader_prog->_LinkedShaders[MESA_SHADER_VERTEX] : NULL; - p = rzalloc(mem_ctx, struct brw_compile); brw_init_compile(brw, p, mem_ctx); } @@ -1257,7 +1255,7 @@ vec4_generator::generate_code(exec_list *instructions) const void *last_annotation_ir = NULL; if (unlikely(debug_flag)) { - if (shader) { + if (prog) { printf("Native code for vertex shader %d:\n", shader_prog->Name); } else { printf("Native code for vertex program %d:\n", prog->Id); @@ -1273,7 +1271,7 @@ vec4_generator::generate_code(exec_list *instructions) last_annotation_ir = inst->ir; if (last_annotation_ir) { printf(" "); - if (shader) { + if (prog) { ((ir_instruction *) last_annotation_ir)->print(); } else { const prog_instruction *vpi; diff --git a/src/mesa/drivers/dri/i965/gen8_fs_generator.cpp b/src/mesa/
Mesa (master): mesa: Ensure that transform feedback refers to the correct program.
Module: Mesa Branch: master Commit: e190709119d8eb85c67bfbad5be699d39ad0118e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e190709119d8eb85c67bfbad5be699d39ad0118e Author: Paul Berry Date: Wed Jan 22 05:14:48 2014 -0800 mesa: Ensure that transform feedback refers to the correct program. Previous to this patch, the _mesa_{Begin,Resume}TransformFeedback functions were using ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX] to find the program that would be the source of transform feedback data. This isn't correct--if there's a geometry shader present it should be ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]. (These might be different if separate shader objects are in use). This patch creates a function get_xfb_source(), which figures out the correct program to use based on GL state, and updates _mesa_{Begin,Resume}TransformFeedback to call it. get_xfb_source() is written in terms of the gl_shader_stage enum, so it should not need modification when we add tessellation shaders in the future. It also creates a new driver flag, NewTransformFeedbackProg, which is flagged whenever this program changes. To reduce future confusion, this patch also rewords some comments and error message text to avoid referring to vertex shaders. Cc: 10.0 v2: make the for loop in get_xfb_source() clearer. Reviewed-by: Kenneth Graunke --- src/mesa/main/mtypes.h|8 -- src/mesa/main/transformfeedback.c | 52 +++-- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 679e1a3..9ab2de0 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1815,8 +1815,9 @@ struct gl_transform_feedback_object /** * The shader program active when BeginTransformFeedback() was called. -* When active and unpaused, this equals -* ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]. +* When active and unpaused, this equals ctx->Shader.CurrentProgram[stage], +* where stage is the pipeline stage that is the source of data for +* transform feedback. */ struct gl_shader_program *shader_program; @@ -3780,6 +3781,9 @@ struct gl_driver_flags /** gl_context::TransformFeedback::CurrentObject */ GLbitfield NewTransformFeedback; + /** gl_context::TransformFeedback::CurrentObject::shader_program */ + GLbitfield NewTransformFeedbackProg; + /** gl_context::RasterDiscard */ GLbitfield NewRasterizerDiscard; diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c index 74897ba..6b9565c 100644 --- a/src/mesa/main/transformfeedback.c +++ b/src/mesa/main/transformfeedback.c @@ -24,7 +24,7 @@ /* - * Vertex transform feedback support. + * Transform feedback support. * * Authors: * Brian Paul @@ -376,25 +376,48 @@ _mesa_compute_max_transform_feedback_vertices( **/ +/** + * Figure out which stage of the pipeline is the source of transform feedback + * data given the current context state, and return its gl_shader_program. + * + * If no active program can generate transform feedback data (i.e. no vertex + * shader is active), returns NULL. + */ +static struct gl_shader_program * +get_xfb_source(struct gl_context *ctx) +{ + int i; + for (i = MESA_SHADER_GEOMETRY; i >= MESA_SHADER_VERTEX; i--) { + if (ctx->Shader.CurrentProgram[i] != NULL) + return ctx->Shader.CurrentProgram[i]; + } + return NULL; +} + + void GLAPIENTRY _mesa_BeginTransformFeedback(GLenum mode) { struct gl_transform_feedback_object *obj; - struct gl_transform_feedback_info *info; + struct gl_transform_feedback_info *info = NULL; + struct gl_shader_program *source; GLuint i; unsigned vertices_per_prim; GET_CURRENT_CONTEXT(ctx); obj = ctx->TransformFeedback.CurrentObject; - if (ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX] == NULL) { + /* Figure out what pipeline stage is the source of data for transform +* feedback. +*/ + source = get_xfb_source(ctx); + if (source == NULL) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginTransformFeedback(no program active)"); return; } - info = - &ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]->LinkedTransformFeedback; + info = &source->LinkedTransformFeedback; if (info->NumOutputs == 0) { _mesa_error(ctx, GL_INVALID_OPERATION, @@ -452,7 +475,10 @@ _mesa_BeginTransformFeedback(GLenum mode) obj->GlesRemainingPrims = max_vertices / vertices_per_prim; } - obj->shader_program = ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; + if (obj->shader_program != source) { + ctx->NewDriverState |= ctx->DriverFlags.NewTransformFeedbackProg; + obj->shader_program = source; + } assert(ctx->Driver.BeginTransformFeedback); ctx->Driver.BeginTransformFeedback(ctx, mode, obj); @@
Mesa (master): glsl: Simplify aggregate type inference to prepare for ARB_arrays_of_arrays.
Module: Mesa Branch: master Commit: 0da1a2cc369052643ccaea75a1722cc37652d82a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0da1a2cc369052643ccaea75a1722cc37652d82a Author: Paul Berry Date: Tue Jan 21 15:41:26 2014 -0800 glsl: Simplify aggregate type inference to prepare for ARB_arrays_of_arrays. Most of the time it is not necessary to perform type inference to compile GLSL; the type of every expression can be inferred from the contents of the expression itself (and previous type declarations). The exception is aggregate initializers: their type is determined by the LHS of the variable being assigned to. For example, in the statement: mat2 foo = { { 1, 2 }, { 3, 4 } }; the type of { 1, 2 } is only known to be vec2 (as opposed to, say, ivec2, uvec2, int[2], or a struct) because of the fact that the result is being assigned to a mat2. Previous to this patch, we handled this situation by doing some type inference during parsing: when parsing a declaration like the one above, we would call _mesa_set_aggregate_type(), which would infer the type of each aggregate initializer and store it in the corresponding ast_aggregate_initializer::constructor_type field. Since this happened at parse time, we couldn't do the type inference using glsl_type objects; we had to use ast_type_specifiers, which are much more awkward to work with. Things are about to get more complicated when we add support for ARB_arrays_of_arrays. This patch simplifies things by postponing the call to _mesa_set_aggregate_type() until ast-to-hir time, when we have access to glsl_type objects. As a side benefit, we only need to have one call to _mesa_set_aggregate_type() now, instead of six. Reviewed-by: Matt Turner --- src/glsl/ast.h | 16 +++-- src/glsl/ast_function.cpp |8 +-- src/glsl/ast_to_hir.cpp |7 ++ src/glsl/glsl_parser.yy | 27 src/glsl/glsl_parser_extras.cpp | 136 +++ 5 files changed, 46 insertions(+), 148 deletions(-) diff --git a/src/glsl/ast.h b/src/glsl/ast.h index 76911f0..b24052b 100644 --- a/src/glsl/ast.h +++ b/src/glsl/ast.h @@ -296,7 +296,16 @@ public: /* empty */ } - ast_type_specifier *constructor_type; + /** +* glsl_type of the aggregate, which is inferred from the LHS of whatever +* the aggregate is being used to initialize. This can't be inferred at +* parse time (since the parser deals with ast_type_specifiers, not +* glsl_types), so the parser leaves it NULL. However, the ast-to-hir +* conversion code makes sure to fill it in with the appropriate type +* before hir() is called. +*/ + const glsl_type *constructor_type; + virtual ir_rvalue *hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); }; @@ -978,9 +987,8 @@ _mesa_ast_array_index_to_hir(void *mem_ctx, YYLTYPE &loc, YYLTYPE &idx_loc); extern void -_mesa_ast_set_aggregate_type(const ast_type_specifier *type, - ast_expression *expr, - _mesa_glsl_parse_state *state); +_mesa_ast_set_aggregate_type(const glsl_type *type, + ast_expression *expr); void emit_function(_mesa_glsl_parse_state *state, ir_function *f); diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp index 2d05d07..4c5b0e4 100644 --- a/src/glsl/ast_function.cpp +++ b/src/glsl/ast_function.cpp @@ -1687,14 +1687,12 @@ ast_aggregate_initializer::hir(exec_list *instructions, { void *ctx = state; YYLTYPE loc = this->get_location(); - const char *name; if (!this->constructor_type) { _mesa_glsl_error(&loc, state, "type of C-style initializer unknown"); return ir_rvalue::error_value(ctx); } - const glsl_type *const constructor_type = - this->constructor_type->glsl_type(&name, state); + const glsl_type *const constructor_type = this->constructor_type; if (!state->ARB_shading_language_420pack_enable) { _mesa_glsl_error(&loc, state, "C-style initialization requires the " @@ -1702,12 +1700,12 @@ ast_aggregate_initializer::hir(exec_list *instructions, return ir_rvalue::error_value(ctx); } - if (this->constructor_type->is_array) { + if (constructor_type->is_array()) { return process_array_constructor(instructions, constructor_type, &loc, &this->expressions, state); } - if (this->constructor_type->structure) { + if (constructor_type->is_record()) { return process_record_constructor(instructions, constructor_type, &loc, &this->expressions, state); } diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 4cc8eb1..8d13610 100644 --- a/src/glsl/ast_to_hir.cpp +++ b
Mesa (master): mesa: Make validate_shader_target() non-static.
Module: Mesa Branch: master Commit: 6ab2a6148a539a9e308ad4e017e5ed6b9658aa4f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6ab2a6148a539a9e308ad4e017e5ed6b9658aa4f Author: Paul Berry Date: Tue Jan 7 15:13:52 2014 -0800 mesa: Make validate_shader_target() non-static. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/main/shaderapi.c |8 src/mesa/main/shaderapi.h |3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 6042fa8..716e659 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -171,8 +171,8 @@ _mesa_copy_string(GLchar *dst, GLsizei maxLength, * \param type Shader target * */ -static bool -validate_shader_target(const struct gl_context *ctx, GLenum type) +bool +_mesa_validate_shader_target(const struct gl_context *ctx, GLenum type) { switch (type) { case GL_FRAGMENT_SHADER: @@ -273,7 +273,7 @@ create_shader(struct gl_context *ctx, GLenum type) struct gl_shader *sh; GLuint name; - if (!validate_shader_target(ctx, type)) { + if (!_mesa_validate_shader_target(ctx, type)) { _mesa_error(ctx, GL_INVALID_ENUM, "CreateShader(type)"); return 0; } @@ -1739,7 +1739,7 @@ _mesa_UseShaderProgramEXT(GLenum type, GLuint program) GET_CURRENT_CONTEXT(ctx); struct gl_shader_program *shProg = NULL; - if (!validate_shader_target(ctx, type)) { + if (!_mesa_validate_shader_target(ctx, type)) { _mesa_error(ctx, GL_INVALID_ENUM, "glUseShaderProgramEXT(type)"); return; } diff --git a/src/mesa/main/shaderapi.h b/src/mesa/main/shaderapi.h index 4822e32..10f810c 100644 --- a/src/mesa/main/shaderapi.h +++ b/src/mesa/main/shaderapi.h @@ -215,6 +215,9 @@ _mesa_copy_linked_program_data(gl_shader_stage type, const struct gl_shader_program *src, struct gl_program *dst); +extern bool +_mesa_validate_shader_target(const struct gl_context *ctx, GLenum type); + #ifdef __cplusplus } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl/linker: Refactor in preparation for adding more shader stages.
Module: Mesa Branch: master Commit: cd18ba1c7aba66f2dd7cdbe2cf3b4a803c241d10 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=cd18ba1c7aba66f2dd7cdbe2cf3b4a803c241d10 Author: Paul Berry Date: Tue Jan 7 08:56:57 2014 -0800 glsl/linker: Refactor in preparation for adding more shader stages. Rather than maintain separately named arrays and counts for vertex, geometry, and fragment shaders, just maintain these as arrays indexed by the gl_shader_type enum. v2: When there is neither a vertex nor a geometry shader, set prog->LastClipDistanceArraySize = 0, and clarify that the values is not used. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/glsl/linker.cpp | 116 ++- 1 file changed, 41 insertions(+), 75 deletions(-) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 38a6560..93b4754 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -1996,19 +1996,14 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) /* Separate the shaders into groups based on their type. */ - struct gl_shader **vert_shader_list; - unsigned num_vert_shaders = 0; - struct gl_shader **frag_shader_list; - unsigned num_frag_shaders = 0; - struct gl_shader **geom_shader_list; - unsigned num_geom_shaders = 0; - - vert_shader_list = (struct gl_shader **) - calloc(prog->NumShaders, sizeof(struct gl_shader *)); - frag_shader_list = (struct gl_shader **) - calloc(prog->NumShaders, sizeof(struct gl_shader *)); - geom_shader_list = (struct gl_shader **) - calloc(prog->NumShaders, sizeof(struct gl_shader *)); + struct gl_shader **shader_list[MESA_SHADER_STAGES]; + unsigned num_shaders[MESA_SHADER_STAGES]; + + for (int i = 0; i < MESA_SHADER_STAGES; i++) { + shader_list[i] = (struct gl_shader **) + calloc(prog->NumShaders, sizeof(struct gl_shader *)); + num_shaders[i] = 0; + } unsigned min_version = UINT_MAX; unsigned max_version = 0; @@ -2024,20 +2019,9 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) goto done; } - switch (prog->Shaders[i]->Stage) { - case MESA_SHADER_VERTEX: -vert_shader_list[num_vert_shaders] = prog->Shaders[i]; -num_vert_shaders++; -break; - case MESA_SHADER_FRAGMENT: -frag_shader_list[num_frag_shaders] = prog->Shaders[i]; -num_frag_shaders++; -break; - case MESA_SHADER_GEOMETRY: -geom_shader_list[num_geom_shaders] = prog->Shaders[i]; -num_geom_shaders++; -break; - } + gl_shader_stage shader_type = prog->Shaders[i]->Stage; + shader_list[shader_type][num_shaders[shader_type]] = prog->Shaders[i]; + num_shaders[shader_type]++; } /* In desktop GLSL, different shader versions may be linked together. In @@ -2054,7 +2038,8 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) /* Geometry shaders have to be linked with vertex shaders. */ - if (num_geom_shaders > 0 && num_vert_shaders == 0) { + if (num_shaders[MESA_SHADER_GEOMETRY] > 0 && + num_shaders[MESA_SHADER_VERTEX] == 0) { linker_error(prog, "Geometry shader must be linked with " "vertex shader\n"); goto done; @@ -2069,55 +2054,39 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) /* Link all shaders for a particular stage and validate the result. */ - if (num_vert_shaders > 0) { - gl_shader *const sh = -link_intrastage_shaders(mem_ctx, ctx, prog, vert_shader_list, -num_vert_shaders); - - if (!prog->LinkStatus) -goto done; - - validate_vertex_shader_executable(prog, sh); - if (!prog->LinkStatus) -goto done; - prog->LastClipDistanceArraySize = prog->Vert.ClipDistanceArraySize; + for (int stage = 0; stage < MESA_SHADER_STAGES; stage++) { + if (num_shaders[stage] > 0) { + gl_shader *const sh = +link_intrastage_shaders(mem_ctx, ctx, prog, shader_list[stage], +num_shaders[stage]); - _mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_VERTEX], -sh); - } - - if (num_frag_shaders > 0) { - gl_shader *const sh = -link_intrastage_shaders(mem_ctx, ctx, prog, frag_shader_list, -num_frag_shaders); - - if (!prog->LinkStatus) -goto done; + if (!prog->LinkStatus) +goto done; - validate_fragment_shader_executable(prog, sh); - if (!prog->LinkStatus) -goto done; + switch (stage) { + case MESA_SHADER_VERTEX: +validate_vertex_shader_executable(prog, sh); +break; + case MESA_SHADER_G
Mesa (master): main: Allow ctx == NULL in _mesa_validate_shader_target().
Module: Mesa Branch: master Commit: 020919b2ae76192f0f35c0901be0e1069a87b7f2 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=020919b2ae76192f0f35c0901be0e1069a87b7f2 Author: Paul Berry Date: Thu Jan 9 15:30:10 2014 -0800 main: Allow ctx == NULL in _mesa_validate_shader_target(). This will allow this function to be used in circumstances where there is no context available, such as when building built-in GLSL functions. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/main/shaderapi.c | 13 ++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 716e659..2ab0a0c 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -174,13 +174,20 @@ _mesa_copy_string(GLchar *dst, GLsizei maxLength, bool _mesa_validate_shader_target(const struct gl_context *ctx, GLenum type) { + /* Note: when building built-in GLSL functions, this function may be +* invoked with ctx == NULL. In that case, we can only validate that it's +* a shader target we recognize, not that it's supported in the current +* context. But that's fine--we don't need any further validation than +* that when building built-in GLSL functions. +*/ + switch (type) { case GL_FRAGMENT_SHADER: - return ctx->Extensions.ARB_fragment_shader; + return ctx == NULL || ctx->Extensions.ARB_fragment_shader; case GL_VERTEX_SHADER: - return ctx->Extensions.ARB_vertex_shader; + return ctx == NULL || ctx->Extensions.ARB_vertex_shader; case GL_GEOMETRY_SHADER_ARB: - return _mesa_has_geometry_shaders(ctx); + return ctx == NULL || _mesa_has_geometry_shaders(ctx); default: return false; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Remove ad-hoc arrays of gl_shader_program.
Module: Mesa Branch: master Commit: 5808c44bab52fdb58ad705e08e334c6f1acdd2ce URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5808c44bab52fdb58ad705e08e334c6f1acdd2ce Author: Paul Berry Date: Thu Jan 9 11:32:00 2014 -0800 mesa: Remove ad-hoc arrays of gl_shader_program. Now that we have a ctx->Shader.CurrentProgram array, we can just use it directly. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/main/context.c |6 +- src/mesa/state_tracker/st_draw.c|6 +- src/mesa/state_tracker/st_program.c |6 +- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index ec9f981..7c3b2d7 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1874,13 +1874,9 @@ _mesa_valid_to_render(struct gl_context *ctx, const char *where) #ifdef DEBUG if (ctx->Shader.Flags & GLSL_LOG) { - struct gl_shader_program *shProg[MESA_SHADER_STAGES]; + struct gl_shader_program **shProg = ctx->Shader.CurrentProgram; gl_shader_stage i; - shProg[MESA_SHADER_VERTEX] = ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; - shProg[MESA_SHADER_GEOMETRY] = ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]; - shProg[MESA_SHADER_FRAGMENT] = ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT]; - for (i = 0; i < MESA_SHADER_STAGES; i++) { if (shProg[i] == NULL || shProg[i]->_Used || shProg[i]->_LinkedShaders[i] == NULL) diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 6a7a4ef..355c180 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -131,11 +131,7 @@ setup_index_buffer(struct st_context *st, static void check_uniforms(struct gl_context *ctx) { - struct gl_shader_program *shProg[3] = { - ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX], - ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY], - ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT], - }; + struct gl_shader_program **shProg = ctx->Shader.CurrentProgram; unsigned j; for (j = 0; j < 3; j++) { diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 1a00c31..7a15b23 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -1195,11 +1195,7 @@ st_get_gp_variant(struct st_context *st, void st_print_shaders(struct gl_context *ctx) { - struct gl_shader_program *shProg[3] = { - ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX], - ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY], - ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT], - }; + struct gl_shader_program **shProg = ctx->Shader.CurrentProgram; unsigned j; for (j = 0; j < 3; j++) { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Change redundant code into loops in texstate.c.
Module: Mesa Branch: master Commit: 1032c33cb93f1e8839be0f743b81492c2ca87e39 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1032c33cb93f1e8839be0f743b81492c2ca87e39 Author: Paul Berry Date: Thu Jan 9 11:34:33 2014 -0800 mesa: Change redundant code into loops in texstate.c. This is possible now that ctx->Shader.CurrentProgram is an array. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/main/texstate.c | 75 ++ 1 file changed, 29 insertions(+), 46 deletions(-) diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index b6da76d..08725f6 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -527,27 +527,20 @@ static void update_texture_state( struct gl_context *ctx ) { GLuint unit; - struct gl_program *fprog = NULL; - struct gl_program *vprog = NULL; - struct gl_program *gprog = NULL; + struct gl_program *prog[MESA_SHADER_STAGES]; GLbitfield enabledFragUnits = 0x0; - - if (ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX] && - ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]->LinkStatus) { - vprog = ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]->_LinkedShaders[MESA_SHADER_VERTEX]->Program; - } - - if (ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY] && - ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]->LinkStatus) { - gprog = ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program; - } - - if (ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT] && - ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT]->LinkStatus) { - fprog = ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT]->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program; - } - else if (ctx->FragmentProgram._Enabled) { - fprog = &ctx->FragmentProgram.Current->Base; + int i; + + for (i = 0; i < MESA_SHADER_STAGES; i++) { + if (ctx->Shader.CurrentProgram[i] && + ctx->Shader.CurrentProgram[i]->LinkStatus) { + prog[i] = ctx->Shader.CurrentProgram[i]->_LinkedShaders[i]->Program; + } else { + if (i == MESA_SHADER_FRAGMENT && ctx->FragmentProgram._Enabled) +prog[i] = &ctx->FragmentProgram.Current->Base; + else +prog[i] = NULL; + } } /* TODO: only set this if there are actual changes */ @@ -563,9 +556,7 @@ update_texture_state( struct gl_context *ctx ) */ for (unit = 0; unit < ctx->Const.MaxCombinedTextureImageUnits; unit++) { struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; - GLbitfield enabledVertTargets = 0x0; - GLbitfield enabledFragTargets = 0x0; - GLbitfield enabledGeomTargets = 0x0; + GLbitfield enabledTargetsByStage[MESA_SHADER_STAGES]; GLbitfield enabledTargets = 0x0; GLuint texIndex; @@ -575,25 +566,16 @@ update_texture_state( struct gl_context *ctx ) * by a fragment program/program. When multiple flags are set, we'll * settle on the one with highest priority (see below). */ - if (vprog) { - enabledVertTargets |= vprog->TexturesUsed[unit]; + for (i = 0; i < MESA_SHADER_STAGES; i++) { + if (prog[i]) +enabledTargetsByStage[i] = prog[i]->TexturesUsed[unit]; + else if (i == MESA_SHADER_FRAGMENT) +enabledTargetsByStage[i] = texUnit->Enabled; + else +enabledTargetsByStage[i] = 0; + enabledTargets |= enabledTargetsByStage[i]; } - if (gprog) { - enabledGeomTargets |= gprog->TexturesUsed[unit]; - } - - if (fprog) { - enabledFragTargets |= fprog->TexturesUsed[unit]; - } - else { - /* fixed-function fragment program */ - enabledFragTargets |= texUnit->Enabled; - } - - enabledTargets = enabledVertTargets | enabledFragTargets | - enabledGeomTargets; - texUnit->_ReallyEnabled = 0x0; if (enabledTargets == 0x0) { @@ -625,7 +607,7 @@ update_texture_state( struct gl_context *ctx ) } if (!texUnit->_ReallyEnabled) { - if (fprog) { + if (prog[MESA_SHADER_FRAGMENT]) { /* If we get here it means the shader is expecting a texture * object, but there isn't one (or it's incomplete). Use the * fallback texture. @@ -655,25 +637,26 @@ update_texture_state( struct gl_context *ctx ) ctx->Texture._EnabledUnits |= (1 << unit); - if (enabledFragTargets) + if (enabledTargetsByStage[MESA_SHADER_FRAGMENT]) enabledFragUnits |= (1 << unit); - if (!fprog) + if (!prog[MESA_SHADER_FRAGMENT]) update_tex_combine(ctx, texUnit); } /* Determine which texture coordinate sets a
Mesa (master): mesa: Change redundant code into loops in shaderapi.c.
Module: Mesa Branch: master Commit: 6ac2e1e199ff02ad720495a64c0755fcae981671 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6ac2e1e199ff02ad720495a64c0755fcae981671 Author: Paul Berry Date: Thu Jan 9 11:33:15 2014 -0800 mesa: Change redundant code into loops in shaderapi.c. This is possible now that ctx->Shader.CurrentProgram is an array. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/main/shaderapi.c | 39 +-- 1 file changed, 9 insertions(+), 30 deletions(-) diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index d57748c..61ac0e3 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -130,11 +130,11 @@ _mesa_init_shader_state(struct gl_context *ctx) void _mesa_free_shader_state(struct gl_context *ctx) { - _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX], NULL); - _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY], - NULL); - _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT], - NULL); + int i; + for (i = 0; i < MESA_SHADER_STAGES; i++) { + _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentProgram[i], + NULL); + } _mesa_reference_shader_program(ctx, &ctx->Shader._CurrentFragmentProgram, NULL); _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, NULL); @@ -946,32 +946,11 @@ use_shader_program(struct gl_context *ctx, GLenum type, struct gl_shader_program *shProg) { struct gl_shader_program **target; + gl_shader_stage stage = _mesa_shader_enum_to_shader_stage(type); - switch (type) { - case GL_VERTEX_SHADER: - target = &ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; - if ((shProg == NULL) - || (shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL)) { -shProg = NULL; - } - break; - case GL_GEOMETRY_SHADER_ARB: - target = &ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]; - if ((shProg == NULL) - || (shProg->_LinkedShaders[MESA_SHADER_GEOMETRY] == NULL)) { -shProg = NULL; - } - break; - case GL_FRAGMENT_SHADER: - target = &ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT]; - if ((shProg == NULL) - || (shProg->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL)) { -shProg = NULL; - } - break; - default: - return; - } + target = &ctx->Shader.CurrentProgram[stage]; + if ((shProg == NULL) || (shProg->_LinkedShaders[stage] == NULL)) + shProg = NULL; if (*target != shProg) { FLUSH_VERTICES(ctx, _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: use _mesa_validate_shader_target() more frequently.
Module: Mesa Branch: master Commit: 4a91675b262c8150c1542991e1018e924c72f337 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4a91675b262c8150c1542991e1018e924c72f337 Author: Paul Berry Date: Tue Jan 7 15:19:07 2014 -0800 mesa: use _mesa_validate_shader_target() more frequently. This patch replaces code in _mesa_new_shader() and delete_shader_cb() that checks the type of a shader with calls to _mesa_validate_shader_target(). This has two advantages: it allows for a more thorough check (since _mesa_validate_shader_target() doesn't permit shader targets that aren't supported by the back-end), and it reduces the amount of code that will need to be modified when adding new shader stages. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/main/shaderobj.c |4 ++-- src/mesa/main/shared.c|4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c index dc81bbc..4f4bb69 100644 --- a/src/mesa/main/shaderobj.c +++ b/src/mesa/main/shaderobj.c @@ -34,6 +34,7 @@ #include "main/context.h" #include "main/hash.h" #include "main/mtypes.h" +#include "main/shaderapi.h" #include "main/shaderobj.h" #include "main/uniforms.h" #include "program/program.h" @@ -105,8 +106,7 @@ struct gl_shader * _mesa_new_shader(struct gl_context *ctx, GLuint name, GLenum type) { struct gl_shader *shader; - assert(type == GL_FRAGMENT_SHADER || type == GL_VERTEX_SHADER || - type == GL_GEOMETRY_SHADER_ARB); + assert(_mesa_validate_shader_target(ctx, type)); shader = rzalloc(NULL, struct gl_shader); if (shader) { shader->Type = type; diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c index 2f73cf3..c11c7f9 100644 --- a/src/mesa/main/shared.c +++ b/src/mesa/main/shared.c @@ -38,6 +38,7 @@ #include "dlist.h" #include "samplerobj.h" #include "set.h" +#include "shaderapi.h" #include "shaderobj.h" #include "syncobj.h" @@ -218,8 +219,7 @@ delete_shader_cb(GLuint id, void *data, void *userData) { struct gl_context *ctx = (struct gl_context *) userData; struct gl_shader *sh = (struct gl_shader *) data; - if (sh->Type == GL_FRAGMENT_SHADER || sh->Type == GL_VERTEX_SHADER || - sh->Type == GL_GEOMETRY_SHADER) { + if (_mesa_validate_shader_target(ctx, sh->Type)) { ctx->Driver.DeleteShader(ctx, sh); } else { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Replace ctx->Shader.Current{Vertex,Fragment, Geometry}Program with an array.
Module: Mesa Branch: master Commit: 3b22146dc714b6090f7423abbc4df53d7d1fdaa9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3b22146dc714b6090f7423abbc4df53d7d1fdaa9 Author: Paul Berry Date: Thu Jan 9 11:16:27 2014 -0800 mesa: Replace ctx->Shader.Current{Vertex,Fragment,Geometry}Program with an array. These are replaced with ctx->Shader.CurrentProgram[MESA_SHADER_{VERTEX,FRAGMENT,GEOMETRY}]. In patches to follow, this will allow us to replace a lot of ad-hoc logic with a variable index into the array. With the exception of the changes to mtypes.h, this patch was generated entirely by the command: find src -type f '(' -iname '*.c' -o -iname '*.cpp' ')' \ -print0 | xargs -0 sed -i \ -e 's/\.CurrentVertexProgram/.CurrentProgram[MESA_SHADER_VERTEX]/g' \ -e 's/\.CurrentGeometryProgram/.CurrentProgram[MESA_SHADER_GEOMETRY]/g' \ -e 's/\.CurrentFragmentProgram/.CurrentProgram[MESA_SHADER_FRAGMENT]/g' Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/drivers/common/meta.c |6 ++--- src/mesa/drivers/dri/i965/brw_gs.c |2 +- src/mesa/drivers/dri/i965/brw_gs_surface_state.c |4 +-- src/mesa/drivers/dri/i965/brw_vec4_gs.c |2 +- src/mesa/drivers/dri/i965/brw_vs.c |4 +-- src/mesa/drivers/dri/i965/brw_vs_state.c |2 +- src/mesa/drivers/dri/i965/brw_vs_surface_state.c |4 +-- src/mesa/drivers/dri/i965/brw_wm_state.c |2 +- src/mesa/drivers/dri/i965/gen6_sol.c |6 ++--- src/mesa/drivers/dri/i965/gen6_vs_state.c|2 +- src/mesa/drivers/dri/i965/gen6_wm_state.c|2 +- src/mesa/drivers/dri/i965/gen7_sol_state.c |4 +-- src/mesa/drivers/dri/i965/gen7_vs_state.c|2 +- src/mesa/drivers/dri/i965/gen7_wm_state.c|2 +- src/mesa/main/api_validate.c | 10 src/mesa/main/context.c | 30 +++--- src/mesa/main/ff_fragment_shader.cpp |8 +++--- src/mesa/main/mtypes.h |7 +++-- src/mesa/main/shaderapi.c| 12 - src/mesa/main/state.c|8 +++--- src/mesa/main/texstate.c | 18 ++--- src/mesa/main/transformfeedback.c|8 +++--- src/mesa/state_tracker/st_atom_clip.c|2 +- src/mesa/state_tracker/st_atom_constbuf.c|6 ++--- src/mesa/state_tracker/st_cb_drawpixels.c|2 +- src/mesa/state_tracker/st_draw.c |6 ++--- src/mesa/state_tracker/st_program.c |6 ++--- src/mesa/swrast/s_fragprog.c |2 +- 28 files changed, 84 insertions(+), 85 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 3855536..98ac6f8 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -618,11 +618,11 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state) } _mesa_reference_shader_program(ctx, &save->VertexShader, - ctx->Shader.CurrentVertexProgram); + ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]); _mesa_reference_shader_program(ctx, &save->GeometryShader, - ctx->Shader.CurrentGeometryProgram); + ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]); _mesa_reference_shader_program(ctx, &save->FragmentShader, - ctx->Shader.CurrentFragmentProgram); + ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT]); _mesa_reference_shader_program(ctx, &save->ActiveShader, ctx->Shader.ActiveProgram); diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c index 20e2ecb..3e1ed73 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.c +++ b/src/mesa/drivers/dri/i965/brw_gs.c @@ -187,7 +187,7 @@ static void populate_key(struct brw_context *brw, /* BRW_NEW_TRANSFORM_FEEDBACK */ if (_mesa_is_xfb_active_and_unpaused(ctx)) { const struct gl_shader_program *shaderprog = -ctx->Shader.CurrentVertexProgram; +ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; const struct gl_transform_feedback_info *linked_xfb_info = &shaderprog->LinkedTransformFeedback; int i; diff --git a/src/mesa/drivers/dri/i965/brw_gs_surface_state.c b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c index 5661941..1ccf2e2 100644 --- a/src/mesa/drivers/dri/i965/brw_gs_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c @@ -69,7 +69,7 @@ brw_upload_gs_ubo_s
Mesa (master): meta: Replace save_state::{Vertex,Geometry, Fragment}Shader with an array.
Module: Mesa Branch: master Commit: 69b258cb4636315b4c1aaaceeedd1eed8af98ba8 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=69b258cb4636315b4c1aaaceeedd1eed8af98ba8 Author: Paul Berry Date: Thu Jan 9 11:29:17 2014 -0800 meta: Replace save_state::{Vertex,Geometry,Fragment}Shader with an array. Since ctx->Shader.Current{Vertex,Geometry,Fragment}Program is an array, this allows some meta code to be rolled up into loops. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/drivers/common/meta.c | 30 ++ 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 98ac6f8..44fafac 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -138,9 +138,7 @@ struct save_state GLboolean FragmentProgramEnabled; struct gl_fragment_program *FragmentProgram; GLboolean ATIFragmentShaderEnabled; - struct gl_shader_program *VertexShader; - struct gl_shader_program *GeometryShader; - struct gl_shader_program *FragmentShader; + struct gl_shader_program *Shader[MESA_SHADER_STAGES]; struct gl_shader_program *ActiveShader; /** MESA_META_STENCIL_TEST */ @@ -617,12 +615,10 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state) _mesa_set_enable(ctx, GL_FRAGMENT_SHADER_ATI, GL_FALSE); } - _mesa_reference_shader_program(ctx, &save->VertexShader, - ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]); - _mesa_reference_shader_program(ctx, &save->GeometryShader, - ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]); - _mesa_reference_shader_program(ctx, &save->FragmentShader, - ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT]); + for (int i = 0; i < MESA_SHADER_STAGES; i++) { + _mesa_reference_shader_program(ctx, &save->Shader[i], + ctx->Shader.CurrentProgram[i]); + } _mesa_reference_shader_program(ctx, &save->ActiveShader, ctx->Shader.ActiveProgram); @@ -829,6 +825,7 @@ _mesa_meta_end(struct gl_context *ctx) { struct save_state *save = &ctx->Meta->Save[ctx->Meta->SaveStackDepth - 1]; const GLbitfield state = save->SavedState; + int i; /* After starting a new occlusion query, initialize the results to the * values saved previously. The driver will then continue to increment @@ -968,23 +965,24 @@ _mesa_meta_end(struct gl_context *ctx) save->ATIFragmentShaderEnabled); } - if (ctx->Extensions.ARB_vertex_shader) -_mesa_use_shader_program(ctx, GL_VERTEX_SHADER, save->VertexShader); + if (ctx->Extensions.ARB_vertex_shader) { +_mesa_use_shader_program(ctx, GL_VERTEX_SHADER, + save->Shader[MESA_SHADER_VERTEX]); + } if (_mesa_has_geometry_shaders(ctx)) _mesa_use_shader_program(ctx, GL_GEOMETRY_SHADER_ARB, - save->GeometryShader); + save->Shader[MESA_SHADER_GEOMETRY]); if (ctx->Extensions.ARB_fragment_shader) _mesa_use_shader_program(ctx, GL_FRAGMENT_SHADER, - save->FragmentShader); + save->Shader[MESA_SHADER_FRAGMENT]); _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, save->ActiveShader); - _mesa_reference_shader_program(ctx, &save->VertexShader, NULL); - _mesa_reference_shader_program(ctx, &save->GeometryShader, NULL); - _mesa_reference_shader_program(ctx, &save->FragmentShader, NULL); + for (i = 0; i < MESA_SHADER_STAGES; i++) + _mesa_reference_shader_program(ctx, &save->Shader[i], NULL); _mesa_reference_shader_program(ctx, &save->ActiveShader, NULL); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965: Fix comments to refer to the new ctx-> Shader.CurrentProgram array.
Module: Mesa Branch: master Commit: b4b70674eae940257b511912053edd19e4f19274 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b4b70674eae940257b511912053edd19e4f19274 Author: Paul Berry Date: Thu Jan 9 11:28:20 2014 -0800 i965: Fix comments to refer to the new ctx->Shader.CurrentProgram array. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/drivers/dri/i965/brw_wm_state.c |4 ++-- src/mesa/drivers/dri/i965/gen6_wm_state.c |4 ++-- src/mesa/drivers/dri/i965/gen7_wm_state.c |4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_wm_state.c b/src/mesa/drivers/dri/i965/brw_wm_state.c index ddd260a..fbd605c 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_state.c @@ -112,8 +112,8 @@ brw_upload_wm_unit(struct brw_context *brw) wm->thread1.depth_coef_urb_read_offset = 1; /* Use ALT floating point mode for ARB fragment programs, because they * require 0^0 == 1. Even though _CurrentFragmentProgram is used for -* rendering, CurrentFragmentProgram is used for this check to -* differentiate between the GLSL and non-GLSL cases. +* rendering, CurrentProgram[MESA_SHADER_FRAGMENT] is used for this check +* to differentiate between the GLSL and non-GLSL cases. */ if (ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT] == NULL) wm->thread1.floating_point_mode = BRW_FLOATING_POINT_NON_IEEE_754; diff --git a/src/mesa/drivers/dri/i965/gen6_wm_state.c b/src/mesa/drivers/dri/i965/gen6_wm_state.c index c29a45c..3d63ae7 100644 --- a/src/mesa/drivers/dri/i965/gen6_wm_state.c +++ b/src/mesa/drivers/dri/i965/gen6_wm_state.c @@ -137,8 +137,8 @@ upload_wm_state(struct brw_context *brw) /* Use ALT floating point mode for ARB fragment programs, because they * require 0^0 == 1. Even though _CurrentFragmentProgram is used for -* rendering, CurrentFragmentProgram is used for this check to -* differentiate between the GLSL and non-GLSL cases. +* rendering, CurrentProgram[MESA_SHADER_FRAGMENT] is used for this check +* to differentiate between the GLSL and non-GLSL cases. */ if (ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT] == NULL) dw2 |= GEN6_WM_FLOATING_POINT_MODE_ALT; diff --git a/src/mesa/drivers/dri/i965/gen7_wm_state.c b/src/mesa/drivers/dri/i965/gen7_wm_state.c index 70b6335..68eb240 100644 --- a/src/mesa/drivers/dri/i965/gen7_wm_state.c +++ b/src/mesa/drivers/dri/i965/gen7_wm_state.c @@ -170,8 +170,8 @@ upload_ps_state(struct brw_context *brw) /* Use ALT floating point mode for ARB fragment programs, because they * require 0^0 == 1. Even though _CurrentFragmentProgram is used for -* rendering, CurrentFragmentProgram is used for this check to -* differentiate between the GLSL and non-GLSL cases. +* rendering, CurrentProgram[MESA_SHADER_FRAGMENT] is used for this check +* to differentiate between the GLSL and non-GLSL cases. */ /* BRW_NEW_FRAGMENT_PROGRAM */ if (ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT] == NULL) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Replace _mesa_program_index_to_target with _mesa_shader_stage_to_program.
Module: Mesa Branch: master Commit: 46d210d38fc472d5454cef864c4299c52bb46c86 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=46d210d38fc472d5454cef864c4299c52bb46c86 Author: Paul Berry Date: Thu Jan 9 13:42:05 2014 -0800 mesa: Replace _mesa_program_index_to_target with _mesa_shader_stage_to_program. In my recent zeal to refactor Mesa's handling of the gl_shader_stage enum, I accidentally wound up with two functions that do the same thing: _mesa_program_index_to_target(), and _mesa_shader_stage_to_program(). This patch keeps _mesa_shader_stage_to_program(), since its name is more consistent with other related functions. However, it changes the signature so that it accepts an unsigned integer instead of a gl_shader_stage--this avoids awkward casts when the function is called from C++ code. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/drivers/dri/i965/brw_shader.cpp |2 +- src/mesa/program/ir_to_mesa.cpp|2 +- src/mesa/program/program.h | 19 +-- src/mesa/state_tracker/st_glsl_to_tgsi.cpp |2 +- 4 files changed, 4 insertions(+), 21 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index 5752348..446c917 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -127,7 +127,7 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) continue; struct gl_program *prog = -ctx->Driver.NewProgram(ctx, _mesa_program_index_to_target(stage), +ctx->Driver.NewProgram(ctx, _mesa_shader_stage_to_program(stage), shader->base.Name); if (!prog) return false; diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index 85d4142..74c512b 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -3053,7 +3053,7 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) _mesa_reference_program(ctx, &prog->_LinkedShaders[i]->Program, linked_prog); if (!ctx->Driver.ProgramStringNotify(ctx, - _mesa_program_index_to_target(i), + _mesa_shader_stage_to_program(i), linked_prog)) { return GL_FALSE; } diff --git a/src/mesa/program/program.h b/src/mesa/program/program.h index c47ac1c..71b0a4a 100644 --- a/src/mesa/program/program.h +++ b/src/mesa/program/program.h @@ -210,7 +210,7 @@ _mesa_program_enum_to_shader_stage(GLenum v) static inline GLenum -_mesa_shader_stage_to_program(gl_shader_stage stage) +_mesa_shader_stage_to_program(unsigned stage) { switch (stage) { case MESA_SHADER_VERTEX: @@ -226,23 +226,6 @@ _mesa_shader_stage_to_program(gl_shader_stage stage) } -static inline GLenum -_mesa_program_index_to_target(GLuint i) -{ - static const GLenum enums[] = { - GL_VERTEX_PROGRAM_ARB, - GL_GEOMETRY_PROGRAM_NV, - GL_FRAGMENT_PROGRAM_ARB - }; - STATIC_ASSERT(Elements(enums) == MESA_SHADER_STAGES); - if(i >= MESA_SHADER_STAGES) { - assert(!"Unexpected program index"); - return 0; - } else - return enums[i]; -} - - /* Cast wrappers from gl_program to gl_vertex/geometry/fragment_program */ static inline struct gl_fragment_program * diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index f1b3544..0871dd0 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -5312,7 +5312,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) _mesa_reference_program(ctx, &prog->_LinkedShaders[i]->Program, linked_prog); if (!ctx->Driver.ProgramStringNotify(ctx, - _mesa_program_index_to_target(i), + _mesa_shader_stage_to_program(i), linked_prog)) { _mesa_reference_program(ctx, &prog->_LinkedShaders[i]->Program, NULL); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Fold long lines introduced by the previous patch.
Module: Mesa Branch: master Commit: 1aef45578ced422df622a251fcce83bbe01d617e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1aef45578ced422df622a251fcce83bbe01d617e Author: Paul Berry Date: Thu Jan 9 11:27:38 2014 -0800 mesa: Fold long lines introduced by the previous patch. Reviewed-by: Chris Forbes Reviewed-by: Brian Paul --- src/mesa/drivers/dri/i965/brw_gs_surface_state.c |6 -- src/mesa/drivers/dri/i965/brw_vec4_gs.c |5 +++-- src/mesa/drivers/dri/i965/brw_vs.c |5 +++-- src/mesa/drivers/dri/i965/brw_vs_surface_state.c |6 -- src/mesa/main/context.c |6 -- src/mesa/main/state.c|9 ++--- src/mesa/main/transformfeedback.c|3 ++- src/mesa/state_tracker/st_atom_constbuf.c|9 ++--- 8 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_gs_surface_state.c b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c index 1ccf2e2..0795e56 100644 --- a/src/mesa/drivers/dri/i965/brw_gs_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c @@ -69,7 +69,8 @@ brw_upload_gs_ubo_surfaces(struct brw_context *brw) struct gl_context *ctx = &brw->ctx; /* _NEW_PROGRAM */ - struct gl_shader_program *prog = ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]; + struct gl_shader_program *prog = + ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]; if (!prog) return; @@ -93,7 +94,8 @@ brw_upload_gs_abo_surfaces(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; /* _NEW_PROGRAM */ - struct gl_shader_program *prog = ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]; + struct gl_shader_program *prog = + ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]; if (prog) { /* CACHE_NEW_GS_PROG */ diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs.c b/src/mesa/drivers/dri/i965/brw_vec4_gs.c index 80e6f97..abc181b 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_gs.c +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs.c @@ -296,8 +296,9 @@ brw_upload_gs_prog(struct brw_context *brw) if (!brw_search_cache(&brw->cache, BRW_GS_PROG, &key, sizeof(key), &stage_state->prog_offset, &brw->gs.prog_data)) { - bool success = do_gs_prog(brw, ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY], -gp, &key); + bool success = + do_gs_prog(brw, ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY], gp, +&key); assert(success); } brw->gs.base.prog_data = &brw->gs.prog_data->base.base; diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c index be260ae..a4f2ac6 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.c +++ b/src/mesa/drivers/dri/i965/brw_vs.c @@ -482,8 +482,9 @@ static void brw_upload_vs_prog(struct brw_context *brw) if (!brw_search_cache(&brw->cache, BRW_VS_PROG, &key, sizeof(key), &brw->vs.base.prog_offset, &brw->vs.prog_data)) { - bool success = do_vs_prog(brw, ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX], - vp, &key); + bool success = + do_vs_prog(brw, ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX], vp, +&key); (void) success; assert(success); } diff --git a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c index 06e246a..bb56d7a 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c @@ -130,7 +130,8 @@ brw_upload_vs_ubo_surfaces(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; /* _NEW_PROGRAM */ - struct gl_shader_program *prog = ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; + struct gl_shader_program *prog = + ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; if (!prog) return; @@ -154,7 +155,8 @@ brw_upload_vs_abo_surfaces(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; /* _NEW_PROGRAM */ - struct gl_shader_program *prog = ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; + struct gl_shader_program *prog = + ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]; if (prog) { /* CACHE_NEW_VS_PROG */ diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 28ce6a1..ec9f981 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1801,7 +1801,8 @@ _mesa_valid_to_render(struct gl_context *ctx, const char *where) ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY], errMsg)) {
Mesa (master): i965: Add GS support to INTEL_DEBUG=shader_time.
Module: Mesa Branch: master Commit: a4d68e9ee94cf4855a3240c3516279b4e7740268 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a4d68e9ee94cf4855a3240c3516279b4e7740268 Author: Paul Berry Date: Fri Jan 17 14:42:48 2014 -0800 i965: Add GS support to INTEL_DEBUG=shader_time. Previously, time spent in geometry shaders would be counted as part of the vertex shader time. Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_context.h |3 +++ src/mesa/drivers/dri/i965/brw_program.c | 10 +- src/mesa/drivers/dri/i965/brw_vec4.cpp|6 +++--- src/mesa/drivers/dri/i965/brw_vec4.h |9 - src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp |3 ++- src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp| 10 -- src/mesa/drivers/dri/i965/brw_vec4_vs_visitor.cpp |3 ++- src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp |3 ++- 8 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 6a0cebe..0c4c021 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -783,6 +783,9 @@ enum shader_time_shader_type { ST_VS, ST_VS_WRITTEN, ST_VS_RESET, + ST_GS, + ST_GS_WRITTEN, + ST_GS_RESET, ST_FS8, ST_FS8_WRITTEN, ST_FS8_RESET, diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c index abfc921..a6a2403 100644 --- a/src/mesa/drivers/dri/i965/brw_program.c +++ b/src/mesa/drivers/dri/i965/brw_program.c @@ -288,7 +288,7 @@ get_written_and_reset(struct brw_context *brw, int i, uint64_t *written, uint64_t *reset) { enum shader_time_shader_type type = brw->shader_time.types[i]; - assert(type == ST_VS || type == ST_FS8 || type == ST_FS16); + assert(type == ST_VS || type == ST_GS || type == ST_FS8 || type == ST_FS16); /* Find where we recorded written and reset. */ int wi, ri; @@ -340,6 +340,8 @@ brw_report_shader_time(struct brw_context *brw) switch (type) { case ST_VS_WRITTEN: case ST_VS_RESET: + case ST_GS_WRITTEN: + case ST_GS_RESET: case ST_FS8_WRITTEN: case ST_FS8_RESET: case ST_FS16_WRITTEN: @@ -349,6 +351,7 @@ brw_report_shader_time(struct brw_context *brw) continue; case ST_VS: + case ST_GS: case ST_FS8: case ST_FS16: get_written_and_reset(brw, i, &written, &reset); @@ -372,6 +375,7 @@ brw_report_shader_time(struct brw_context *brw) switch (type) { case ST_VS: + case ST_GS: case ST_FS8: case ST_FS16: total_by_type[type] += scaled[i]; @@ -432,6 +436,9 @@ brw_report_shader_time(struct brw_context *brw) case ST_VS: stage = "vs"; break; + case ST_GS: + stage = "gs"; + break; case ST_FS8: stage = "fs8"; break; @@ -449,6 +456,7 @@ brw_report_shader_time(struct brw_context *brw) printf("\n"); print_shader_time_line("total", "vs", -1, total_by_type[ST_VS], total); + print_shader_time_line("total", "gs", -1, total_by_type[ST_GS], total); print_shader_time_line("total", "fs8", -1, total_by_type[ST_FS8], total); print_shader_time_line("total", "fs16", -1, total_by_type[ST_FS16], total); } diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index d4ed820..2a0cb13 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -1494,10 +1494,10 @@ vec4_visitor::emit_shader_time_end() */ emit(ADD(diff, src_reg(diff), src_reg(-2u))); - emit_shader_time_write(ST_VS, src_reg(diff)); - emit_shader_time_write(ST_VS_WRITTEN, src_reg(1u)); + emit_shader_time_write(st_base, src_reg(diff)); + emit_shader_time_write(st_written, src_reg(1u)); emit(BRW_OPCODE_ELSE); - emit_shader_time_write(ST_VS_RESET, src_reg(1u)); + emit_shader_time_write(st_reset, src_reg(1u)); emit(BRW_OPCODE_ENDIF); } diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h index 71aaf1a..4a5b577 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.h +++ b/src/mesa/drivers/dri/i965/brw_vec4.h @@ -232,7 +232,10 @@ public: struct brw_shader *shader, void *mem_ctx, bool debug_flag, -bool no_spills); +bool no_spills, +shader_time_shader_type st_base, +shader_time_shader_type st_written, +shader_time_shader_type st_reset); ~vec4_visitor(); dst_reg dst_null_f() @@ -548,6 +551,10 @@ private: * If true, then register a
Mesa (master): i965: Modify some error messages to refer to "vec4" instead of "vs".
Module: Mesa Branch: master Commit: 51000c2ff8a6b59b6dab51cbd63ef87ac6f2a317 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=51000c2ff8a6b59b6dab51cbd63ef87ac6f2a317 Author: Paul Berry Date: Sat Mar 23 07:22:08 2013 -0700 i965: Modify some error messages to refer to "vec4" instead of "vs". These messages are in code that is shared between the VS and GS back-ends, so use the terminology "vec4" to avoid confusion. Reviewed-by: Matt Turner Reviewed-by: Ian Romanick Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_vec4_generator.cpp |8 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp index c1ef81d..51e88d2 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp @@ -327,7 +327,7 @@ vec4_generator::generate_tex(vec4_instruction *inst, } break; default: -assert(!"should not get here: invalid VS texture opcode"); +assert(!"should not get here: invalid vec4 texture opcode"); break; } } else { @@ -356,7 +356,7 @@ vec4_generator::generate_tex(vec4_instruction *inst, assert(inst->mlen == 2); break; default: -assert(!"should not get here: invalid VS texture opcode"); +assert(!"should not get here: invalid vec4 texture opcode"); break; } } @@ -1218,10 +1218,10 @@ vec4_generator::generate_vec4_instruction(vec4_instruction *instruction, default: if (inst->opcode < (int) ARRAY_SIZE(opcode_descs)) { - _mesa_problem(&brw->ctx, "Unsupported opcode in `%s' in VS\n", + _mesa_problem(&brw->ctx, "Unsupported opcode in `%s' in vec4\n", opcode_descs[inst->opcode].name); } else { - _mesa_problem(&brw->ctx, "Unsupported opcode %d in VS", inst->opcode); + _mesa_problem(&brw->ctx, "Unsupported opcode %d in vec4", inst->opcode); } abort(); } diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 76b24ad..15a6cbd 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -3353,7 +3353,7 @@ vec4_visitor::fail(const char *format, ...) va_start(va, format); msg = ralloc_vasprintf(mem_ctx, format, va); va_end(va); - msg = ralloc_asprintf(mem_ctx, "VS compile failed: %s\n", msg); + msg = ralloc_asprintf(mem_ctx, "vec4 compile failed: %s\n", msg); this->fail_msg = msg; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965: Ensure that all necessary state is re-emitted if we run out of aperture.
Module: Mesa Branch: master Commit: fb6d9798a0c6eefd512f5b0f19eed34af8f4f257 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fb6d9798a0c6eefd512f5b0f19eed34af8f4f257 Author: Paul Berry Date: Fri Jan 10 18:56:14 2014 -0800 i965: Ensure that all necessary state is re-emitted if we run out of aperture. Prior to this patch, if we ran out of aperture space during brw_try_draw_prims(), we would rewind the batch buffer pointer (potentially throwing some state that may have been emitted by brw_upload_state()), flush the batch, and then try again. However, we wouldn't reset the dirty bits to the state they had before the call to brw_upload_state(). As a result, when we tried again, there was a danger that we wouldn't re-emit all the necessary state. (Note: prior to the introduction of hardware contexts, this wasn't a problem because flushing the batch forced all state to be re-emitted). This patch fixes the problem by leaving the dirty bits set at the end of brw_upload_state(); we only clear them after we have determined that we don't need to rewind the batch buffer. Cc: 10.0 9.2 Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_draw.c |6 ++ src/mesa/drivers/dri/i965/brw_state.h|1 + src/mesa/drivers/dri/i965/brw_state_upload.c | 14 ++ 3 files changed, 21 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index b898cd3..ec56a21 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -499,6 +499,12 @@ retry: } } } + + /* Now that we know we haven't run out of aperture space, we can safely + * reset the dirty bits. + */ + if (brw->state.dirty.brw) + brw_clear_dirty_bits(brw); } if (brw->always_flush_batch) diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index a148125..e9428fb 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -143,6 +143,7 @@ brw_depthbuffer_format(struct brw_context *brw); * brw_state.c */ void brw_upload_state(struct brw_context *brw); +void brw_clear_dirty_bits(struct brw_context *brw); void brw_init_state(struct brw_context *brw); void brw_destroy_state(struct brw_context *brw); diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index 1eb3a79..7490df4 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -573,6 +573,20 @@ void brw_upload_state(struct brw_context *brw) fprintf(stderr, "\n"); } } +} + +/** + * Clear dirty bits to account for the fact that the state emitted by + * brw_upload_state() has been committed to the hardware. This is a separate + * call from brw_upload_state() because it's possible that after the call to + * brw_upload_state(), we will discover that we've run out of aperture space, + * and need to rewind the batch buffer to the state it had before the + * brw_upload_state() call. + */ +void +brw_clear_dirty_bits(struct brw_context *brw) +{ + struct brw_state_flags *state = &brw->state.dirty; memset(state, 0, sizeof(*state)); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965: Fix clears of layered framebuffers with mismatched layer counts.
Module: Mesa Branch: master Commit: 532b1fecd93fd30d3b1b101b55fd2c6e074088ad URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=532b1fecd93fd30d3b1b101b55fd2c6e074088ad Author: Paul Berry Date: Tue Jan 7 06:29:47 2014 -0800 i965: Fix clears of layered framebuffers with mismatched layer counts. Previously, Mesa enforced the following rule (from ARB_geometry_shader4's list of criteria for framebuffer completeness): * If any framebuffer attachment is layered, all attachments must have the same layer count. For three-dimensional textures, the layer count is the depth of the attached volume. For cube map textures, the layer count is always six. For one- and two-dimensional array textures, the layer count is simply the number of layers in the array texture. { FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB } However, when ARB_geometry_shader4 was adopted into GL 3.2, this rule was dropped; GL 3.2 permits different attachments to have different layer counts. This patch brings Mesa in line with GL 3.2. In order to ensure that layered clears properly clear all layers, we now have to keep track of the maximum number of layers in a layered framebuffer. Fixes the following piglit tests in spec/!OpenGL 3.2/layered-rendering: - clear-color-all-types 1d_array mipmapped - clear-color-all-types 1d_array single_level - clear-color-mismatched-layer-count - framebuffer-layer-count-mismatch Reviewed-by: Anuj Phogat Reviewed-by: Chris Forbes --- src/mesa/drivers/common/meta.c |4 ++-- src/mesa/drivers/dri/i965/brw_blorp_clear.cpp|8 +++ src/mesa/drivers/dri/i965/brw_clear.c|6 ++--- src/mesa/drivers/dri/i965/brw_wm_surface_state.c |2 +- src/mesa/drivers/dri/i965/gen6_clip_state.c |2 +- src/mesa/drivers/dri/i965/gen7_misc_state.c |2 +- src/mesa/main/fbobject.c | 26 +++--- src/mesa/main/mtypes.h |9 8 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 7b41876..1294514 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -2407,9 +2407,9 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers) GL_DYNAMIC_DRAW_ARB); /* draw quad(s) */ - if (fb->NumLayers > 0) { + if (fb->MaxNumLayers > 0) { unsigned layer; - for (layer = 0; layer < fb->NumLayers; layer++) { + for (layer = 0; layer < fb->MaxNumLayers; layer++) { if (fb->_IntegerColor) _mesa_Uniform1i(clear->IntegerLayerLocation, layer); else diff --git a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp index 072ad55..c55108a 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp @@ -573,14 +573,14 @@ brw_blorp_clear_color(struct brw_context *brw, struct gl_framebuffer *fb, if (rb == NULL) continue; - if (fb->NumLayers > 0) { + if (fb->MaxNumLayers > 0) { unsigned layer_multiplier = (irb->mt->msaa_layout == INTEL_MSAA_LAYOUT_UMS || irb->mt->msaa_layout == INTEL_MSAA_LAYOUT_CMS) ? irb->mt->num_samples : 1; - assert(fb->NumLayers * layer_multiplier == -irb->mt->level[irb->mt_level].depth); - for (unsigned layer = 0; layer < fb->NumLayers; layer++) { + unsigned num_layers = +irb->mt->level[irb->mt_level].depth / layer_multiplier; + for (unsigned layer = 0; layer < num_layers; layer++) { if (!do_single_blorp_clear(brw, fb, rb, buf, partial_clear, layer * layer_multiplier)) { return false; diff --git a/src/mesa/drivers/dri/i965/brw_clear.c b/src/mesa/drivers/dri/i965/brw_clear.c index 1cac996..fe68d9e 100644 --- a/src/mesa/drivers/dri/i965/brw_clear.c +++ b/src/mesa/drivers/dri/i965/brw_clear.c @@ -181,9 +181,9 @@ brw_fast_clear_depth(struct gl_context *ctx) */ intel_batchbuffer_emit_mi_flush(brw); - if (fb->NumLayers > 0) { - assert(fb->NumLayers == depth_irb->mt->level[depth_irb->mt_level].depth); - for (unsigned layer = 0; layer < fb->NumLayers; layer++) { + if (fb->MaxNumLayers > 0) { + unsigned num_layers = depth_irb->mt->level[depth_irb->mt_level].depth; + for (unsigned layer = 0; layer < num_layers; layer++) { intel_hiz_exec(brw, mt, depth_irb->mt_level, layer, GEN6_HIZ_OP_DEPTH_CLEAR); } diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c index acb1a40..e837631 100644 --- a/src/mesa/drivers/dri/i9
Mesa (master): main: check texture target when validating layered framebuffers.
Module: Mesa Branch: master Commit: 28af1dc21772d0b7819dff6080484c67114dc0d1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=28af1dc21772d0b7819dff6080484c67114dc0d1 Author: Paul Berry Date: Tue Nov 19 19:01:37 2013 -0800 main: check texture target when validating layered framebuffers. >From section 4.4.4 (Framebuffer Completeness) of the GL 3.2 spec: If any framebuffer attachment is layered, all populated attachments must be layered. Additionally, all populated color attachments must be from textures of the same target. We weren't checking that the attachments were from textures of the same target. Reviewed-by: Anuj Phogat Reviewed-by: Chris Forbes --- src/mesa/main/fbobject.c | 12 +--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index d846808..7ecc48e 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -877,8 +877,9 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx, GLint fixedSampleLocations = -1; GLint i; GLuint j; - bool layer_count_valid = false; + bool layer_info_valid = false; /* Covers layer_count and layer_tex_target */ GLuint layer_count = 0, att_layer_count; + GLenum layer_tex_target = 0; assert(_mesa_is_user_fbo(fb)); @@ -1062,9 +1063,14 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx, } else { att_layer_count = 0; } - if (!layer_count_valid) { + if (!layer_info_valid) { layer_count = att_layer_count; - layer_count_valid = true; + layer_tex_target = att_tex_target; + layer_info_valid = true; + } else if (layer_count > 0 && layer_tex_target != att_tex_target) { + fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS; + fbo_incomplete(ctx, "layered framebuffer has mismatched targets", i); + return; } else if (layer_count != att_layer_count) { if (layer_count == 0 || att_layer_count == 0) { fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Index into ctx->Const.Program[] rather than using ad-hoc code.
Module: Mesa Branch: master Commit: bce8bc0b250c7d64ac7898ba032858963dee6a37 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bce8bc0b250c7d64ac7898ba032858963dee6a37 Author: Paul Berry Date: Wed Jan 8 10:17:01 2014 -0800 glsl: Index into ctx->Const.Program[] rather than using ad-hoc code. Reviewed-by: Brian Paul Reviewed-by: Kenneth Graunke --- src/glsl/ast_to_hir.cpp| 13 + src/glsl/link_atomics.cpp | 16 ++-- src/glsl/link_varyings.cpp | 32 ++-- src/glsl/linker.cpp| 43 --- 4 files changed, 17 insertions(+), 87 deletions(-) diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 1ac6047..ef8e699 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -1983,18 +1983,7 @@ validate_binding_qualifier(struct _mesa_glsl_parse_state *state, * with an array of size N, all elements of the array from binding * through binding + N - 1 must be within this range." */ - unsigned limit = 0; - switch (state->stage) { - case MESA_SHADER_VERTEX: - limit = ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits; - break; - case MESA_SHADER_GEOMETRY: - limit = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits; - break; - case MESA_SHADER_FRAGMENT: - limit = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits; - break; - } + unsigned limit = ctx->Const.Program[state->stage].MaxTextureImageUnits; if (max_index >= limit) { _mesa_glsl_error(loc, state, "layout(binding = %d) for %d samplers " diff --git a/src/glsl/link_atomics.cpp b/src/glsl/link_atomics.cpp index 7f4ddaf..db9c539 100644 --- a/src/glsl/link_atomics.cpp +++ b/src/glsl/link_atomics.cpp @@ -214,18 +214,6 @@ void link_check_atomic_counter_resources(struct gl_context *ctx, struct gl_shader_program *prog) { - const unsigned max_atomic_counters[] = { - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicCounters, - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicCounters, - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters - }; - STATIC_ASSERT(Elements(max_atomic_counters) == MESA_SHADER_STAGES); - const unsigned max_atomic_buffers[] = { - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicBuffers, - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers, - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers - }; - STATIC_ASSERT(Elements(max_atomic_buffers) == MESA_SHADER_STAGES); unsigned num_buffers; active_atomic_buffer *const abs = find_active_atomic_counters(ctx, prog, &num_buffers); @@ -257,11 +245,11 @@ link_check_atomic_counter_resources(struct gl_context *ctx, /* Check that they are within the supported limits. */ for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - if (atomic_counters[i] > max_atomic_counters[i]) + if (atomic_counters[i] > ctx->Const.Program[i].MaxAtomicCounters) linker_error(prog, "Too many %s shader atomic counters", _mesa_shader_stage_to_string(i)); - if (atomic_buffers[i] > max_atomic_buffers[i]) + if (atomic_buffers[i] > ctx->Const.Program[i].MaxAtomicBuffers) linker_error(prog, "Too many %s shader atomic counter buffers", _mesa_shader_stage_to_string(i)); } diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp index 6672b87..c925c00 100644 --- a/src/glsl/link_varyings.cpp +++ b/src/glsl/link_varyings.cpp @@ -1249,19 +1249,9 @@ check_against_output_limit(struct gl_context *ctx, } } - unsigned max_output_components; - switch (producer->Stage) { - case MESA_SHADER_VERTEX: - max_output_components = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents; - break; - case MESA_SHADER_GEOMETRY: - max_output_components = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents; - break; - case MESA_SHADER_FRAGMENT: - default: - assert(!"Should not get here."); - return false; - } + assert(producer->Stage != MESA_SHADER_FRAGMENT); + unsigned max_output_components = + ctx->Const.Program[producer->Stage].MaxOutputComponents; const unsigned output_components = output_vectors * 4; if (output_components > max_output_components) { @@ -1298,19 +1288,9 @@ check_against_input_limit(struct gl_context *ctx, } } - unsigned max_input_components; - switch (consumer->Stage) { - case MESA_SHADER_GEOMETRY: - max_input_components = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents; - break; - case MESA_SHADER_FRAGMENT: - max_input_components = ctx->Const
Mesa (master): main: Change init_program_limits() to use gl_shader_stage.
Module: Mesa Branch: master Commit: e654216ac7ec2d254685d0ff5f437917747c9bd3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e654216ac7ec2d254685d0ff5f437917747c9bd3 Author: Paul Berry Date: Wed Jan 8 10:32:18 2014 -0800 main: Change init_program_limits() to use gl_shader_stage. This allows the caller to execute it in a loop rather than hand-rolling a separate call for each stage. Reviewed-by: Brian Paul Reviewed-by: Kenneth Graunke --- src/mesa/main/context.c | 18 +- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index cfebbd2..0b8fb94 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -461,7 +461,7 @@ _mesa_init_current(struct gl_context *ctx) * Important: drivers should override these with actual limits. */ static void -init_program_limits(struct gl_context *ctx, GLenum type, +init_program_limits(struct gl_context *ctx, gl_shader_stage stage, struct gl_program_constants *prog) { prog->MaxInstructions = MAX_PROGRAM_INSTRUCTIONS; @@ -473,8 +473,8 @@ init_program_limits(struct gl_context *ctx, GLenum type, prog->MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS; prog->MaxAddressOffset = MAX_PROGRAM_LOCAL_PARAMS; - switch (type) { - case GL_VERTEX_PROGRAM_ARB: + switch (stage) { + case MESA_SHADER_VERTEX: prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS; prog->MaxAttribs = MAX_VERTEX_GENERIC_ATTRIBS; prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS; @@ -482,7 +482,7 @@ init_program_limits(struct gl_context *ctx, GLenum type, prog->MaxInputComponents = 0; /* value not used */ prog->MaxOutputComponents = 16 * 4; /* old limit not to break tnl and swrast */ break; - case GL_FRAGMENT_PROGRAM_ARB: + case MESA_SHADER_FRAGMENT: prog->MaxParameters = MAX_NV_FRAGMENT_PROGRAM_PARAMS; prog->MaxAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS; prog->MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS; @@ -490,7 +490,7 @@ init_program_limits(struct gl_context *ctx, GLenum type, prog->MaxInputComponents = 16 * 4; /* old limit not to break tnl and swrast */ prog->MaxOutputComponents = 0; /* value not used */ break; - case MESA_GEOMETRY_PROGRAM: + case MESA_SHADER_GEOMETRY: prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS; prog->MaxAttribs = MAX_VERTEX_GENERIC_ATTRIBS; prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS; @@ -499,7 +499,7 @@ init_program_limits(struct gl_context *ctx, GLenum type, prog->MaxOutputComponents = 16 * 4; /* old limit not to break tnl and swrast */ break; default: - assert(0 && "Bad program type in init_program_limits()"); + assert(0 && "Bad shader stage in init_program_limits()"); } /* Set the native limits to zero. This implies that there is no native @@ -551,6 +551,7 @@ init_program_limits(struct gl_context *ctx, GLenum type, static void _mesa_init_constants(struct gl_context *ctx) { + int i; assert(ctx); /* Constants, may be overriden (usually only reduced) by device drivers */ @@ -593,9 +594,8 @@ _mesa_init_constants(struct gl_context *ctx) ctx->Const.MaxUniformBlockSize = 16384; ctx->Const.UniformBufferOffsetAlignment = 1; - init_program_limits(ctx, GL_VERTEX_PROGRAM_ARB, &ctx->Const.Program[MESA_SHADER_VERTEX]); - init_program_limits(ctx, GL_FRAGMENT_PROGRAM_ARB, &ctx->Const.Program[MESA_SHADER_FRAGMENT]); - init_program_limits(ctx, MESA_GEOMETRY_PROGRAM, &ctx->Const.Program[MESA_SHADER_GEOMETRY]); + for (i = 0; i < MESA_SHADER_STAGES; i++) + init_program_limits(ctx, i, &ctx->Const.Program[i]); ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES; ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Use functions to convert gl_shader_stage to PROGRAM enum or pipe target.
Module: Mesa Branch: master Commit: 8668eaaa007a1a0b23a4bc39469d6dba293b7da9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8668eaaa007a1a0b23a4bc39469d6dba293b7da9 Author: Paul Berry Date: Wed Jan 8 11:09:58 2014 -0800 mesa: Use functions to convert gl_shader_stage to PROGRAM enum or pipe target. Suggested-by: Brian Paul Reviewed-by: Brian Paul Reviewed-by: Kenneth Graunke v2: Improve assert message. --- src/mesa/program/ir_to_mesa.cpp| 17 +--- src/mesa/program/program.h | 18 + src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 40 ++-- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index 7988248..f6c229c 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -2799,26 +2799,11 @@ get_mesa_program(struct gl_context *ctx, ir_instruction **mesa_instruction_annotation; int i; struct gl_program *prog; - GLenum target; + GLenum target = _mesa_shader_stage_to_program(shader->Stage); const char *target_string = _mesa_shader_stage_to_string(shader->Stage); struct gl_shader_compiler_options *options = &ctx->ShaderCompilerOptions[shader->Stage]; - switch (shader->Stage) { - case MESA_SHADER_VERTEX: - target = GL_VERTEX_PROGRAM_ARB; - break; - case MESA_SHADER_FRAGMENT: - target = GL_FRAGMENT_PROGRAM_ARB; - break; - case MESA_SHADER_GEOMETRY: - target = GL_GEOMETRY_PROGRAM_NV; - break; - default: - assert(!"should not be reached"); - return NULL; - } - validate_ir_tree(shader->ir); prog = ctx->Driver.NewProgram(ctx, target, shader_program->Name); diff --git a/src/mesa/program/program.h b/src/mesa/program/program.h index 4015b4c..0e350cd 100644 --- a/src/mesa/program/program.h +++ b/src/mesa/program/program.h @@ -207,6 +207,24 @@ _mesa_program_enum_to_shader_stage(GLenum v) } } + +static inline GLenum +_mesa_shader_stage_to_program(gl_shader_stage stage) +{ + switch (stage) { + case MESA_SHADER_VERTEX: + return GL_VERTEX_PROGRAM_ARB; + case MESA_SHADER_FRAGMENT: + return GL_FRAGMENT_PROGRAM_ARB; + case MESA_SHADER_GEOMETRY: + return GL_GEOMETRY_PROGRAM_NV; + } + + assert(!"Unexpected shader stage in _mesa_shader_stage_to_program"); + return GL_VERTEX_PROGRAM_ARB; +} + + static inline GLenum _mesa_program_index_to_target(GLuint i) { diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 4b6fd2d..73c39eb 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -5023,6 +5023,24 @@ out: } /* - End TGSI code -- */ + +static unsigned +shader_stage_to_ptarget(gl_shader_stage stage) +{ + switch (stage) { + case MESA_SHADER_VERTEX: + return PIPE_SHADER_VERTEX; + case MESA_SHADER_FRAGMENT: + return PIPE_SHADER_FRAGMENT; + case MESA_SHADER_GEOMETRY: + return PIPE_SHADER_GEOMETRY; + } + + assert(!"should not be reached"); + return PIPE_SHADER_VERTEX; +} + + /** * Convert a shader's GLSL IR into a Mesa gl_program, although without * generating Mesa IR. @@ -5034,30 +5052,12 @@ get_mesa_program(struct gl_context *ctx, { glsl_to_tgsi_visitor* v; struct gl_program *prog; - GLenum target; + GLenum target = _mesa_shader_stage_to_program(shader->Stage); bool progress; struct gl_shader_compiler_options *options = &ctx->ShaderCompilerOptions[_mesa_shader_enum_to_shader_stage(shader->Type)]; struct pipe_screen *pscreen = ctx->st->pipe->screen; - unsigned ptarget; - - switch (shader->Type) { - case GL_VERTEX_SHADER: - target = GL_VERTEX_PROGRAM_ARB; - ptarget = PIPE_SHADER_VERTEX; - break; - case GL_FRAGMENT_SHADER: - target = GL_FRAGMENT_PROGRAM_ARB; - ptarget = PIPE_SHADER_FRAGMENT; - break; - case GL_GEOMETRY_SHADER: - target = GL_GEOMETRY_PROGRAM_NV; - ptarget = PIPE_SHADER_GEOMETRY; - break; - default: - assert(!"should not be reached"); - return NULL; - } + unsigned ptarget = shader_stage_to_ptarget(shader->Stage); validate_ir_tree(shader->ir); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Index into ctx->Const.Program[] rather than using ad-hoc code.
Module: Mesa Branch: master Commit: b539385789a95074cc53c9e16988d2384ec5c7de URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b539385789a95074cc53c9e16988d2384ec5c7de Author: Paul Berry Date: Wed Jan 8 10:17:01 2014 -0800 mesa: Index into ctx->Const.Program[] rather than using ad-hoc code. Reviewed-by: Brian Paul Reviewed-by: Kenneth Graunke --- src/mesa/program/program.c | 17 ++--- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c index df4d75f..3c19e8c 100644 --- a/src/mesa/program/program.c +++ b/src/mesa/program/program.c @@ -896,21 +896,8 @@ _mesa_valid_register_index(const struct gl_context *ctx, { const struct gl_program_constants *c; - switch (shaderType) { - case MESA_SHADER_VERTEX: - c = &ctx->Const.Program[MESA_SHADER_VERTEX]; - break; - case MESA_SHADER_FRAGMENT: - c = &ctx->Const.Program[MESA_SHADER_FRAGMENT]; - break; - case MESA_SHADER_GEOMETRY: - c = &ctx->Const.Program[MESA_SHADER_GEOMETRY]; - break; - default: - _mesa_problem(ctx, -"unexpected shader type in _mesa_valid_register_index()"); - return GL_FALSE; - } + assert(0 <= shaderType && shaderType < MESA_SHADER_STAGES); + c = &ctx->Const.Program[shaderType]; switch (file) { case PROGRAM_UNDEFINED: ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: replace ctx->Const.{Vertex,Fragment, Geomtery}Program with an array.
Module: Mesa Branch: master Commit: 84732a982c3eeaca2e2809532c8422dc5f7045c1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=84732a982c3eeaca2e2809532c8422dc5f7045c1 Author: Paul Berry Date: Wed Jan 8 10:00:28 2014 -0800 mesa: replace ctx->Const.{Vertex,Fragment,Geomtery}Program with an array. These are replaced with ctx->Const.Program[MESA_SHADER_{VERTEX,FRAGMENT,GEOMETRY}]. In patches to follow, this will allow us to replace a lot of ad-hoc logic with a variable index into the array. With the exception of the changes to mtypes.h, this patch was generated entirely by the command: find src -type f '(' -iname '*.c' -o -iname '*.cpp' -o -iname '*.py' \ -o -iname '*.y' ')' -print0 | xargs -0 sed -i \ -e 's/Const\.VertexProgram/Const.Program[MESA_SHADER_VERTEX]/g' \ -e 's/Const\.GeometryProgram/Const.Program[MESA_SHADER_GEOMETRY]/g' \ -e 's/Const\.FragmentProgram/Const.Program[MESA_SHADER_FRAGMENT]/g' Suggested-by: Brian Paul Reviewed-by: Brian Paul Reviewed-by: Kenneth Graunke --- src/glsl/ast_to_hir.cpp |6 +- src/glsl/builtin_variables.cpp |4 +- src/glsl/glsl_parser_extras.cpp | 28 +++--- src/glsl/link_atomics.cpp| 12 +-- src/glsl/link_varyings.cpp |8 +- src/glsl/linker.cpp | 24 ++--- src/glsl/main.cpp| 122 +- src/glsl/standalone_scaffolding.cpp | 14 +-- src/mesa/drivers/dri/i915/i830_context.c |2 +- src/mesa/drivers/dri/i915/i915_context.c | 52 +-- src/mesa/drivers/dri/i965/brw_context.c | 98 ++--- src/mesa/drivers/dri/nouveau/nv04_context.c |2 +- src/mesa/drivers/dri/nouveau/nv10_context.c |2 +- src/mesa/drivers/dri/nouveau/nv20_context.c |2 +- src/mesa/drivers/dri/r200/r200_context.c | 12 +-- src/mesa/drivers/dri/r200/r200_state.c |2 +- src/mesa/drivers/dri/radeon/radeon_context.c |2 +- src/mesa/drivers/dri/radeon/radeon_state.c |2 +- src/mesa/main/arbprogram.c | 20 ++--- src/mesa/main/context.c | 26 +++--- src/mesa/main/ffvertex_prog.c|2 +- src/mesa/main/get.c | 10 +-- src/mesa/main/get_hash_params.py | 50 +-- src/mesa/main/mtypes.h |4 +- src/mesa/main/shader_query.cpp |2 +- src/mesa/main/shaderapi.c|4 +- src/mesa/main/texenv.c |8 +- src/mesa/main/varray.c | 24 ++--- src/mesa/main/version.c |2 +- src/mesa/program/program.c | 26 +++--- src/mesa/program/program_parse.y |6 +- src/mesa/state_tracker/st_atom_sampler.c |6 +- src/mesa/state_tracker/st_atom_texture.c |8 +- src/mesa/state_tracker/st_glsl_to_tgsi.cpp |2 +- src/mesa/state_tracker/st_mesa_to_tgsi.c |2 +- src/mesa/swrast/s_context.c |6 +- src/mesa/swrast/s_texcombine.c |2 +- src/mesa/tnl/t_vb_program.c |4 +- 38 files changed, 303 insertions(+), 305 deletions(-) Diff: http://cgit.freedesktop.org/mesa/mesa/diff/?id=84732a982c3eeaca2e2809532c8422dc5f7045c1 ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Use gl_shader::Stage instead of gl_shader:: Type where possible.
Module: Mesa Branch: master Commit: e3b86f07da4ba9a4db6b8aae4072af6f1638b7cc URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e3b86f07da4ba9a4db6b8aae4072af6f1638b7cc Author: Paul Berry Date: Tue Jan 7 10:58:56 2014 -0800 mesa: Use gl_shader::Stage instead of gl_shader::Type where possible. This reduces confusion since gl_shader::Type is sometimes GL_SHADER_PROGRAM_MESA but is more frequently GL_SHADER_{VERTEX,GEOMETRY,FRAGMENT}. It also has the advantage that when switching on gl_shader::Stage, the compiler will alert if one of the possible enum types is unhandled. Finally, many functions in src/glsl (especially those dealing with linking) already use gl_shader_stage to represent pipeline stages; using gl_shader::Stage in those functions avoids the need for a conversion. Note: in the process I changed _mesa_write_shader_to_file() so that if it encounters an unexpected shader stage, it will use a file suffix of "" rather than "geom". Reviewed-by: Brian Paul v2: Split from patch "mesa: Store gl_shader_stage enum in gl_shader objects." Reviewed-by: Kenneth Graunke --- src/glsl/glsl_parser_extras.cpp |4 ++-- src/glsl/link_interface_blocks.cpp |2 +- src/glsl/link_varyings.cpp | 22 +++--- src/glsl/linker.cpp | 16 src/glsl/lower_packed_varyings.cpp |2 +- src/glsl/opt_dead_builtin_varyings.cpp |4 ++-- src/mesa/drivers/dri/i965/brw_shader.cpp |5 +++-- src/mesa/drivers/dri/i965/brw_wm_surface_state.c |2 +- src/mesa/main/shaderapi.c|8 src/mesa/program/ir_to_mesa.cpp | 17 - src/mesa/program/prog_print.c| 15 ++- 11 files changed, 51 insertions(+), 46 deletions(-) diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 8a9526c..0031e15 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -1448,7 +1448,7 @@ static void set_shader_inout_layout(struct gl_shader *shader, struct _mesa_glsl_parse_state *state) { - if (shader->Type != GL_GEOMETRY_SHADER) { + if (shader->Stage != MESA_SHADER_GEOMETRY) { /* Should have been prevented by the parser. */ assert(!state->gs_input_prim_type_specified); assert(!state->out_qualifier->flags.i); @@ -1516,7 +1516,7 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, if (!state->error && !shader->ir->is_empty()) { struct gl_shader_compiler_options *options = - &ctx->ShaderCompilerOptions[_mesa_shader_enum_to_shader_stage(shader->Type)]; + &ctx->ShaderCompilerOptions[shader->Stage]; /* Do some optimization at compile time to reduce shader IR size * and reduce later work if the same shader is linked multiple times diff --git a/src/glsl/link_interface_blocks.cpp b/src/glsl/link_interface_blocks.cpp index 4769636..52552cc 100644 --- a/src/glsl/link_interface_blocks.cpp +++ b/src/glsl/link_interface_blocks.cpp @@ -313,7 +313,7 @@ validate_interstage_inout_blocks(struct gl_shader_program *prog, const gl_shader *consumer) { interface_block_definitions definitions; - const bool extra_array_level = consumer->Type == GL_GEOMETRY_SHADER; + const bool extra_array_level = consumer->Stage == MESA_SHADER_GEOMETRY; /* Add input interfaces from the consumer to the symbol table. */ foreach_list(node, consumer->ir) { diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp index ab40d45..da97e9f 100644 --- a/src/glsl/link_varyings.cpp +++ b/src/glsl/link_varyings.cpp @@ -1072,7 +1072,7 @@ assign_varying_locations(struct gl_context *ctx, const unsigned producer_base = VARYING_SLOT_VAR0; const unsigned consumer_base = VARYING_SLOT_VAR0; varying_matches matches(ctx->Const.DisableVaryingPacking, - consumer && consumer->Type == GL_FRAGMENT_SHADER); + consumer && consumer->Stage == MESA_SHADER_FRAGMENT); hash_table *tfeedback_candidates = hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare); hash_table *consumer_inputs @@ -1217,9 +1217,9 @@ assign_varying_locations(struct gl_context *ctx, linker_error(prog, "%s shader varying %s not written " "by %s shader\n.", -_mesa_progshader_enum_to_string(consumer->Type), +_mesa_shader_stage_to_string(consumer->Stage), var->name, -_mesa_progshader_enum_to_string(producer->Type)); +
Mesa (master): mesa: Remove _mesa_progshader_enum_to_string(), which is no longer used.
Module: Mesa Branch: master Commit: 31ec2f83385c4f13c9c8831a90db982883bbedcd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=31ec2f83385c4f13c9c8831a90db982883bbedcd Author: Paul Berry Date: Tue Jan 7 11:40:00 2014 -0800 mesa: Remove _mesa_progshader_enum_to_string(), which is no longer used. Reviewed-by: Kenneth Graunke Reviewed-by: Brian Paul --- src/glsl/glsl_parser_extras.cpp| 29 src/glsl/glsl_parser_extras.h |3 --- src/mesa/main/uniform_query.cpp|2 +- src/mesa/state_tracker/st_glsl_to_tgsi.cpp |2 +- 4 files changed, 2 insertions(+), 34 deletions(-) diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index ce8279f..fe29ddd 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -329,35 +329,6 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version, } } -extern "C" { - -/** - * Translate a GLenum to a short shader stage name for debug printouts and - * error messages. - * - * It recognizes the PROGRAM variants of the names so it can be used - * with a struct gl_program->Target, not just a struct - * gl_shader->Type. - */ -const char * -_mesa_progshader_enum_to_string(GLenum type) -{ - switch (type) { - case GL_VERTEX_SHADER: - case GL_VERTEX_PROGRAM_ARB: - return "vertex"; - case GL_FRAGMENT_SHADER: - case GL_FRAGMENT_PROGRAM_ARB: - return "fragment"; - case GL_GEOMETRY_SHADER: - return "geometry"; - default: - assert(!"Should not get here."); - return "unknown"; - } -} - -} /* extern "C" */ /** * Translate a gl_shader_stage to a short shader stage name for debug diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index 6572488..2444a96 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -440,9 +440,6 @@ extern "C" { extern const char * _mesa_shader_stage_to_string(unsigned stage); -extern const char * -_mesa_progshader_enum_to_string(GLenum type); - extern int glcpp_preprocess(void *ctx, const char **shader, char **info_log, const struct gl_extensions *extensions, struct gl_context *gl_ctx); diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index d90193e..82d7628 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -452,7 +452,7 @@ log_program_parameters(const struct gl_shader_program *shProg) const struct gl_program *const prog = shProg->_LinkedShaders[i]->Program; printf("Program %d %s shader parameters:\n", - shProg->Name, _mesa_progshader_enum_to_string(prog->Target)); + shProg->Name, _mesa_shader_stage_to_string(i)); for (unsigned j = 0; j < prog->Parameters->NumParameters; j++) { printf("%s: %p %f %f %f %f\n", prog->Parameters->Parameters[j].Name, diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 9cb97a0..c4dc77f 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -5143,7 +5143,7 @@ get_mesa_program(struct gl_context *ctx, if (ctx->Shader.Flags & GLSL_DUMP) { printf("\n"); printf("GLSL IR for linked %s program %d:\n", - _mesa_progshader_enum_to_string(shader->Type), + _mesa_shader_stage_to_string(shader->Stage), shader_program->Name); _mesa_print_ir(shader->ir, NULL); printf("\n"); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Make more use of gl_shader_stage enum in link_varyings.cpp.
Module: Mesa Branch: master Commit: 80ee24823f9faeb95c46ec2bc899bb828a923c3b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=80ee24823f9faeb95c46ec2bc899bb828a923c3b Author: Paul Berry Date: Tue Jan 7 11:13:32 2014 -0800 glsl: Make more use of gl_shader_stage enum in link_varyings.cpp. Reviewed-by: Kenneth Graunke v2: Also rename "shaderType" param of is_varying_var() to "stage". Reviewed-by: Brian Paul --- src/glsl/link_varyings.cpp | 48 ++-- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp index da97e9f..7a31f97 100644 --- a/src/glsl/link_varyings.cpp +++ b/src/glsl/link_varyings.cpp @@ -48,13 +48,13 @@ static void cross_validate_types_and_qualifiers(struct gl_shader_program *prog, const ir_variable *input, const ir_variable *output, -GLenum consumer_type, -GLenum producer_type) +gl_shader_stage consumer_stage, +gl_shader_stage producer_stage) { /* Check that the types match between stages. */ const glsl_type *type_to_match = input->type; - if (consumer_type == GL_GEOMETRY_SHADER) { + if (consumer_stage == MESA_SHADER_GEOMETRY) { assert(type_to_match->is_array()); /* Enforced by ast_to_hir */ type_to_match = type_to_match->element_type(); } @@ -82,10 +82,10 @@ cross_validate_types_and_qualifiers(struct gl_shader_program *prog, linker_error(prog, "%s shader output `%s' declared as type `%s', " "but %s shader input declared as type `%s'\n", - _mesa_progshader_enum_to_string(producer_type), + _mesa_shader_stage_to_string(producer_stage), output->name, output->type->name, - _mesa_progshader_enum_to_string(consumer_type), + _mesa_shader_stage_to_string(consumer_stage), input->type->name); return; } @@ -97,10 +97,10 @@ cross_validate_types_and_qualifiers(struct gl_shader_program *prog, linker_error(prog, "%s shader output `%s' %s centroid qualifier, " "but %s shader input %s centroid qualifier\n", - _mesa_progshader_enum_to_string(producer_type), + _mesa_shader_stage_to_string(producer_stage), output->name, (output->data.centroid) ? "has" : "lacks", - _mesa_progshader_enum_to_string(consumer_type), + _mesa_shader_stage_to_string(consumer_stage), (input->data.centroid) ? "has" : "lacks"); return; } @@ -109,10 +109,10 @@ cross_validate_types_and_qualifiers(struct gl_shader_program *prog, linker_error(prog, "%s shader output `%s' %s sample qualifier, " "but %s shader input %s sample qualifier\n", - _mesa_progshader_enum_to_string(producer_type), + _mesa_shader_stage_to_string(producer_stage), output->name, (output->data.sample) ? "has" : "lacks", - _mesa_progshader_enum_to_string(consumer_type), + _mesa_shader_stage_to_string(consumer_stage), (input->data.sample) ? "has" : "lacks"); return; } @@ -121,10 +121,10 @@ cross_validate_types_and_qualifiers(struct gl_shader_program *prog, linker_error(prog, "%s shader output `%s' %s invariant qualifier, " "but %s shader input %s invariant qualifier\n", - _mesa_progshader_enum_to_string(producer_type), + _mesa_shader_stage_to_string(producer_stage), output->name, (output->data.invariant) ? "has" : "lacks", - _mesa_progshader_enum_to_string(consumer_type), + _mesa_shader_stage_to_string(consumer_stage), (input->data.invariant) ? "has" : "lacks"); return; } @@ -135,10 +135,10 @@ cross_validate_types_and_qualifiers(struct gl_shader_program *prog, "interpolation qualifier, " "but %s shader input specifies %s " "interpolation qualifier\n", - _mesa_progshader_enum_to_string(producer_type), +
Mesa (master): glsl: Change _mesa_glsl_parse_state ctor to use gl_shader_stage enum.
Module: Mesa Branch: master Commit: 911007820962d78a60c8056f64c0bde1ea724149 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=911007820962d78a60c8056f64c0bde1ea724149 Author: Paul Berry Date: Tue Jan 7 09:46:10 2014 -0800 glsl: Change _mesa_glsl_parse_state ctor to use gl_shader_stage enum. Reviewed-by: Kenneth Graunke v2: Also rename "target" param to "stage". Reviewed-by: Brian Paul --- src/glsl/glsl_parser_extras.cpp | 12 +--- src/glsl/glsl_parser_extras.h|2 +- src/glsl/main.cpp|2 +- src/glsl/test_optpass.cpp|2 +- src/glsl/tests/builtin_variable_test.cpp |2 +- src/mesa/main/ff_fragment_shader.cpp |2 +- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 0031e15..ce8279f 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -54,14 +54,12 @@ static unsigned known_desktop_glsl_versions[] = _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, - GLenum target, void *mem_ctx) + gl_shader_stage stage, + void *mem_ctx) : ctx(_ctx), switch_state() { - switch (target) { - case GL_VERTEX_SHADER: this->stage = MESA_SHADER_VERTEX; break; - case GL_FRAGMENT_SHADER: this->stage = MESA_SHADER_FRAGMENT; break; - case GL_GEOMETRY_SHADER: this->stage = MESA_SHADER_GEOMETRY; break; - } + assert(stage < MESA_SHADER_STAGES); + this->stage = stage; this->scanner = NULL; this->translation_unit.make_empty(); @@ -1479,7 +1477,7 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, bool dump_ast, bool dump_hir) { struct _mesa_glsl_parse_state *state = - new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader); + new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader); const char *source = shader->Source; state->error = glcpp_preprocess(state, &source, &state->info_log, diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index 197f337..6572488 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -68,7 +68,7 @@ extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state, struct _mesa_glsl_parse_state { - _mesa_glsl_parse_state(struct gl_context *_ctx, GLenum target, + _mesa_glsl_parse_state(struct gl_context *_ctx, gl_shader_stage stage, void *mem_ctx); DECLARE_RALLOC_CXX_OPERATORS(_mesa_glsl_parse_state); diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp index 3260c44..736689e 100644 --- a/src/glsl/main.cpp +++ b/src/glsl/main.cpp @@ -276,7 +276,7 @@ void compile_shader(struct gl_context *ctx, struct gl_shader *shader) { struct _mesa_glsl_parse_state *state = - new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader); + new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader); _mesa_glsl_compile_shader(ctx, shader, dump_ast, dump_hir); diff --git a/src/glsl/test_optpass.cpp b/src/glsl/test_optpass.cpp index bdb1e8f..1a15f3c 100644 --- a/src/glsl/test_optpass.cpp +++ b/src/glsl/test_optpass.cpp @@ -209,7 +209,7 @@ int test_optpass(int argc, char **argv) string input = read_stdin_to_eof(); struct _mesa_glsl_parse_state *state - = new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader); + = new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader); if (input_format_ir) { shader->ir = new(shader) exec_list; diff --git a/src/glsl/tests/builtin_variable_test.cpp b/src/glsl/tests/builtin_variable_test.cpp index 9b4a097..3fdfce5 100644 --- a/src/glsl/tests/builtin_variable_test.cpp +++ b/src/glsl/tests/builtin_variable_test.cpp @@ -68,7 +68,7 @@ common_builtin::SetUp() this->shader->Stage = _mesa_shader_enum_to_shader_stage(this->shader_type); this->state = - new(mem_ctx) _mesa_glsl_parse_state(&this->ctx, this->shader->Type, + new(mem_ctx) _mesa_glsl_parse_state(&this->ctx, this->shader->Stage, this->shader); _mesa_glsl_initialize_types(this->state); diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp index ba6258d..00ca025 100644 --- a/src/mesa/main/ff_fragment_shader.cpp +++ b/src/mesa/main/ff_fragment_shader.cpp @@ -1296,7 +1296,7 @@ create_new_program(struct gl_context *ctx, struct state_key *key) p.mem_ctx = ralloc_context(NULL); p.shader = ctx->Driver.NewShader(ctx, 0, GL_FRAGMENT_SHADER); p.shader->ir = new(p.shader) exec_list; - state = new(p.s
Mesa (master): glsl: make _mesa_shader_stage_to_string() available to non-C++ code.
Module: Mesa Branch: master Commit: 72a995d30721246476c94f95c7df10838fe7f69a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=72a995d30721246476c94f95c7df10838fe7f69a Author: Paul Berry Date: Tue Jan 7 10:58:56 2014 -0800 glsl: make _mesa_shader_stage_to_string() available to non-C++ code. Reviewed-by: Brian Paul v2: Split from patch "mesa: Store gl_shader_stage enum in gl_shader objects." Reviewed-by: Kenneth Graunke --- src/glsl/glsl_parser_extras.h | 15 +++ 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index 8e0ae3b..197f337 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -423,14 +423,6 @@ extern bool _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp, YYLTYPE *behavior_locp, _mesa_glsl_parse_state *state); -/** - * Get the textual name of the specified shader stage (which is a - * gl_shader_stage). - */ -extern const char * -_mesa_shader_stage_to_string(unsigned stage); - - #endif /* __cplusplus */ @@ -441,6 +433,13 @@ _mesa_shader_stage_to_string(unsigned stage); extern "C" { #endif +/** + * Get the textual name of the specified shader stage (which is a + * gl_shader_stage). + */ +extern const char * +_mesa_shader_stage_to_string(unsigned stage); + extern const char * _mesa_progshader_enum_to_string(GLenum type); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Clean up nomenclature for pipeline stages.
Module: Mesa Branch: master Commit: 665b8d7b6d8eae03c9dc0ef1a744fe59d9cc6cb6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=665b8d7b6d8eae03c9dc0ef1a744fe59d9cc6cb6 Author: Paul Berry Date: Tue Jan 7 10:11:39 2014 -0800 mesa: Clean up nomenclature for pipeline stages. Previously, we had an enum called gl_shader_type which represented pipeline stages in the order they occur in the pipeline (i.e. MESA_SHADER_VERTEX=0, MESA_SHADER_GEOMETRY=1, etc), and several inconsistently named functions for converting between it and other representations: - _mesa_shader_type_to_string: gl_shader_type -> string - _mesa_shader_type_to_index: GLenum (GL_*_SHADER) -> gl_shader_type - _mesa_program_target_to_index: GLenum (GL_*_PROGRAM) -> gl_shader_type - _mesa_shader_enum_to_string: GLenum (GL_*_{SHADER,PROGRAM}) -> string This patch tries to clean things up so that we use more consistent terminology: the enum is now called gl_shader_stage (to emphasize that it is in the order of pipeline stages), and the conversion functions are: - _mesa_shader_stage_to_string: gl_shader_stage -> string - _mesa_shader_enum_to_shader_stage: GLenum (GL_*_SHADER) -> gl_shader_stage - _mesa_program_enum_to_shader_stage: GLenum (GL_*_PROGRAM) -> gl_shader_stage - _mesa_progshader_enum_to_string: GLenum (GL_*_{SHADER,PROGRAM}) -> string In addition, MESA_SHADER_TYPES has been renamed to MESA_SHADER_STAGES, for consistency with the new name for the enum. Reviewed-by: Kenneth Graunke v2: Also rename the "target" field of _mesa_glsl_parse_state and the "target" parameter of _mesa_shader_stage_to_string to "stage". Reviewed-by: Brian Paul --- src/glsl/ast_to_hir.cpp | 76 +++--- src/glsl/builtin_functions.cpp | 22 +++ src/glsl/builtin_variables.cpp | 12 ++-- src/glsl/glsl_parser.yy |8 +-- src/glsl/glsl_parser_extras.cpp | 22 +++ src/glsl/glsl_parser_extras.h| 10 +-- src/glsl/ir_uniform.h|2 +- src/glsl/link_atomics.cpp| 22 +++ src/glsl/link_uniform_initializers.cpp |8 +-- src/glsl/link_uniforms.cpp | 12 ++-- src/glsl/link_varyings.cpp | 24 +++ src/glsl/linker.cpp | 62 +- src/glsl/main.cpp|2 +- src/glsl/standalone_scaffolding.cpp |2 +- src/glsl/standalone_scaffolding.h|6 +- src/glsl/test_optpass.cpp|2 +- src/glsl/tests/set_uniform_initializer_tests.cpp |4 +- src/mesa/drivers/dri/i965/brw_context.c |2 +- src/mesa/drivers/dri/i965/brw_shader.cpp | 10 +-- src/mesa/main/context.c |8 +-- src/mesa/main/mtypes.h | 12 ++-- src/mesa/main/shaderapi.c| 14 ++-- src/mesa/main/shaderapi.h|2 +- src/mesa/main/shaderobj.c|4 +- src/mesa/main/shaderobj.h|6 +- src/mesa/main/uniform_query.cpp |6 +- src/mesa/main/uniforms.c |4 +- src/mesa/program/ir_to_mesa.cpp | 18 ++--- src/mesa/program/program.c |2 +- src/mesa/program/program.h |8 +-- src/mesa/program/sampler.cpp |2 +- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 12 ++-- 32 files changed, 203 insertions(+), 203 deletions(-) Diff: http://cgit.freedesktop.org/mesa/mesa/diff/?id=665b8d7b6d8eae03c9dc0ef1a744fe59d9cc6cb6 ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Make more use of gl_shader_stage enum in lower_clip_distance.cpp.
Module: Mesa Branch: master Commit: 2adb9fea77140fccb7bd3f7a547f026c050333bd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2adb9fea77140fccb7bd3f7a547f026c050333bd Author: Paul Berry Date: Tue Jan 7 11:19:22 2014 -0800 glsl: Make more use of gl_shader_stage enum in lower_clip_distance.cpp. Reviewed-by: Kenneth Graunke Reviewed-by: Brian Paul --- src/glsl/lower_clip_distance.cpp | 16 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/glsl/lower_clip_distance.cpp b/src/glsl/lower_clip_distance.cpp index bb4f6ab..2d6138d 100644 --- a/src/glsl/lower_clip_distance.cpp +++ b/src/glsl/lower_clip_distance.cpp @@ -54,10 +54,10 @@ namespace { class lower_clip_distance_visitor : public ir_rvalue_visitor { public: - explicit lower_clip_distance_visitor(GLenum shader_type) + explicit lower_clip_distance_visitor(gl_shader_stage shader_stage) : progress(false), old_clip_distance_1d_var(NULL), old_clip_distance_2d_var(NULL), new_clip_distance_1d_var(NULL), -new_clip_distance_2d_var(NULL), shader_type(shader_type) +new_clip_distance_2d_var(NULL), shader_stage(shader_stage) { } @@ -96,9 +96,9 @@ public: ir_variable *new_clip_distance_2d_var; /** -* Type of shader we are compiling (e.g. GL_VERTEX_SHADER) +* Type of shader we are compiling (e.g. MESA_SHADER_VERTEX) */ - const GLenum shader_type; + const gl_shader_stage shader_stage; }; } /* anonymous namespace */ @@ -142,7 +142,7 @@ lower_clip_distance_visitor::visit(ir_variable *ir) } else { /* 2D gl_ClipDistance (used for geometry input). */ assert(ir->data.mode == ir_var_shader_in && - this->shader_type == GL_GEOMETRY_SHADER_ARB); + this->shader_stage == MESA_SHADER_GEOMETRY); if (this->old_clip_distance_2d_var) return visit_continue; @@ -253,7 +253,7 @@ lower_clip_distance_visitor::is_clip_distance_vec8(ir_rvalue *ir) } if (this->old_clip_distance_2d_var) { /* 2D clip distance is only possible as a geometry input */ - assert(this->shader_type == GL_GEOMETRY_SHADER_ARB); + assert(this->shader_stage == MESA_SHADER_GEOMETRY); ir_dereference_array *array_ref = ir->as_dereference_array(); if (array_ref) { @@ -288,7 +288,7 @@ lower_clip_distance_visitor::lower_clip_distance_vec8(ir_rvalue *ir) } if (this->old_clip_distance_2d_var) { /* 2D clip distance is only possible as a geometry input */ - assert(this->shader_type == GL_GEOMETRY_SHADER_ARB); + assert(this->shader_stage == MESA_SHADER_GEOMETRY); ir_dereference_array *array_ref = ir->as_dereference_array(); if (array_ref) { @@ -536,7 +536,7 @@ lower_clip_distance_visitor::visit_leave(ir_call *ir) bool lower_clip_distance(gl_shader *shader) { - lower_clip_distance_visitor v(shader->Type); + lower_clip_distance_visitor v(shader->Stage); visit_list_elements(&v, shader->ir); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Move declaration of gl_shader_stage earlier in mtypes.h.
Module: Mesa Branch: master Commit: 1722f5e73ee73e7c2ab58a4be39c95c2a55b154f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1722f5e73ee73e7c2ab58a4be39c95c2a55b154f Author: Paul Berry Date: Tue Jan 7 10:58:56 2014 -0800 mesa: Move declaration of gl_shader_stage earlier in mtypes.h. Also move the related #define MESA_SHADER_STAGES. This will allow gl_shader_stage to be used in struct gl_shader. Reviewed-by: Brian Paul v2: Split from patch "mesa: Store gl_shader_stage enum in gl_shader objects." Reviewed-by: Kenneth Graunke --- src/mesa/main/mtypes.h | 34 +- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 9e2083c..04bc4d4 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -393,6 +393,23 @@ typedef enum /** + * Shader stages. Note that these will become 5 with tessellation. + * + * The order must match how shaders are ordered in the pipeline. + * The GLSL linker assumes that if ihttp://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Make more use of gl_shader_stage enum in ir_set_program_inouts.cpp.
Module: Mesa Branch: master Commit: acfc58a7e593cdb377527c8b84e2fd9bf5906079 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=acfc58a7e593cdb377527c8b84e2fd9bf5906079 Author: Paul Berry Date: Tue Jan 7 11:23:34 2014 -0800 glsl: Make more use of gl_shader_stage enum in ir_set_program_inouts.cpp. Reviewed-by: Kenneth Graunke Reviewed-by: Brian Paul --- src/glsl/ir.h |2 +- src/glsl/ir_set_program_inouts.cpp | 29 ++-- src/mesa/drivers/dri/i965/brw_shader.cpp |2 +- src/mesa/program/ir_to_mesa.cpp|2 +- src/mesa/state_tracker/st_glsl_to_tgsi.cpp |2 +- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/glsl/ir.h b/src/glsl/ir.h index 4d86385..aff6798 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -2351,7 +2351,7 @@ ir_has_call(ir_instruction *ir); extern void do_set_program_inouts(exec_list *instructions, struct gl_program *prog, - GLenum shader_type); + gl_shader_stage shader_stage); extern char * prototype_string(const glsl_type *return_type, const char *name, diff --git a/src/glsl/ir_set_program_inouts.cpp b/src/glsl/ir_set_program_inouts.cpp index 0b49eb2..5163eb2 100644 --- a/src/glsl/ir_set_program_inouts.cpp +++ b/src/glsl/ir_set_program_inouts.cpp @@ -46,10 +46,11 @@ namespace { class ir_set_program_inouts_visitor : public ir_hierarchical_visitor { public: - ir_set_program_inouts_visitor(struct gl_program *prog, GLenum shader_type) + ir_set_program_inouts_visitor(struct gl_program *prog, + gl_shader_stage shader_stage) { this->prog = prog; - this->shader_type = shader_type; + this->shader_stage = shader_stage; } ~ir_set_program_inouts_visitor() { @@ -67,7 +68,7 @@ private: bool try_mark_partial_variable(ir_variable *var, ir_rvalue *index); struct gl_program *prog; - GLenum shader_type; + gl_shader_stage shader_stage; }; } /* anonymous namespace */ @@ -124,13 +125,13 @@ void ir_set_program_inouts_visitor::mark_whole_variable(ir_variable *var) { const glsl_type *type = var->type; - if (this->shader_type == GL_GEOMETRY_SHADER && + if (this->shader_stage == MESA_SHADER_GEOMETRY && var->data.mode == ir_var_shader_in && type->is_array()) { type = type->fields.array; } mark(this->prog, var, 0, type->count_attribute_slots(), -this->shader_type == GL_FRAGMENT_SHADER); +this->shader_stage == MESA_SHADER_FRAGMENT); } /* Default handler: Mark all the locations in the variable as used. */ @@ -163,7 +164,7 @@ ir_set_program_inouts_visitor::try_mark_partial_variable(ir_variable *var, { const glsl_type *type = var->type; - if (this->shader_type == GL_GEOMETRY_SHADER && + if (this->shader_stage == MESA_SHADER_GEOMETRY && var->data.mode == ir_var_shader_in) { /* The only geometry shader input that is not an array is * gl_PrimitiveIDIn, and in that case, this code will never be reached, @@ -227,7 +228,7 @@ ir_set_program_inouts_visitor::try_mark_partial_variable(ir_variable *var, } mark(this->prog, var, index_as_constant->value.u[0] * elem_width, -elem_width, this->shader_type == GL_FRAGMENT_SHADER); +elem_width, this->shader_stage == MESA_SHADER_FRAGMENT); return true; } @@ -245,7 +246,7 @@ ir_set_program_inouts_visitor::visit_enter(ir_dereference_array *ir) */ if (ir_dereference_variable * const deref_var = inner_array->array->as_dereference_variable()) { - if (this->shader_type == GL_GEOMETRY_SHADER && + if (this->shader_stage == MESA_SHADER_GEOMETRY && deref_var->var->data.mode == ir_var_shader_in) { /* foo is a geometry shader input, so i is the vertex, and j the * part of the input we're accessing. @@ -264,7 +265,7 @@ ir_set_program_inouts_visitor::visit_enter(ir_dereference_array *ir) } else if (ir_dereference_variable * const deref_var = ir->array->as_dereference_variable()) { /* ir => foo[i], where foo is a variable. */ - if (this->shader_type == GL_GEOMETRY_SHADER && + if (this->shader_stage == MESA_SHADER_GEOMETRY && deref_var->var->data.mode == ir_var_shader_in) { /* foo is a geometry shader input, so i is the vertex, and we're * accessing the entire input. @@ -304,7 +305,7 @@ ir_set_program_inouts_visitor::visit_enter(ir_function_signature *ir) ir_visitor_status ir_set_program_inouts_visitor::visit_enter(ir_expression *ir) { - if (this->shader_type == GL_FRAGMENT_SHADER && + if (this->shader_stage == MESA_SHADER_FRAGMENT && ir->operation
Mesa (master): mesa: Store gl_shader_stage enum in gl_shader objects.
Module: Mesa Branch: master Commit: 65511e5f22e2ba0a5ebd9210319a55d80ea5334e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=65511e5f22e2ba0a5ebd9210319a55d80ea5334e Author: Paul Berry Date: Tue Jan 7 10:58:56 2014 -0800 mesa: Store gl_shader_stage enum in gl_shader objects. Reviewed-by: Brian Paul Reviewed-by: Kenneth Graunke --- src/glsl/main.cpp |1 + src/glsl/standalone_scaffolding.cpp|1 + src/glsl/test_optpass.cpp |1 + src/glsl/tests/builtin_variable_test.cpp |1 + src/mesa/drivers/dri/i965/brw_shader.cpp |1 + src/mesa/main/mtypes.h |1 + src/mesa/main/shaderobj.c |1 + src/mesa/state_tracker/st_glsl_to_tgsi.cpp |1 + 8 files changed, 8 insertions(+) diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp index 2f59848..3260c44 100644 --- a/src/glsl/main.cpp +++ b/src/glsl/main.cpp @@ -362,6 +362,7 @@ main(int argc, char **argv) shader->Type = GL_FRAGMENT_SHADER; else usage_fail(argv[0]); + shader->Stage = _mesa_shader_enum_to_shader_stage(shader->Type); shader->Source = load_text_file(whole_program, argv[optind]); if (shader->Source == NULL) { diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp index 73dfe5c..6a71745 100644 --- a/src/glsl/standalone_scaffolding.cpp +++ b/src/glsl/standalone_scaffolding.cpp @@ -76,6 +76,7 @@ _mesa_new_shader(struct gl_context *ctx, GLuint name, GLenum type) shader = rzalloc(NULL, struct gl_shader); if (shader) { shader->Type = type; + shader->Stage = _mesa_shader_enum_to_shader_stage(type); shader->Name = name; shader->RefCount = 1; } diff --git a/src/glsl/test_optpass.cpp b/src/glsl/test_optpass.cpp index 01f6f95..bdb1e8f 100644 --- a/src/glsl/test_optpass.cpp +++ b/src/glsl/test_optpass.cpp @@ -204,6 +204,7 @@ int test_optpass(int argc, char **argv) struct gl_shader *shader = rzalloc(NULL, struct gl_shader); shader->Type = shader_type; + shader->Stage = _mesa_shader_enum_to_shader_stage(shader_type); string input = read_stdin_to_eof(); diff --git a/src/glsl/tests/builtin_variable_test.cpp b/src/glsl/tests/builtin_variable_test.cpp index 63949ee..9b4a097 100644 --- a/src/glsl/tests/builtin_variable_test.cpp +++ b/src/glsl/tests/builtin_variable_test.cpp @@ -65,6 +65,7 @@ common_builtin::SetUp() this->shader = rzalloc(this->mem_ctx, gl_shader); this->shader->Type = this->shader_type; + this->shader->Stage = _mesa_shader_enum_to_shader_stage(this->shader_type); this->state = new(mem_ctx) _mesa_glsl_parse_state(&this->ctx, this->shader->Type, diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index a40df6d..c0d6aa2 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -40,6 +40,7 @@ brw_new_shader(struct gl_context *ctx, GLuint name, GLuint type) shader = rzalloc(NULL, struct brw_shader); if (shader) { shader->base.Type = type; + shader->base.Stage = _mesa_shader_enum_to_shader_stage(type); shader->base.Name = name; _mesa_init_shader(ctx, &shader->base); } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 04bc4d4..37e0592 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2319,6 +2319,7 @@ struct gl_shader * Must be the first field. */ GLenum Type; + gl_shader_stage Stage; GLuint Name; /**< AKA the handle */ GLchar *Label; /**< GL_KHR_debug */ GLint RefCount; /**< Reference count */ diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c index 3076fb4..dc81bbc 100644 --- a/src/mesa/main/shaderobj.c +++ b/src/mesa/main/shaderobj.c @@ -110,6 +110,7 @@ _mesa_new_shader(struct gl_context *ctx, GLuint name, GLenum type) shader = rzalloc(NULL, struct gl_shader); if (shader) { shader->Type = type; + shader->Stage = _mesa_shader_enum_to_shader_stage(type); shader->Name = name; _mesa_init_shader(ctx, shader); } diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index b2131ed..bd4eb5e 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -5207,6 +5207,7 @@ st_new_shader(struct gl_context *ctx, GLuint name, GLuint type) shader = rzalloc(NULL, struct gl_shader); if (shader) { shader->Type = type; + shader->Stage = _mesa_shader_enum_to_shader_stage(type); shader->Name = name; _mesa_init_shader(ctx, shader); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Improve static error checking of arrays sized by MESA_SHADER_TYPES.
Module: Mesa Branch: master Commit: 99e822fa18a322f7bf0d32ce99eab534d5614469 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=99e822fa18a322f7bf0d32ce99eab534d5614469 Author: Paul Berry Date: Tue Dec 17 09:54:38 2013 -0800 mesa: Improve static error checking of arrays sized by MESA_SHADER_TYPES. This patch replaces the following pattern: foo bar[MESA_SHADER_TYPES] = { ... }; With: foo bar[] = { ... }; STATIC_ASSERT(Elements(bar) == MESA_SHADER_TYPES); This way, when a new shader type is added in a future version of Mesa, we will get a compile error to remind us that the array needs to be updated. Reviewed-by: Brian Paul --- src/glsl/link_atomics.cpp |7 --- src/glsl/linker.cpp| 14 ++ src/mesa/program/program.h |3 ++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/glsl/link_atomics.cpp b/src/glsl/link_atomics.cpp index 6b7682c..603329c 100644 --- a/src/glsl/link_atomics.cpp +++ b/src/glsl/link_atomics.cpp @@ -214,17 +214,18 @@ void link_check_atomic_counter_resources(struct gl_context *ctx, struct gl_shader_program *prog) { - STATIC_ASSERT(MESA_SHADER_TYPES == 3); - const unsigned max_atomic_counters[MESA_SHADER_TYPES] = { + const unsigned max_atomic_counters[] = { ctx->Const.VertexProgram.MaxAtomicCounters, ctx->Const.GeometryProgram.MaxAtomicCounters, ctx->Const.FragmentProgram.MaxAtomicCounters }; - const unsigned max_atomic_buffers[MESA_SHADER_TYPES] = { + STATIC_ASSERT(Elements(max_atomic_counters) == MESA_SHADER_TYPES); + const unsigned max_atomic_buffers[] = { ctx->Const.VertexProgram.MaxAtomicBuffers, ctx->Const.GeometryProgram.MaxAtomicBuffers, ctx->Const.FragmentProgram.MaxAtomicBuffers }; + STATIC_ASSERT(Elements(max_atomic_buffers) == MESA_SHADER_TYPES); unsigned num_buffers; active_atomic_buffer *const abs = find_active_atomic_counters(ctx, prog, &num_buffers); diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 9cfbb9b..a81e107 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -1894,29 +1894,35 @@ store_fragdepth_layout(struct gl_shader_program *prog) static void check_resources(struct gl_context *ctx, struct gl_shader_program *prog) { - const unsigned max_samplers[MESA_SHADER_TYPES] = { + const unsigned max_samplers[] = { ctx->Const.VertexProgram.MaxTextureImageUnits, ctx->Const.GeometryProgram.MaxTextureImageUnits, ctx->Const.FragmentProgram.MaxTextureImageUnits }; + STATIC_ASSERT(Elements(max_samplers) == MESA_SHADER_TYPES); - const unsigned max_default_uniform_components[MESA_SHADER_TYPES] = { + const unsigned max_default_uniform_components[] = { ctx->Const.VertexProgram.MaxUniformComponents, ctx->Const.GeometryProgram.MaxUniformComponents, ctx->Const.FragmentProgram.MaxUniformComponents }; + STATIC_ASSERT(Elements(max_default_uniform_components) == + MESA_SHADER_TYPES); - const unsigned max_combined_uniform_components[MESA_SHADER_TYPES] = { + const unsigned max_combined_uniform_components[] = { ctx->Const.VertexProgram.MaxCombinedUniformComponents, ctx->Const.GeometryProgram.MaxCombinedUniformComponents, ctx->Const.FragmentProgram.MaxCombinedUniformComponents }; + STATIC_ASSERT(Elements(max_combined_uniform_components) == + MESA_SHADER_TYPES); - const unsigned max_uniform_blocks[MESA_SHADER_TYPES] = { + const unsigned max_uniform_blocks[] = { ctx->Const.VertexProgram.MaxUniformBlocks, ctx->Const.GeometryProgram.MaxUniformBlocks, ctx->Const.FragmentProgram.MaxUniformBlocks }; + STATIC_ASSERT(Elements(max_uniform_blocks) == MESA_SHADER_TYPES); for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) { struct gl_shader *sh = prog->_LinkedShaders[i]; diff --git a/src/mesa/program/program.h b/src/mesa/program/program.h index 353ccab..135271c 100644 --- a/src/mesa/program/program.h +++ b/src/mesa/program/program.h @@ -210,11 +210,12 @@ _mesa_program_target_to_index(GLenum v) static inline GLenum _mesa_program_index_to_target(GLuint i) { - static const GLenum enums[MESA_SHADER_TYPES] = { + static const GLenum enums[] = { GL_VERTEX_PROGRAM_ARB, GL_GEOMETRY_PROGRAM_NV, GL_FRAGMENT_PROGRAM_ARB }; + STATIC_ASSERT(Elements(enums) == MESA_SHADER_TYPES); if(i >= MESA_SHADER_TYPES) return 0; else ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): main: Remove unused function _mesa_shader_index_to_type().
Module: Mesa Branch: master Commit: 89c35c59a4421db863ba70b28a546b294f7b1ba9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=89c35c59a4421db863ba70b28a546b294f7b1ba9 Author: Paul Berry Date: Tue Dec 17 10:07:24 2013 -0800 main: Remove unused function _mesa_shader_index_to_type(). Reviewed-by: Brian Paul --- src/mesa/main/shaderobj.h | 15 --- 1 file changed, 15 deletions(-) diff --git a/src/mesa/main/shaderobj.h b/src/mesa/main/shaderobj.h index aff178f..155058d 100644 --- a/src/mesa/main/shaderobj.h +++ b/src/mesa/main/shaderobj.h @@ -118,21 +118,6 @@ _mesa_shader_type_to_index(GLenum v) } -static inline GLenum -_mesa_shader_index_to_type(GLuint i) -{ - static const GLenum enums[MESA_SHADER_TYPES] = { - GL_VERTEX_SHADER, - GL_GEOMETRY_SHADER, - GL_FRAGMENT_SHADER - }; - if (i >= MESA_SHADER_TYPES) - return 0; - else - return enums[i]; -} - - #ifdef __cplusplus } #endif ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Add an assertion to _mesa_program_index_to_target().
Module: Mesa Branch: master Commit: 7e0b4b5e9b719de9f01e808fc18138b67be4178a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7e0b4b5e9b719de9f01e808fc18138b67be4178a Author: Paul Berry Date: Tue Dec 17 10:11:27 2013 -0800 mesa: Add an assertion to _mesa_program_index_to_target(). Only a Mesa bug could cause this function to be called with an out-of-range index, so raise an assertion if that ever happens. Reviewed-by: Brian Paul --- src/mesa/program/program.h |5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mesa/program/program.h b/src/mesa/program/program.h index 135271c..baff473 100644 --- a/src/mesa/program/program.h +++ b/src/mesa/program/program.h @@ -216,9 +216,10 @@ _mesa_program_index_to_target(GLuint i) GL_FRAGMENT_PROGRAM_ARB }; STATIC_ASSERT(Elements(enums) == MESA_SHADER_TYPES); - if(i >= MESA_SHADER_TYPES) + if(i >= MESA_SHADER_TYPES) { + assert(!"Unexpected program index"); return 0; - else + } else return enums[i]; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Fix gl_type of usamplerCube built-in type.
Module: Mesa Branch: master Commit: 77c74c647be7d387d1f94e4a64ce44646a5b7ccd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=77c74c647be7d387d1f94e4a64ce44646a5b7ccd Author: Paul Berry Date: Mon Dec 16 15:10:42 2013 -0800 glsl: Fix gl_type of usamplerCube built-in type. I'm not aware of any piglit tests that this fixes, but the old code was obviously wrong. Reviewed-by: Kenneth Graunke --- src/glsl/builtin_type_macros.h |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/glsl/builtin_type_macros.h b/src/glsl/builtin_type_macros.h index 263fd83..06b4dbd 100644 --- a/src/glsl/builtin_type_macros.h +++ b/src/glsl/builtin_type_macros.h @@ -91,7 +91,7 @@ DECL_TYPE(isampler2DMSArray, GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, GLSL_SAMPLER_D DECL_TYPE(usampler1D,GL_UNSIGNED_INT_SAMPLER_1D, GLSL_SAMPLER_DIM_1D, 0, 0, GLSL_TYPE_UINT) DECL_TYPE(usampler2D,GL_UNSIGNED_INT_SAMPLER_2D, GLSL_SAMPLER_DIM_2D, 0, 0, GLSL_TYPE_UINT) DECL_TYPE(usampler3D,GL_UNSIGNED_INT_SAMPLER_3D, GLSL_SAMPLER_DIM_3D, 0, 0, GLSL_TYPE_UINT) -DECL_TYPE(usamplerCube, GL_INT_SAMPLER_CUBE, GLSL_SAMPLER_DIM_CUBE, 0, 0, GLSL_TYPE_UINT) +DECL_TYPE(usamplerCube, GL_UNSIGNED_INT_SAMPLER_CUBE, GLSL_SAMPLER_DIM_CUBE, 0, 0, GLSL_TYPE_UINT) DECL_TYPE(usampler1DArray, GL_UNSIGNED_INT_SAMPLER_1D_ARRAY, GLSL_SAMPLER_DIM_1D, 0, 1, GLSL_TYPE_UINT) DECL_TYPE(usampler2DArray, GL_UNSIGNED_INT_SAMPLER_2D_ARRAY, GLSL_SAMPLER_DIM_2D, 0, 1, GLSL_TYPE_UINT) DECL_TYPE(usamplerCubeArray, GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY, GLSL_SAMPLER_DIM_CUBE, 0, 1, GLSL_TYPE_UINT) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Get rid of hardcoded arrays of shader target names.
Module: Mesa Branch: master Commit: d343e3d98c9ef639663efc371b1729dcc7788777 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d343e3d98c9ef639663efc371b1729dcc7788777 Author: Paul Berry Date: Tue Dec 17 09:46:08 2013 -0800 glsl: Get rid of hardcoded arrays of shader target names. We already have a function for converting a shader type index to a string: _mesa_shader_type_to_string(). Reviewed-by: Brian Paul --- src/glsl/link_atomics.cpp |8 +++- src/glsl/linker.cpp | 16 ++-- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/glsl/link_atomics.cpp b/src/glsl/link_atomics.cpp index 33903ad..6b7682c 100644 --- a/src/glsl/link_atomics.cpp +++ b/src/glsl/link_atomics.cpp @@ -21,6 +21,7 @@ * DEALINGS IN THE SOFTWARE. */ +#include "glsl_parser_extras.h" #include "ir.h" #include "ir_uniform.h" #include "linker.h" @@ -214,9 +215,6 @@ link_check_atomic_counter_resources(struct gl_context *ctx, struct gl_shader_program *prog) { STATIC_ASSERT(MESA_SHADER_TYPES == 3); - static const char *shader_names[MESA_SHADER_TYPES] = { - "vertex", "geometry", "fragment" - }; const unsigned max_atomic_counters[MESA_SHADER_TYPES] = { ctx->Const.VertexProgram.MaxAtomicCounters, ctx->Const.GeometryProgram.MaxAtomicCounters, @@ -260,11 +258,11 @@ link_check_atomic_counter_resources(struct gl_context *ctx, for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) { if (atomic_counters[i] > max_atomic_counters[i]) linker_error(prog, "Too many %s shader atomic counters", - shader_names[i]); + _mesa_shader_type_to_string(i)); if (atomic_buffers[i] > max_atomic_buffers[i]) linker_error(prog, "Too many %s shader atomic counter buffers", - shader_names[i]); + _mesa_shader_type_to_string(i)); } if (total_atomic_counters > ctx->Const.MaxCombinedAtomicCounters) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index f6d7a90..6edf7c1 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -1893,10 +1893,6 @@ store_fragdepth_layout(struct gl_shader_program *prog) static void check_resources(struct gl_context *ctx, struct gl_shader_program *prog) { - static const char *const shader_names[MESA_SHADER_TYPES] = { - "vertex", "geometry", "fragment" - }; - const unsigned max_samplers[MESA_SHADER_TYPES] = { ctx->Const.VertexProgram.MaxTextureImageUnits, ctx->Const.GeometryProgram.MaxTextureImageUnits, @@ -1929,7 +1925,7 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog) if (sh->num_samplers > max_samplers[i]) { linker_error(prog, "Too many %s shader texture samplers", - shader_names[i]); + _mesa_shader_type_to_string(i)); } if (sh->num_uniform_components > max_default_uniform_components[i]) { @@ -1938,11 +1934,11 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog) "components, but the driver will try to optimize " "them out; this is non-portable out-of-spec " "behavior\n", - shader_names[i]); + _mesa_shader_type_to_string(i)); } else { linker_error(prog, "Too many %s shader default uniform block " "components", - shader_names[i]); + _mesa_shader_type_to_string(i)); } } @@ -1952,10 +1948,10 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog) linker_warning(prog, "Too many %s shader uniform components, " "but the driver will try to optimize them out; " "this is non-portable out-of-spec behavior\n", - shader_names[i]); + _mesa_shader_type_to_string(i)); } else { linker_error(prog, "Too many %s shader uniform components", - shader_names[i]); + _mesa_shader_type_to_string(i)); } } } @@ -1979,7 +1975,7 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog) for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) { if (blocks[i] > max_uniform_blocks[i]) { linker_error(prog, "Too many %s uniform blocks (%d/%d)", - shader_names[i], + _mesa_shader_type_to_string(i), blocks[i], max_uniform_blocks[i]); break; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Remove extraneous shader_type argument from analyze_clip_usage().
Module: Mesa Branch: master Commit: b30e25f29752fe3782d9ad43cb2cee46885c487d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b30e25f29752fe3782d9ad43cb2cee46885c487d Author: Paul Berry Date: Tue Dec 17 09:49:43 2013 -0800 glsl: Remove extraneous shader_type argument from analyze_clip_usage(). This argument was carrying the name of the shader target (as a string). We can get this just as easily by calling _mesa_shader_enum_to_string(). Reviewed-by: Brian Paul --- src/glsl/linker.cpp |9 + 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 6edf7c1..9cfbb9b 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -414,7 +414,7 @@ link_invalidate_variable_locations(exec_list *ir) * Return false if an error was reported. */ static void -analyze_clip_usage(const char *shader_type, struct gl_shader_program *prog, +analyze_clip_usage(struct gl_shader_program *prog, struct gl_shader *shader, GLboolean *UsesClipDistance, GLuint *ClipDistanceArraySize) { @@ -437,7 +437,8 @@ analyze_clip_usage(const char *shader_type, struct gl_shader_program *prog, clip_distance.run(shader->ir); if (clip_vertex.variable_found() && clip_distance.variable_found()) { linker_error(prog, "%s shader writes to both `gl_ClipVertex' " - "and `gl_ClipDistance'\n", shader_type); + "and `gl_ClipDistance'\n", + _mesa_shader_enum_to_string(shader->Type)); return; } *UsesClipDistance = clip_distance.variable_found(); @@ -501,7 +502,7 @@ validate_vertex_shader_executable(struct gl_shader_program *prog, } } - analyze_clip_usage("vertex", prog, shader, &prog->Vert.UsesClipDistance, + analyze_clip_usage(prog, shader, &prog->Vert.UsesClipDistance, &prog->Vert.ClipDistanceArraySize); } @@ -548,7 +549,7 @@ validate_geometry_shader_executable(struct gl_shader_program *prog, unsigned num_vertices = vertices_per_prim(prog->Geom.InputType); prog->Geom.VerticesIn = num_vertices; - analyze_clip_usage("geometry", prog, shader, &prog->Geom.UsesClipDistance, + analyze_clip_usage(prog, shader, &prog->Geom.UsesClipDistance, &prog->Geom.ClipDistanceArraySize); find_end_primitive_visitor end_primitive; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): Rename overloads of _mesa_glsl_shader_target_name().
Module: Mesa Branch: master Commit: 26707abe5635e99814603a0f4895865e977cf267 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=26707abe5635e99814603a0f4895865e977cf267 Author: Paul Berry Date: Tue Dec 17 12:13:11 2013 -0800 Rename overloads of _mesa_glsl_shader_target_name(). Previously, _mesa_glsl_shader_target_name() had an overload for GLenum and an overload for the gl_shader_type enum, each of which behaved differently. However, since GLenum is a synonym for unsigned int, and unsigned ints are often used in place of gl_shader_type (e.g. in loop indices), there was a big risk of calling the wrong overload by mistake. This patch gives the two overloads different names so that it's always clear which one we mean to call. Reviewed-by: Brian Paul --- src/glsl/ast_to_hir.cpp| 10 +- src/glsl/glsl_parser_extras.cpp| 17 - src/glsl/glsl_parser_extras.h |7 --- src/glsl/link_varyings.cpp | 24 src/glsl/linker.cpp|2 +- src/mesa/drivers/dri/i965/brw_shader.cpp |4 ++-- src/mesa/main/shaderapi.c |6 +++--- src/mesa/main/uniform_query.cpp|2 +- src/mesa/program/ir_to_mesa.cpp|2 +- src/mesa/state_tracker/st_glsl_to_tgsi.cpp |2 +- 10 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 3bc181e..91810f9 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -2110,7 +2110,7 @@ validate_explicit_location(const struct ast_type_qualifier *qual, _mesa_glsl_error(loc, state, "%s cannot be given an explicit location in %s shader", mode_string(var), - _mesa_glsl_shader_target_name(state->target)); + _mesa_shader_type_to_string(state->target)); } else { var->data.explicit_location = true; @@ -2188,7 +2188,7 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, _mesa_glsl_error(loc, state, "`attribute' variables may not be declared in the " "%s shader", - _mesa_glsl_shader_target_name(state->target)); + _mesa_shader_type_to_string(state->target)); } /* Section 6.1.1 (Function Calling Conventions) of the GLSL 1.10 spec says: @@ -2599,7 +2599,7 @@ process_initializer(ir_variable *var, ast_declaration *decl, if ((var->data.mode == ir_var_shader_in) && (state->current_function == NULL)) { _mesa_glsl_error(& initializer_loc, state, "cannot initialize %s shader input / %s", - _mesa_glsl_shader_target_name(state->target), + _mesa_shader_type_to_string(state->target), (state->target == MESA_SHADER_VERTEX) ? "attribute" : "varying"); } @@ -4890,7 +4890,7 @@ ast_interface_block::hir(exec_list *instructions, _mesa_glsl_error(&loc, state, "redeclaration of gl_PerVertex input not allowed " "in the %s shader", - _mesa_glsl_shader_target_name(state->target)); + _mesa_shader_type_to_string(state->target)); } if (this->instance_name == NULL || strcmp(this->instance_name, "gl_in") != 0 || !this->is_array) { @@ -4907,7 +4907,7 @@ ast_interface_block::hir(exec_list *instructions, _mesa_glsl_error(&loc, state, "redeclaration of gl_PerVertex output not " "allowed in the %s shader", - _mesa_glsl_shader_target_name(state->target)); + _mesa_shader_type_to_string(state->target)); } if (this->instance_name != NULL) { _mesa_glsl_error(&loc, state, diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 5f19368..fc9a8b2 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -334,16 +334,15 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version, extern "C" { /** - * The most common use of _mesa_glsl_shader_target_name(), which is - * shared with C code in Mesa core to translate a GLenum to a short - * shader stage name in debug printouts. + * Translate a GLenum to a short shader stage name for debug printouts and + * error messages. * * It recognizes the PROGRAM variants of the names so it can be used * with a struct gl_program->Target, n
Mesa (master): main: Move MESA_SHADER_TYPES outside of gl_shader_type enum.
Module: Mesa Branch: master Commit: abab4385437bdcfbfff1cf772a5c418eb06ed822 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=abab4385437bdcfbfff1cf772a5c418eb06ed822 Author: Paul Berry Date: Mon Dec 16 13:05:09 2013 -0800 main: Move MESA_SHADER_TYPES outside of gl_shader_type enum. This will avoid spurious compiler warnings in the patch that follows. Reviewed-by: Brian Paul --- src/mesa/main/mtypes.h |3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index f7e1391..534c3bc 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2399,9 +2399,10 @@ typedef enum MESA_SHADER_VERTEX = 0, MESA_SHADER_GEOMETRY = 1, MESA_SHADER_FRAGMENT = 2, - MESA_SHADER_TYPES = 3 } gl_shader_type; +#define MESA_SHADER_TYPES (MESA_SHADER_FRAGMENT + 1) + struct gl_uniform_buffer_variable { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Don' t return bad values from _mesa_shader_type_to_index.
Module: Mesa Branch: master Commit: d9b55244fd56b5971b40fdadb262a25840197096 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d9b55244fd56b5971b40fdadb262a25840197096 Author: Paul Berry Date: Mon Dec 16 12:58:55 2013 -0800 glsl: Don't return bad values from _mesa_shader_type_to_index. This will avoid compiler warnings in the patch that follows. There should be no user-visible effect because the change only affects the behaviour when an invalid enum is passed to _mesa_shader_type_to_index(), and that can only happen if there is a bug elsewhere in Mesa. Reviewed-by: Brian Paul --- src/glsl/standalone_scaffolding.h |2 +- src/mesa/main/shaderobj.h |2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/glsl/standalone_scaffolding.h b/src/glsl/standalone_scaffolding.h index 7afb1c3..9f4818a 100644 --- a/src/glsl/standalone_scaffolding.h +++ b/src/glsl/standalone_scaffolding.h @@ -60,7 +60,7 @@ _mesa_shader_type_to_index(GLenum v) return MESA_SHADER_GEOMETRY; default: assert(!"bad value in _mesa_shader_type_to_index()"); - return MESA_SHADER_TYPES; + return MESA_SHADER_VERTEX; } } diff --git a/src/mesa/main/shaderobj.h b/src/mesa/main/shaderobj.h index de1c9fc..aff178f 100644 --- a/src/mesa/main/shaderobj.h +++ b/src/mesa/main/shaderobj.h @@ -113,7 +113,7 @@ _mesa_shader_type_to_index(GLenum v) return MESA_SHADER_GEOMETRY; default: ASSERT(0 && "bad value in _mesa_shader_type_to_index()"); - return MESA_SHADER_TYPES; + return MESA_SHADER_VERTEX; } } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Replace _mesa_glsl_parser_targets enum with gl_shader_type.
Module: Mesa Branch: master Commit: 7963fde37b6646aef7868f9d552960e5967dd811 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7963fde37b6646aef7868f9d552960e5967dd811 Author: Paul Berry Date: Mon Dec 16 13:09:20 2013 -0800 glsl: Replace _mesa_glsl_parser_targets enum with gl_shader_type. These enums were redundant. Reviewed-by: Brian Paul --- src/glsl/ast_to_hir.cpp | 82 +++--- src/glsl/builtin_functions.cpp | 22 +- src/glsl/builtin_variables.cpp | 20 +- src/glsl/glsl_parser.yy |8 ++-- src/glsl/glsl_parser_extras.cpp | 14 +++--- src/glsl/glsl_parser_extras.h | 10 + 6 files changed, 75 insertions(+), 81 deletions(-) diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index b2bbcca..3bc181e 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -1860,7 +1860,7 @@ ast_fully_specified_type::glsl_type(const char **name, if (type->base_type == GLSL_TYPE_FLOAT && state->es_shader - && state->target == fragment_shader + && state->target == MESA_SHADER_FRAGMENT && this->qualifier.precision == ast_precision_none && state->symbols->get_variable("#default precision") == NULL) { YYLTYPE loc = this->get_location(); @@ -1882,12 +1882,12 @@ ast_fully_specified_type::glsl_type(const char **name, * this function will produce undefined results. */ static bool -is_varying_var(ir_variable *var, _mesa_glsl_parser_targets target) +is_varying_var(ir_variable *var, gl_shader_type target) { switch (target) { - case vertex_shader: + case MESA_SHADER_VERTEX: return var->data.mode == ir_var_shader_out; - case fragment_shader: + case MESA_SHADER_FRAGMENT: return var->data.mode == ir_var_shader_in; default: return var->data.mode == ir_var_shader_out || var->data.mode == ir_var_shader_in; @@ -1985,13 +1985,13 @@ validate_binding_qualifier(struct _mesa_glsl_parse_state *state, */ unsigned limit = 0; switch (state->target) { - case vertex_shader: + case MESA_SHADER_VERTEX: limit = ctx->Const.VertexProgram.MaxTextureImageUnits; break; - case geometry_shader: + case MESA_SHADER_GEOMETRY: limit = ctx->Const.GeometryProgram.MaxTextureImageUnits; break; - case fragment_shader: + case MESA_SHADER_FRAGMENT: limit = ctx->Const.FragmentProgram.MaxTextureImageUnits; break; } @@ -2049,8 +2049,8 @@ interpret_interpolation_qualifier(const struct ast_type_qualifier *qual, } - if ((state->target == vertex_shader && mode == ir_var_shader_in) || - (state->target == fragment_shader && mode == ir_var_shader_out)) { + if ((state->target == MESA_SHADER_VERTEX && mode == ir_var_shader_in) || + (state->target == MESA_SHADER_FRAGMENT && mode == ir_var_shader_out)) { _mesa_glsl_error(loc, state, "interpolation qualifier `%s' cannot be applied to " "vertex shader inputs or fragment shader outputs", @@ -2077,7 +2077,7 @@ validate_explicit_location(const struct ast_type_qualifier *qual, * locations. */ switch (state->target) { - case vertex_shader: + case MESA_SHADER_VERTEX: if (var->data.mode == ir_var_shader_in) { if (!state->check_explicit_attrib_location_allowed(loc, var)) return; @@ -2088,13 +2088,13 @@ validate_explicit_location(const struct ast_type_qualifier *qual, fail = true; break; - case geometry_shader: + case MESA_SHADER_GEOMETRY: _mesa_glsl_error(loc, state, "geometry shader variables cannot be given " "explicit locations"); return; - case fragment_shader: + case MESA_SHADER_FRAGMENT: if (var->data.mode == ir_var_shader_out) { if (!state->check_explicit_attrib_location_allowed(loc, var)) return; @@ -2122,7 +2122,7 @@ validate_explicit_location(const struct ast_type_qualifier *qual, * ensures that negative values stay negative. */ if (qual->location >= 0) { - var->data.location = (state->target == vertex_shader) + var->data.location = (state->target == MESA_SHADER_VERTEX) ? (qual->location + VERT_ATTRIB_GENERIC0) : (qual->location + FRAG_RESULT_DATA0); } else { @@ -2174,7 +2174,7 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, if (qual->flags.q.constant || qual->flags.q.attribute || qual->flags.q.uniform - || (qual->flags.q.varying && (state->target == fragment_shader))) +
Mesa (master): 22 new commits
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=088494aa032bf32db8b67f1fb07e5797603a473d Author: Paul Berry Date: Fri Nov 29 00:52:11 2013 -0800 glsl/loops: Get rid of lower_bounded_loops and ir_loop::normative_bound. Now that loop_controls no longer creates normatively bound loops, there is no need for ir_loop::normative_bound or the lower_bounded_loops pass. Reviewed-by: Ian Romanick URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7ea3baa64da061f86a50c41081a26e0c2859e99c Author: Paul Berry Date: Fri Nov 29 00:16:43 2013 -0800 glsl/loops: Stop creating normatively bound loops in loop_controls. Previously, when loop_controls analyzed a loop and found that it had a fixed bound (known at compile time), it would remove all of the loop terminators and instead set the loop's normative_bound field to force the loop to execute the correct number of times. This made loop unrolling easy, but it had a serious disadvantage. Since most GPU's don't have a native mechanism for executing a loop a fixed number of times, in order to implement the normative bound, the back-ends would have to synthesize a new loop induction variable. As a result, many loops wound up having two induction variables instead of one. This caused extra register pressure and unnecessary instructions. This patch modifies loop_controls so that it doesn't set the loop's normative_bound anymore. Instead it leaves one of the terminators in the loop (the limiting terminator), so the back-end doesn't have to go to any extra work to ensure the loop terminates at the right time. This complicates loop unrolling slightly: when deciding whether a loop can be unrolled, we have to account for the presence of the limiting terminator. And when we do unroll the loop, we have to remove the limiting terminator first. For an example of how this results in more efficient back end code, consider the loop: for (int i = 0; i < 100; i++) { total += i; } Previous to this patch, on i965, this loop would compile down to this (vec4) native code: mov(8) g4<1>.xD 0D mov(8) g8<1>.xD 0D loop: cmp.ge.f0(8) null g8<4;4,1>.xD 100D (+f0) if(8) break(8) endif(8) add(8) g5<1>.xD g5<4;4,1>.xD g4<4;4,1>.xD add(8) g8<1>.xD g8<4;4,1>.xD 1D add(8) g4<1>.xD g4<4;4,1>.xD 1D while(8) loop (notice that both g8 and g4 are loop induction variables; one is used to terminate the loop, and the other is used to accumulate the total). After this patch, the same loop compiles to: mov(8) g4<1>.xD 0D loop: cmp.ge.f0(8) null g4<4;4,1>.xD 100D (+f0) if(8) break(8) endif(8) add(8) g5<1>.xD g5<4;4,1>.xD g4<4;4,1>.xD add(8) g4<1>.xD g4<4;4,1>.xD 1D while(8) loop Reviewed-by: Ian Romanick URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4d844cfa56220b7de8ca676ad222d89f81c60c09 Author: Paul Berry Date: Fri Nov 29 00:11:12 2013 -0800 glsl/loops: Get rid of loop_variable_state::max_iterations. This value is now redundant with loop_variable_state::limiting_terminator->iterations and ir_loop::normative_bound. Reviewed-by: Ian Romanick URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e734c9f677ef3e9e2e4f207e4e794651ea6643b4 Author: Paul Berry Date: Thu Nov 28 22:12:08 2013 -0800 glsl/loops: Simplify loop unrolling logic by breaking into functions. The old logic of loop_unroll_visitor::visit_leave(ir_loop *) was: heuristics to skip unrolling in various circumstances; if (loop contains more than one jump) return; else if (loop contains one jump) { if (the jump is an unconditional "break" at the end of the loop) { remove the break and set iteration count to 1; fall through to simple loop unrolling code; } else { for (each "if" statement in the loop body) see if the jump is a "break" at the end of one of its forks; if (the "break" wasn't found) return; splice the remainder of the loop into the other fork of the "if"; remove the "break"; complex loop unrolling code; return; } } simple loop unrolling code; return; These tasks have been moved to
Mesa (master): glsl: Remove unused field loop_variable_state::loop.
Module: Mesa Branch: master Commit: 26498e0f0c198ac912b176cf9a14768ad2c0244c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=26498e0f0c198ac912b176cf9a14768ad2c0244c Author: Paul Berry Date: Wed Nov 27 10:53:33 2013 -0800 glsl: Remove unused field loop_variable_state::loop. This field was neither initialized nor used. It was just dead memory. Reviewed-by: Kenneth Graunke --- src/glsl/loop_analysis.h |5 - 1 files changed, 0 insertions(+), 5 deletions(-) diff --git a/src/glsl/loop_analysis.h b/src/glsl/loop_analysis.h index 769d626..98414b3 100644 --- a/src/glsl/loop_analysis.h +++ b/src/glsl/loop_analysis.h @@ -71,11 +71,6 @@ public: /** -* Loop whose variable state is being tracked by this structure -*/ - ir_loop *loop; - - /** * Variables that have not yet been classified */ exec_list variables; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Teach ir_variable_refcount about ir_loop:: counter variables.
Module: Mesa Branch: master Commit: 9d2951ea0acdcd219ad28831ac9e7112737d9ca3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9d2951ea0acdcd219ad28831ac9e7112737d9ca3 Author: Paul Berry Date: Tue Nov 26 14:37:57 2013 -0800 glsl: Teach ir_variable_refcount about ir_loop::counter variables. If an ir_loop has a non-null "counter" field, the variable referred to by this field is implicitly read and written by the loop. We need to account for this in ir_variable_refcount, otherwise there is a danger we will try to dead-code-eliminate the loop counter variable. Note: at the moment the dead code elimination bug doesn't occur due to a bug in ir_hierarchical_visitor: it doesn't visit the "counter" field, so dead code elimination doesn't treat it as a candidate for elimination. But the patch to follow will fix that bug, so we need to fix ir_variable_refcount first in order to avoid breaking dead code elimination. Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- src/glsl/ir_variable_refcount.cpp | 21 + src/glsl/ir_variable_refcount.h |1 + 2 files changed, 22 insertions(+), 0 deletions(-) diff --git a/src/glsl/ir_variable_refcount.cpp b/src/glsl/ir_variable_refcount.cpp index 923eb1a..425ed81 100644 --- a/src/glsl/ir_variable_refcount.cpp +++ b/src/glsl/ir_variable_refcount.cpp @@ -132,3 +132,24 @@ ir_variable_refcount_visitor::visit_leave(ir_assignment *ir) return visit_continue; } + + +ir_visitor_status +ir_variable_refcount_visitor::visit_leave(ir_loop *ir) +{ + /* If the loop has a counter variable, it is implicitly referenced and +* assigned to. Note that since the LHS of an assignment is counted as a +* reference, we actually have to increment referenced_count by 2 so that +* later code will know that the variable isn't just assigned to. +*/ + if (ir->counter != NULL) { + ir_variable_refcount_entry *entry = + this->get_variable_entry(ir->counter); + if (entry) { + entry->referenced_count += 2; + entry->assigned_count++; + } + } + + return visit_continue; +} diff --git a/src/glsl/ir_variable_refcount.h b/src/glsl/ir_variable_refcount.h index c15e811..03fa7b5 100644 --- a/src/glsl/ir_variable_refcount.h +++ b/src/glsl/ir_variable_refcount.h @@ -60,6 +60,7 @@ public: virtual ir_visitor_status visit_enter(ir_function_signature *); virtual ir_visitor_status visit_leave(ir_assignment *); + virtual ir_visitor_status visit_leave(ir_loop *); ir_variable_refcount_entry *get_variable_entry(ir_variable *var); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: In ir_validate, check that ir_loop:: counter always refers to a new var.
Module: Mesa Branch: master Commit: a810db7b84b00763ce9ccbf40baee3f534057a80 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a810db7b84b00763ce9ccbf40baee3f534057a80 Author: Paul Berry Date: Wed Nov 27 10:12:53 2013 -0800 glsl: In ir_validate, check that ir_loop::counter always refers to a new var. The compiler back-ends (i965's fs_visitor and brw_visitor, ir_to_mesa_visitor, and glsl_to_tgsi_visitor) have been assuming this for some time. Thanks to the preceding patch, the compiler front-end no longer breaks this assumption. This patch adds code to validate the assumption so that if we have future bugs, we'll be able to catch them earlier. Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- src/glsl/ir_validate.cpp | 13 + 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp index 13e41a0..26d6388 100644 --- a/src/glsl/ir_validate.cpp +++ b/src/glsl/ir_validate.cpp @@ -63,6 +63,7 @@ public: virtual ir_visitor_status visit_enter(ir_if *ir); + virtual ir_visitor_status visit_enter(ir_loop *ir); virtual ir_visitor_status visit_leave(ir_loop *ir); virtual ir_visitor_status visit_enter(ir_function *ir); virtual ir_visitor_status visit_leave(ir_function *ir); @@ -149,6 +150,18 @@ ir_validate::visit_enter(ir_if *ir) ir_visitor_status +ir_validate::visit_enter(ir_loop *ir) +{ + if (ir->counter != NULL && hash_table_find(ht, ir->counter) != NULL) { + printf("ir_loop @ %p specifies already-declared variable `%s' @ %p\n", + (void *) ir, ir->counter->name, (void *) ir->counter); + abort(); + } + return visit_continue; +} + + +ir_visitor_status ir_validate::visit_leave(ir_loop *ir) { if (ir->counter != NULL) { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/gen6: Fix multisample resolve blits for luminance/ intensity 32F formats.
Module: Mesa Branch: master Commit: c4cf487315f1f5375534f1677177983fa496d577 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c4cf487315f1f5375534f1677177983fa496d577 Author: Paul Berry Date: Wed Nov 27 07:43:03 2013 -0800 i965/gen6: Fix multisample resolve blits for luminance/intensity 32F formats. On gen6, multisamble resolve blits use the SAMPLE message to blend together the 4 samples for each texel. For some reason, SAMPLE doesn't blend together the proper samples when the source format is L32_FLOAT or I32_FLOAT, resulting in blocky artifacts. To work around this problem, sample from the source surface using R32_FLOAT. This shouldn't affect rendering correctness, because when doing these resolve blits, the destination format is R32_FLOAT, so the channel replication done by L32_FLOAT and I32_FLOAT is unnecessary. Fixes piglit tests on Sandy Bridge: - spec/ARB_texture_float/multisample-formats 2 GL_ARB_texture_float - spec/ARB_texture_float/multisample-formats 4 GL_ARB_texture_float No piglit regressions on Sandy Bridge. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=70601 Cc: Kenneth Graunke Cc: mesa-sta...@lists.freedesktop.org Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 15 +++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp index 2d2edc1..9c48eac 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp @@ -2099,6 +2099,21 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw, src.brw_surfaceformat = dst.brw_surfaceformat; } + /* When doing a multisample resolve of a GL_LUMINANCE32F or GL_INTENSITY32F +* texture, the above code configures the source format for L32_FLOAT or +* I32_FLOAT, and the destination format for R32_FLOAT. On Sandy Bridge, +* the SAMPLE message appears to handle multisampled L32_FLOAT and +* I32_FLOAT textures incorrectly, resulting in blocky artifacts. So work +* around the problem by using a source format of R32_FLOAT. This +* shouldn't affect rendering correctness, since the destination format is +* R32_FLOAT, so only the contents of the red channel matters. +*/ + if (brw->gen == 6 && src.num_samples > 1 && dst.num_samples <= 1 && + src_mt->format == dst_mt->format && + dst.brw_surfaceformat == BRW_SURFACEFORMAT_R32_FLOAT) { + src.brw_surfaceformat = dst.brw_surfaceformat; + } + use_wm_prog = true; memset(&wm_prog_key, 0, sizeof(wm_prog_key)); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Fix inconsistent assumptions about ir_loop::counter.
Module: Mesa Branch: master Commit: d6eb4321d0e62b6b391ad88ce390bd6e23d79747 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d6eb4321d0e62b6b391ad88ce390bd6e23d79747 Author: Paul Berry Date: Tue Nov 26 14:19:49 2013 -0800 glsl: Fix inconsistent assumptions about ir_loop::counter. The compiler back-ends (i965's fs_visitor and brw_visitor, ir_to_mesa_visitor, and glsl_to_tgsi_visitor) assume that when ir_loop::counter is non-null, it points to a fresh ir_variable that should be used as the loop counter (as opposed to an ir_variable that exists elsewhere in the instruction stream). However, previous to this patch: (1) loop_control_visitor did not create a new variable for ir_loop::counter; instead it re-used the existing ir_variable. This caused the loop counter to be double-incremented (once explicitly by the body of the loop, and once implicitly by ir_loop::increment). (2) ir_clone did not clone ir_loop::counter properly, resulting in the cloned ir_loop pointing to the source ir_loop's counter. (3) ir_hierarchical_visitor did not visit ir_loop::counter, resulting in the ir_variable being missed by reparenting. Additionally, most optimization passes (e.g. loop unrolling) assume that the variable mentioned by ir_loop::counter is not accessed in the body of the loop (an assumption which (1) violates). The combination of these factors caused a perfect storm in which the code worked properly nearly all of the time: for loops that got unrolled, (1) would introduce a double-increment, but loop unrolling would fail to notice it (since it assumes that ir_loop::counter is not accessed in the body of the loop), so it would unroll the loop the correct number of times. For loops that didn't get unrolled, (1) would introduce a double-increment, but then later when the IR was cloned for linking, (2) would prevent the loop counter from being cloned properly, so it would look to further analysis stages like an independent variable (and hence the double-increment would stop occurring). At the end of linking, (3) would prevent the loop counter from being reparented, so it would still belong to the shader object rather than the linked program object. Provided that the client program didn't delete the shader object, the memory would never get reclaimed, and so the shader would function properly. However, for loops that didn't get unrolled, if the client program did delete the shader object, and the memory belonging to the loop counter got re-used, this could cause a use-after-free bug, leading to a crash. This patch fixes loop_control_visitor, ir_clone, and ir_hierarchical_visitor to treat ir_loop::counter the same way the back-ends treat it: as a freshly allocated ir_variable that needs to be visited and cloned independently of other ir_variables. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=72026 Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- src/glsl/ir_clone.cpp |3 ++- src/glsl/ir_hv_accept.cpp |6 ++ src/glsl/loop_controls.cpp |2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp index 40ed33a..8f57499 100644 --- a/src/glsl/ir_clone.cpp +++ b/src/glsl/ir_clone.cpp @@ -163,7 +163,8 @@ ir_loop::clone(void *mem_ctx, struct hash_table *ht) const new_loop->to = this->to->clone(mem_ctx, ht); if (this->increment) new_loop->increment = this->increment->clone(mem_ctx, ht); - new_loop->counter = counter; + if (this->counter) + new_loop->counter = this->counter->clone(mem_ctx, ht); foreach_iter(exec_list_iterator, iter, this->body_instructions) { ir_instruction *ir = (ir_instruction *)iter.get(); diff --git a/src/glsl/ir_hv_accept.cpp b/src/glsl/ir_hv_accept.cpp index 941b25e..a0fe3b9 100644 --- a/src/glsl/ir_hv_accept.cpp +++ b/src/glsl/ir_hv_accept.cpp @@ -87,6 +87,12 @@ ir_loop::accept(ir_hierarchical_visitor *v) if (s != visit_continue) return (s == visit_continue_with_parent) ? visit_continue : s; + if (this->counter) { + s = this->counter->accept(v); + if (s != visit_continue) + return (s == visit_continue_with_parent) ? visit_continue : s; + } + s = visit_list_elements(v, &this->body_instructions); if (s == visit_stop) return s; diff --git a/src/glsl/loop_controls.cpp b/src/glsl/loop_controls.cpp index 2648193..0eb103f 100644 --- a/src/glsl/loop_controls.cpp +++ b/src/glsl/loop_controls.cpp @@ -254,7 +254,7 @@ loop_control_visitor::visit_leave(ir_loop *ir) ir->from = init->clone(ir, NULL); ir->to = limit->clone(ir, NULL); ir->increment = lv->increment->clone(ir, NULL); -ir->counter = lv->var; +ir->counter = lv->var->clone(ir, NULL); ir-&
Mesa (master): glsl: Improve documentation of ir_loop counter/ control fields.
Module: Mesa Branch: master Commit: af9af2965bbd7ba8d18cd1064afcf57392904edb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=af9af2965bbd7ba8d18cd1064afcf57392904edb Author: Paul Berry Date: Wed Nov 27 11:39:51 2013 -0800 glsl: Improve documentation of ir_loop counter/control fields. Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- src/glsl/ir.h | 34 -- 1 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/glsl/ir.h b/src/glsl/ir.h index 4f775da..b898d61 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -1032,13 +1032,33 @@ public: * If \c from and \c to are the same value, the loop will execute once. */ /*@{*/ - ir_rvalue *from; /** Value of the loop counter on the first -* iteration of the loop. -*/ - ir_rvalue *to; /** Value of the loop counter on the last -* iteration of the loop. -*/ + + /** +* Value which should be assigned to \c counter before the first iteration +* of the loop. Must be non-null whenever \c counter is non-null, and vice +* versa. +*/ + ir_rvalue *from; + + /** +* Value which \c counter should be compared to in order to determine +* whether to exit the loop. Must be non-null whenever \c counter is +* non-null, and vice versa. +*/ + ir_rvalue *to; + + /** +* Value which should be added to \c counter at the end of each loop +* iteration. Must be non-null whenever \c counter is non-null, and vice +* versa. +*/ ir_rvalue *increment; + + /** +* Variable which counts loop iterations. This is a brand new ir_variable +* declaration (not a reference to a previously declared ir_variable, as in +* ir_dereference_variable). +*/ ir_variable *counter; /** @@ -1047,6 +1067,8 @@ public: * If any of the loop control fields are non-\c NULL, this field must be * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal, * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal. +* +* Ignored if \c counter is NULL. */ int cmp; /*@}*/ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/gs: Properly skip GS binding table upload when no GS active.
Module: Mesa Branch: master Commit: 2714ca81b9bad3dec3894fac97f34502c80b1697 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2714ca81b9bad3dec3894fac97f34502c80b1697 Author: Paul Berry Date: Mon Nov 25 08:03:24 2013 -0800 i965/gs: Properly skip GS binding table upload when no GS active. Previously, in brw_gs_upload_binding_table(), we checked whether brw->gs.prog_data was NULL in order to determine whether a geometry shader was active. This didn't work: brw->gs.prog_data starts off as NULL, but it is set to non-NULL when a geometry shader program is built, and then never set to NULL again. As a result, if we called brw_gs_upload_binding_table() while there was no geometry shader active, but a geometry shader had previously been active, it would refer to a stale (and possibly freed) prog_data structure. This patch fixes the problem by modifying brw_gs_upload_binding_table() to use the proper technique to determine whether a geometry shader is active: by checking whether brw->geometry_program is NULL. This fixes the crash reported in comment 2 of bug 71870 (the incorrect rendering remains, however). Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=71870 Cc: mesa-sta...@lists.freedesktop.org Reviewed-by: Chris Forbes Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_binding_tables.c |2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_binding_tables.c b/src/mesa/drivers/dri/i965/brw_binding_tables.c index 0a322dc..b39bd10 100644 --- a/src/mesa/drivers/dri/i965/brw_binding_tables.c +++ b/src/mesa/drivers/dri/i965/brw_binding_tables.c @@ -128,7 +128,7 @@ static void brw_gs_upload_binding_table(struct brw_context *brw) { /* If there's no GS, skip changing anything. */ - if (!brw->gs.prog_data) + if (brw->geometry_program == NULL) return; brw_upload_binding_table(brw, BRW_NEW_GS_BINDING_TABLE, &brw->gs.base); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl/linker: Validate IR just before reparenting.
Module: Mesa Branch: master Commit: d7fa9eb003bf0d2016ca1f7cb14e59ad22e89b93 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d7fa9eb003bf0d2016ca1f7cb14e59ad22e89b93 Author: Paul Berry Date: Fri Nov 22 12:37:22 2013 -0800 glsl/linker: Validate IR just before reparenting. If reparent_ir() is called on invalid IR, then there's a danger that it will fail to reparent all of the necessary nodes. For example, if the IR contains an ir_dereference_variable which refers to an ir_variable that's not in the tree, that ir_variable won't get reparented, resulting in subtle use-after-free bugs once the non-reparented nodes are freed. (This is exactly what happened in the bug fixed by the previous commit). This patch makes this kind of bug far easier to track down, by transforming it from a use-after-free bug into an explicit IR validation error. Reviewed-by: Eric Anholt Reviewed-by: Ian Romanick --- src/glsl/linker.cpp |5 + 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index fac186a..1366077 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -2396,6 +2396,11 @@ done: if (prog->_LinkedShaders[i] == NULL) continue; + /* Do a final validation step to make sure that the IR wasn't + * invalidated by any modifications performed after intrastage linking. + */ + validate_ir_tree(prog->_LinkedShaders[i]->ir); + /* Retain any live IR, but trash the rest. */ reparent_ir(prog->_LinkedShaders[i]->ir, prog->_LinkedShaders[i]->ir); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/gs: Set GS prog_data to NULL if there is no GS program.
Module: Mesa Branch: master Commit: 37bdde1087584f4c1839e14db75c157b83246ebd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=37bdde1087584f4c1839e14db75c157b83246ebd Author: Paul Berry Date: Mon Nov 25 07:49:15 2013 -0800 i965/gs: Set GS prog_data to NULL if there is no GS program. The previous commit fixes a bug wherein we would incorrectly refer to stale geometry shader prog_data when no geometry shader was active. This patch reduces the likelihood of that sort of bug occurring in the future by setting prog_data to NULL whenever there is no GS program. Cc: mesa-sta...@lists.freedesktop.org Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_vec4_gs.c |7 +++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs.c b/src/mesa/drivers/dri/i965/brw_vec4_gs.c index b52d646..018b0b6 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_gs.c +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs.c @@ -259,6 +259,13 @@ brw_upload_gs_prog(struct brw_context *brw) brw->vue_map_geom_out = brw->vue_map_vs; brw->state.dirty.brw |= BRW_NEW_VUE_MAP_GEOM_OUT; } + + /* Other state atoms had better not try to access prog_data, since + * there's no GS program. + */ + brw->gs.prog_data = NULL; + brw->gs.base.prog_data = NULL; + return; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Fix lowering of direct assignment in lower_clip_distance.
Module: Mesa Branch: master Commit: 9dfcb05fa649ee7a573eab3d16851ebd4cb96010 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9dfcb05fa649ee7a573eab3d16851ebd4cb96010 Author: Paul Berry Date: Fri Nov 22 12:37:22 2013 -0800 glsl: Fix lowering of direct assignment in lower_clip_distance. In commit 065da16 (glsl: Convert lower_clip_distance_visitor to be an ir_rvalue_visitor), we failed to notice that since lower_clip_distance_visitor overrides visit_leave(ir_assignment *), ir_rvalue_visitor::visit_leave(ir_assignment *) wasn't getting called. As a result, clip distance dereferences appearing directly on the right hand side of an assignment (not in a subexpression) weren't getting properly lowered. This caused an ir_dereference_variable node to be left in the IR that referred to the old gl_ClipDistance variable. However, since the lowering pass replaces gl_ClipDistance with gl_ClipDistanceMESA, this turned into a dangling pointer when the IR got reparented. Prior to the introduction of geometry shaders, this bug was unlikely to arise, because (a) reading from gl_ClipDistance[i] in the fragment shader was rare, and (b) when it happened, it was likely that it would either appear in a subexpression, or be hoisted into a subexpression by tree grafting. However, in a geometry shader, we're likely to see a statement like this, which would trigger the bug: gl_ClipDistance[i] = gl_in[j].gl_ClipDistance[i]; This patch causes lower_clip_distance_visitor::visit_leave(ir_assignment *) to call the base class visitor, so that the right hand side of the assignment is properly lowered. Fixes piglit test: - spec/glsl-1.50/execution/geometry/clip-distance-itemized-copy Cc: Ian Romanick Cc: "9.2" Cc: "10.0" Reviewed-by: Eric Anholt Reviewed-by: Ian Romanick --- src/glsl/lower_clip_distance.cpp |5 + 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/src/glsl/lower_clip_distance.cpp b/src/glsl/lower_clip_distance.cpp index 682c8fd..04fa6d4 100644 --- a/src/glsl/lower_clip_distance.cpp +++ b/src/glsl/lower_clip_distance.cpp @@ -381,6 +381,11 @@ lower_clip_distance_visitor::fix_lhs(ir_assignment *ir) ir_visitor_status lower_clip_distance_visitor::visit_leave(ir_assignment *ir) { + /* First invoke the base class visitor. This causes handle_rvalue() to be +* called on ir->rhs and ir->condition. +*/ + ir_rvalue_visitor::visit_leave(ir); + if (this->is_clip_distance_vec8(ir->lhs) || this->is_clip_distance_vec8(ir->rhs)) { /* LHS or RHS of the assignment is the entire 1D gl_ClipDistance array ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965: Fix fast clear of depth buffers.
Module: Mesa Branch: master Commit: 08315233509f1fa7dc1e877aed2a8517296cf86e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=08315233509f1fa7dc1e877aed2a8517296cf86e Author: Paul Berry Date: Tue Nov 19 18:51:48 2013 -0800 i965: Fix fast clear of depth buffers. >From section 4.4.7 (Layered Framebuffers) of the GLSL 3.2 spec: When the Clear or ClearBuffer* commands are used to clear a layered framebuffer attachment, all layers of the attachment are cleared. This patch fixes the fast depth clear path. Fixes piglit test "spec/!OpenGL 3.2/layered-rendering/clear-depth". Cc: "10.0" Reviewed-by: Eric Anholt Reviewed-by: Jordan Justen --- src/mesa/drivers/dri/i965/brw_clear.c | 12 ++-- 1 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_clear.c b/src/mesa/drivers/dri/i965/brw_clear.c index d94e259..1cac996 100644 --- a/src/mesa/drivers/dri/i965/brw_clear.c +++ b/src/mesa/drivers/dri/i965/brw_clear.c @@ -181,8 +181,16 @@ brw_fast_clear_depth(struct gl_context *ctx) */ intel_batchbuffer_emit_mi_flush(brw); - intel_hiz_exec(brw, mt, depth_irb->mt_level, depth_irb->mt_layer, - GEN6_HIZ_OP_DEPTH_CLEAR); + if (fb->NumLayers > 0) { + assert(fb->NumLayers == depth_irb->mt->level[depth_irb->mt_level].depth); + for (unsigned layer = 0; layer < fb->NumLayers; layer++) { + intel_hiz_exec(brw, mt, depth_irb->mt_level, layer, +GEN6_HIZ_OP_DEPTH_CLEAR); + } + } else { + intel_hiz_exec(brw, mt, depth_irb->mt_level, depth_irb->mt_layer, + GEN6_HIZ_OP_DEPTH_CLEAR); + } if (brw->gen == 6) { /* From the Sandy Bridge PRM, volume 2 part 1, page 314: ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965: Fix blorp clear of layered framebuffers.
Module: Mesa Branch: master Commit: c1019670ea89505ea7411629c052d662c8eb6be6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c1019670ea89505ea7411629c052d662c8eb6be6 Author: Paul Berry Date: Tue Nov 19 12:58:02 2013 -0800 i965: Fix blorp clear of layered framebuffers. >From section 4.4.7 (Layered Framebuffers) of the GLSL 3.2 spec: When the Clear or ClearBuffer* commands are used to clear a layered framebuffer attachment, all layers of the attachment are cleared. This patch fixes the blorp clear path for color buffers. Fixes piglit test "spec/!OpenGL 3.2/layered-rendering/clear-color". Cc: "10.0" Reviewed-by: Eric Anholt Reviewed-by: Jordan Justen --- src/mesa/drivers/dri/i965/brw_blorp_clear.cpp | 26 ++-- 1 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp index c7f485e..02ec273 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp @@ -67,7 +67,8 @@ public: struct gl_framebuffer *fb, struct gl_renderbuffer *rb, GLubyte *color_mask, - bool partial_clear); + bool partial_clear, + unsigned layer); }; @@ -183,12 +184,13 @@ brw_blorp_clear_params::brw_blorp_clear_params(struct brw_context *brw, struct gl_framebuffer *fb, struct gl_renderbuffer *rb, GLubyte *color_mask, - bool partial_clear) + bool partial_clear, + unsigned layer) { struct gl_context *ctx = &brw->ctx; struct intel_renderbuffer *irb = intel_renderbuffer(rb); - dst.set(brw, irb->mt, irb->mt_level, irb->mt_layer, true); + dst.set(brw, irb->mt, irb->mt_level, layer, true); /* Override the surface format according to the context's sRGB rules. */ gl_format format = _mesa_get_render_format(ctx, irb->mt->format); @@ -443,13 +445,13 @@ brw_blorp_const_color_program::compile(struct brw_context *brw, bool do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb, struct gl_renderbuffer *rb, unsigned buf, - bool partial_clear) + bool partial_clear, unsigned layer) { struct gl_context *ctx = &brw->ctx; struct intel_renderbuffer *irb = intel_renderbuffer(rb); brw_blorp_clear_params params(brw, fb, rb, ctx->Color.ColorMask[buf], - partial_clear); + partial_clear, layer); bool is_fast_clear = (params.fast_clear_op == GEN7_FAST_CLEAR_OP_FAST_CLEAR); @@ -525,6 +527,7 @@ brw_blorp_clear_color(struct brw_context *brw, struct gl_framebuffer *fb, for (unsigned buf = 0; buf < fb->_NumColorDrawBuffers; buf++) { struct gl_renderbuffer *rb = fb->_ColorDrawBuffers[buf]; + struct intel_renderbuffer *irb = intel_renderbuffer(rb); /* If this is an ES2 context or GL_ARB_ES2_compatibility is supported, * the framebuffer can be complete with some attachments missing. In @@ -533,8 +536,17 @@ brw_blorp_clear_color(struct brw_context *brw, struct gl_framebuffer *fb, if (rb == NULL) continue; - if (!do_single_blorp_clear(brw, fb, rb, buf, partial_clear)) - return false; + if (fb->NumLayers > 0) { + assert(fb->NumLayers == irb->mt->level[irb->mt_level].depth); + for (unsigned layer = 0; layer < fb->NumLayers; layer++) { +if (!do_single_blorp_clear(brw, fb, rb, buf, partial_clear, layer)) + return false; + } + } else { + unsigned layer = irb->mt_layer; + if (!do_single_blorp_clear(brw, fb, rb, buf, partial_clear, layer)) +return false; + } } return true; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Implement GL_FRAMEBUFFER_ATTACHMENT_LAYERED query.
Module: Mesa Branch: master Commit: ec79c05cbfb7c68fbef7447e1744423c00f26654 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ec79c05cbfb7c68fbef7447e1744423c00f26654 Author: Paul Berry Date: Tue Nov 19 21:17:19 2013 -0800 mesa: Implement GL_FRAMEBUFFER_ATTACHMENT_LAYERED query. >From section 6.1.18 (Renderbuffer Object Queries) of the GL 3.2 spec, under the heading "If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is TEXTURE, then": If pname is FRAMEBUFFER_ATTACHMENT_LAYERED, then params will contain TRUE if an entire level of a three-dimesional texture, cube map texture, or one-or two-dimensional array texture is attached. Otherwise, params will contain FALSE. Fixes piglit tests: - spec/!OpenGL 3.2/layered-rendering/framebuffer-layered-attachments - spec/!OpenGL 3.2/layered-rendering/framebuffertexture-defaults Cc: "10.0" Reviewed-by: Chris Forbes v2: Don't include "EXT" in the error message, since this query only makes sensen in context versions that have adopted glGetFramebufferAttachmentParameteriv(). Reviewed-by: Ian Romanick --- src/mesa/main/fbobject.c | 12 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index dd13107..3650627 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -2964,6 +2964,18 @@ _mesa_GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, " invalid FBO attachment structure"); } return; + case GL_FRAMEBUFFER_ATTACHMENT_LAYERED: + if (!_mesa_has_geometry_shaders(ctx)) { + goto invalid_pname_enum; + } else if (att->Type == GL_TEXTURE) { + *params = att->Layered; + } else if (att->Type == GL_NONE) { + _mesa_error(ctx, err, + "glGetFramebufferAttachmentParameteriv(pname)"); + } else { + goto invalid_pname_enum; + } + return; default: goto invalid_pname_enum; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: Track number of layers in layered framebuffers.
Module: Mesa Branch: master Commit: 95140740ad1c6cd8a34002c307556f5c49a34589 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=95140740ad1c6cd8a34002c307556f5c49a34589 Author: Paul Berry Date: Tue Nov 19 15:55:51 2013 -0800 mesa: Track number of layers in layered framebuffers. In order to properly clear layered framebuffers, we need to know how many layers they have. The easiest way to do this is to record it in the gl_framebuffer struct when we check framebuffer completeness. This patch replaces the gl_framebuffer::Layered boolean with a gl_framebuffer::NumLayers integer, which is 0 if the framebuffer is not layered, and equal to the number of layers otherwise. v2: Remove gl_framebuffer::Layered and make gl_framebuffer::NumLayers always have a defined value. Fix factor of 6 error in the number of layers in a cube map array. Cc: "10.0" Reviewed-by: Chris Forbes Reviewed-by: Jordan Justen Reviewed-by: Eric Anholt --- src/mesa/drivers/dri/i965/brw_wm_surface_state.c |2 +- src/mesa/drivers/dri/i965/gen6_clip_state.c |2 +- src/mesa/drivers/dri/i965/gen7_misc_state.c |2 +- src/mesa/main/fbobject.c | 13 +++-- src/mesa/main/mtypes.h |8 +++- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c index 662c975..fd6954b 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -701,7 +701,7 @@ brw_update_renderbuffer_surfaces(struct brw_context *brw) for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) { if (intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[i])) { brw->vtbl.update_renderbuffer_surface(brw, ctx->DrawBuffer->_ColorDrawBuffers[i], - ctx->DrawBuffer->Layered, i); + ctx->DrawBuffer->NumLayers > 0, i); } else { brw->vtbl.update_null_renderbuffer_surface(brw, i); } diff --git a/src/mesa/drivers/dri/i965/gen6_clip_state.c b/src/mesa/drivers/dri/i965/gen6_clip_state.c index 03d0f90..37a39b8 100644 --- a/src/mesa/drivers/dri/i965/gen6_clip_state.c +++ b/src/mesa/drivers/dri/i965/gen6_clip_state.c @@ -121,7 +121,7 @@ upload_clip_state(struct brw_context *brw) dw2); OUT_BATCH(U_FIXED(0.125, 3) << GEN6_CLIP_MIN_POINT_WIDTH_SHIFT | U_FIXED(255.875, 3) << GEN6_CLIP_MAX_POINT_WIDTH_SHIFT | - (fb->Layered ? 0 : GEN6_CLIP_FORCE_ZERO_RTAINDEX)); + (fb->NumLayers > 0 ? 0 : GEN6_CLIP_FORCE_ZERO_RTAINDEX)); ADVANCE_BATCH(); } diff --git a/src/mesa/drivers/dri/i965/gen7_misc_state.c b/src/mesa/drivers/dri/i965/gen7_misc_state.c index 3f3833e..4251949 100644 --- a/src/mesa/drivers/dri/i965/gen7_misc_state.c +++ b/src/mesa/drivers/dri/i965/gen7_misc_state.c @@ -81,7 +81,7 @@ gen7_emit_depth_stencil_hiz(struct brw_context *brw, break; } - if (fb->Layered || !irb) { + if (fb->NumLayers > 0 || !irb) { min_array_element = 0; } else if (irb->mt->num_samples > 1) { /* Convert physical layer to logical layer. */ diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index 9dd7161..e8cf274 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -905,6 +905,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx, struct gl_renderbuffer_attachment *att; GLenum f; gl_format attFormat; + GLenum att_tex_target = GL_NONE; /* * XXX for ARB_fbo, only check color buffers that are named by @@ -945,6 +946,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx, */ if (att->Type == GL_TEXTURE) { const struct gl_texture_image *texImg = att->Renderbuffer->TexImage; + att_tex_target = att->Texture->Target; minWidth = MIN2(minWidth, texImg->Width); maxWidth = MAX2(maxWidth, texImg->Width); minHeight = MIN2(minHeight, texImg->Height); @@ -1057,7 +1059,14 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx, } /* Check that layered rendering is consistent. */ - att_layer_count = att->Layered ? att->Renderbuffer->Depth : 0; + if (att->Layered) { + if (att_tex_target == GL_TEXTURE_CUBE_MAP) +att_layer_count = 6; + else +att_layer_count = att->Renderbuffer->Depth; + } else { + att_layer_count = 0; + } if (!layer_count_valid) { layer_count = att_layer_count; layer_count_valid = true; @@ -1073,7 +1082,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx, } } - fb->
Mesa (master): mesa: Fix texture target validation for glFramebufferTexture ()
Module: Mesa Branch: master Commit: af1471dc04cc89822bab2c253c808880dd47c25a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=af1471dc04cc89822bab2c253c808880dd47c25a Author: Paul Berry Date: Tue Nov 19 21:47:04 2013 -0800 mesa: Fix texture target validation for glFramebufferTexture() Previously we were using the code path for validating glFramebufferTextureLayer(). But glFramebufferTexture() allows additional texture types. Fixes piglit tests: - spec/!OpenGL 3.2/layered-rendering/gl-layer-cube-map - spec/!OpenGL 3.2/layered-rendering/framebuffertexture Cc: "10.0" Reviewed-by: Jordan Justen Reviewed-by: Chris Forbes v2: Clarify comment above framebuffer_texture(). Reviewed-by: Ian Romanick --- src/mesa/main/fbobject.c | 59 - 1 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index e8cf274..dd13107 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -2307,8 +2307,13 @@ reuse_framebuffer_texture_attachment(struct gl_framebuffer *fb, /** * Common code called by glFramebufferTexture1D/2D/3DEXT() and * glFramebufferTextureLayerEXT(). - * Note: glFramebufferTextureLayerEXT() has no textarget parameter so we'll - * get textarget=0 in that case. + * + * \param textarget is the textarget that was passed to the + * glFramebufferTexture...() function, or 0 if the corresponding function + * doesn't have a textarget parameter. + * + * \param layered is true if this function was called from + * glFramebufferTexture(), false otherwise. */ static void framebuffer_texture(struct gl_context *ctx, const char *caller, GLenum target, @@ -2343,16 +2348,46 @@ framebuffer_texture(struct gl_context *ctx, const char *caller, GLenum target, texObj = _mesa_lookup_texture(ctx, texture); if (texObj != NULL) { if (textarget == 0) { -/* If textarget == 0 it means we're being called by - * glFramebufferTextureLayer() and textarget is not used. - * The only legal texture types for that function are 3D and - * 1D/2D arrays textures. - */ -err = (texObj->Target != GL_TEXTURE_3D) && -(texObj->Target != GL_TEXTURE_1D_ARRAY_EXT) && -(texObj->Target != GL_TEXTURE_2D_ARRAY_EXT) && -(texObj->Target != GL_TEXTURE_CUBE_MAP_ARRAY) && -(texObj->Target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY); +if (layered) { + /* We're being called by glFramebufferTexture() and textarget +* is not used. +*/ + switch (texObj->Target) { + case GL_TEXTURE_3D: + case GL_TEXTURE_1D_ARRAY_EXT: + case GL_TEXTURE_2D_ARRAY_EXT: + case GL_TEXTURE_CUBE_MAP: + case GL_TEXTURE_CUBE_MAP_ARRAY: + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: + err = false; + break; + case GL_TEXTURE_1D: + case GL_TEXTURE_2D: + case GL_TEXTURE_RECTANGLE: + case GL_TEXTURE_2D_MULTISAMPLE: + /* These texture types are valid to pass to + * glFramebufferTexture(), but since they aren't layered, it + * is equivalent to calling glFramebufferTexture{1D,2D}(). + */ + err = false; + layered = false; + textarget = texObj->Target; + break; + default: + err = true; + break; + } +} else { + /* We're being called by glFramebufferTextureLayer() and +* textarget is not used. The only legal texture types for +* that function are 3D and 1D/2D arrays textures. +*/ + err = (texObj->Target != GL_TEXTURE_3D) && + (texObj->Target != GL_TEXTURE_1D_ARRAY_EXT) && + (texObj->Target != GL_TEXTURE_2D_ARRAY_EXT) && + (texObj->Target != GL_TEXTURE_CUBE_MAP_ARRAY) && + (texObj->Target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY); +} } else { /* Make sure textarget is consistent with the texture's type */ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965: refactor blorp clear code in preparation for layered clears.
Module: Mesa Branch: master Commit: 1ec5365429b46a39a06186092502c8e66fb4140e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1ec5365429b46a39a06186092502c8e66fb4140e Author: Paul Berry Date: Tue Nov 19 10:42:59 2013 -0800 i965: refactor blorp clear code in preparation for layered clears. Cc: "10.0" Reviewed-by: Eric Anholt Reviewed-by: Jordan Justen --- src/mesa/drivers/dri/i965/brw_blorp_clear.cpp | 119 ++--- 1 files changed, 66 insertions(+), 53 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp index d1933ce..c7f485e 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp @@ -439,13 +439,75 @@ brw_blorp_const_color_program::compile(struct brw_context *brw, return brw_get_program(&func, program_size); } -extern "C" { + bool -brw_blorp_clear_color(struct brw_context *brw, struct gl_framebuffer *fb, +do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb, + struct gl_renderbuffer *rb, unsigned buf, bool partial_clear) { struct gl_context *ctx = &brw->ctx; + struct intel_renderbuffer *irb = intel_renderbuffer(rb); + + brw_blorp_clear_params params(brw, fb, rb, ctx->Color.ColorMask[buf], + partial_clear); + + bool is_fast_clear = + (params.fast_clear_op == GEN7_FAST_CLEAR_OP_FAST_CLEAR); + if (is_fast_clear) { + /* Record the clear color in the miptree so that it will be + * programmed in SURFACE_STATE by later rendering and resolve + * operations. + */ + uint32_t new_color_value = + compute_fast_clear_color_bits(&ctx->Color.ClearColor); + if (irb->mt->fast_clear_color_value != new_color_value) { + irb->mt->fast_clear_color_value = new_color_value; + brw->state.dirty.brw |= BRW_NEW_SURFACES; + } + + /* If the buffer is already in INTEL_MCS_STATE_CLEAR, the clear is + * redundant and can be skipped. + */ + if (irb->mt->mcs_state == INTEL_MCS_STATE_CLEAR) + return true; + + /* If the MCS buffer hasn't been allocated yet, we need to allocate + * it now. + */ + if (!irb->mt->mcs_mt) { + if (!intel_miptree_alloc_non_msrt_mcs(brw, irb->mt)) { +/* MCS allocation failed--probably this will only happen in + * out-of-memory conditions. But in any case, try to recover + * by falling back to a non-blorp clear technique. + */ +return false; + } + brw->state.dirty.brw |= BRW_NEW_SURFACES; + } + } + + DBG("%s to mt %p level %d layer %d\n", __FUNCTION__, + irb->mt, irb->mt_level, irb->mt_layer); + + brw_blorp_exec(brw, ¶ms); + + if (is_fast_clear) { + /* Now that the fast clear has occurred, put the buffer in + * INTEL_MCS_STATE_CLEAR so that we won't waste time doing redundant + * clears. + */ + irb->mt->mcs_state = INTEL_MCS_STATE_CLEAR; + } + + return true; +} + +extern "C" { +bool +brw_blorp_clear_color(struct brw_context *brw, struct gl_framebuffer *fb, + bool partial_clear) +{ /* The constant color clear code doesn't work for multisampled surfaces, so * we need to support falling back to other clear mechanisms. * Unfortunately, our clear code is based on a bitmask that doesn't @@ -463,7 +525,6 @@ brw_blorp_clear_color(struct brw_context *brw, struct gl_framebuffer *fb, for (unsigned buf = 0; buf < fb->_NumColorDrawBuffers; buf++) { struct gl_renderbuffer *rb = fb->_ColorDrawBuffers[buf]; - struct intel_renderbuffer *irb = intel_renderbuffer(rb); /* If this is an ES2 context or GL_ARB_ES2_compatibility is supported, * the framebuffer can be complete with some attachments missing. In @@ -472,56 +533,8 @@ brw_blorp_clear_color(struct brw_context *brw, struct gl_framebuffer *fb, if (rb == NULL) continue; - brw_blorp_clear_params params(brw, fb, rb, ctx->Color.ColorMask[buf], -partial_clear); - - bool is_fast_clear = - (params.fast_clear_op == GEN7_FAST_CLEAR_OP_FAST_CLEAR); - if (is_fast_clear) { - /* Record the clear color in the miptree so that it will be - * programmed in SURFACE_STATE by later rendering and resolve - * operations. - */ - uint32_t new_color_value = -compute_fast_clear_color_bits(&ctx->Color.ClearColor); - if (irb->mt->fast_clear_color_value != new_color_value) { -irb->mt->fast_clear_color_value = new_color_value; -brw->state.dirty.brw |= BRW_NEW_SURFACES; - } - -
Mesa (master): meta: fix meta clear of layered framebuffers
Module: Mesa Branch: master Commit: 068a073c1d4853b5c8f33efdeb481026f42e23a5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=068a073c1d4853b5c8f33efdeb481026f42e23a5 Author: Paul Berry Date: Tue Nov 19 13:31:20 2013 -0800 meta: fix meta clear of layered framebuffers >From section 4.4.7 (Layered Framebuffers) of the GLSL 3.2 spec: When the Clear or ClearBuffer* commands are used to clear a layered framebuffer attachment, all layers of the attachment are cleared. This patch fixes meta clears to properly clear all layers of a layered framebuffer attachment. We accomplish this by adding a geometry shader to the meta clear program which sets gl_Layer to a uniform value. When clearing a layered framebuffer, we execute in a loop, setting the uniform to point to each layer in turn. Cc: "10.0" Reviewed-by: Eric Anholt Reviewed-by: Jordan Justen --- src/mesa/drivers/common/meta.c | 51 +-- 1 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 99b02ba..0c05cc0 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -241,9 +241,11 @@ struct clear_state GLuint VBO; GLuint ShaderProg; GLint ColorLocation; + GLint LayerLocation; GLuint IntegerShaderProg; GLint IntegerColorLocation; + GLint IntegerLayerLocation; }; @@ -2145,6 +2147,19 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) "{\n" " gl_Position = position;\n" "}\n"; + const char *gs_source = + "#version 150\n" + "layout(triangles) in;\n" + "layout(triangle_strip, max_vertices = 4) out;\n" + "uniform int layer;\n" + "void main()\n" + "{\n" + " for (int i = 0; i < 3; i++) {\n" + "gl_Layer = layer;\n" + "gl_Position = gl_in[i].gl_Position;\n" + "EmitVertex();\n" + " }\n" + "}\n"; const char *fs_source = "#ifdef GL_ES\n" "precision highp float;\n" @@ -2154,7 +2169,7 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) "{\n" " gl_FragColor = color;\n" "}\n"; - GLuint vs, fs; + GLuint vs, gs = 0, fs; bool has_integer_textures; if (clear->ArrayObj != 0) @@ -2176,6 +2191,12 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) _mesa_ShaderSource(vs, 1, &vs_source, NULL); _mesa_CompileShader(vs); + if (_mesa_has_geometry_shaders(ctx)) { + gs = _mesa_CreateShaderObjectARB(GL_GEOMETRY_SHADER); + _mesa_ShaderSource(gs, 1, &gs_source, NULL); + _mesa_CompileShader(gs); + } + fs = _mesa_CreateShaderObjectARB(GL_FRAGMENT_SHADER); _mesa_ShaderSource(fs, 1, &fs_source, NULL); _mesa_CompileShader(fs); @@ -2183,6 +2204,8 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear->ShaderProg = _mesa_CreateProgramObjectARB(); _mesa_AttachShader(clear->ShaderProg, fs); _mesa_DeleteObjectARB(fs); + if (gs != 0) + _mesa_AttachShader(clear->ShaderProg, gs); _mesa_AttachShader(clear->ShaderProg, vs); _mesa_DeleteObjectARB(vs); _mesa_BindAttribLocation(clear->ShaderProg, 0, "position"); @@ -2190,6 +2213,10 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear->ColorLocation = _mesa_GetUniformLocation(clear->ShaderProg, "color"); + if (gs != 0) { + clear->LayerLocation = _mesa_GetUniformLocation(clear->ShaderProg, + "layer"); + } has_integer_textures = _mesa_is_gles3(ctx) || (_mesa_is_desktop_gl(ctx) && ctx->Const.GLSLVersion >= 130); @@ -2227,6 +2254,8 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear->IntegerShaderProg = _mesa_CreateProgramObjectARB(); _mesa_AttachShader(clear->IntegerShaderProg, fs); _mesa_DeleteObjectARB(fs); + if (gs != 0) + _mesa_AttachShader(clear->IntegerShaderProg, gs); _mesa_AttachShader(clear->IntegerShaderProg, vs); _mesa_DeleteObjectARB(vs); _mesa_BindAttribLocation(clear->IntegerShaderProg, 0, "position"); @@ -2240,7 +2269,13 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear->IntegerColorLocation = _mesa_GetUniformLocation(clear->IntegerShaderProg, "color"); + if (gs != 0) { + clear->IntegerLayerLocation = +_mesa_GetUniformLocation(clear->IntegerShaderProg, "la
Mesa (master): glsl: Fix interstage uniform interface block link error detection.
Module: Mesa Branch: master Commit: 544e3129c5addeb6c9539339782dd54616ef0499 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=544e3129c5addeb6c9539339782dd54616ef0499 Author: Paul Berry Date: Fri Nov 15 14:23:45 2013 -0800 glsl: Fix interstage uniform interface block link error detection. Previously, we checked for interstage uniform interface block link errors in validate_interstage_interface_blocks(), which is only called on pairs of adjacent shader stages. Therefore, we failed to detect uniform interface block mismatches between non-adjacent shader stages. Before the introduction of geometry shaders, this wasn't a problem, because the only supported shader stages were vertex and fragment shaders, therefore they were always adjacent. However, now that we allow a program to contain vertex, geometry, and fragment shaders, that is no longer the case. Fixes piglit test "skip-stage-uniform-block-array-size-mismatch". Cc: "10.0" v2: Rename validate_interstage_interface_blocks() to validate_interstage_inout_blocks() to reflect the fact that it no longer validates uniform blocks. Reviewed-by: Jordan Justen v3: Make validate_interstage_inout_blocks() skip uniform blocks. Reviewed-by: Ian Romanick --- src/glsl/link_interface_blocks.cpp | 75 +++- src/glsl/linker.cpp|9 +++- src/glsl/linker.h | 10 +++- 3 files changed, 62 insertions(+), 32 deletions(-) diff --git a/src/glsl/link_interface_blocks.cpp b/src/glsl/link_interface_blocks.cpp index 528d4a1..6900fa9 100644 --- a/src/glsl/link_interface_blocks.cpp +++ b/src/glsl/link_interface_blocks.cpp @@ -308,57 +308,78 @@ validate_intrastage_interface_blocks(struct gl_shader_program *prog, } void -validate_interstage_interface_blocks(struct gl_shader_program *prog, - const gl_shader *producer, - const gl_shader *consumer) +validate_interstage_inout_blocks(struct gl_shader_program *prog, + const gl_shader *producer, + const gl_shader *consumer) { - interface_block_definitions inout_interfaces; - interface_block_definitions uniform_interfaces; + interface_block_definitions definitions; const bool extra_array_level = consumer->Type == GL_GEOMETRY_SHADER; - /* Add non-output interfaces from the consumer to the symbol table. */ + /* Add input interfaces from the consumer to the symbol table. */ foreach_list(node, consumer->ir) { ir_variable *var = ((ir_instruction *) node)->as_variable(); - if (!var || !var->get_interface_type() || var->mode == ir_var_shader_out) + if (!var || !var->get_interface_type() || var->mode != ir_var_shader_in) continue; - interface_block_definitions *definitions = var->mode == ir_var_uniform ? - &uniform_interfaces : &inout_interfaces; - definitions->store(interface_block_definition(var)); + definitions.store(interface_block_definition(var)); } - /* Verify that the producer's interfaces match. */ + /* Verify that the producer's output interfaces match. */ foreach_list(node, producer->ir) { ir_variable *var = ((ir_instruction *) node)->as_variable(); - if (!var || !var->get_interface_type() || var->mode == ir_var_shader_in) + if (!var || !var->get_interface_type() || var->mode != ir_var_shader_out) continue; - interface_block_definitions *definitions = var->mode == ir_var_uniform ? - &uniform_interfaces : &inout_interfaces; interface_block_definition *consumer_def = - definitions->lookup(var->get_interface_type()->name); + definitions.lookup(var->get_interface_type()->name); /* The consumer doesn't use this output block. Ignore it. */ if (consumer_def == NULL) continue; const interface_block_definition producer_def(var); - bool match; - if (var->mode == ir_var_uniform) { - /* Uniform matching rules are the same for interstage and intrastage - * linking. - */ - match = intrastage_match(consumer_def, &producer_def, - (ir_variable_mode) var->mode); - } else { - match = interstage_match(&producer_def, consumer_def, - extra_array_level); - } - if (!match) { + if (!interstage_match(&producer_def, consumer_def, extra_array_level)) { linker_error(prog, "definitions of interface block `%s' do not " "match\n", var->get_interface_type()->name); return; } } } + + +void +validate_interstage_uniform_blocks(struct gl_shader_program *prog, +
Mesa (master): glsl: Prohibit illegal mixing of redeclarations inside/ outside gl_PerVertex.
Module: Mesa Branch: master Commit: 2bbcf19acad530d339ffe8e007fe2f6a244e1580 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2bbcf19acad530d339ffe8e007fe2f6a244e1580 Author: Paul Berry Date: Wed Nov 13 16:53:18 2013 -0800 glsl: Prohibit illegal mixing of redeclarations inside/outside gl_PerVertex. >From section 7.1 (Built-In Language Variables) of the GLSL 4.10 spec: Also, if a built-in interface block is redeclared, no member of the built-in declaration can be redeclared outside the block redeclaration. We have been regarding this text as a clarification to the behaviour established for gl_PerVertex by GLSL 1.50, so we apply it regardless of GLSL version. This patch enforces the rule by adding an enum to ir_variable to track how the variable was declared: implicitly, normally, or in an interface block. Fixes piglit tests: - gs-redeclares-pervertex-out-after-global-redeclaration.geom - vs-redeclares-pervertex-out-after-global-redeclaration.vert - gs-redeclares-pervertex-out-after-other-global-redeclaration.geom - vs-redeclares-pervertex-out-after-other-global-redeclaration.vert - gs-redeclares-pervertex-out-before-global-redeclaration - vs-redeclares-pervertex-out-before-global-redeclaration Cc: "10.0" v2: Don't set "how_declared" redundantly in builtin_variables.cpp. Properly clone "how_declared". Reviewed-by: Ian Romanick --- src/glsl/ast_to_hir.cpp| 20 src/glsl/builtin_variables.cpp |1 + src/glsl/ir.cpp|3 ++- src/glsl/ir.h | 36 src/glsl/ir_clone.cpp |1 + 5 files changed, 60 insertions(+), 1 deletions(-) diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 76b256c..0128047 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -3355,6 +3355,15 @@ ast_declarator_list::hir(exec_list *instructions, ir_variable *earlier = get_variable_being_redeclared(var, decl->get_location(), state, false /* allow_all_redeclarations */); + if (earlier != NULL) { + if (strncmp(var->name, "gl_", 3) == 0 && + earlier->how_declared == ir_var_declared_in_block) { +_mesa_glsl_error(&loc, state, + "`%s' has already been redeclared using " + "gl_PerVertex", var->name); + } + earlier->how_declared = ir_var_declared_normally; + } if (decl->initializer != NULL) { result = process_initializer((earlier == NULL) ? var : earlier, @@ -5048,6 +5057,7 @@ ast_interface_block::hir(exec_list *instructions, _mesa_glsl_error(&loc, state, "`%s' redeclared", this->instance_name); } + earlier->how_declared = ir_var_declared_normally; earlier->type = var->type; earlier->reinit_interface_type(block_type); delete var; @@ -5078,7 +5088,11 @@ ast_interface_block::hir(exec_list *instructions, _mesa_glsl_error(&loc, state, "redeclaration of gl_PerVertex can only " "include built-in variables"); +} else if (earlier->how_declared == ir_var_declared_normally) { + _mesa_glsl_error(&loc, state, +"`%s' has already been redeclared", var->name); } else { + earlier->how_declared = ir_var_declared_in_block; earlier->reinit_interface_type(block_type); } continue; @@ -5125,6 +5139,12 @@ ast_interface_block::hir(exec_list *instructions, if (var != NULL && var->get_interface_type() == earlier_per_vertex && var->mode == var_mode) { + if (var->how_declared == ir_var_declared_normally) { + _mesa_glsl_error(&loc, state, + "redeclaration of gl_PerVertex cannot " + "follow a redeclaration of `%s'", + var->name); + } state->symbols->disable_variable(var->name); var->remove(); } diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp index 4d44104..d57324c 100644 --- a/src/glsl/builtin_variables.cpp +++ b/src/glsl/builtin_variables.cpp @@ -434,6 +434,7 @@ builtin_variable_generator::add_variable(const char *name, enum ir_variable_mode mode, int slot) { ir_variable *var = new(symtab) ir_variable(type, name, mode); + var->how_decl
Mesa (master): glsl: Fix cross-version linking between VS and GS.
Module: Mesa Branch: master Commit: 0f4cacbb53c23e4fa027375c492edd17b40ae748 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f4cacbb53c23e4fa027375c492edd17b40ae748 Author: Paul Berry Date: Tue Nov 19 17:48:02 2013 -0800 glsl: Fix cross-version linking between VS and GS. Previously, when attempting to link a vertex shader and a geometry shader that use different GLSL versions, we would sometimes generate a link error due to the implicit declaration of gl_PerVertex being different between the two GLSL versions. This patch fixes that problem by only requiring interface block definitions to match when they are explicitly declared. Fixes piglit test "shaders/version-mixing vs-gs". Cc: "10.0" v2: In the interface_block_definition constructor, move the assignment to explicitly_declared after the existing if block. Reviewed-by: Ian Romanick --- src/glsl/link_interface_blocks.cpp | 27 +++ 1 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/glsl/link_interface_blocks.cpp b/src/glsl/link_interface_blocks.cpp index a7fceb9..528d4a1 100644 --- a/src/glsl/link_interface_blocks.cpp +++ b/src/glsl/link_interface_blocks.cpp @@ -60,6 +60,7 @@ struct interface_block_definition if (var->type->is_array()) array_size = var->type->length; } + explicitly_declared = (var->how_declared != ir_var_declared_implicitly); } /** @@ -77,6 +78,12 @@ struct interface_block_definition * Otherwise -1. */ int array_size; + + /** +* True if this interface block was explicitly declared in the shader; +* false if it was an implicitly declared built-in interface block. +*/ + bool explicitly_declared; }; @@ -91,8 +98,14 @@ intrastage_match(interface_block_definition *a, ir_variable_mode mode) { /* Types must match. */ - if (a->type != b->type) - return false; + if (a->type != b->type) { + /* Exception: if both the interface blocks are implicitly declared, + * don't force their types to match. They might mismatch due to the two + * shaders using different GLSL versions, and that's ok. + */ + if (a->explicitly_declared || b->explicitly_declared) + return false; + } /* Presence/absence of interface names must match. */ if ((a->instance_name == NULL) != (b->instance_name == NULL)) @@ -144,8 +157,14 @@ interstage_match(const interface_block_definition *producer, assert(producer->array_size != 0); /* Types must match. */ - if (consumer->type != producer->type) - return false; + if (consumer->type != producer->type) { + /* Exception: if both the interface blocks are implicitly declared, + * don't force their types to match. They might mismatch due to the two + * shaders using different GLSL versions, and that's ok. + */ + if (consumer->explicitly_declared || producer->explicitly_declared) + return false; + } if (extra_array_level) { /* Consumer must be an array, and producer must not. */ if (consumer->array_size == -1) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/gen7: Disallow Y tiling of renderable surfaces with valign of 2.
Module: Mesa Branch: master Commit: 81b998ca48fc96753096f22949bf3785b7aa425c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=81b998ca48fc96753096f22949bf3785b7aa425c Author: Paul Berry Date: Tue Nov 12 17:51:15 2013 -0800 i965/gen7: Disallow Y tiling of renderable surfaces with valign of 2. Gen7 does not allow render targets to have a vertical alignment of 2. So, when creating a surface, if its format is renderable, and its vertical alignment is 2, force it to use X tiling. Reviewed-by: Eric Anholt --- src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 17 + 1 files changed, 17 insertions(+), 0 deletions(-) diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index 884ddef..292c312 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -478,6 +478,23 @@ intel_miptree_choose_tiling(struct brw_context *brw, if (brw->gen != 7 && mt->cpp >= 16) return I915_TILING_X; + /* From the Ivy Bridge PRM, Vol4 Part1 2.12.2.1 (SURFACE_STATE for most +* messages), on p64, under the heading "Surface Vertical Alignment": +* +* This field must be set to VALIGN_4 for all tiled Y Render Target +* surfaces. +* +* So if the surface is renderable and uses a vertical alignment of 2, +* force it to be X tiled. This is somewhat conservative (it's possible +* that the client won't ever render to this surface), but it's difficult +* to know that ahead of time. And besides, since we use a vertical +* alignment of 4 as often as we can, this shouldn't happen very often. +*/ + if (brw->gen == 7 && mt->align_h == 2 && + brw->format_supported_as_render_target[format]) { + return I915_TILING_X; + } + return I915_TILING_Y | I915_TILING_X; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/gen7: Prefer vertical alignment of 4 when possible.
Module: Mesa Branch: master Commit: 6b40dd17cf844b9cc8d6b1a816d4e93cbf6decef URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6b40dd17cf844b9cc8d6b1a816d4e93cbf6decef Author: Paul Berry Date: Tue Nov 12 17:16:25 2013 -0800 i965/gen7: Prefer vertical alignment of 4 when possible. Gen6+ allows for color buffers to use a vertical alignment of either 4 or 2. Previously we defaulted to 2. This may have caused problems on Gen7 because Y-tiled render targets are not allowed to use a vertical alignment of 2. This patch changes the vertical alignment to 4 on Gen7, except for the few formats where a vertical alignment of 2 is required. Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_tex_layout.c | 25 ++--- 1 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c b/src/mesa/drivers/dri/i965/brw_tex_layout.c index d05dbeb..2c81eed 100644 --- a/src/mesa/drivers/dri/i965/brw_tex_layout.c +++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c @@ -105,11 +105,11 @@ intel_vertical_texture_alignment_unit(struct brw_context *brw, * | Depth Buffer | 2 | 2 | 2 | 4 | 4 | * | Separate Stencil Buffer| N/A | N/A | N/A | 4 | 8 | * | Multisampled (4x or 8x) render target | N/A | N/A | N/A | 4 | 4 | -* | All Others | 2 | 2 | 2 | 2 | 2 | +* | All Others | 2 | 2 | 2 | * | * | * +--+ * -* On SNB+, non-special cases can be overridden by setting the SURFACE_STATE -* "Surface Vertical Alignment" field to VALIGN_2 or VALIGN_4. +* Where "*" means either VALIGN_2 or VALIGN_4 depending on the setting of +* the SURFACE_STATE "Surface Vertical Alignment" field. */ if (_mesa_is_format_compressed(format)) return 4; @@ -128,6 +128,25 @@ intel_vertical_texture_alignment_unit(struct brw_context *brw, return 4; } + if (brw->gen == 7) { + /* On Gen7, we prefer a vertical alignment of 4 when possible, because + * that allows Y tiled render targets. + * + * From the Ivy Bridge PRM, Vol4 Part1 2.12.2.1 (SURFACE_STATE for most + * messages), on p64, under the heading "Surface Vertical Alignment": + * + * Value of 1 [VALIGN_4] is not supported for format YCRCB_NORMAL + * (0x182), YCRCB_SWAPUVY (0x183), YCRCB_SWAPUV (0x18f), YCRCB_SWAPY + * (0x190) + * + * VALIGN_4 is not supported for surface format R32G32B32_FLOAT. + */ + if (base_format == GL_YCBCR_MESA || format == MESA_FORMAT_RGB_FLOAT32) + return 2; + + return 4; + } + return 2; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/vec4: Fix broken IR annotation in debug output.
Module: Mesa Branch: master Commit: 60b1a118e123493624324ae191d05870e95968f3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=60b1a118e123493624324ae191d05870e95968f3 Author: Paul Berry Date: Tue Nov 5 21:44:13 2013 -0800 i965/vec4: Fix broken IR annotation in debug output. Commit 70953b5 (i965: Initialize all member variables of vec4_instruction on construction) inadvertently added a line to the vec4_instruction constructor setting this->ir to NULL, wiping out the previously set value. As a result, ever since then, the output of INTEL_DEBUG=vs and INTEL_DEBUG=gs has been missing IR annotations. Cc: "10.0" Reviewed-by: Eric Anholt --- src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 423f693..a13eafb 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -53,7 +53,6 @@ vec4_instruction::vec4_instruction(vec4_visitor *v, this->mlen = 0; this->base_mrf = 0; this->offset = 0; - this->ir = NULL; this->annotation = v->current_annotation; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965/gen7: Emit workaround flush when changing GS enable state.
Module: Mesa Branch: master Commit: 7dfb4b2d00ddb8e5ee24d4c58eb9415dc4ccc21c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7dfb4b2d00ddb8e5ee24d4c58eb9415dc4ccc21c Author: Paul Berry Date: Mon Nov 4 20:06:48 2013 -0800 i965/gen7: Emit workaround flush when changing GS enable state. v2: Don't go to extra work to avoid extraneous flushes. (Previous experiments in the kernel have suggested that flushing the pipeline when it is already empty is extremely cheap). Cc: "10.0" Reviewed-by: Eric Anholt --- src/mesa/drivers/dri/i965/brw_context.c |1 + src/mesa/drivers/dri/i965/brw_context.h |6 + src/mesa/drivers/dri/i965/gen7_blorp.cpp | 16 + src/mesa/drivers/dri/i965/gen7_gs_state.c | 16 + src/mesa/drivers/dri/i965/gen7_urb.c | 24 +-- src/mesa/drivers/dri/i965/intel_batchbuffer.c | 30 + src/mesa/drivers/dri/i965/intel_batchbuffer.h |1 + 7 files changed, 72 insertions(+), 22 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index bee98e3..0399ec0 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -764,6 +764,7 @@ brwCreateContext(gl_api api, brw->prim_restart.in_progress = false; brw->prim_restart.enable_cut_index = false; + brw->gs.enabled = false; if (brw->gen < 6) { brw->curbe.last_buf = calloc(1, 4096); diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 8b1cbb3..4a08986 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1300,6 +1300,12 @@ struct brw_context struct { struct brw_stage_state base; struct brw_gs_prog_data *prog_data; + + /** + * True if the 3DSTATE_GS command most recently emitted to the 3D + * pipeline enabled the GS; false otherwise. + */ + bool enabled; } gs; struct { diff --git a/src/mesa/drivers/dri/i965/gen7_blorp.cpp b/src/mesa/drivers/dri/i965/gen7_blorp.cpp index 540c46d..d481538 100644 --- a/src/mesa/drivers/dri/i965/gen7_blorp.cpp +++ b/src/mesa/drivers/dri/i965/gen7_blorp.cpp @@ -402,6 +402,21 @@ gen7_blorp_emit_gs_disable(struct brw_context *brw, OUT_BATCH(0); ADVANCE_BATCH(); + /** +* From Graphics BSpec: 3D-Media-GPGPU Engine > 3D Pipeline Stages > +* Geometry > Geometry Shader > State: +* +* "Note: Because of corruption in IVB:GT2, software needs to flush the +* whole fixed function pipeline when the GS enable changes value in +* the 3DSTATE_GS." +* +* The hardware architects have clarified that in this context "flush the +* whole fixed function pipeline" means to emit a PIPE_CONTROL with the "CS +* Stall" bit set. +*/ + if (!brw->is_haswell && brw->gt == 2 && brw->gs.enabled) + gen7_emit_cs_stall_flush(brw); + BEGIN_BATCH(7); OUT_BATCH(_3DSTATE_GS << 16 | (7 - 2)); OUT_BATCH(0); @@ -411,6 +426,7 @@ gen7_blorp_emit_gs_disable(struct brw_context *brw, OUT_BATCH(0); OUT_BATCH(0); ADVANCE_BATCH(); + brw->gs.enabled = false; } /* 3DSTATE_STREAMOUT diff --git a/src/mesa/drivers/dri/i965/gen7_gs_state.c b/src/mesa/drivers/dri/i965/gen7_gs_state.c index 584f2db..d2ba354 100644 --- a/src/mesa/drivers/dri/i965/gen7_gs_state.c +++ b/src/mesa/drivers/dri/i965/gen7_gs_state.c @@ -80,6 +80,21 @@ upload_gs_state(struct brw_context *brw) gen7_upload_constant_state(brw, stage_state, active, _3DSTATE_CONSTANT_GS); + /** +* From Graphics BSpec: 3D-Media-GPGPU Engine > 3D Pipeline Stages > +* Geometry > Geometry Shader > State: +* +* "Note: Because of corruption in IVB:GT2, software needs to flush the +* whole fixed function pipeline when the GS enable changes value in +* the 3DSTATE_GS." +* +* The hardware architects have clarified that in this context "flush the +* whole fixed function pipeline" means to emit a PIPE_CONTROL with the "CS +* Stall" bit set. +*/ + if (!brw->is_haswell && brw->gt == 2 && brw->gs.enabled != active) + gen7_emit_cs_stall_flush(brw); + if (active) { BEGIN_BATCH(7); OUT_BATCH(_3DSTATE_GS << 16 | (7 - 2)); @@ -176,6 +191,7 @@ upload_gs_state(struct brw_context *brw) OUT_BATCH(0); ADVANCE_BATCH(); } + brw->gs.enabled = active; } const struct brw_tracked_state gen7_gs_state = { diff --git a/src/mesa/drivers/dri/i965/gen7_urb.c b/src/mesa/drivers/dri/i965/gen7_urb.c index 6dcdfe4..c638586 100644 --- a/src/mesa/drivers/dri/i965/gen7_urb.c +++ b/src/mesa/drivers/dri/i965/gen7_urb.c @@ -122,28 +122,8 @@ gen7_emit_push_constant_state(struct brw
Mesa (master): main: Fix MaxUniformComponents for geometry shaders.
Module: Mesa Branch: master Commit: 46e9f78efcb6ccc25ea59d83624aaa5077254a85 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=46e9f78efcb6ccc25ea59d83624aaa5077254a85 Author: Paul Berry Date: Wed Nov 13 14:24:09 2013 -0800 main: Fix MaxUniformComponents for geometry shaders. For both vertex and fragment shaders we default MaxUniformComponents to 4 * MAX_UNIFORMS. It makes sense to do this for geometry shaders too; if back-ends have different limits they can override them as necessary. Fixes piglit test: spec/glsl-1.50/built-in constants/gl_MaxGeometryUniformComponents Cc: "10.0" Reviewed-by: Kenneth Graunke Reviewed-by: Chad Versace --- src/mesa/main/context.c |2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index d005d23..8cbc935 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -494,7 +494,7 @@ init_program_limits(struct gl_context *ctx, GLenum type, prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS; prog->MaxAttribs = MAX_VERTEX_GENERIC_ATTRIBS; prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS; - prog->MaxUniformComponents = MAX_GEOMETRY_UNIFORM_COMPONENTS; + prog->MaxUniformComponents = 4 * MAX_UNIFORMS; prog->MaxInputComponents = 16 * 4; /* old limit not to break tnl and swrast */ prog->MaxOutputComponents = 16 * 4; /* old limit not to break tnl and swrast */ break; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): i965: Fix vertical alignment for multisampled buffers.
Module: Mesa Branch: master Commit: b4c3b833ec8ec6787658ea90365ff565cd8846c7 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b4c3b833ec8ec6787658ea90365ff565cd8846c7 Author: Paul Berry Date: Tue Nov 12 10:55:18 2013 -0800 i965: Fix vertical alignment for multisampled buffers. >From the Sandy Bridge PRM, Vol 1 Part 1 7.18.3.4 (Alignment Unit Size): j [vertical alignment] = 4 for any render target surface is multisampled (4x) >From the Ivy Bridge PRM, Vol 4 Part 1 2.12.2.1 (SURFACE_STATE for most messages), under the "Surface Vertical Alignment" heading: This field is intended to be set to VALIGN_4 if the surface was rendered as a depth buffer, for a multisampled (4x) render target, or for a multisampled (8x) render target, since these surfaces support only alignment of 4. Back in 2012 when we added multisampling support to the i965 driver, we forgot to update the logic for computing the vertical alignment, so we were often using a vertical alignment of 2 for multisampled buffers, leading to subtle rendering errors. Note that the specs also require a vertical alignment of 4 for all Y-tiled render target surfaces; I plan to address that in a separate patch. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=53077 Cc: mesa-sta...@lists.freedesktop.org Reviewed-by: Kenneth Graunke Reviewed-by: Eric Anholt --- src/mesa/drivers/dri/i965/brw_tex_layout.c | 11 +++ 1 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c b/src/mesa/drivers/dri/i965/brw_tex_layout.c index d912862..d05dbeb 100644 --- a/src/mesa/drivers/dri/i965/brw_tex_layout.c +++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c @@ -86,7 +86,7 @@ intel_horizontal_texture_alignment_unit(struct brw_context *brw, static unsigned int intel_vertical_texture_alignment_unit(struct brw_context *brw, - gl_format format) + gl_format format, bool multisampled) { /** * From the "Alignment Unit Size" section of various specs, namely: @@ -110,8 +110,6 @@ intel_vertical_texture_alignment_unit(struct brw_context *brw, * * On SNB+, non-special cases can be overridden by setting the SURFACE_STATE * "Surface Vertical Alignment" field to VALIGN_2 or VALIGN_4. -* -* We currently don't support multisampling. */ if (_mesa_is_format_compressed(format)) return 4; @@ -119,6 +117,9 @@ intel_vertical_texture_alignment_unit(struct brw_context *brw, if (format == MESA_FORMAT_S8) return brw->gen >= 7 ? 8 : 4; + if (multisampled) + return 4; + GLenum base_format = _mesa_get_format_base_format(format); if (brw->gen >= 6 && @@ -276,8 +277,10 @@ brw_miptree_layout_texture_3d(struct brw_context *brw, void brw_miptree_layout(struct brw_context *brw, struct intel_mipmap_tree *mt) { + bool multisampled = mt->num_samples > 1; mt->align_w = intel_horizontal_texture_alignment_unit(brw, mt->format); - mt->align_h = intel_vertical_texture_alignment_unit(brw, mt->format); + mt->align_h = + intel_vertical_texture_alignment_unit(brw, mt->format, multisampled); switch (mt->target) { case GL_TEXTURE_CUBE_MAP: ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Rework interface block linking.
Module: Mesa Branch: master Commit: f38ac41ed48fefe82360520c9d33ba9261a3e642 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f38ac41ed48fefe82360520c9d33ba9261a3e642 Author: Paul Berry Date: Tue Oct 29 14:41:32 2013 -0700 glsl: Rework interface block linking. Previously, when doing intrastage and interstage interface block linking, we only checked the interface type; this prevented us from catching some link errors. We now check the following additional constraints: - For intrastage linking, the presence/absence of interface names must match. - For shader ins/outs, the interface names themselves must match when doing intrastage linking (note: it's not clear from the spec whether this is necessary, but Mesa's implementation currently relies on it). - Array vs. nonarray must be consistent, taking into account the special rules for vertex-geometry linkage. - Array sizes must be consistent (exception: during intrastage linking, an unsized array matches a sized array). Note: validate_interstage_interface_blocks currently handles both uniforms and in/out variables. As a result, if all three shader types are present (VS, GS, and FS), and a uniform interface block is mentioned in the VS and FS but not the GS, it won't be validated. I plan to address this in later patches. Fixes the following piglit tests in spec/glsl-1.50/linker: - interface-blocks-vs-fs-array-size-mismatch - interface-vs-array-to-fs-unnamed - interface-vs-unnamed-to-fs-array - intrastage-interface-unnamed-array v2: Simplify logic in intrastage_match() for handling array sizes. Make extra_array_level const. Use an unnamed temporary interface_block_definition in validate_interstage_interface_blocks()'s first call to definitions->store(). Cc: "10.0" Reviewed-by: Ian Romanick Reviewed-by: Jordan Justen --- src/glsl/link_interface_blocks.cpp | 271 +--- 1 files changed, 251 insertions(+), 20 deletions(-) diff --git a/src/glsl/link_interface_blocks.cpp b/src/glsl/link_interface_blocks.cpp index 4f1c9d3..a7fceb9 100644 --- a/src/glsl/link_interface_blocks.cpp +++ b/src/glsl/link_interface_blocks.cpp @@ -30,13 +30,211 @@ #include "glsl_symbol_table.h" #include "linker.h" #include "main/macros.h" +#include "program/hash_table.h" + + +namespace { + +/** + * Information about a single interface block definition that we need to keep + * track of in order to check linkage rules. + * + * Note: this class is expected to be short lived, so it doesn't make copies + * of the strings it references; it simply borrows the pointers from the + * ir_variable class. + */ +struct interface_block_definition +{ + /** +* Extract an interface block definition from an ir_variable that +* represents either the interface instance (for named interfaces), or a +* member of the interface (for unnamed interfaces). +*/ + explicit interface_block_definition(const ir_variable *var) + : type(var->get_interface_type()), +instance_name(NULL), +array_size(-1) + { + if (var->is_interface_instance()) { + instance_name = var->name; + if (var->type->is_array()) +array_size = var->type->length; + } + } + + /** +* Interface block type +*/ + const glsl_type *type; + + /** +* For a named interface block, the instance name. Otherwise NULL. +*/ + const char *instance_name; + + /** +* For an interface block array, the array size (or 0 if unsized). +* Otherwise -1. +*/ + int array_size; +}; + + +/** + * Check if two interfaces match, according to intrastage interface matching + * rules. If they do, and the first interface uses an unsized array, it will + * be updated to reflect the array size declared in the second interface. + */ +bool +intrastage_match(interface_block_definition *a, + const interface_block_definition *b, + ir_variable_mode mode) +{ + /* Types must match. */ + if (a->type != b->type) + return false; + + /* Presence/absence of interface names must match. */ + if ((a->instance_name == NULL) != (b->instance_name == NULL)) + return false; + + /* For uniforms, instance names need not match. For shader ins/outs, +* it's not clear from the spec whether they need to match, but +* Mesa's implementation relies on them matching. +*/ + if (a->instance_name != NULL && mode != ir_var_uniform && + strcmp(a->instance_name, b->instance_name) != 0) { + return false; + } + + /* Array vs. nonarray must be consistent, and sizes must be +* consistent, with the exception that unsized arrays match sized +* arrays. +*/ + if ((a->array_size == -1) != (b->array_size == -1)) + return false; + if (b->array_size != 0) { + if (a
Mesa (master): i965/gen6: Don' t allow SIMD16 dispatch in 4x PERPIXEL mode with computed depth.
Module: Mesa Branch: master Commit: 2fd785ac49ffe85c62c6b7f515e2dcf9e9bbc5ca URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2fd785ac49ffe85c62c6b7f515e2dcf9e9bbc5ca Author: Paul Berry Date: Mon Nov 4 18:48:17 2013 -0800 i965/gen6: Don't allow SIMD16 dispatch in 4x PERPIXEL mode with computed depth. Hardware docs say we can only use SIMD8 dispatch in this condition. Reviewed-by: Eric Anholt Reviewed-by: Chris Forbes --- src/mesa/drivers/dri/i965/gen6_wm_state.c | 34 - 1 files changed, 33 insertions(+), 1 deletions(-) diff --git a/src/mesa/drivers/dri/i965/gen6_wm_state.c b/src/mesa/drivers/dri/i965/gen6_wm_state.c index 5773246..3f9f8f4 100644 --- a/src/mesa/drivers/dri/i965/gen6_wm_state.c +++ b/src/mesa/drivers/dri/i965/gen6_wm_state.c @@ -234,8 +234,40 @@ upload_wm_state(struct brw_context *brw) if (min_inv_per_frag > 1) dw6 |= GEN6_WM_MSDISPMODE_PERSAMPLE; - else + else { dw6 |= GEN6_WM_MSDISPMODE_PERPIXEL; + + /* From the Sandy Bridge PRM, Vol 2 part 1, 7.7.1 ("Pixel Grouping + * (Dispatch Size) Control"), p.334: + * + * Note: in the table below, the Valid column indicates which + * products that combination is supported on. Combinations of + * dispatch enables not listed in the table are not available on + * any product. + * + * A: Valid on all products + * + * B: Not valid on [DevSNB] if 4x PERPIXEL mode with pixel shader + * computed depth. + * + * D: Valid on all products, except when in non-1x PERSAMPLE mode + * (applies to [DevSNB+] only). Not valid on [DevSNB] if 4x + * PERPIXEL mode with pixel shader computed depth. + * + * E: Not valid on [DevSNB] if 4x PERPIXEL mode with pixel shader + * computed depth. + * + * F: Valid on all products, except not valid on [DevSNB] if 4x + * PERPIXEL mode with pixel shader computed depth. + * + * In the table that follows, the only entry with "A" in the Valid + * column is the entry where only 8 pixel dispatch is enabled. + * Therefore, when we are in PERPIXEL mode with pixel shader computed + * depth, we need to disable SIMD16 dispatch. + */ + if (dw5 & GEN6_WM_COMPUTED_DEPTH) +dw5 &= ~GEN6_WM_16_DISPATCH_ENABLE; + } } else { dw6 |= GEN6_WM_MSRAST_OFF_PIXEL; dw6 |= GEN6_WM_MSDISPMODE_PERSAMPLE; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Don' t generate misleading debug names when packing gs inputs.
Module: Mesa Branch: master Commit: 86cdff56353a223d3c9c1cd24bc83a1799eaa6d9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=86cdff56353a223d3c9c1cd24bc83a1799eaa6d9 Author: Paul Berry Date: Wed Oct 30 17:01:01 2013 -0700 glsl: Don't generate misleading debug names when packing gs inputs. Previously, when packing geometry shader input varyings like this: in float foo[3]; in float bar[3]; lower_packed_varyings would declare a packed varying like this: (declare (shader_in flat) (array ivec4 3) packed:foo[0],bar[0]) That's confusing, since the packed varying acutally stores all three values of foo and all three values of bar. This patch causes it to generate the more sensible declaration: (declare (shader_in flat) (array ivec4 3) packed:foo,bar) Note that there should be no functional change for users of geometry shaders, since the packed name is only used for generating debug output. But this should reduce confusion when using INTEL_DEBUG=gs. Reviewed-by: Eric Anholt --- src/glsl/lower_packed_varyings.cpp |7 +++ 1 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/glsl/lower_packed_varyings.cpp b/src/glsl/lower_packed_varyings.cpp index 2bcadfd..61ee692 100644 --- a/src/glsl/lower_packed_varyings.cpp +++ b/src/glsl/lower_packed_varyings.cpp @@ -506,17 +506,16 @@ lower_packed_varyings_visitor::lower_arraylike(ir_rvalue *rvalue, ir_constant *constant = new(this->mem_ctx) ir_constant(i); ir_dereference_array *dereference_array = new(this->mem_ctx) ir_dereference_array(rvalue, constant); - char *subscripted_name - = ralloc_asprintf(this->mem_ctx, "%s[%d]", name, i); if (gs_input_toplevel) { /* Geometry shader inputs are a special case. Instead of storing * each element of the array at a different location, all elements * are at the same location, but with a different vertex index. */ (void) this->lower_rvalue(dereference_array, fine_location, - unpacked_var, subscripted_name, - false, i); + unpacked_var, name, false, i); } else { + char *subscripted_name += ralloc_asprintf(this->mem_ctx, "%s[%d]", name, i); fine_location = this->lower_rvalue(dereference_array, fine_location, unpacked_var, subscripted_name, ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Generalize MSVC fix for strcasecmp().
Module: Mesa Branch: master Commit: be63803b0c1efab19d20be3274f92fb55ead7958 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=be63803b0c1efab19d20be3274f92fb55ead7958 Author: Paul Berry Date: Sat Oct 26 10:25:46 2013 -0700 glsl: Generalize MSVC fix for strcasecmp(). This will let us use strcasecmp() from anywhere inside Mesa without having to worry about the fact that it doesn't exist in MSVC. Reviewed-by: Kenneth Graunke Reviewed-by: Ian Romanick --- src/glsl/glsl_parser.yy |8 +--- src/mesa/main/imports.h |1 + 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy index 0a0708e..4ed4105 100644 --- a/src/glsl/glsl_parser.yy +++ b/src/glsl/glsl_parser.yy @@ -66,14 +66,8 @@ static bool match_layout_qualifier(const char *s1, const char *s2, */ if (state->es_shader) return strcmp(s1, s2); - else { -#if defined(_MSC_VER) - /* MSVC doesn't have a strcasecmp() function; instead it has _stricmp. */ - return _stricmp(s1, s2); -#else + else return strcasecmp(s1, s2); -#endif - } } %} diff --git a/src/mesa/main/imports.h b/src/mesa/main/imports.h index 53e40b4..d79e2a3 100644 --- a/src/mesa/main/imports.h +++ b/src/mesa/main/imports.h @@ -141,6 +141,7 @@ static inline float acoshf(float x) { return logf(x + sqrtf(x * x - 1.0f)); } static inline float atanhf(float x) { return (logf(1.0f + x) - logf(1.0f - x)) / 2.0f; } static inline int isblank(int ch) { return ch == ' ' || ch == '\t'; } #define strtoll(p, e, b) _strtoi64(p, e, b) +#define strcasecmp(s1, s2) _stricmp(s1, s2) #endif /*@}*/ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: Add check for unsized arrays to glsl types
Module: Mesa Branch: master Commit: b59c5926cb0a5981a2e553c68e36312be7f122f9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b59c5926cb0a5981a2e553c68e36312be7f122f9 Author: Timothy Arceri Date: Wed Oct 23 21:31:27 2013 +1100 glsl: Add check for unsized arrays to glsl types The main purpose of this patch is to increase readability of the array code by introducing is_unsized_array() to glsl_types. Some redundent is_array() checks are also removed, and small number of other related clean ups. The introduction of is_unsized_array() should also make the ARB_arrays_of_arrays code simpler and more readable when it arrives. V2: Also replace code that checks for unsized arrays directly with the length variable Signed-off-by: Timothy Arceri v3 (Paul Berry ): clean up formatting. Separate whitespace cleanups to their own patch. Reviewed-by: Paul Berry --- src/glsl/ast_array_index.cpp |2 +- src/glsl/ast_function.cpp| 14 +++--- src/glsl/ast_to_hir.cpp | 24 ++-- src/glsl/glsl_types.h|8 src/glsl/hir_field_selection.cpp |2 +- src/glsl/linker.cpp |4 ++-- src/glsl/opt_array_splitting.cpp |2 +- 7 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/glsl/ast_array_index.cpp b/src/glsl/ast_array_index.cpp index 107c29e..f7b5e83 100644 --- a/src/glsl/ast_array_index.cpp +++ b/src/glsl/ast_array_index.cpp @@ -165,7 +165,7 @@ _mesa_ast_array_index_to_hir(void *mem_ctx, if (array->type->is_array()) update_max_array_access(array, idx, &loc, state); } else if (const_index == NULL && array->type->is_array()) { - if (array->type->array_size() == 0) { + if (array->type->is_unsized_array()) { _mesa_glsl_error(&loc, state, "unsized array index must be constant"); } else if (array->type->fields.array->is_interface() && array->variable_referenced()->mode == ir_var_uniform) { diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp index 02aad4f..2707522 100644 --- a/src/glsl/ast_function.cpp +++ b/src/glsl/ast_function.cpp @@ -732,21 +732,21 @@ process_array_constructor(exec_list *instructions, exec_list actual_parameters; const unsigned parameter_count = process_parameters(instructions, &actual_parameters, parameters, state); + bool is_unsized_array = constructor_type->is_unsized_array(); - if ((parameter_count == 0) - || ((constructor_type->length != 0) - && (constructor_type->length != parameter_count))) { - const unsigned min_param = (constructor_type->length == 0) -? 1 : constructor_type->length; + if ((parameter_count == 0) || + (!is_unsized_array && (constructor_type->length != parameter_count))) { + const unsigned min_param = is_unsized_array + ? 1 : constructor_type->length; _mesa_glsl_error(loc, state, "array constructor must have %s %u " "parameter%s", - (constructor_type->length == 0) ? "at least" : "exactly", + is_unsized_array ? "at least" : "exactly", min_param, (min_param <= 1) ? "" : "s"); return ir_rvalue::error_value(ctx); } - if (constructor_type->length == 0) { + if (is_unsized_array) { constructor_type = glsl_type::get_array_instance(constructor_type->element_type(), parameter_count); diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 561d942..3cc44a0 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -689,16 +689,15 @@ validate_assignment(struct _mesa_glsl_parse_state *state, if (rhs->type == lhs_type) return rhs; - /* If the array element types are the same and the size of the LHS is zero, + /* If the array element types are the same and the LHS is unsized, * the assignment is okay for initializers embedded in variable * declarations. * * Note: Whole-array assignments are not permitted in GLSL 1.10, but this * is handled by ir_dereference::is_lvalue. */ - if (is_initializer && lhs_type->is_array() && rhs->type->is_array() - && (lhs_type->element_type() == rhs->type->element_type()) - && (lhs_type->array_size() == 0)) { + if (is_initializer && lhs_type->is_unsized_array() && rhs->type->is_array() + && (lhs_type->element_type() == rhs->type->element_type())) { return rhs; } @@ -805,7 +804,7 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state, * dereference of a variable. Any other case would require tha
Mesa (master): glsl: Fix comment
Module: Mesa Branch: master Commit: e14abf566b7a0dfab64d2763d03d94524b8cfb3d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e14abf566b7a0dfab64d2763d03d94524b8cfb3d Author: Timothy Arceri Date: Tue Oct 22 22:38:12 2013 +1100 glsl: Fix comment Signed-off-by: Timothy Arceri Reviewed-by: Paul Berry --- src/glsl/ast_array_index.cpp |2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/glsl/ast_array_index.cpp b/src/glsl/ast_array_index.cpp index b457ec8..107c29e 100644 --- a/src/glsl/ast_array_index.cpp +++ b/src/glsl/ast_array_index.cpp @@ -143,7 +143,7 @@ _mesa_ast_array_index_to_hir(void *mem_ctx, bound = array->type->vector_elements; } } else { -/* glsl_type::array_size() returns 0 for non-array types. This means +/* glsl_type::array_size() returns -1 for non-array types. This means * that we don't need to verify that the type is an array before * doing the bounds checking. */ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit