svga: fix PS output register setup regression
authorBrian Paul <brianp@vmware.com>
Thu, 23 Jan 2014 16:36:57 +0000 (09:36 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 23 Jan 2014 18:08:40 +0000 (11:08 -0700)
Fixes glean fragProg1 regression caused by commit b9f68d927ea
(implement TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS).  This bug
only appears when the fragment shader emits fragment.Z before
color outputs.  The bug was caused by confusion between register
indexes and semantic indexes.

Also added some comments to better explain register indexing.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/drivers/svga/svga_tgsi_decl_sm30.c
src/gallium/drivers/svga/svga_tgsi_emit.h

index 137afd605830b92c8da7b32601ebee4eb18fd6c4..42d6f489bc5b679e06667632e90664e1f7a881a1 100644 (file)
@@ -319,6 +319,7 @@ ps30_input(struct svga_shader_emitter *emit,
 /**
  * Process a PS output declaration.
  * Note that we don't actually emit a SVGA3DOpDcl for PS outputs.
+ * \idx  register index, such as OUT[2] (not semantic index)
  */
 static boolean
 ps30_output(struct svga_shader_emitter *emit,
@@ -344,9 +345,9 @@ ps30_output(struct svga_shader_emitter *emit,
             if (semantic.Index == 0) {
                unsigned i;
                for (i = 0; i < emit->key.fkey.write_color0_to_n_cbufs; i++) {
-                  emit->output_map[i] = dst_register(SVGA3DREG_TEMP,
+                  emit->output_map[idx+i] = dst_register(SVGA3DREG_TEMP,
                                                      emit->nr_hw_temp++);
-                  emit->temp_color_output[i] = emit->output_map[i];
+                  emit->temp_color_output[i] = emit->output_map[idx+i];
                   emit->true_color_output[i] = dst_register(SVGA3DREG_COLOROUT,
                                                             i);
                }
index d31b866928afdce7f9fb27f19e11a96dad3e53a4..53f93de28d32143b455f4b0684c645db8ea51db0 100644 (file)
@@ -99,6 +99,7 @@ struct svga_shader_emitter
    unsigned label[32];
    unsigned nr_labels;
 
+   /** input/output register mappings, indexed by register number */
    struct src_register input_map[PIPE_MAX_ATTRIBS];
    SVGA3dShaderDestToken output_map[PIPE_MAX_ATTRIBS];
 
@@ -119,7 +120,7 @@ struct svga_shader_emitter
    /* shared output for depth and fog */
    SVGA3dShaderDestToken vs_depth_fog;
 
-   /* PS output colors */
+   /* PS output colors (indexed by color semantic index) */
    SVGA3dShaderDestToken temp_color_output[PIPE_MAX_COLOR_BUFS];
    SVGA3dShaderDestToken true_color_output[PIPE_MAX_COLOR_BUFS];