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; -- 2.5.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev