r600: need to export something from PS
authorAndre Maasikas <amaasikas@gmail.com>
Wed, 21 Oct 2009 09:23:27 +0000 (12:23 +0300)
committerAndre Maasikas <amaasikas@gmail.com>
Thu, 22 Oct 2009 06:44:03 +0000 (09:44 +0300)
 Also avoids empty shader for "END" - seems to be somewhat valid fp
 Maybe this can be done differently in the future (fake FRAG_RESULT_COLOR
 already in Map_Fragment_Program() or is there a way to program the chip
 to not hang in case of no exports.

src/mesa/drivers/dri/r600/r700_assembler.c
src/mesa/drivers/dri/r600/r700_fragprog.c

index d0eb9949a66c70da502e20e39d4d642738b576cb..6ff08e1cfb7aab93c9d61383db33f76078bdf40a 100644 (file)
@@ -4187,6 +4187,7 @@ GLboolean Process_Fragment_Exports(r700_AssemblerBase *pR700AsmCode,
                                    GLbitfield          OutputsWritten)  
 { 
     unsigned int unBit;
+    GLuint export_count = 0;
 
     if(pR700AsmCode->depth_export_register_number >= 0) 
     {
@@ -4208,6 +4209,7 @@ GLboolean Process_Fragment_Exports(r700_AssemblerBase *pR700AsmCode,
         {
             return GL_FALSE;
         }
+        export_count++;
        }
        unBit = 1 << FRAG_RESULT_DEPTH;
        if(OutputsWritten & unBit)
@@ -4221,8 +4223,15 @@ GLboolean Process_Fragment_Exports(r700_AssemblerBase *pR700AsmCode,
         {
             return GL_FALSE;
         }
+        export_count++;
        }
-
+    /* Need to export something, otherwise we'll hang
+     * results are undefined anyway */
+    if(export_count == 0)
+    {
+        Process_Export(pR700AsmCode, SQ_EXPORT_PIXEL, 0, 1, 0, GL_FALSE);
+    }
+    
     if(pR700AsmCode->cf_last_export_ptr != NULL) 
     {
         pR700AsmCode->cf_last_export_ptr->m_Word1.f.cf_inst        = SQ_CF_INST_EXPORT_DONE;
index 62a1ea1a22abd9b0fff2aaaf6e26e76fabd4b144..3736bce11c4fcf3959421c30cc4e040d4120b8bf 100644 (file)
@@ -251,7 +251,15 @@ GLboolean r700TranslateFragmentShader(struct r700_fragment_program *fp,
                number_of_colors_exported--;
        }
 
-       fp->r700Shader.exportMode = number_of_colors_exported << 1 | z_enabled;
+       /* illegal to set this to 0 */
+       if(number_of_colors_exported || z_enabled)
+       {
+           fp->r700Shader.exportMode = number_of_colors_exported << 1 | z_enabled;
+       }
+       else
+       {
+           fp->r700Shader.exportMode = (1 << 1);
+       }
 
     fp->translated = GL_TRUE;