[Mesa-dev] [PATCH v2] swr: [rasterizer core] allow an OpenGL driver to specify halfz clipping
Rowley, Timothy O
timothy.o.rowley at intel.com
Wed Nov 9 17:03:11 UTC 2016
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 <imirkin at 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 <imirkin at 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
>
More information about the mesa-dev
mailing list