mesa: Put materials at the end of the generic block.
authorMathias Fröhlich <mathias.froehlich@web.de>
Sat, 27 Jan 2018 15:07:22 +0000 (16:07 +0100)
committerMathias Fröhlich <Mathias.Froehlich@gmx.net>
Thu, 1 Feb 2018 21:39:06 +0000 (22:39 +0100)
The materials are now moved to the end of the
generic attributes block to the range 4-15.

Before, the way the position and generic 0 attribute
is handled was dependent on the presence and kind of
the currently attached vertex program. With this
change the way the position attribute and the generic 0
attribute is treated only depends on the enabled
flag of those two arrays.
This will later help to untangle the update dependencies
between enabled arrays and shader inputs.

v2: s,VERT_ATTRIB_MAT_OFFSET,VERT_ATTRIB_MAT0,g

Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/compiler/shader_enums.h
src/mesa/tnl/t_context.h
src/mesa/vbo/vbo_exec_array.c
src/mesa/vbo/vbo_exec_draw.c
src/mesa/vbo/vbo_save_draw.c

index aa296adb5a1c0b64fd786f06b483591b8af9ac57..fb78ad384cbc790da1123b951445919d22bc6721 100644 (file)
@@ -127,6 +127,8 @@ const char *gl_vert_attrib_name(gl_vert_attrib attrib);
  * VERT_ATTRIB_MAT
  *   include the generic shader attributes used to alias
  *   varying material values for the TNL shader programs.
+ *   They are located at the end of the generic attribute
+ *   block not to overlap with the generic 0 attribute.
  */
 #define VERT_ATTRIB_FF(i)           (VERT_ATTRIB_POS + (i))
 #define VERT_ATTRIB_FF_MAX          VERT_ATTRIB_GENERIC0
@@ -137,7 +139,10 @@ const char *gl_vert_attrib_name(gl_vert_attrib attrib);
 #define VERT_ATTRIB_GENERIC(i)      (VERT_ATTRIB_GENERIC0 + (i))
 #define VERT_ATTRIB_GENERIC_MAX     MAX_VERTEX_GENERIC_ATTRIBS
 
-#define VERT_ATTRIB_MAT(i)          VERT_ATTRIB_GENERIC(i)
+#define VERT_ATTRIB_MAT0            \
+   (VERT_ATTRIB_GENERIC_MAX - VERT_ATTRIB_MAT_MAX)
+#define VERT_ATTRIB_MAT(i)          \
+   VERT_ATTRIB_GENERIC((i) + VERT_ATTRIB_MAT0)
 #define VERT_ATTRIB_MAT_MAX         MAT_ATTRIB_MAX
 
 /**
index 48d7ced791fcfcb8ab549d31bdb56333172611be..082110c6070c97e7aaf463468dd24a276ec3ea1d 100644 (file)
@@ -158,8 +158,8 @@ enum {
 #define _TNL_FIRST_GENERIC _TNL_ATTRIB_GENERIC0
 #define _TNL_LAST_GENERIC  _TNL_ATTRIB_GENERIC15
 
-#define _TNL_FIRST_MAT       _TNL_ATTRIB_MAT_FRONT_AMBIENT /* GENERIC0 */
-#define _TNL_LAST_MAT        _TNL_ATTRIB_MAT_BACK_INDEXES  /* GENERIC11 */
+#define _TNL_FIRST_MAT       _TNL_ATTRIB_MAT_FRONT_AMBIENT /* GENERIC4 */
+#define _TNL_LAST_MAT        _TNL_ATTRIB_MAT_BACK_INDEXES  /* GENERIC15 */
 
 /* Number of available texture attributes */
 #define _TNL_NUM_TEX 8
index d1f4da0c0e7f6fd2a121d4a81c5c7774f46bbfd8..98eb6466ba39c1765421eccac44b60b77674f6b8 100644 (file)
@@ -335,20 +335,20 @@ recalculate_input_bindings(struct gl_context *ctx)
          }
       }
 
