From patchwork Mon Oct 19 19:47:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rob Clark X-Patchwork-Id: 7439451 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 88CB0BEEA4 for ; Mon, 19 Oct 2015 19:48:24 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 65512207FA for ; Mon, 19 Oct 2015 19:48:23 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 502F1207E6 for ; Mon, 19 Oct 2015 19:48:22 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AE34772113; Mon, 19 Oct 2015 12:48:20 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-qg0-f46.google.com (mail-qg0-f46.google.com [209.85.192.46]) by gabe.freedesktop.org (Postfix) with ESMTPS id D7B13720F2 for ; Mon, 19 Oct 2015 12:48:16 -0700 (PDT) Received: by qgeo38 with SMTP id o38so123902611qge.0 for ; Mon, 19 Oct 2015 12:48:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=OT5MLE1L/G4xYGA5EqycytihWm+uxVix8htpqrqeL0U=; b=Cwp0FwbNvgUDebKf41aaM9cqHOCft2813YeO8chVtMN5q/BTCgRT2XHGTc8CrufeKC 4DAnKgo4e57A1zHAYzFh2BsBpfgmMh1ROXAL17c452XoDHSmT2Y7zSLErStQTmNRcmj3 vGde8nxFslTkqs5fd0SpmC55CNnLDVlkxbw6H0+hvD+2mxp3A4k0vkzcuI7hREIyBcjM nDqp1DNx8U/f2jD3YqLhWN4M3U8/Ppkwb+L3A/UK+5uVizFmRv5HO2ha4RPzYHgrh5De xa/UbZFMs/pmXVuC2SQaICyWdKlGFHgw5UjjAAWFOzhYFoXU8qD8vqWWtizMSAcJVcfH B9Wg== X-Received: by 10.140.39.168 with SMTP id v37mr38385327qgv.24.1445284096122; Mon, 19 Oct 2015 12:48:16 -0700 (PDT) Received: from localhost ([2601:184:4000:26d7:6af7:28ff:fe77:e429]) by smtp.gmail.com with ESMTPSA id 139sm6003937qht.32.2015.10.19.12.48.15 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 19 Oct 2015 12:48:15 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Subject: [RFCv0 6/8] freedreno/ir3: add support for NIR as preferred IR Date: Mon, 19 Oct 2015 15:47:59 -0400 Message-Id: <1445284081-29532-7-git-send-email-robdclark@gmail.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1445284081-29532-1-git-send-email-robdclark@gmail.com> References: <1445284081-29532-1-git-send-email-robdclark@gmail.com> Cc: Jason Ekstrand X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP For now under debug flag, since only suitable for debugging/testing. --- src/gallium/drivers/freedreno/freedreno_screen.c | 5 +++- src/gallium/drivers/freedreno/freedreno_util.h | 1 + .../drivers/freedreno/ir3/ir3_compiler_nir.c | 15 ++++++++++- src/gallium/drivers/freedreno/ir3/ir3_shader.c | 30 +++++++++++++++++++--- src/gallium/drivers/freedreno/ir3/ir3_shader.h | 3 +++ 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index b64f78c..30def8e 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -71,6 +71,7 @@ static const struct debug_named_value debug_options[] = { {"glsl120", FD_DBG_GLSL120,"Temporary flag to force GLSL 1.20 (rather than 1.30) on a3xx+"}, {"shaderdb", FD_DBG_SHADERDB, "Enable shaderdb output"}, {"flush", FD_DBG_FLUSH, "Force flush after every draw"}, + {"nir", FD_DBG_NIR, "Prefer NIR as native IR"}, DEBUG_NAMED_VALUE_END }; @@ -398,7 +399,7 @@ fd_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: - case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: + case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 0; case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: return 1; @@ -410,6 +411,8 @@ fd_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: return 16; case PIPE_SHADER_CAP_PREFERRED_IR: + if ((fd_mesa_debug & FD_DBG_NIR) && is_ir3(screen)) + return PIPE_SHADER_IR_NIR; return PIPE_SHADER_IR_TGSI; } debug_printf("unknown shader param %d\n", param); diff --git a/src/gallium/drivers/freedreno/freedreno_util.h b/src/gallium/drivers/freedreno/freedreno_util.h index 0d2418e..56d3235 100644 --- a/src/gallium/drivers/freedreno/freedreno_util.h +++ b/src/gallium/drivers/freedreno/freedreno_util.h @@ -73,6 +73,7 @@ enum adreno_stencil_op fd_stencil_op(unsigned op); #define FD_DBG_GLSL120 0x0400 #define FD_DBG_SHADERDB 0x0800 #define FD_DBG_FLUSH 0x1000 +#define FD_DBG_NIR 0x2000 extern int fd_mesa_debug; extern bool fd_binning_enabled; diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c index b4e5483..5a53e32 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c @@ -164,7 +164,14 @@ to_nir(struct ir3_compile *ctx, struct ir3_shader_variant *so) tex_options.lower_txp = (1 << GLSL_SAMPLER_DIM_3D); } - struct nir_shader *s = tgsi_to_nir(so->shader->tokens, &options); + struct nir_shader *s; + + if (so->shader->nir) { + // XXX need nir_clone() here.. + s = so->shader->nir; + } else { + s = tgsi_to_nir(so->shader->tokens, &options); + } if (fd_mesa_debug & FD_DBG_OPTMSGS) { debug_printf("----------------------\n"); @@ -292,6 +299,12 @@ compile_error(struct ir3_compile *ctx, const char *format, ...) static void compile_free(struct ir3_compile *ctx) { + /* TODO .. probably need a ralloc_free(ctx->s) here, at least + * for the tgsi_to_nir case.. right now in the case we get + * NIR directly, we want to skip this since the nir_shader isn't + * getting cloned.. and/or if it was we might be wanting to + * free it in ir3_shader_destroy()?? + */ ralloc_free(ctx); } diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.c b/src/gallium/drivers/freedreno/ir3/ir3_shader.c index 7b56533..0cbf8fe 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_shader.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.c @@ -39,6 +39,7 @@ #include "ir3_shader.h" #include "ir3_compiler.h" +#include "ir3_nir.h" static void @@ -188,9 +189,15 @@ create_variant(struct ir3_shader *shader, struct ir3_shader_key key) v->type = shader->type; if (fd_mesa_debug & FD_DBG_DISASM) { - DBG("dump tgsi: type=%d, k={bp=%u,cts=%u,hp=%u}", shader->type, - key.binning_pass, key.color_two_side, key.half_precision); - tgsi_dump(shader->tokens, 0); + if (shader->nir) { + DBG("dump nir: type=%d, k={bp=%u,cts=%u,hp=%u}", shader->type, + key.binning_pass, key.color_two_side, key.half_precision); + nir_print_shader(shader->nir, stderr); + } else { + DBG("dump tgsi: type=%d, k={bp=%u,cts=%u,hp=%u}", shader->type, + key.binning_pass, key.color_two_side, key.half_precision); + tgsi_dump(shader->tokens, 0); + } } ret = ir3_compile_shader_nir(shader->compiler, v); @@ -267,7 +274,9 @@ ir3_shader_destroy(struct ir3_shader *shader) v = v->next; delete_variant(t); } + free((void *)shader->tokens); + /* XXX ralloc_free(shader->nir); */ free(shader); } @@ -281,7 +290,20 @@ ir3_shader_create(struct pipe_context *pctx, shader->id = ++shader->compiler->shader_count; shader->pctx = pctx; shader->type = type; - shader->tokens = tgsi_dup_tokens(cso->tokens); + if (cso->ir == PIPE_SHADER_IR_NIR) { + /* TODO might need nir_clone() here.. Depends a bit on how we + * define the lifecycle of cso->nir. If we could assume that it + * always sticks around until the cso is destroyed, then we'd + * only need to clone in to_nir() (for the variant specific + * lowering), rather than both here and to_nir(). This is a bit + * different from the lifetime of cso->tokens which sometimes + * but not always goes away after the pipe->pipe_create_xyz_state() + * call (which is unfortunate, and maybe worth fixing). + */ + shader->nir = cso->nir; + } else { + shader->tokens = tgsi_dup_tokens(cso->tokens); + } shader->stream_output = cso->stream_output; if (fd_mesa_debug & FD_DBG_SHADERDB) { /* if shader-db run, create a standard variant immediately diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.h b/src/gallium/drivers/freedreno/ir3/ir3_shader.h index 7e2c27d..9ef3277 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_shader.h +++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.h @@ -220,6 +220,8 @@ struct ir3_shader_variant { struct ir3_shader *shader; }; +typedef struct nir_shader nir_shader; + struct ir3_shader { enum shader_t type; @@ -230,6 +232,7 @@ struct ir3_shader { struct ir3_compiler *compiler; struct pipe_context *pctx; + nir_shader *nir; const struct tgsi_token *tokens; struct pipe_stream_output_info stream_output;