Mesa (master): mesa/cs: Add dispatch API stubs for ARB_compute_shader.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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().

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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].

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-05 Thread Paul Berry
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.

2014-02-04 Thread Paul Berry
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.

2014-02-04 Thread Paul Berry
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

2014-01-24 Thread Paul Berry
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.

2014-01-24 Thread Paul Berry
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.

2014-01-24 Thread Paul Berry
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.

2014-01-24 Thread Paul Berry
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.

2014-01-22 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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().

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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.

2014-01-21 Thread Paul Berry
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".

2014-01-21 Thread Paul Berry
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.

2014-01-13 Thread Paul Berry
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.

2014-01-10 Thread Paul Berry
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.

2014-01-10 Thread Paul Berry
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.

2014-01-09 Thread Paul Berry
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.

2014-01-09 Thread Paul Berry
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.

2014-01-09 Thread Paul Berry
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.

2014-01-09 Thread Paul Berry
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.

2014-01-09 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2014-01-08 Thread Paul Berry
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.

2013-12-30 Thread Paul Berry
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().

2013-12-30 Thread Paul Berry
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().

2013-12-30 Thread Paul Berry
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.

2013-12-30 Thread Paul Berry
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.

2013-12-30 Thread Paul Berry
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().

2013-12-30 Thread Paul Berry
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().

2013-12-30 Thread Paul Berry
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.

2013-12-17 Thread Paul Berry
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.

2013-12-17 Thread Paul Berry
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.

2013-12-17 Thread Paul Berry
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

2013-12-09 Thread Paul Berry
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.

2013-11-29 Thread Paul Berry
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.

2013-11-29 Thread Paul Berry
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.

2013-11-29 Thread Paul Berry
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.

2013-11-29 Thread Paul Berry
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.

2013-11-29 Thread Paul Berry
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.

2013-11-29 Thread Paul Berry
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.

2013-11-26 Thread Paul Berry
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.

2013-11-26 Thread Paul Berry
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.

2013-11-26 Thread Paul Berry
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.

2013-11-26 Thread Paul Berry
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.

2013-11-21 Thread Paul Berry
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.

2013-11-21 Thread Paul Berry
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.

2013-11-21 Thread Paul Berry
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.

2013-11-21 Thread Paul Berry
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 ()

2013-11-21 Thread Paul Berry
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.

2013-11-21 Thread Paul Berry
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

2013-11-21 Thread Paul Berry
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.

2013-11-21 Thread Paul Berry
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.

2013-11-21 Thread Paul Berry
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.

2013-11-21 Thread Paul Berry
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.

2013-11-19 Thread Paul Berry
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.

2013-11-19 Thread Paul Berry
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.

2013-11-19 Thread Paul Berry
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.

2013-11-18 Thread Paul Berry
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.

2013-11-15 Thread Paul Berry
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.

2013-11-15 Thread Paul Berry
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.

2013-11-15 Thread Paul Berry
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.

2013-11-06 Thread Paul Berry
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.

2013-11-04 Thread Paul Berry
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().

2013-10-29 Thread Paul Berry
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

2013-10-28 Thread Paul Berry
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

2013-10-28 Thread Paul Berry
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


  1   2   3   4   5   6   7   8   >