radeonsi: Move interpolation mode check into the compiler
authorTom Stellard <thomas.stellard@amd.com>
Thu, 6 Sep 2012 19:41:59 +0000 (15:41 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Tue, 11 Sep 2012 18:53:47 +0000 (14:53 -0400)
The compiler needs to know which interpolation modes are enabled, so
it knows which values will be preloaded into the VGPRs.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeon/SIAssignInterpRegs.cpp
src/gallium/drivers/radeonsi/si_state_draw.c

index 447eff6f5acc003aecd21fdd66877db01e17467d..0e36e6b8b785d5e56881ee62e5c2e51f787f3c90 100644 (file)
@@ -52,6 +52,7 @@ public:
 char SIAssignInterpRegsPass::ID = 0;
 
 #define INTERP_VALUES 16
+#define REQUIRED_VALUE_MAX_INDEX 7
 
 struct interp_info {
   bool enabled;
@@ -92,16 +93,26 @@ bool SIAssignInterpRegsPass::runOnMachineFunction(MachineFunction &MF)
     return false;
   }
   MachineRegisterInfo &MRI = MF.getRegInfo();
+  bool ForceEnable = true;
 
   /* First pass, mark the interpolation values that are used. */
   for (unsigned interp_idx = 0; interp_idx < INTERP_VALUES; interp_idx++) {
     for (unsigned reg_idx = 0; reg_idx < InterpUse[interp_idx].reg_count;
                                                                reg_idx++) {
-      InterpUse[interp_idx].enabled =
+      InterpUse[interp_idx].enabled = InterpUse[interp_idx].enabled ||
                             !MRI.use_empty(InterpUse[interp_idx].regs[reg_idx]);
+      if (InterpUse[interp_idx].enabled &&
+          interp_idx <= REQUIRED_VALUE_MAX_INDEX) {
+        ForceEnable = false;
+      }
     }
   }
 
+  // At least one interpolation mode must be enabled or else the GPU will hang.
+  if (ForceEnable) {
+    InterpUse[0].enabled = true;
+  }
+
   unsigned used_vgprs = 0;
 
   /* Second pass, replace with VGPRs. */
index 8f6dde04431ea37a47e36eb332052a5352c0283c..8b43f5a8f7d47a2b32fe52e147b7f6755761d197 100644 (file)
@@ -170,17 +170,15 @@ static void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *s
        si_pm4_set_reg(pm4, R_0286E0_SPI_BARYC_CNTL, spi_baryc_cntl);
        spi_ps_input_ena = shader->spi_ps_input_ena;
        /* we need to enable at least one of them, otherwise we hang the GPU */
-       if (!G_0286CC_PERSP_SAMPLE_ENA(spi_ps_input_ena) &&
-           !G_0286CC_PERSP_CENTER_ENA(spi_ps_input_ena) &&
-           !G_0286CC_PERSP_CENTROID_ENA(spi_ps_input_ena) &&
-           !G_0286CC_PERSP_PULL_MODEL_ENA(spi_ps_input_ena) &&
-           !G_0286CC_LINEAR_SAMPLE_ENA(spi_ps_input_ena) &&
-           !G_0286CC_LINEAR_CENTER_ENA(spi_ps_input_ena) &&
-           !G_0286CC_LINEAR_CENTROID_ENA(spi_ps_input_ena) &&
-           !G_0286CC_LINE_STIPPLE_TEX_ENA(spi_ps_input_ena)) {
-
-               spi_ps_input_ena |= S_0286CC_PERSP_SAMPLE_ENA(1);
-       }
+       assert(G_0286CC_PERSP_SAMPLE_ENA(spi_ps_input_ena) ||
+           G_0286CC_PERSP_CENTER_ENA(spi_ps_input_ena) ||
+           G_0286CC_PERSP_CENTROID_ENA(spi_ps_input_ena) ||
+           G_0286CC_PERSP_PULL_MODEL_ENA(spi_ps_input_ena) ||
+           G_0286CC_LINEAR_SAMPLE_ENA(spi_ps_input_ena) ||
+           G_0286CC_LINEAR_CENTER_ENA(spi_ps_input_ena) ||
+           G_0286CC_LINEAR_CENTROID_ENA(spi_ps_input_ena) ||
+           G_0286CC_LINE_STIPPLE_TEX_ENA(spi_ps_input_ena));
+
        si_pm4_set_reg(pm4, R_0286CC_SPI_PS_INPUT_ENA, spi_ps_input_ena);
        si_pm4_set_reg(pm4, R_0286D0_SPI_PS_INPUT_ADDR, spi_ps_input_ena);
        si_pm4_set_reg(pm4, R_0286D8_SPI_PS_IN_CONTROL, spi_ps_in_control);