-      for (i = 0; i < VERT_ATTRIB_MAT_MAX; i++) {
-         inputs[VERT_ATTRIB_MAT(i)] =
-            &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT + i];
-         const_inputs |= VERT_BIT_MAT(i);
-      }
-
       /* Could use just about anything, just to fill in the empty
        * slots:
        */
-      for (i = VERT_ATTRIB_MAT_MAX; i < VERT_ATTRIB_GENERIC_MAX; i++) {
+      for (i = 0; i < VERT_ATTRIB_MAT0; i++) {
          inputs[VERT_ATTRIB_GENERIC(i)] =
             &vbo->currval[VBO_ATTRIB_GENERIC0 + i];
          const_inputs |= VERT_BIT_GENERIC(i);
       }
+
+      for (i = 0; i < VERT_ATTRIB_MAT_MAX; i++) {
+         inputs[VERT_ATTRIB_MAT(i)] =
+            &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT + i];
+         const_inputs |= VERT_BIT_MAT(i);
+      }
       break;
 
    case VP_SHADER:
index 2b7784694f76a0162f334a6694ee1466f4b0f6f1..bd82825b5170a0cf603999035beecb9fe1ebd438 100644 (file)
@@ -187,16 +187,16 @@ vbo_exec_bind_arrays(struct gl_context *ctx)
    /* Overlay other active attributes */
    switch (get_vp_mode(exec->ctx)) {
    case VP_FF:
+      for (attr = 0; attr < VERT_ATTRIB_MAT0; attr++) {
+         assert(VERT_ATTRIB_GENERIC(attr) < ARRAY_SIZE(exec->vtx.inputs));
+         exec->vtx.inputs[VERT_ATTRIB_GENERIC(attr)] =
+            &vbo->currval[VBO_ATTRIB_GENERIC0+attr];
+      }
       for (attr = 0; attr < VERT_ATTRIB_MAT_MAX; attr++) {
          assert(VERT_ATTRIB_MAT(attr) < ARRAY_SIZE(exec->vtx.inputs));
          exec->vtx.inputs[VERT_ATTRIB_MAT(attr)] =
             &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT+attr];
       }
-      for (attr = VERT_ATTRIB_MAT_MAX; attr < VERT_ATTRIB_GENERIC_MAX; attr++) {
-         assert(VERT_ATTRIB_GENERIC(attr) < ARRAY_SIZE(exec->vtx.inputs));
-         exec->vtx.inputs[VERT_ATTRIB_GENERIC(attr)] =
-            &vbo->currval[VBO_ATTRIB_GENERIC0+attr];
-      }
       map = vbo->map_vp_none;
       break;
    case VP_SHADER:
index bbc2d0dfedf30782aa3aae17090c29103b392fae..a9e0890ebe0b09c0865f162159fd613b183d3b9c 100644 (file)
@@ -151,14 +151,14 @@ bind_vertex_list(struct gl_context *ctx,
    /* Overlay other active attributes */
    switch (get_vp_mode(ctx)) {
    case VP_FF:
+      for (attr = 0; attr < VERT_ATTRIB_MAT0; attr++) {
+         save->inputs[VERT_ATTRIB_GENERIC(attr)] =
+            &vbo->currval[VBO_ATTRIB_GENERIC0+attr];
+      }
       for (attr = 0; attr < VERT_ATTRIB_MAT_MAX; attr++) {
          save->inputs[VERT_ATTRIB_MAT(attr)] =
             &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT+attr];
       }
-      for (attr = VERT_ATTRIB_MAT_MAX; attr < VERT_ATTRIB_GENERIC_MAX; attr++) {
-         save->inputs[VERT_ATTRIB_GENERIC(attr)] =
-            &vbo->currval[VBO_ATTRIB_GENERIC0+attr];
-      }
       map = vbo->map_vp_none;
       break;
    case VP_SHADER: