[Mesa-dev] [PATCH 13/14] i965/fs: Split LIR emission ouf of ir-visitor

Matt Turner mattst88 at gmail.com
Wed May 28 11:16:50 PDT 2014


On Wed, May 28, 2014 at 5:36 AM, Topi Pohjolainen
<topi.pohjolainen at intel.com> wrote:
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
>  src/mesa/drivers/dri/i965/Makefile.sources   |   1 +
>  src/mesa/drivers/dri/i965/brw_fs.cpp         |  44 -----------
>  src/mesa/drivers/dri/i965/brw_fs.h           |  19 +----
>  src/mesa/drivers/dri/i965/brw_fs_emit.h      |  33 ++++++++
>  src/mesa/drivers/dri/i965/brw_fs_emitter.cpp | 108 +++++++++++++++++++++++++++
>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp |  31 +-------
>  6 files changed, 145 insertions(+), 91 deletions(-)
>  create mode 100644 src/mesa/drivers/dri/i965/brw_fs_emitter.cpp
>
> diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources
> index 2570059..d43fc8e 100644
> --- a/src/mesa/drivers/dri/i965/Makefile.sources
> +++ b/src/mesa/drivers/dri/i965/Makefile.sources
> @@ -69,6 +69,7 @@ i965_FILES = \
>         brw_fs_sel_peephole.cpp \
>         brw_fs_vector_splitting.cpp \
>         brw_fs_visitor.cpp \
> +       brw_fs_emitter.cpp \

Alphabetize.

