[Mesa-dev] [PATCH] llvmpipe: Fix alpha testing precision on rgba8 formats.

Jose Fonseca jfonseca at vmware.com
Tue May 22 09:52:45 PDT 2012



----- Original Message -----
> On 05/22/2012 09:07 AM, jfonseca at vmware.com wrote:
> > From: José Fonseca<jfonseca at vmware.com>
> >
> > This is a long standing problem, that recently surfaced with the
> > change
> > to enable perspective correct color interpolation.
> >
> > A fix for all possible formats is left to the future.
> > ---
> >   src/gallium/drivers/llvmpipe/lp_bld_alpha.c |   31
> >   +++++++++++++++++++++++++++
> >   src/gallium/drivers/llvmpipe/lp_bld_alpha.h |    2 ++
> >   src/gallium/drivers/llvmpipe/lp_state_fs.c  |    5 ++++-
> >   3 files changed, 37 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/gallium/drivers/llvmpipe/lp_bld_alpha.c
> > b/src/gallium/drivers/llvmpipe/lp_bld_alpha.c
> > index 518969c..bf4e8c4 100644
> > --- a/src/gallium/drivers/llvmpipe/lp_bld_alpha.c
> > +++ b/src/gallium/drivers/llvmpipe/lp_bld_alpha.c
> > @@ -32,9 +32,12 @@
> >    */
> >
> >   #include "pipe/p_state.h"
> > +#include "util/u_format.h"
> >
> >   #include "gallivm/lp_bld_type.h"
> >   #include "gallivm/lp_bld_const.h"
> > +#include "gallivm/lp_bld_arit.h"
> > +#include "gallivm/lp_bld_conv.h"
> >   #include "gallivm/lp_bld_logic.h"
> >   #include "gallivm/lp_bld_flow.h"
> >   #include "gallivm/lp_bld_debug.h"
> > @@ -46,6 +49,7 @@ void
> >   lp_build_alpha_test(struct gallivm_state *gallivm,
> >                       unsigned func,
> >                       struct lp_type type,
> > +                    const struct util_format_description
> > *cbuf_format_desc,
> >                       struct lp_build_mask_context *mask,
> >                       LLVMValueRef alpha,
> >                       LLVMValueRef ref,
> > @@ -56,6 +60,33 @@ lp_build_alpha_test(struct gallivm_state
> > *gallivm,
> >
> >      lp_build_context_init(&bld, gallivm, type);
> >
> > +   /*
> > +    * Alpha testing needs to be done in the color buffer
> > precision.
> > +    *
> > +    * TODO: Ideally, instead of duplicating the color conversion
> > code, we would do
> > +    * alpha testing after converting the output colors, but that's
> > not very
> > +    * convenient, because it needs to be done before depth
> > testing.  Hopefully
> > +    * LLVM will detect and remove the duplicate expression.
> > +    *
> > +    * FIXME: This should be generalized to formats other than
> > rgba8 variants.
> > +    * It is, however, difficult to come up with a truly generic
> > rule that would
> > +    * work for an arbitrary format.  For example, how many bits
> > should we use
> > +    * when doing alpha testing for B5G5R5X1_UNORM?
>  > +    */
> 
> The GL spec addresses this in section 2.14.9 on page 71 of the 2.1
> spec:
> 
> """
> For an RGBA color, each color component (which lies in [0, 1]) is
> converted (by rounding to nearest) to a fixed-point value with m
> bits.
> [...]
> m must be at least as large as the number of bits in the
> corresponding
> component of the framebuffer. m must be at least 2 for A if the
> framebuffer does not contain an A component, or if there is only 1
> bit
> of A in the framebuffer.
> """

Thanks Brian. That helps a lot. I'll make a follow up change that meets those constraints for an arbitrary format then.

Jose


More information about the mesa-dev mailing list