SwrSetRastState shouldn’t be overriding what the caller passed in. clip.h changes look good.
> On Nov 9, 2016, at 10:56 AM, Ilia Mirkin <imir...@alum.mit.edu> wrote: > > With ARB_clip_control, GL may also do 0..1 depth clipping, not just > -1..1. This removes clip's reliance on driver type. Instead we force > halfz to on for DX driver types at the API layer. > > Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> > --- > > v1 -> v2: remove driverType from clip, set halfz at API layer > > src/gallium/drivers/swr/rasterizer/core/api.cpp | 4 ++++ > src/gallium/drivers/swr/rasterizer/core/clip.h | 13 ++++++------- > src/gallium/drivers/swr/rasterizer/core/state.h | 1 + > 3 files changed, 11 insertions(+), 7 deletions(-) > > diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp > b/src/gallium/drivers/swr/rasterizer/core/api.cpp > index b1a426d..70bd6a8 100644 > --- a/src/gallium/drivers/swr/rasterizer/core/api.cpp > +++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp > @@ -701,6 +701,10 @@ void SwrSetRastState( > API_STATE* pState = GetDrawState(pContext); > > memcpy(&pState->rastState, pRastState, sizeof(SWR_RASTSTATE)); > + if (pContext->driverType == DX) > + { > + pState->rastState.clipHalfZ = 1; > + } > } > > void SwrSetViewports( > diff --git a/src/gallium/drivers/swr/rasterizer/core/clip.h > b/src/gallium/drivers/swr/rasterizer/core/clip.h > index 43bc522..3d86b28 100644 > --- a/src/gallium/drivers/swr/rasterizer/core/clip.h > +++ b/src/gallium/drivers/swr/rasterizer/core/clip.h > @@ -63,7 +63,7 @@ void Clip(const float *pTriangle, const float *pAttribs, > int numAttribs, float * > int *numVerts, float *pOutAttribs); > > INLINE > -void ComputeClipCodes(DRIVER_TYPE type, const API_STATE& state, const > simdvector& vertex, simdscalar& clipCodes, simdscalari viewportIndexes) > +void ComputeClipCodes(const API_STATE& state, const simdvector& vertex, > simdscalar& clipCodes, simdscalari viewportIndexes) > { > clipCodes = _simd_setzero_ps(); > > @@ -90,7 +90,7 @@ void ComputeClipCodes(DRIVER_TYPE type, const API_STATE& > state, const simdvector > { > // FRUSTUM_NEAR > // DX clips depth [0..w], GL clips [-w..w] > - if (type == DX) > + if (state.rastState.clipHalfZ) > { > vRes = _simd_cmplt_ps(vertex.z, _simd_setzero_ps()); > } > @@ -135,7 +135,7 @@ class Clipper > { > public: > Clipper(uint32_t in_workerId, DRAW_CONTEXT* in_pDC) : > - workerId(in_workerId), driverType(in_pDC->pContext->driverType), > pDC(in_pDC), state(GetApiState(in_pDC)) > + workerId(in_workerId), pDC(in_pDC), state(GetApiState(in_pDC)) > { > static_assert(NumVertsPerPrim >= 1 && NumVertsPerPrim <= 3, "Invalid > NumVertsPerPrim"); > } > @@ -144,7 +144,7 @@ public: > { > for (uint32_t i = 0; i < NumVertsPerPrim; ++i) > { > - ::ComputeClipCodes(this->driverType, this->state, vertex[i], > this->clipCodes[i], viewportIndexes); > + ::ComputeClipCodes(this->state, vertex[i], this->clipCodes[i], > viewportIndexes); > } > } > > @@ -640,7 +640,7 @@ private: > case FRUSTUM_BOTTOM: t = ComputeInterpFactor(_simd_sub_ps(v1[3], > v1[1]), _simd_sub_ps(v2[3], v2[1])); break; > case FRUSTUM_NEAR: > // DX Znear plane is 0, GL is -w > - if (this->driverType == DX) > + if (this->state.rastState.clipHalfZ) > { > t = ComputeInterpFactor(v1[2], v2[2]); > } > @@ -708,7 +708,7 @@ private: > case FRUSTUM_RIGHT: return _simd_cmple_ps(v[0], v[3]); > case FRUSTUM_TOP: return _simd_cmpge_ps(v[1], > _simd_mul_ps(v[3], _simd_set1_ps(-1.0f))); > case FRUSTUM_BOTTOM: return _simd_cmple_ps(v[1], v[3]); > - case FRUSTUM_NEAR: return _simd_cmpge_ps(v[2], this->driverType > == DX ? _simd_setzero_ps() : _simd_mul_ps(v[3], _simd_set1_ps(-1.0f))); > + case FRUSTUM_NEAR: return _simd_cmpge_ps(v[2], > this->state.rastState.clipHalfZ ? _simd_setzero_ps() : _simd_mul_ps(v[3], > _simd_set1_ps(-1.0f))); > case FRUSTUM_FAR: return _simd_cmple_ps(v[2], v[3]); > default: > SWR_ASSERT(false, "invalid clipping plane: %d", ClippingPlane); > @@ -942,7 +942,6 @@ private: > } > > const uint32_t workerId{ 0 }; > - const DRIVER_TYPE driverType{ DX }; > DRAW_CONTEXT* pDC{ nullptr }; > const API_STATE& state; > simdscalar clipCodes[NumVertsPerPrim]; > diff --git a/src/gallium/drivers/swr/rasterizer/core/state.h > b/src/gallium/drivers/swr/rasterizer/core/state.h > index 93e4565..5ee12e8 100644 > --- a/src/gallium/drivers/swr/rasterizer/core/state.h > +++ b/src/gallium/drivers/swr/rasterizer/core/state.h > @@ -932,6 +932,7 @@ struct SWR_RASTSTATE > uint32_t frontWinding : 1; > uint32_t scissorEnable : 1; > uint32_t depthClipEnable : 1; > + uint32_t clipHalfZ : 1; > uint32_t pointParam : 1; > uint32_t pointSpriteEnable : 1; > uint32_t pointSpriteTopOrigin : 1; > -- > 2.7.3 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev