Yes, that was about to be my suggestion too - remove the drivertype use in the clipper and use the “clipHalfZ” flag instead.
driverType is still used in the SwrSetViewports setup, so can’t be completely removed right now. -Tim > On Nov 9, 2016, at 10:04 AM, Ilia Mirkin <[email protected]> wrote: > > On Wed, Nov 9, 2016 at 1:21 AM, Ilia Mirkin <[email protected]> wrote: >> With ARB_clip_control, GL may also do 0..1 depth clipping, not just >> -1..1. For backwards compatibility, preserve the existing driver type >> check for DX as well. > > Oh. An even better idea would be to update SwrSetRasterizer to > magically flip that bit on when driverType == DX at the API level. And > drop all that driver type stuff from the core otherwise. IMHO that's > much cleaner. Let me know if you think this will cause problems. > > At least in gallium, we've avoided making any GL vs DX distinctions. > It seems like a good thing to do in swr core as well. > > Cheers, > > -ilia > >> >> Signed-off-by: Ilia Mirkin <[email protected]> >> --- >> src/gallium/drivers/swr/rasterizer/core/clip.h | 6 +++--- >> src/gallium/drivers/swr/rasterizer/core/state.h | 1 + >> 2 files changed, 4 insertions(+), 3 deletions(-) >> >> diff --git a/src/gallium/drivers/swr/rasterizer/core/clip.h >> b/src/gallium/drivers/swr/rasterizer/core/clip.h >> index 43bc522..78dbcf0 100644 >> --- a/src/gallium/drivers/swr/rasterizer/core/clip.h >> +++ b/src/gallium/drivers/swr/rasterizer/core/clip.h >> @@ -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 (type == DX || state.rastState.clipHalfZ) >> { >> vRes = _simd_cmplt_ps(vertex.z, _simd_setzero_ps()); >> } >> @@ -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->driverType == DX || 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->driverType == DX || 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); >> 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 [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
