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:
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user