>         brw_gs.c \
>         brw_gs_emit.c \
>         brw_gs_state.c \
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index c971480..f3d8dcf 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -661,50 +661,6 @@ fs_visitor::no16(const char *format, ...)
>     va_end(va);
>  }
>
> -fs_inst *
> -fs_visitor::emit(enum opcode opcode)
> -{
> -   return emit(new(mem_ctx) fs_inst(opcode));
> -}
> -
> -fs_inst *
> -fs_visitor::emit(enum opcode opcode, fs_reg dst)
> -{
> -   return emit(new(mem_ctx) fs_inst(opcode, dst));
> -}
> -
> -fs_inst *
> -fs_visitor::emit(enum opcode opcode, fs_reg dst, fs_reg src0)
> -{
> -   return emit(new(mem_ctx) fs_inst(opcode, dst, src0));
> -}
> -
> -fs_inst *
> -fs_visitor::emit(enum opcode opcode, fs_reg dst, fs_reg src0, fs_reg src1)
> -{
> -   return emit(new(mem_ctx) fs_inst(opcode, dst, src0, src1));
> -}
> -
> -fs_inst *
> -fs_visitor::emit(enum opcode opcode, fs_reg dst,
> -                 fs_reg src0, fs_reg src1, fs_reg src2)
> -{
> -   return emit(new(mem_ctx) fs_inst(opcode, dst, src0, src1, src2));
> -}
> -
> -void
> -fs_visitor::push_force_uncompressed()
> -{
> -   force_uncompressed_stack++;
> -}
> -
> -void
> -fs_visitor::pop_force_uncompressed()
> -{
> -   force_uncompressed_stack--;
> -   assert(force_uncompressed_stack >= 0);
> -}
> -
>  /**
>   * Returns true if the instruction has a flag that means it won't
>   * update an entire destination register.
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index 6c39368..82af5cd 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -69,7 +69,7 @@ namespace brw {
>   *
>   * Translates either GLSL IR or Mesa IR (for ARB_fragment_program) into FS IR.
>   */
> -class fs_visitor : public backend_visitor, public backend_emitter
> +class fs_visitor : public backend_visitor, public fs_emitter
>  {
>  public:
>
> @@ -109,16 +109,6 @@ public:
>
>     bool can_do_source_mods(fs_inst *inst);
>
> -   fs_inst *emit(fs_inst *inst);
> -   void emit(exec_list list);
> -
> -   fs_inst *emit(enum opcode opcode);
> -   fs_inst *emit(enum opcode opcode, fs_reg dst);
> -   fs_inst *emit(enum opcode opcode, fs_reg dst, fs_reg src0);
> -   fs_inst *emit(enum opcode opcode, fs_reg dst, fs_reg src0, fs_reg src1);
> -   fs_inst *emit(enum opcode opcode, fs_reg dst,
> -                 fs_reg src0, fs_reg src1, fs_reg src2);
> -
>     fs_inst *MOV(fs_reg dst, fs_reg src);
>     fs_inst *NOT(fs_reg dst, fs_reg src);
>     fs_inst *RNDD(fs_reg dst, fs_reg src);
> @@ -207,9 +197,6 @@ public:
>     void no16(const char *msg, ...);
>     void lower_uniform_pull_constant_loads();
>
> -   void push_force_uncompressed();
> -   void pop_force_uncompressed();
> -
>     void emit_dummy_fs();
>     fs_reg *emit_fragcoord_interpolation(ir_variable *ir);
>     fs_inst *emit_linterp(const fs_reg &attr, const fs_reg &interp,
> @@ -381,10 +368,6 @@ public:
>
>     int grf_used;
>     bool spilled_any_registers;
> -
> -   const unsigned dispatch_width; /**< 8 or 16 */
> -
> -   int force_uncompressed_stack;
>  };
>
>  /**
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_emit.h b/src/mesa/drivers/dri/i965/brw_fs_emit.h
> index 1b1e584..d24e137 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_emit.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs_emit.h
> @@ -31,6 +31,7 @@
>  extern "C" {
>  #include <sys/types.h>
>  #include "brw_shader.h"
> +#include "brw_context.h"
>  }
>
>  #include "glsl/glsl_types.h"
> @@ -217,4 +218,36 @@ public:
>     bool force_writemask_all:1;
>  };
>
> +class fs_emitter : public backend_emitter
> +{
> +protected:
> +   fs_emitter(struct brw_context *brw, void *mem_ctx,
> +              unsigned dispatch_width);
> +
> +public:
> +   const unsigned dispatch_width; /**< 8 or 16 */
> +
> +   fs_inst *emit(enum opcode opcode);
> +   fs_inst *emit(enum opcode opcode, fs_reg dst);
> +   fs_inst *emit(enum opcode opcode, fs_reg dst, fs_reg src0);
> +   fs_inst *emit(enum opcode opcode, fs_reg dst, fs_reg src0, fs_reg src1);
> +   fs_inst *emit(enum opcode opcode, fs_reg dst,
> +                 fs_reg src0, fs_reg src1, fs_reg src2);
> +
> +   fs_inst *emit(fs_inst *inst);
> +
> +protected:
> +   void emit(exec_list list);
> +
> +   void push_force_uncompressed();
> +   void pop_force_uncompressed();
> +
> +   /** @{ debug annotation info */
> +   const char *current_annotation;
> +   const void *base_ir;
> +   /** @} */
> +
> +   int force_uncompressed_stack;
> +};
> +
>  #endif /* BRW_FS_EMIT_H */
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_emitter.cpp b/src/mesa/drivers/dri/i965/brw_fs_emitter.cpp
> new file mode 100644
> index 0000000..4feef55
> --- /dev/null
> +++ b/src/mesa/drivers/dri/i965/brw_fs_emitter.cpp
> @@ -0,0 +1,108 @@
> +/*
> + * Copyright © 2014 Intel Corporation
> + *
> + * 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 (including the next
> + * paragraph) 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.
> + */
> +
> +/** @file brw_fs_emitter.cpp
> + *
> + * This file supports generating the FS LIR. The LIR makes it easier to do
> + * backend-specific optimizations than doing so in the GLSL IR or in the
> + * native code.

This description should be updated.


More information about the mesa-dev mailing list