Luca Barbieri wrote:
> The state tracker will use the TGSI convention properties if the hardware
> exposes the appropriate capability, and otherwise adjust WPOS itself.
> 
> Thus, this patch will work on unmodified drivers, and not require any
> changes
> 
> However, this should only be a temporary solution, and all drivers should
> eventually support the TGSI coord convention properties.
> 
> If a driver was previously broken (not unlikely, since nv30, nv40 and
> softpipe were), adding the appopriate caps or negative caps allows a
> quick fix, allowing the state tracker to adjust wpos appropriately.
> ---
>  src/mesa/state_tracker/st_extensions.c   |    1 +
>  src/mesa/state_tracker/st_mesa_to_tgsi.c |   61 
> ++++++++++++++++++++++++++++--
>  2 files changed, 58 insertions(+), 4 deletions(-)
> 
> diff --git a/src/mesa/state_tracker/st_extensions.c 
> b/src/mesa/state_tracker/st_extensions.c
> index 05bf16d..3aaca69 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -148,6 +148,7 @@ void st_init_extensions(struct st_context *st)
>      * Extensions that are supported by all Gallium drivers:
>      */
>     ctx->Extensions.ARB_copy_buffer = GL_TRUE;
> +   ctx->Extensions.ARB_fragment_coord_conventions = GL_TRUE;
>     ctx->Extensions.ARB_fragment_program = GL_TRUE;
>     ctx->Extensions.ARB_half_float_vertex = GL_TRUE;
>     ctx->Extensions.ARB_map_buffer_range = GL_TRUE;
> diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c 
> b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> index 5e15c39..9de818a 100644
> --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
> +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> @@ -663,6 +663,22 @@ compile_instruction(
>     }
>  }
>  
> +/**
> + * Emit the TGSI instructions to adjust the WPOS pixel center convention
> + */
> +static void
> +emit_adjusted_wpos( struct st_translate *t,
> +                    const struct gl_program *program, GLfloat value)
> +{
> +   struct ureg_program *ureg = t->ureg;
> +   struct ureg_dst wpos_temp = ureg_DECL_temporary(ureg);
> +   struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]];
> +
> +   ureg_ADD(ureg, ureg_writemask(wpos_temp, TGSI_WRITEMASK_X | 
> TGSI_WRITEMASK_Y),
> +                wpos_input, ureg_imm1f(ureg, value));
> +
> +   t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp);
> +}
>  
>  /**
>   * Emit the TGSI instructions for inverting the WPOS y coordinate.
> @@ -688,12 +704,18 @@ emit_inverted_wpos( struct st_translate *t,
>                                                         winSizeState);
>  
>     struct ureg_src winsize = ureg_DECL_constant( ureg, winHeightConst );
> -   struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg );
> +   struct ureg_dst wpos_temp;
>     struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]];
>  
>     /* MOV wpos_temp, input[wpos]
>      */
> -   ureg_MOV( ureg, wpos_temp, wpos_input );
> +   if(wpos_input.File == TGSI_FILE_TEMPORARY)
> +      wpos_temp = ureg_dst(wpos_input);
> +   else
> +   {
> +      wpos_temp = ureg_DECL_temporary( ureg );
> +      ureg_MOV( ureg, wpos_temp, wpos_input );
> +   }
>  
>     /* SUB wpos_temp.y, winsize_const, wpos_input
>      */
> @@ -796,6 +818,7 @@ st_translate_mesa_program(
>      * Declare input attributes.
>      */
>     if (procType == TGSI_PROCESSOR_FRAGMENT) {
> +      struct gl_fragment_program* fp = (struct gl_fragment_program*)program;
>        for (i = 0; i < numInputs; i++) {
>           t->inputs[i] = ureg_DECL_fs_input(ureg,
>                                             inputSemanticName[i],
> @@ -808,8 +831,38 @@ st_translate_mesa_program(
>            * emitting constant references, below:
>            */
>        struct pipe_screen* pscreen = st_context(ctx)->pipe->screen;
> -      if(strcmp(pscreen->get_vendor(pscreen), "nouveau"))
> -            emit_inverted_wpos( t, program );
> +      int invert = 0;
> +
> +      if(!fp->OriginUpperLeft)
> +         {
> +            if(pscreen->get_param(pscreen, 
> PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT))
> +               ureg_property_fs_coord_origin(ureg, 
> TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
> +            else
> +               invert = 1;
> +         }
> +         else if(pscreen->get_param(pscreen, 
> PIPE_NO_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT))
> +         {
> +            ureg_property_fs_coord_origin(ureg, 
> TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
> +            invert = 1;
> +         }
> +
> +      if(fp->PixelCenterInteger)
> +      {
> +         if(pscreen->get_param(pscreen, 
> PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER))
> +            ureg_property_fs_coord_pixel_center(ureg, 
> TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
> +         else
> +            emit_adjusted_wpos( t, program, invert ? 0.5f : -0.5f);
> +      }
> +      else if(pscreen->get_param(pscreen, 
> PIPE_NO_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER))
> +      {
> +         ureg_property_fs_coord_pixel_center(ureg, 
> TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
> +         emit_adjusted_wpos( t, program, invert ? -0.5f : 0.5f);
> +      }
> +
> +      /* we invert after adjustment so that we avoid the MOV to temporary,
> +       * and reuse the adjustment ADD instead */
> +      if(invert)
> +         emit_inverted_wpos( t, program );
>        }
>  
>        if (program->InputsRead & FRAG_BIT_FACE) {

Other than then NO_CAP issue, I only have comments on your formatting. 
  The Mesa/gallium style for conditionals is:

    if (cond) {
       ...
    }

Note whitespace after 'if' and brace placement.  Let's keep things 
consistant.

-Brian

------------------------------------------------------------------------------
Throughout its 18-year history, RSA Conference consistently attracts the
world's best and brightest in the field, creating opportunities for Conference
attendees to learn about information security's most important issues through
interactions with peers, luminaries and emerging and established companies.
http://p.sf.net/sfu/rsaconf-dev2dev
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to