nv50,nvc0: Use ttn for tgsi shaders by default
authorM Henning <drawoc@darkrefraction.com>
Tue, 4 Apr 2023 05:54:40 +0000 (01:54 -0400)
committerMarge Bot <emma+marge@anholt.net>
Tue, 25 Apr 2023 03:46:34 +0000 (03:46 +0000)
Reviewed-by: Emma Anholt <emma@anholt.net>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22537>

src/gallium/drivers/nouveau/nv50/nv50_state.c
src/gallium/drivers/nouveau/nvc0/nvc0_state.c

index d2a870d..7ac4915 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "tgsi/tgsi_parse.h"
 #include "compiler/nir/nir.h"
+#include "nir/tgsi_to_nir.h"
 
 #include "nv50/nv50_stateobj.h"
 #include "nv50/nv50_context.h"
@@ -740,6 +741,7 @@ nv50_sp_state_create(struct pipe_context *pipe,
                      enum pipe_shader_type type)
 {
    struct nv50_program *prog;
+   const struct nouveau_screen *screen = nouveau_screen(pipe->screen);
 
    prog = CALLOC_STRUCT(nv50_program);
    if (!prog)
@@ -750,7 +752,12 @@ nv50_sp_state_create(struct pipe_context *pipe,
 
    switch (cso->type) {
    case PIPE_SHADER_IR_TGSI:
-      prog->pipe.tokens = tgsi_dup_tokens(cso->tokens);
+      if (screen->prefer_nir) {
+         prog->pipe.type = PIPE_SHADER_IR_NIR;
+         prog->pipe.ir.nir = tgsi_to_nir(cso->tokens, pipe->screen, false);
+      } else {
+         prog->pipe.tokens = tgsi_dup_tokens(cso->tokens);
+      }
       break;
    case PIPE_SHADER_IR_NIR:
       prog->pipe.ir.nir = cso->ir.nir;
@@ -841,6 +848,7 @@ nv50_cp_state_create(struct pipe_context *pipe,
                      const struct pipe_compute_state *cso)
 {
    struct nv50_program *prog;
+   const struct nouveau_screen *screen = nouveau_screen(pipe->screen);
 
    prog = CALLOC_STRUCT(nv50_program);
    if (!prog)
@@ -849,9 +857,16 @@ nv50_cp_state_create(struct pipe_context *pipe,
    prog->pipe.type = cso->ir_type;
 
    switch(cso->ir_type) {
-   case PIPE_SHADER_IR_TGSI:
-      prog->pipe.tokens = tgsi_dup_tokens((const struct tgsi_token *)cso->prog);
+   case PIPE_SHADER_IR_TGSI: {
+      const struct tgsi_token *tokens = cso->prog;
+      if (screen->prefer_nir) {
+         prog->pipe.type = PIPE_SHADER_IR_NIR;
+         prog->pipe.ir.nir = tgsi_to_nir(tokens, pipe->screen, false);
+      } else {
+         prog->pipe.tokens = tgsi_dup_tokens(tokens);
+      }
       break;
+   }
    case PIPE_SHADER_IR_NIR:
       prog->pipe.ir.nir = (nir_shader *)cso->prog;
       break;
index 7141a99..b40dfc3 100644 (file)
@@ -29,6 +29,7 @@
 #include "tgsi/tgsi_parse.h"
 #include "compiler/nir/nir.h"
 #include "compiler/nir/nir_serialize.h"
+#include "nir/tgsi_to_nir.h"
 
 #include "nvc0/nvc0_stateobj.h"
 #include "nvc0/nvc0_context.h"
@@ -600,6 +601,7 @@ nvc0_sp_state_create(struct pipe_context *pipe,
                      const struct pipe_shader_state *cso, unsigned type)
 {
    struct nvc0_program *prog;
+   const struct nouveau_screen *screen = nouveau_screen(pipe->screen);
 
    prog = CALLOC_STRUCT(nvc0_program);
    if (!prog)
@@ -610,7 +612,12 @@ nvc0_sp_state_create(struct pipe_context *pipe,
 
    switch(cso->type) {
    case PIPE_SHADER_IR_TGSI:
-      prog->pipe.tokens = tgsi_dup_tokens(cso->tokens);
+      if (screen->prefer_nir) {
+         prog->pipe.type = PIPE_SHADER_IR_NIR;
+         prog->pipe.ir.nir = tgsi_to_nir(cso->tokens, pipe->screen, false);
+      } else {
+         prog->pipe.tokens = tgsi_dup_tokens(cso->tokens);
+      }
       break;
    case PIPE_SHADER_IR_NIR:
       prog->pipe.ir.nir = cso->ir.nir;
@@ -734,6 +741,7 @@ nvc0_cp_state_create(struct pipe_context *pipe,
                      const struct pipe_compute_state *cso)
 {
    struct nvc0_program *prog;
+   const struct nouveau_screen *screen = nouveau_screen(pipe->screen);
 
    prog = CALLOC_STRUCT(nvc0_program);
    if (!prog)
@@ -745,9 +753,16 @@ nvc0_cp_state_create(struct pipe_context *pipe,
    prog->parm_size = cso->req_input_mem;
 
    switch(cso->ir_type) {
-   case PIPE_SHADER_IR_TGSI:
-      prog->pipe.tokens = tgsi_dup_tokens((const struct tgsi_token *)cso->prog);
+   case PIPE_SHADER_IR_TGSI: {
+      const struct tgsi_token *tokens = cso->prog;
+      if (screen->prefer_nir) {
+         prog->pipe.type = PIPE_SHADER_IR_NIR;
+         prog->pipe.ir.nir = tgsi_to_nir(tokens, pipe->screen, false);
+      } else {
+         prog->pipe.tokens = tgsi_dup_tokens(tokens);
+      }
       break;
+   }
    case PIPE_SHADER_IR_NIR:
       prog->pipe.ir.nir = (nir_shader *)cso->prog;
       break;