swr/rast: Add support for read-only render targets
authorTim Rowley <timothy.o.rowley@intel.com>
Mon, 26 Jun 2017 21:46:05 +0000 (16:46 -0500)
committerTim Rowley <timothy.o.rowley@intel.com>
Thu, 13 Jul 2017 13:47:10 +0000 (08:47 -0500)
Core will ensure hot tiles are loaded for read and write render targets,
and will skip all output merger for read-only render targets.

Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
src/gallium/drivers/swr/rasterizer/core/api.cpp
src/gallium/drivers/swr/rasterizer/core/state.h

index 4905890..855d133 100644 (file)
@@ -957,13 +957,14 @@ void SetupPipeline(DRAW_CONTEXT *pDC)
                                           (pState->state.depthStencilState.stencilTestEnable  ||
                                            pState->state.depthStencilState.stencilWriteEnable)) ? true : false;
 
-    pState->state.colorHottileEnable = pState->state.psState.renderTargetMask;
+
+    uint32_t hotTileEnable = pState->state.psState.renderTargetMask;
 
     // Disable hottile for surfaces with no writes
     if (psState.pfnPixelShader != nullptr)
     {
         DWORD rt;
-        uint32_t rtMask = pState->state.colorHottileEnable;
+        uint32_t rtMask = pState->state.psState.renderTargetMask;
         while (_BitScanForward(&rt, rtMask))
         {
             rtMask &= ~(1 << rt);
@@ -973,10 +974,14 @@ void SetupPipeline(DRAW_CONTEXT *pDC)
                 pState->state.blendState.renderTarget[rt].writeDisableGreen &&
                 pState->state.blendState.renderTarget[rt].writeDisableBlue)
             {
-                pState->state.colorHottileEnable &= ~(1 << rt);
+                hotTileEnable &= ~(1 << rt);
             }
         }
     }
+
+    pState->state.colorHottileEnable = hotTileEnable;
+
+
     // Setup depth quantization function
     if (pState->state.depthHottileEnable)
     {
index d9e9280..7af3f82 100644 (file)
@@ -1139,11 +1139,12 @@ struct SWR_PS_STATE
     uint32_t writesODepth           : 1;    // pixel shader writes to depth
     uint32_t usesSourceDepth        : 1;    // pixel shader reads depth
     uint32_t shadingRate            : 2;    // shading per pixel / sample / coarse pixel
-    uint32_t renderTargetMask       : 8;    // number of render target outputs in use (0-8)
     uint32_t posOffset              : 2;    // type of offset (none, sample, centroid) to add to pixel position
     uint32_t barycentricsMask       : 3;    // which type(s) of barycentric coords does the PS interpolate attributes with
     uint32_t usesUAV                : 1;    // pixel shader accesses UAV 
     uint32_t forceEarlyZ            : 1;    // force execution of early depth/stencil test
+
+    uint8_t renderTargetMask;               // Mask of render targets written
 };
 
 // depth bounds state