[Mesa-dev] [PATCH] llvmpipe: handle offset_clamp

Jose Fonseca jfonseca at vmware.com
Thu Jun 27 00:41:56 PDT 2013


----- Original Message -----
> From: Roland Scheidegger <sroland at vmware.com>
> 
> This was just ignored (unless for some reason like unfilled polys draw was
> handling this).

Patch looks good.

> I'm not convinced of that code, putting the float for the clamp in the key
> isn't really a good idea. 

Indeed.

> Then again the other floats for depth bias are
> already in there too anyway (should probably have a jit_context for the
> setup function), so this is just a quick fix.
> Also, the "minimum resolvable depth difference" used isn't really right as it
> should be calculated according to the z values of the current primitive
> and not be a constant (of course, this only makes a difference for float
> depth buffers), at least for d3d10, so depth biasing is still not quite
> right.
> ---
>  src/gallium/drivers/llvmpipe/lp_state_setup.c   |   20 +++++++++++++++++++-
>  src/gallium/drivers/llvmpipe/lp_state_setup.h   |    3 ++-
>  src/gallium/drivers/llvmpipe/lp_state_surface.c |    2 ++
>  3 files changed, 23 insertions(+), 2 deletions(-)
> 
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_setup.c
> b/src/gallium/drivers/llvmpipe/lp_state_setup.c
> index ed68b98..2988bed 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_setup.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_setup.c
> @@ -244,6 +244,7 @@ lp_do_offset_tri(struct gallivm_state *gallivm,
>  {
>     LLVMBuilderRef b = gallivm->builder;
>     struct lp_build_context bld;
> +   struct lp_build_context flt_scalar_bld;
>     LLVMValueRef zoffset, mult;
>     LLVMValueRef z0_new, z1_new, z2_new;
>     LLVMValueRef dzdxdzdy, dzdx, dzdy, dzxyz20, dyzzx01, dyzzx01_dzxyz20,
>     dzx01_dyz20;
> @@ -298,6 +299,18 @@ lp_do_offset_tri(struct gallivm_state *gallivm,
>                             lp_build_const_float(gallivm,
>                             key->pgon_offset_units),
>                             mult, "zoffset");
>  
> +   lp_build_context_init(&flt_scalar_bld, gallivm, lp_type_float_vec(32,
> 32));
> +   if (key->pgon_offset_clamp > 0) {
> +      zoffset = lp_build_min(&flt_scalar_bld,
> +                             lp_build_const_float(gallivm,
> key->pgon_offset_clamp),
> +                             zoffset);
> +   }
> +   else if (key->pgon_offset_clamp < 0) {
> +      zoffset = lp_build_max(&flt_scalar_bld,
> +                             lp_build_const_float(gallivm,
> key->pgon_offset_clamp),
> +                             zoffset);
> +   }
> +
>     /* yuck */
>     shuffles[0] = twoi;
>     shuffles[1] = lp_build_const_int32(gallivm, 6);
> @@ -312,6 +325,10 @@ lp_do_offset_tri(struct gallivm_state *gallivm,
>     zoffset = vec4f_from_scalar(gallivm, zoffset, "");
>  
>     /* clamp and do offset */
> +   /*
> +    * XXX I suspect the clamp (is that even right to always clamp to fixed
> 0.0/1.0?)
> +    * should really be per fragment?
> +    */

yes. this doesn't look right. Should probably be a FIXME too.

>     z0z1z2 = lp_build_clamp(&bld, LLVMBuildFAdd(b, z0z1z2, zoffset, ""),
>     bld.zero, bld.one);
>  
>     /* insert into args->a0.z, a1.z, a2.z:
> @@ -810,7 +827,7 @@ lp_make_setup_variant_key(struct llvmpipe_context *lp,
>     key->pixel_center_half = lp->rasterizer->half_pixel_center;
>     key->twoside = lp->rasterizer->light_twoside;
>     key->size = Offset(struct lp_setup_variant_key,
> -		      inputs[key->num_inputs]);
> +                      inputs[key->num_inputs]);
>  
>     key->color_slot  = lp->color_slot [0];
>     key->bcolor_slot = lp->bcolor_slot[0];
> @@ -823,6 +840,7 @@ lp_make_setup_variant_key(struct llvmpipe_context *lp,
>  
>     key->pgon_offset_units = (float) (lp->rasterizer->offset_units *
>     lp->mrd);
>     key->pgon_offset_scale = lp->rasterizer->offset_scale;
> +   key->pgon_offset_clamp = lp->rasterizer->offset_clamp;
>     key->pad = 0;
>     memcpy(key->inputs, fs->inputs, key->num_inputs * sizeof key->inputs[0]);
>     for (i = 0; i < key->num_inputs; i++) {
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_setup.h
> b/src/gallium/drivers/llvmpipe/lp_state_setup.h
> index 73d40a5..c2a2c7f 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_setup.h
> +++ b/src/gallium/drivers/llvmpipe/lp_state_setup.h
> @@ -14,7 +14,7 @@ struct lp_setup_variant_list_item
>  };
>  
>  
> -struct lp_setup_variant_key {
> +struct lp_setup_variant_key {
>     unsigned size:16;
>     unsigned num_inputs:8;
>     int color_slot:8;
> @@ -29,6 +29,7 @@ struct lp_setup_variant_key {
>  
>     float pgon_offset_units;
>     float pgon_offset_scale;
> +   float pgon_offset_clamp;
>     struct lp_shader_input inputs[PIPE_MAX_SHADER_INPUTS];
>  };
>  
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_surface.c
> b/src/gallium/drivers/llvmpipe/lp_state_surface.c
> index 375ceb2..e6aac31 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_surface.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_surface.c
> @@ -65,6 +65,8 @@ llvmpipe_set_framebuffer_state(struct pipe_context *pipe,
>        }
>  
>        /* Tell draw module how deep the Z/depth buffer is */
> +      /* FIXME: mrd constant isn't right should use a value derived from
> +       * current primitive not a constant (for float depth buffers) */
>        if (lp->framebuffer.zsbuf) {
>           int depth_bits;
>           double mrd;
> --
> 1.7.9.5
> 

Jose


More information about the mesa-dev mailing list