diff options
author | Ilia Mirkin <[email protected]> | 2016-11-09 01:18:05 -0500 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2016-11-09 20:10:52 -0500 |
commit | 4b5b87e7abf86b9b75a50d912a486042a770829e (patch) | |
tree | b008052a95fc4baf6d8b8703c33710ae44b5aa46 | |
parent | 4af25e713113e5a50c0e03685ce7de20d3828961 (diff) |
swr: [rasterizer core] allow an OpenGL driver to specify halfz clipping
With ARB_clip_control, GL may also do 0..1 depth clipping, not just
-1..1. This removes clip's reliance on driver type. DX users will need
to be updated to set the new clipHalfZ flag to get proper clipping
functionality.
Signed-off-by: Ilia Mirkin <[email protected]>
Reviewed-by: Tim Rowley <[email protected]>
-rw-r--r-- | src/gallium/drivers/swr/rasterizer/core/clip.h | 13 | ||||
-rw-r--r-- | src/gallium/drivers/swr/rasterizer/core/state.h | 1 |
2 files changed, 7 insertions, 7 deletions
diff --git a/src/gallium/drivers/swr/rasterizer/core/clip.h b/src/gallium/drivers/swr/rasterizer/core/clip.h index 43bc5222c8d..3d86b2827a8 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 93e4565735a..5ee12e8ef79 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; |