From 185b37f641ca7e9f66b649011cd77d1e4b28040f Mon Sep 17 00:00:00 2001 From: Tim Rowley Date: Mon, 26 Jun 2017 16:46:05 -0500 Subject: [PATCH] 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 --- src/gallium/drivers/swr/rasterizer/core/api.cpp | 11 ++++++++--- src/gallium/drivers/swr/rasterizer/core/state.h | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp b/src/gallium/drivers/swr/rasterizer/core/api.cpp index 4905890..855d133 100644 --- a/src/gallium/drivers/swr/rasterizer/core/api.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp @@ -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) { diff --git a/src/gallium/drivers/swr/rasterizer/core/state.h b/src/gallium/drivers/swr/rasterizer/core/state.h index d9e9280..7af3f82 100644 --- a/src/gallium/drivers/swr/rasterizer/core/state.h +++ b/src/gallium/drivers/swr/rasterizer/core/state.h @@ -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 -- 2.7.4