From d86e2487a0fb3b3d1f88a07d0eff723f3b30c737 Mon Sep 17 00:00:00 2001 From: Tim Rowley Date: Fri, 5 Aug 2016 16:19:10 -0600 Subject: [PATCH] swr: [rasterizer jitter] fetch support for offsetting VertexID Signed-off-by: Tim Rowley --- .../drivers/swr/rasterizer/jitter/fetch_jit.cpp | 12 +++++++++++- .../drivers/swr/rasterizer/jitter/fetch_jit.h | 8 +++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp index 2c2d68eb592..3da0e4064d9 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp @@ -158,8 +158,18 @@ Function* FetchJit::Create(const FETCH_COMPILE_STATE& fetchState) default: SWR_ASSERT(0, "Unsupported index type"); vIndices = nullptr; break; } + Value* vVertexId = vIndices; + if (fetchState.bVertexIDOffsetEnable) + { + // Assuming one of baseVertex or startVertex is 0, so adding both should be functionally correct + Value* vBaseVertex = VBROADCAST(LOAD(mpFetchInfo, { 0, SWR_FETCH_CONTEXT_BaseVertex })); + Value* vStartVertex = VBROADCAST(LOAD(mpFetchInfo, { 0, SWR_FETCH_CONTEXT_StartVertex })); + vVertexId = ADD(vIndices, vBaseVertex); + vVertexId = ADD(vVertexId, vStartVertex); + } + // store out vertex IDs - STORE(vIndices, GEP(mpFetchInfo, { 0, SWR_FETCH_CONTEXT_VertexID })); + STORE(vVertexId, GEP(mpFetchInfo, { 0, SWR_FETCH_CONTEXT_VertexID })); // store out cut mask if enabled if (fetchState.bEnableCutIndex) diff --git a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.h b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.h index d3181cd29ec..15474536d4b 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.h +++ b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.h @@ -100,9 +100,10 @@ struct FETCH_COMPILE_STATE uint32_t cutIndex{ 0xffffffff }; // Options that effect the JIT'd code - bool bDisableVGATHER; // if enabled, FetchJit will generate loads/shuffles instead of VGATHERs - bool bDisableIndexOOBCheck; // if enabled, FetchJit will exclude index OOB check - bool bEnableCutIndex{ false }; // compares indices with the cut index and returns a cut mask + bool bDisableVGATHER; // If enabled, FetchJit will generate loads/shuffles instead of VGATHERs + bool bDisableIndexOOBCheck; // If enabled, FetchJit will exclude index OOB check + bool bEnableCutIndex{ false }; // Compares indices with the cut index and returns a cut mask + bool bVertexIDOffsetEnable{ false }; // Offset vertexID by StartVertex for non-indexed draws or BaseVertex for indexed draws FETCH_COMPILE_STATE(bool disableVGATHER = false, bool diableIndexOOBCheck = false): bDisableVGATHER(disableVGATHER), bDisableIndexOOBCheck(diableIndexOOBCheck){ }; @@ -115,6 +116,7 @@ struct FETCH_COMPILE_STATE if (bDisableIndexOOBCheck != other.bDisableIndexOOBCheck) return false; if (bEnableCutIndex != other.bEnableCutIndex) return false; if (cutIndex != other.cutIndex) return false; + if (bVertexIDOffsetEnable != other.bVertexIDOffsetEnable) return false; for(uint32_t i = 0; i < numAttribs; ++i) { -- 2.30.2