Add outputs_written bitfield to pipe_shader_state, use it to determine if fragment...
authorBrian <brian.paul@tungstengraphics.com>
Wed, 3 Oct 2007 20:43:57 +0000 (14:43 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Wed, 3 Oct 2007 20:43:57 +0000 (14:43 -0600)
src/mesa/pipe/p_state.h
src/mesa/pipe/softpipe/sp_quad_fs.c
src/mesa/state_tracker/st_program.c

index ac9d7009cc02172793057ec89c68e19f7c4cba2c..64c5f13f232a92e56162825d78d0e13528625007 100644 (file)
@@ -150,13 +150,11 @@ struct pipe_shader_state {
 #endif
    void *executable;
 
-   /** These fields somewhat constitute the shader "signature" */
    ubyte num_inputs;
    ubyte num_outputs;
-
+   uint outputs_written;  /**< bitmask */
    ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
    ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
-
    ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */
    ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
 };
index d9349a2280727bec240910b6fe10dfdaabd44765..2b0c4366bd969091bb2c60852d3f79737eb67997 100755 (executable)
@@ -116,8 +116,7 @@ shade_quad(
       sizeof( quad->outputs.color ) );
 
    /* Z */
-   if (qss->stage.softpipe->fs->output_semantic_name[0]
-       == TGSI_SEMANTIC_POSITION) {
+   if (qss->stage.softpipe->fs->outputs_written & 0x1) {
       /* output[0] is new Z */
       uint i;
       for (i = 0; i < 4; i++) {
index 807cd8cb052a0613ee248fe0375dd1cf093ff8b6..86aaaad6bb39bd181a77349a42dfa5705bac1218 100644 (file)
@@ -160,6 +160,8 @@ st_translate_vertex_program(struct st_context *st,
             defaultOutputMapping[attr] = slot;
          }
 
+         vs.outputs_written |= (1 << slot);
+
          /*
          printf("Output %u -> slot %u\n", attr, slot);
          */
@@ -346,21 +348,40 @@ st_translate_fragment_program(struct st_context *st,
    /*
     * Semantics for outputs
     */
-   for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
-      if (stfp->Base.Base.OutputsWritten & (1 << attr)) {
-         switch (attr) {
-         case FRAG_RESULT_DEPR:
-            fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_POSITION;
-            outputMapping[attr] = fs.num_outputs;
-            break;
-         case FRAG_RESULT_COLR:
-            fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_COLOR;
-            outputMapping[attr] = fs.num_outputs;
-            break;
-         default:
-            assert(0);
+   {
+      uint numColors = 0;
+      GLbitfield outputsWritten = stfp->Base.Base.OutputsWritten;
+
+      /* output[0] is always Z, but may not really be written */
+      fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_POSITION;
+      fs.output_semantic_index[fs.num_outputs] = 0;
+      outputMapping[FRAG_RESULT_DEPR] = fs.num_outputs;
+      fs.num_outputs++;
+
+      if (outputsWritten & (1 << FRAG_RESULT_DEPR)) {
+         fs.outputs_written |= 0x1;
+         outputsWritten &= ~(1 << FRAG_RESULT_DEPR);
+      }
+
+      /* color outputs begin at output [1] */
+      for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
+         if (outputsWritten & (1 << attr)) {
+            switch (attr) {
+            case FRAG_RESULT_DEPR:
+               assert(0);
+               break;
+            case FRAG_RESULT_COLR:
+               fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_COLOR;
+               fs.output_semantic_index[fs.num_outputs] = numColors;
+               outputMapping[attr] = fs.num_outputs;
+               fs.outputs_written |= (0x2 << numColors);
+               numColors++;
+               break;
+            default:
+               assert(0);
+            }
+            fs.num_outputs++;
          }
-         fs.num_outputs++;
       }
    }