[Mesa-dev] [PATCH v5 06/34] nvir/nir: add support for NIR on nvc0

Pierre Moreau pierre.morrow at free.fr
Tue Feb 20 22:04:52 UTC 2018


Acked-by: Pierre Moreau <pierre.morrow at free.fr>

On 2018-02-20 — 22:02, Karol Herbst wrote:
> not all those nir options are actually required, it just made the work a
> little easier.
> 
> v2: fix asserts
>     parse compute shaders
>     don't lower bitfield_insert
> v3: fix memory leak
> v4: don't lower fmod32
> v5: set lower_all_io_to_temps to false
>     fix memory leak because we take over ownership of the nir shader
>     merge: use the lowering helper
> 
> Signed-off-by: Karol Herbst <kherbst at redhat.com>
> ---
>  src/gallium/drivers/nouveau/Makefile.sources       |  1 +
>  src/gallium/drivers/nouveau/codegen/nv50_ir.cpp    |  3 +
>  src/gallium/drivers/nouveau/codegen/nv50_ir.h      |  1 +
>  .../drivers/nouveau/codegen/nv50_ir_from_nir.cpp   | 74 ++++++++++++++++++++++
>  src/gallium/drivers/nouveau/meson.build            | 10 +--
>  src/gallium/drivers/nouveau/nvc0/nvc0_program.c    | 18 +++++-
>  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c     | 41 +++++++++++-
>  src/gallium/drivers/nouveau/nvc0/nvc0_state.c      | 27 +++++++-
>  8 files changed, 166 insertions(+), 9 deletions(-)
>  create mode 100644 src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
> 
> diff --git a/src/gallium/drivers/nouveau/Makefile.sources b/src/gallium/drivers/nouveau/Makefile.sources
> index ec344c6316..c6a1aff711 100644
> --- a/src/gallium/drivers/nouveau/Makefile.sources
> +++ b/src/gallium/drivers/nouveau/Makefile.sources
> @@ -117,6 +117,7 @@ NV50_CODEGEN_SOURCES := \
>  	codegen/nv50_ir_emit_nv50.cpp \
>  	codegen/nv50_ir_from_common.cpp \
>  	codegen/nv50_ir_from_common.h \
> +	codegen/nv50_ir_from_nir.cpp \
>  	codegen/nv50_ir_from_tgsi.cpp \
>  	codegen/nv50_ir_graph.cpp \
>  	codegen/nv50_ir_graph.h \
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
> index 6f12df70a1..b95ba8e4e9 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
> @@ -1231,6 +1231,9 @@ nv50_ir_generate_code(struct nv50_ir_prog_info *info)
>     prog->optLevel = info->optLevel;
>  
>     switch (info->bin.sourceRep) {
> +   case PIPE_SHADER_IR_NIR:
> +      ret = prog->makeFromNIR(info) ? 0 : -2;
> +      break;
>     case PIPE_SHADER_IR_TGSI:
>        ret = prog->makeFromTGSI(info) ? 0 : -2;
>        break;
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.h b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
> index f4f3c70888..e5b4592a61 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir.h
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
> @@ -1255,6 +1255,7 @@ public:
>     inline void del(Function *fn, int& id) { allFuncs.remove(id); }
>     inline void add(Value *rval, int& id) { allRValues.insert(rval, id); }
>  
> +   bool makeFromNIR(struct nv50_ir_prog_info *);
>     bool makeFromTGSI(struct nv50_ir_prog_info *);
>     bool convertToSSA();
>     bool optimizeSSA(int level);
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
> new file mode 100644
> index 0000000000..73527d4800
> --- /dev/null
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
> @@ -0,0 +1,74 @@
> +/*
> + * Copyright 2017 Red Hat Inc.
> + *
> + * 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.
> + *
> + * Authors: Karol Herbst <kherbst at redhat.com>
> + */
> +
> +#include "compiler/nir/nir.h"
> +
> +#include "codegen/nv50_ir.h"
> +#include "codegen/nv50_ir_from_common.h"
> +#include "codegen/nv50_ir_lowering_helper.h"
> +#include "codegen/nv50_ir_util.h"
> +
> +namespace {
> +
> +using namespace nv50_ir;
> +
> +class Converter : public ConverterCommon
> +{
> +public:
> +   Converter(Program *, nir_shader *, nv50_ir_prog_info *);
> +
> +   bool run();
> +private:
> +   nir_shader *nir;
> +};
> +
> +Converter::Converter(Program *prog, nir_shader *nir, nv50_ir_prog_info *info)
> +   : ConverterCommon(prog, info),
> +     nir(nir) {}
> +
> +bool
> +Converter::run()
> +{
> +   return false;
> +}
> +
> +} // unnamed namespace
> +
> +namespace nv50_ir {
> +
> +bool
> +Program::makeFromNIR(struct nv50_ir_prog_info *info)
> +{
> +   nir_shader *nir = (nir_shader*)info->bin.source;
> +   Converter converter(this, nir, info);
> +   bool result = converter.run();
> +   if (!result)
> +      return result;
> +   LoweringHelper lowering;
> +   lowering.run(this);
> +   tlsSize = info->bin.tlsSpace;
> +   return result;
> +}
> +
> +} // namespace nv50_ir
> diff --git a/src/gallium/drivers/nouveau/meson.build b/src/gallium/drivers/nouveau/meson.build
> index 0c41ff253b..3fc696e12a 100644
> --- a/src/gallium/drivers/nouveau/meson.build
> +++ b/src/gallium/drivers/nouveau/meson.build
> @@ -131,6 +131,7 @@ files_libnouveau = files(
>    'codegen/nv50_ir_emit_nv50.cpp',
>    'codegen/nv50_ir_from_common.cpp',
>    'codegen/nv50_ir_from_common.h',
> +  'codegen/nv50_ir_from_nir.cpp',
>    'codegen/nv50_ir_from_tgsi.cpp',
>    'codegen/nv50_ir_graph.cpp',
>    'codegen/nv50_ir_graph.h',
> @@ -210,8 +211,9 @@ files_libnouveau = files(
>  
>  libnouveau = static_library(
>    'nouveau',
> -  [files_libnouveau],
> -  include_directories : [inc_src, inc_include, inc_gallium, inc_gallium_aux],
> +  [files_libnouveau, nir_opcodes_h],
> +  include_directories : [inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_common],
> +
>    c_args : [c_vis_args],
>    cpp_args : [cpp_vis_args],
>    dependencies : [dep_libdrm, dep_libdrm_nouveau],
> @@ -222,12 +224,12 @@ nouveau_compiler = executable(
>    'nouveau_compiler.c',
>    include_directories : [inc_src, inc_include, inc_gallium, inc_gallium_aux],
>    dependencies : [dep_libdrm, dep_libdrm_nouveau],
> -  link_with : [libnouveau, libgallium, libmesa_util],
> +  link_with : [libnouveau, libgallium, libmesa_util, libnir],
>    build_by_default : with_tools.contains('nouveau'),
>    install : with_tools.contains('nouveau'),
>  )
>  
>  driver_nouveau = declare_dependency(
>    compile_args : '-DGALLIUM_NOUVEAU',
> -  link_with : [libnouveauwinsys, libnouveau],
> +  link_with : [libnouveauwinsys, libnouveau, libnir],
>  )
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
> index fd65859516..bd66af3cf9 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
> @@ -22,6 +22,7 @@
>  
>  #include "pipe/p_defines.h"
>  
> +#include "compiler/nir/nir.h"
>  #include "tgsi/tgsi_ureg.h"
>  
>  #include "nvc0/nvc0_context.h"
> @@ -569,8 +570,19 @@ nvc0_program_translate(struct nvc0_program *prog, uint16_t chipset,
>  
>     info->type = prog->type;
>     info->target = chipset;
> -   info->bin.sourceRep = PIPE_SHADER_IR_TGSI;
> -   info->bin.source = (void *)prog->pipe.tokens;
> +   switch (prog->pipe.type) {
> +   case PIPE_SHADER_IR_TGSI:
> +      info->bin.sourceRep = PIPE_SHADER_IR_TGSI;
> +      info->bin.source = (void *)prog->pipe.tokens;
> +      break;
> +   case PIPE_SHADER_IR_NIR:
> +      info->bin.sourceRep = PIPE_SHADER_IR_NIR;
> +      info->bin.source = (void *)nir_shader_clone(NULL, prog->pipe.ir.nir);
> +      break;
> +   default:
> +      assert(!"unsupported IR!");
> +      break;
> +   }
>  
>  #ifdef DEBUG
>     info->target = debug_get_num_option("NV50_PROG_CHIPSET", chipset);
> @@ -698,6 +710,8 @@ nvc0_program_translate(struct nvc0_program *prog, uint16_t chipset,
>  #endif
>  
>  out:
> +   if (info->bin.sourceRep == PIPE_SHADER_IR_NIR)
> +      ralloc_free((void *)info->bin.source);
>     FREE(info);
>     return !ret;
>  }
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> index 2052e84b58..fb5668d726 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -26,6 +26,7 @@
>  #include "util/u_format.h"
>  #include "util/u_format_s3tc.h"
>  #include "pipe/p_screen.h"
> +#include "compiler/nir/nir.h"
>  
>  #include "nouveau_vp3_video.h"
>  
> @@ -355,7 +356,8 @@ nvc0_screen_get_shader_param(struct pipe_screen *pscreen,
>     case PIPE_SHADER_CAP_PREFERRED_IR:
>        return PIPE_SHADER_IR_TGSI;
>     case PIPE_SHADER_CAP_SUPPORTED_IRS:
> -      return 1 << PIPE_SHADER_IR_TGSI;
> +      return 1 << PIPE_SHADER_IR_TGSI |
> +             1 << PIPE_SHADER_IR_NIR;
>     case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
>     case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
>     case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
> @@ -787,6 +789,41 @@ nvc0_screen_resize_text_area(struct nvc0_screen *screen, uint64_t size)
>     return 0;
>  }
>  
> +static const nir_shader_compiler_options nir_options = {
> +   .fuse_ffma = false, // nir doesn't track mad vs fma
> +   .lower_flrp32 = true,
> +   .lower_flrp64 = true,
> +   .lower_fpow = true,
> +   .lower_fmod64 = true,
> +   .lower_uadd_carry = true,
> +   .lower_usub_borrow = true,
> +   .lower_ffract = true,
> +   .lower_pack_half_2x16 = true,
> +   .lower_pack_unorm_2x16 = true,
> +   .lower_pack_snorm_2x16 = true,
> +   .lower_pack_unorm_4x8 = true,
> +   .lower_pack_snorm_4x8 = true,
> +   .lower_unpack_half_2x16 = true,
> +   .lower_unpack_unorm_2x16 = true,
> +   .lower_unpack_snorm_2x16 = true,
> +   .lower_unpack_unorm_4x8 = true,
> +   .lower_unpack_snorm_4x8 = true,
> +   .lower_extract_byte = true,
> +   .lower_extract_word = true,
> +   .lower_all_io_to_temps = false,
> +   .native_integers = true,
> +   .lower_cs_local_index_from_id = true,
> +   .max_unroll_iterations = 32,
> +};
> +
> +static const void *
> +nvc0_screen_get_compiler_options(struct pipe_screen *pscreen,
> +                                 enum pipe_shader_ir ir,
> +                                 enum pipe_shader_type shader)
> +{
> +        return &nir_options;
> +}
> +
>  #define FAIL_SCREEN_INIT(str, err)                    \
>     do {                                               \
>        NOUVEAU_ERR(str, err);                          \
> @@ -853,6 +890,8 @@ nvc0_screen_create(struct nouveau_device *dev)
>     pscreen->get_paramf = nvc0_screen_get_paramf;
>     pscreen->get_driver_query_info = nvc0_screen_get_driver_query_info;
>     pscreen->get_driver_query_group_info = nvc0_screen_get_driver_query_group_info;
> +   // nir stuff
> +   pscreen->get_compiler_options = nvc0_screen_get_compiler_options;
>  
>     nvc0_screen_init_resource_functions(pscreen);
>  
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
> index 99d45a238a..f4ef022cce 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
> @@ -27,6 +27,7 @@
>  #include "util/u_transfer.h"
>  
>  #include "tgsi/tgsi_parse.h"
> +#include "compiler/nir/nir.h"
>  
>  #include "nvc0/nvc0_stateobj.h"
>  #include "nvc0/nvc0_context.h"
> @@ -580,9 +581,19 @@ nvc0_sp_state_create(struct pipe_context *pipe,
>        return NULL;
>  
>     prog->type = type;
> +   prog->pipe.type = cso->type;
>  
> -   if (cso->tokens)
> +   switch(cso->type) {
> +   case PIPE_SHADER_IR_TGSI:
>        prog->pipe.tokens = tgsi_dup_tokens(cso->tokens);
> +      break;
> +   case PIPE_SHADER_IR_NIR:
> +      prog->pipe.ir.nir = cso->ir.nir;
> +      break;
> +   default:
> +      assert(!"unsupported IR!");
> +      break;
> +   }
>  
>     if (cso->stream_output.num_outputs)
>        prog->pipe.stream_output = cso->stream_output;
> @@ -602,6 +613,7 @@ nvc0_sp_state_delete(struct pipe_context *pipe, void *hwcso)
>     nvc0_program_destroy(nvc0_context(pipe), prog);
>  
>     FREE((void *)prog->pipe.tokens);
> +   ralloc_free(prog->pipe.ir.nir);
>     FREE(prog);
>  }
>  
> @@ -695,12 +707,23 @@ nvc0_cp_state_create(struct pipe_context *pipe,
>     if (!prog)
>        return NULL;
>     prog->type = PIPE_SHADER_COMPUTE;
> +   prog->pipe.type = cso->ir_type;
>  
>     prog->cp.smem_size = cso->req_local_mem;
>     prog->cp.lmem_size = cso->req_private_mem;
>     prog->parm_size = cso->req_input_mem;
>  
> -   prog->pipe.tokens = tgsi_dup_tokens((const struct tgsi_token *)cso->prog);
> +   switch(cso->ir_type) {
> +   case PIPE_SHADER_IR_TGSI:
> +      prog->pipe.tokens = tgsi_dup_tokens((const struct tgsi_token *)cso->prog);
> +      break;
> +   case PIPE_SHADER_IR_NIR:
> +      prog->pipe.ir.nir = nir_shader_clone(NULL, cso->prog);
> +      break;
> +   default:
> +      assert(!"unsupported IR!");
> +      break;
> +   }
>  
>     prog->translated = nvc0_program_translate(
>        prog, nvc0_context(pipe)->screen->base.device->chipset,
> -- 
> 2.14.3
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180220/d778961e/attachment.sig>


More information about the mesa-dev mailing list