[Mesa-dev] [PATCH 08/14] swr: [rasterizer core/jitter] fix alpha test bug

Ilia Mirkin imirkin at alum.mit.edu
Thu Nov 10 04:44:01 UTC 2016


I think a second instance of the blend func being called was missed in
backend.h (the avx512 one). Also iirc there was so.e third place where it
was called... Should grep for pfnBlendFunc and see if any other instances
pop up.

On Nov 9, 2016 10:19 PM, "Tim Rowley" <timothy.o.rowley at intel.com> wrote:

> Alpha from render target 0 should always be used for alpha test for all
> render targets, according to GL and DX9 specs. Previously we were using
> alpha from the current render target.
> ---
>  src/gallium/drivers/swr/rasterizer/core/backend.h       |  1 +
>  src/gallium/drivers/swr/rasterizer/core/state.h         |  6 +++++-
>  src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp | 10 ++++++++--
>  3 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/drivers/swr/rasterizer/core/backend.h
> b/src/gallium/drivers/swr/rasterizer/core/backend.h
> index dc0be90..a7018e0 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/backend.h
> +++ b/src/gallium/drivers/swr/rasterizer/core/backend.h
> @@ -714,6 +714,7 @@ INLINE void OutputMerger(SWR_PS_CONTEXT &psContext,
> uint8_t* (&pColorBase)[SWR_N
>                  pBlendState,
>                  psContext.shaded[rt],
>                  psContext.shaded[1],
> +                psContext.shaded[0].w,
>                  sample,
>                  pColorSample,
>                  blendOut,
> diff --git a/src/gallium/drivers/swr/rasterizer/core/state.h
> b/src/gallium/drivers/swr/rasterizer/core/state.h
> index 5ee12e8..24927cd 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/state.h
> +++ b/src/gallium/drivers/swr/rasterizer/core/state.h
> @@ -805,9 +805,13 @@ typedef void(__cdecl *PFN_CS_FUNC)(HANDLE
> hPrivateData, SWR_CS_CONTEXT* pCsConte
>  typedef void(__cdecl *PFN_SO_FUNC)(SWR_STREAMOUT_CONTEXT& soContext);
>  typedef void(__cdecl *PFN_PIXEL_KERNEL)(HANDLE hPrivateData,
> SWR_PS_CONTEXT *pContext);
>  typedef void(__cdecl *PFN_CPIXEL_KERNEL)(HANDLE hPrivateData,
> SWR_PS_CONTEXT *pContext);
> -typedef void(__cdecl *PFN_BLEND_JIT_FUNC)(const SWR_BLEND_STATE*,
> simdvector&, simdvector&, uint32_t, uint8_t*, simdvector&, simdscalari*,
> simdscalari*);
> +typedef void(__cdecl *PFN_BLEND_JIT_FUNC)(const SWR_BLEND_STATE*,
> +    simdvector& vSrc, simdvector& vSrc1, simdscalar& vSrc0Alpha, uint32_t
> sample,
> +    uint8_t* pDst, simdvector& vResult, simdscalari* vOMask, simdscalari*
> vCoverageMask);
>  typedef simdscalar(*PFN_QUANTIZE_DEPTH)(simdscalar);
>
> +
> +
>  ////////////////////////////////////////////////////////////
> //////////////
>  /// FRONTEND_STATE
>  /////////////////////////////////////////////////////////////////////////
> diff --git a/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
> b/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
> index d69d503..43e3d36 100644
> --- a/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
> @@ -443,10 +443,13 @@ struct BlendJit : public Builder
>          }
>      }
>
> -    void AlphaTest(const BLEND_COMPILE_STATE& state, Value* pBlendState,
> Value* pAlpha, Value* ppMask)
> +    void AlphaTest(const BLEND_COMPILE_STATE& state, Value* pBlendState,
> Value* ppAlpha, Value* ppMask)
>      {
>          // load uint32_t reference
>          Value* pRef = VBROADCAST(LOAD(pBlendState, { 0, SWR_BLEND_STATE_alphaTestReference
> }));
> +
> +        // load alpha
> +        Value* pAlpha = LOAD(ppAlpha);
>
>          Value* pTest = nullptr;
>          if (state.alphaTestFormat == ALPHA_TEST_UNORM8)
> @@ -523,6 +526,7 @@ struct BlendJit : public Builder
>              PointerType::get(Gen_SWR_BLEND_STATE(JM()), 0), //
> SWR_BLEND_STATE*
>              PointerType::get(mSimdFP32Ty, 0),               //
> simdvector& src
>              PointerType::get(mSimdFP32Ty, 0),               //
> simdvector& src1
> +            PointerType::get(mSimdFP32Ty, 0),               // src0alpha
>              Type::getInt32Ty(JM()->mContext),               // sampleNum
>              PointerType::get(mSimdFP32Ty, 0),               // uint8_t*
> pDst
>              PointerType::get(mSimdFP32Ty, 0),               //
> simdvector& result
> @@ -545,6 +549,8 @@ struct BlendJit : public Builder
>          pSrc->setName("src");
>          Value* pSrc1 = &*argitr++;
>          pSrc1->setName("src1");
> +        Value* pSrc0Alpha = &*argitr++;
> +        pSrc0Alpha->setName("src0alpha");
>          Value* sampleNum = &*argitr++;
>          sampleNum->setName("sampleNum");
>          Value* pDst = &*argitr++;
> @@ -588,7 +594,7 @@ struct BlendJit : public Builder
>          // alpha test
>          if (state.desc.alphaTestEnable)
>          {
> -            AlphaTest(state, pBlendState, src[3], ppMask);
> +            AlphaTest(state, pBlendState, pSrc0Alpha, ppMask);
>          }
>
>          // color blend
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161109/d52b6f51/attachment-0001.html>


More information about the mesa-dev mailing list