swr/rast: Add support for read-only render targets

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>
This commit is contained in:
Tim Rowley
2017-06-26 16:46:05 -05:00
parent d8ebcad540
commit 185b37f641
2 changed files with 10 additions and 4 deletions

View File

@@ -957,13 +957,14 @@ void SetupPipeline(DRAW_CONTEXT *pDC)
(pState->state.depthStencilState.stencilTestEnable || (pState->state.depthStencilState.stencilTestEnable ||
pState->state.depthStencilState.stencilWriteEnable)) ? true : false; 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 // Disable hottile for surfaces with no writes
if (psState.pfnPixelShader != nullptr) if (psState.pfnPixelShader != nullptr)
{ {
DWORD rt; DWORD rt;
uint32_t rtMask = pState->state.colorHottileEnable; uint32_t rtMask = pState->state.psState.renderTargetMask;
while (_BitScanForward(&rt, rtMask)) while (_BitScanForward(&rt, rtMask))
{ {
rtMask &= ~(1 << rt); rtMask &= ~(1 << rt);
@@ -973,10 +974,14 @@ void SetupPipeline(DRAW_CONTEXT *pDC)
pState->state.blendState.renderTarget[rt].writeDisableGreen && pState->state.blendState.renderTarget[rt].writeDisableGreen &&
pState->state.blendState.renderTarget[rt].writeDisableBlue) pState->state.blendState.renderTarget[rt].writeDisableBlue)
{ {
pState->state.colorHottileEnable &= ~(1 << rt); hotTileEnable &= ~(1 << rt);
} }
} }
} }
pState->state.colorHottileEnable = hotTileEnable;
// Setup depth quantization function // Setup depth quantization function
if (pState->state.depthHottileEnable) if (pState->state.depthHottileEnable)
{ {

View File

@@ -1139,11 +1139,12 @@ struct SWR_PS_STATE
uint32_t writesODepth : 1; // pixel shader writes to depth uint32_t writesODepth : 1; // pixel shader writes to depth
uint32_t usesSourceDepth : 1; // pixel shader reads depth uint32_t usesSourceDepth : 1; // pixel shader reads depth
uint32_t shadingRate : 2; // shading per pixel / sample / coarse pixel 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 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 barycentricsMask : 3; // which type(s) of barycentric coords does the PS interpolate attributes with
uint32_t usesUAV : 1; // pixel shader accesses UAV uint32_t usesUAV : 1; // pixel shader accesses UAV
uint32_t forceEarlyZ : 1; // force execution of early depth/stencil test uint32_t forceEarlyZ : 1; // force execution of early depth/stencil test
uint8_t renderTargetMask; // Mask of render targets written
}; };
// depth bounds state // depth bounds state