[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