radeonsi: always allocate export memory for pixel shaders
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 5 May 2016 00:05:14 +0000 (19:05 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 9 May 2016 16:52:46 +0000 (11:52 -0500)
Experiments with framebuffer-no-attachments type draw calls have shown that
NULL exports stall terribly unless we ensure that export memory is allocated
by the SPI.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_state_shaders.c

index 0bfd7e8d111efae4acd5752eda5543956a9e3d57..11e73098253ae9421ae278f94d730a3239252644 100644 (file)
@@ -688,14 +688,19 @@ static void si_shader_ps(struct si_shader *shader)
        spi_shader_col_format = si_get_spi_shader_col_format(shader);
        cb_shader_mask = si_get_cb_shader_mask(spi_shader_col_format);
 
-       /* This must be non-zero for alpha-test/kill to work.
-        * The hardware ignores the EXEC mask if no export memory is allocated.
+       /* Ensure that some export memory is always allocated, for two reasons:
+        *
+        * 1) Correctness: The hardware ignores the EXEC mask if no export
+        *    memory is allocated, so KILL and alpha test do not work correctly
+        *    without this.
+        * 2) Performance: Every shader needs at least a NULL export, even when
+        *    it writes no color/depth output. The NULL export instruction
+        *    stalls without this setting.
+        *
         * Don't add this to CB_SHADER_MASK.
         */
        if (!spi_shader_col_format &&
-           !info->writes_z && !info->writes_stencil && !info->writes_samplemask &&
-           (shader->selector->info.uses_kill ||
-            shader->key.ps.epilog.alpha_func != PIPE_FUNC_ALWAYS))
+           !info->writes_z && !info->writes_stencil && !info->writes_samplemask)
                spi_shader_col_format = V_028714_SPI_SHADER_32_R;
 
        si_pm4_set_reg(pm4, R_0286CC_SPI_PS_INPUT_ENA, input_ena);