continue;
if (c->key.vp_outputs_written & BITFIELD64_BIT(i)) {
- int fp_index = _mesa_vert_result_to_frag_attrib((gl_varying_slot) i);
-
/* The back color slot is skipped when the front color is
* also written to. In addition, some slots can be
* written in the vertex shader and not read in the
* fragment shader. So the register number must always be
* incremented, mapped or not.
*/
- if (fp_index >= 0)
- urb_setup[fp_index] = urb_next;
+ if (_mesa_varying_slot_in_fs((gl_varying_slot) i))
+ urb_setup[i] = urb_next;
urb_next++;
}
}
key.proj_attrib_mask |= BITFIELD64_BIT(i);
if (intel->gen < 6) {
- int vp_index = _mesa_vert_result_to_frag_attrib((gl_varying_slot) i);
-
- if (vp_index >= 0)
- key.vp_outputs_written |= BITFIELD64_BIT(vp_index);
+ if (_mesa_varying_slot_in_fs((gl_varying_slot) i))
+ key.vp_outputs_written |= BITFIELD64_BIT(i);
}
}
* which describes the fragment program input sizes.
*/
for (vertRes = 0; vertRes < VARYING_SLOT_MAX; vertRes++) {
-
- /* map vertex program output index to fragment program input index */
- GLint fragAttrib = _mesa_vert_result_to_frag_attrib(vertRes);
- if (fragAttrib < 0)
+ if (!_mesa_varying_slot_in_fs(vertRes))
continue;
switch (get_output_size(t, vertRes)) {
- case 4: t->size_masks[4-1] |= BITFIELD64_BIT(fragAttrib);
- case 3: t->size_masks[3-1] |= BITFIELD64_BIT(fragAttrib);
- case 2: t->size_masks[2-1] |= BITFIELD64_BIT(fragAttrib);
- case 1: t->size_masks[1-1] |= BITFIELD64_BIT(fragAttrib);
+ case 4: t->size_masks[4-1] |= BITFIELD64_BIT(vertRes);
+ case 3: t->size_masks[3-1] |= BITFIELD64_BIT(vertRes);
+ case 2: t->size_masks[2-1] |= BITFIELD64_BIT(vertRes);
+ case 1: t->size_masks[1-1] |= BITFIELD64_BIT(vertRes);
break;
}
}
* When this enum is updated, the following code must be updated too:
* - vertResults (in prog_print.c's arb_output_attrib_string())
* - fragAttribs (in prog_print.c's arb_input_attrib_string())
- * - _mesa_vert_result_to_frag_attrib()
+ * - _mesa_varying_slot_in_fs()
* - _mesa_frag_attrib_to_vert_result()
*/
typedef enum
/**
* Indexes for fragment program input attributes. Note that
- * _mesa_vert_result_to_frag_attrib() and frag_attrib_to_vert_result() make
- * assumptions about the layout of this enum.
+ * _mesa_frag_attrib_to_vert_result() makes assumptions about the layout of
+ * this enum.
*/
typedef enum
{
/**
- * Convert from a gl_varying_slot value for a vertex output to the
- * corresponding gl_frag_attrib.
- *
- * Varying output values which have no corresponding gl_frag_attrib
- * (VARYING_SLOT_PSIZ, VARYING_SLOT_BFC0, VARYING_SLOT_BFC1, and
- * VARYING_SLOT_EDGE) are converted to a value of -1.
+ * Determine if the given gl_varying_slot appears in the fragment shader.
*/
-static inline int
-_mesa_vert_result_to_frag_attrib(gl_varying_slot vert_result)
+static inline GLboolean
+_mesa_varying_slot_in_fs(gl_varying_slot slot)
{
- if (vert_result <= VARYING_SLOT_TEX7)
- return vert_result;
- else if (vert_result < VARYING_SLOT_CLIP_DIST0)
- return -1;
- else if (vert_result <= VARYING_SLOT_CLIP_DIST1)
- return vert_result;
- else if (vert_result < VARYING_SLOT_VAR0)
- return -1;
- else
- return vert_result;
+ switch (slot) {
+ case VARYING_SLOT_PSIZ:
+ case VARYING_SLOT_BFC0:
+ case VARYING_SLOT_BFC1:
+ case VARYING_SLOT_EDGE:
+ case VARYING_SLOT_CLIP_VERTEX:
+ case VARYING_SLOT_LAYER:
+ return GL_FALSE;
+ default:
+ return GL_TRUE;
+ }
}