[Mesa-dev] [PATCH 2/7] st/mesa: implement GL_ATI_fragment_shader

Ilia Mirkin imirkin at alum.mit.edu
Fri Feb 5 21:22:31 UTC 2016


On Fri, Feb 5, 2016 at 4:11 PM, Miklós Máté <mtmkls at gmail.com> wrote:
> v2: fix arithmetic for special opcodes
>  (based on comments from Marek and Ilia),
>  fix fog state, cleanup
> ---
>  src/mesa/Makefile.sources                 |   1 +
>  src/mesa/program/program.h                |   2 +
>  src/mesa/state_tracker/st_atifs_to_tgsi.c | 734 ++++++++++++++++++++++++++++++
>  src/mesa/state_tracker/st_atifs_to_tgsi.h |  65 +++
>  src/mesa/state_tracker/st_atom_constbuf.c |  14 +
>  src/mesa/state_tracker/st_atom_shader.c   |   5 +-
>  src/mesa/state_tracker/st_cb_drawpixels.c |   1 +
>  src/mesa/state_tracker/st_cb_program.c    |  36 +-
>  src/mesa/state_tracker/st_program.c       |  30 +-
>  src/mesa/state_tracker/st_program.h       |   4 +
>  10 files changed, 889 insertions(+), 3 deletions(-)
>  create mode 100644 src/mesa/state_tracker/st_atifs_to_tgsi.c
>  create mode 100644 src/mesa/state_tracker/st_atifs_to_tgsi.h
>
> diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources
> index ffe560f..23fe42a 100644
> --- a/src/mesa/Makefile.sources
> +++ b/src/mesa/Makefile.sources
> @@ -393,6 +393,7 @@ VBO_FILES = \
>         vbo/vbo_split_inplace.c
>
>  STATETRACKER_FILES = \
> +       state_tracker/st_atifs_to_tgsi.c \
>         state_tracker/st_atom_array.c \
>         state_tracker/st_atom_atomicbuf.c \
>         state_tracker/st_atom_blend.c \
> diff --git a/src/mesa/program/program.h b/src/mesa/program/program.h
> index 24e0597..09e6928 100644
> --- a/src/mesa/program/program.h
> +++ b/src/mesa/program/program.h
> @@ -172,6 +172,8 @@ _mesa_program_enum_to_shader_stage(GLenum v)
>        return MESA_SHADER_VERTEX;
>     case GL_FRAGMENT_PROGRAM_ARB:
>        return MESA_SHADER_FRAGMENT;
> +   case GL_FRAGMENT_SHADER_ATI:
> +      return MESA_SHADER_FRAGMENT;
>     case GL_GEOMETRY_PROGRAM_NV:
>        return MESA_SHADER_GEOMETRY;
>     case GL_TESS_CONTROL_PROGRAM_NV:
> diff --git a/src/mesa/state_tracker/st_atifs_to_tgsi.c b/src/mesa/state_tracker/st_atifs_to_tgsi.c
> new file mode 100644
> index 0000000..fe303f6
> --- /dev/null
> +++ b/src/mesa/state_tracker/st_atifs_to_tgsi.c
> @@ -0,0 +1,734 @@
> +/*
> + * Copyright (C) 2016 Miklós Máté
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include "main/mtypes.h"
> +#include "main/atifragshader.h"
> +#include "main/texobj.h"
> +#include "main/errors.h"
> +#include "program/prog_parameter.h"
> +
> +#include "tgsi/tgsi_transform.h"
> +#include "tgsi/tgsi_ureg.h"
> +#include "util/u_math.h"
> +#include "util/u_memory.h"
> +
> +#include "st_program.h"
> +#include "st_atifs_to_tgsi.h"
> +
> +/**
> + * Intermediate state used during shader translation.
> + */
> +struct st_translate {
> +   struct ureg_program *ureg;
> +   struct gl_context *ctx;
> +   struct ati_fragment_shader *atifs;
> +
> +   struct ureg_dst temps[MAX_PROGRAM_TEMPS];
> +   struct ureg_src *constants;
> +   struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS];
> +   struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS];
> +   struct ureg_src samplers[PIPE_MAX_SAMPLERS];
> +
> +   const GLuint *inputMapping;
> +   const GLuint *outputMapping;
> +
> +   unsigned current_pass;
> +
> +   bool regs_written[MAX_NUM_PASSES_ATI][MAX_NUM_FRAGMENT_REGISTERS_ATI];
> +
> +   boolean error;
> +};
> +
> +struct instruction_desc {
> +   unsigned TGSI_opcode;
> +   const char *name;
> +   unsigned char arg_count;
> +   unsigned char special; /* no 1:1 corresponding TGSI instruction */
> +};
> +
> +static struct instruction_desc inst_desc[] = {
> +   {TGSI_OPCODE_MOV, "MOV", 1, 0},
> +   {TGSI_OPCODE_NOP, "UND", 0, 0}, /* unused */
> +   {TGSI_OPCODE_ADD, "ADD", 2, 0},
> +   {TGSI_OPCODE_MUL, "MUL", 2, 0},
> +   {TGSI_OPCODE_SUB, "SUB", 2, 0},
> +   {TGSI_OPCODE_DP3, "DOT3", 2, 0},
> +   {TGSI_OPCODE_DP4, "DOT4", 2, 0},
> +   {TGSI_OPCODE_MAD, "MAD", 3, 0},
> +   {TGSI_OPCODE_LRP, "LERP", 3, 0},
> +   {TGSI_OPCODE_NOP, "CND", 3, 1},
> +   {TGSI_OPCODE_NOP, "CND0", 3, 2},
> +   {TGSI_OPCODE_NOP, "DOT2_ADD", 3, 3}
> +};
> +
> +static struct ureg_dst get_temp(struct st_translate *t, unsigned index)
> +{
> +   if (ureg_dst_is_undef(t->temps[index]))
> +      t->temps[index] = ureg_DECL_temporary(t->ureg);
> +   return t->temps[index];
> +}
> +
> +static struct ureg_src apply_swizzle(struct st_translate *t,
> +      struct ureg_src src, GLuint swizzle)
> +{
> +   if (swizzle == GL_SWIZZLE_STR_ATI) {
> +      return src;
> +   } else if (swizzle == GL_SWIZZLE_STQ_ATI) {
> +      return ureg_swizzle(src,
> +            TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_W, TGSI_SWIZZLE_Z);
> +   } else {
> +      struct ureg_dst tmp[2];
> +      struct ureg_src imm[3];
> +
> +      tmp[0] = get_temp(t, MAX_NUM_FRAGMENT_REGISTERS_ATI);
> +      tmp[1] = get_temp(t, MAX_NUM_FRAGMENT_REGISTERS_ATI+1);
> +      imm[0] = src;
> +      imm[1] = ureg_imm4f(t->ureg, 1.0, 1.0, 0.0, 0.0);
> +      imm[2] = ureg_imm4f(t->ureg, 0.0, 0.0, 1.0, 1.0);
> +      ureg_insn(t->ureg, TGSI_OPCODE_MAD, &tmp[0], 1, imm, 3);
> +
> +      if (swizzle == GL_SWIZZLE_STR_DR_ATI)
> +         imm[0] = ureg_swizzle(src,
> +               TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z);

Both here and elsewhere, you may find it more compact to write

ureg_scalar(src, TGSI_SWIZZLE_Z);


More information about the mesa-dev mailing list