Mesa (main): mesa/arbprog: Move the GLSLFragCoordIsSysVal handling to prog_to_nir.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jul 16 04:30:59 UTC 2022


Module: Mesa
Branch: main
Commit: 153f7b8852c1984c65340b7edd587fe1f4927660
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=153f7b8852c1984c65340b7edd587fe1f4927660

Author: Emma Anholt <emma at anholt.net>
Date:   Wed Jul 13 12:29:30 2022 -0700

mesa/arbprog: Move the GLSLFragCoordIsSysVal handling to prog_to_nir.

We don't need to go grubbing around in the ARB program when we can use the
right variable type at prog_to_nir time.  This does leave
fp->system_values_read/inputs_read as they were, but I don't see anywhere
that that matters (the NIR will have its info gathered appropriately, and
other lowering may also cause mismatch between the gl_program and the
NIR).

Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17528>

---

 src/mesa/program/prog_to_nir.c      | 15 ++++++++++++++-
 src/mesa/program/prog_to_nir.h      |  2 +-
 src/mesa/program/programopt.c       | 27 ---------------------------
 src/mesa/program/programopt.h       |  3 ---
 src/mesa/state_tracker/st_program.c |  4 +---
 5 files changed, 16 insertions(+), 35 deletions(-)

diff --git a/src/mesa/program/prog_to_nir.c b/src/mesa/program/prog_to_nir.c
index 5cd073d565e..16116f62ec3 100644
--- a/src/mesa/program/prog_to_nir.c
+++ b/src/mesa/program/prog_to_nir.c
@@ -27,6 +27,7 @@
 #include "compiler/nir/nir_builder.h"
 #include "compiler/glsl/list.h"
 
+#include "main/mtypes.h"
 #include "main/shader_types.h"
 #include "util/ralloc.h"
 
@@ -45,6 +46,7 @@
  */
 
 struct ptn_compile {
+   const struct gl_context *ctx;
    const struct gl_program *prog;
    nir_builder build;
    bool error;
@@ -866,6 +868,16 @@ setup_registers_and_variables(struct ptn_compile *c)
    while (inputs_read) {
       const int i = u_bit_scan64(&inputs_read);
 
+      if (c->ctx->Const.GLSLFragCoordIsSysVal &&
+          shader->info.stage == MESA_SHADER_FRAGMENT &&
+          i == VARYING_SLOT_POS) {
+         nir_variable *var = nir_variable_create(shader, nir_var_system_value, glsl_vec4_type(),
+                                                 "frag_coord");
+         var->data.location = SYSTEM_VALUE_FRAG_COORD;
+         c->input_vars[i] = var;
+         continue;
+      }
+
       nir_variable *var =
          nir_variable_create(shader, nir_var_shader_in, glsl_vec4_type(),
                              ralloc_asprintf(shader, "in_%d", i));
@@ -974,7 +986,7 @@ setup_registers_and_variables(struct ptn_compile *c)
 }
 
 struct nir_shader *
-prog_to_nir(const struct gl_program *prog,
+prog_to_nir(const struct gl_context *ctx, const struct gl_program *prog,
             const nir_shader_compiler_options *options)
 {
    struct ptn_compile *c;
@@ -985,6 +997,7 @@ prog_to_nir(const struct gl_program *prog,
    if (!c)
       return NULL;
    c->prog = prog;
+   c->ctx = ctx;
 
    c->build = nir_builder_init_simple_shader(stage, options, NULL);
 
diff --git a/src/mesa/program/prog_to_nir.h b/src/mesa/program/prog_to_nir.h
index aab0d835069..ad7c8e70c7f 100644
--- a/src/mesa/program/prog_to_nir.h
+++ b/src/mesa/program/prog_to_nir.h
@@ -30,7 +30,7 @@
 extern "C" {
 #endif
 
-struct nir_shader *prog_to_nir(const struct gl_program *prog,
+struct nir_shader *prog_to_nir(const struct gl_context *ctx, const struct gl_program *prog,
                                const nir_shader_compiler_options *options);
 
 enum glsl_sampler_dim _mesa_texture_index_to_sampler_dim(gl_texture_index index,
diff --git a/src/mesa/program/programopt.c b/src/mesa/program/programopt.c
index 4937b19bbdd..201281045f3 100644
--- a/src/mesa/program/programopt.c
+++ b/src/mesa/program/programopt.c
@@ -506,30 +506,3 @@ _mesa_remove_output_reads(struct gl_program *prog, gl_register_file type)
       }
    }
 }
-
-void
-_mesa_program_fragment_position_to_sysval(struct gl_program *prog)
-{
-   GLuint i;
-
-   if (prog->Target != GL_FRAGMENT_PROGRAM_ARB ||
-       !(prog->info.inputs_read & BITFIELD64_BIT(VARYING_SLOT_POS)))
-      return;
-
-   prog->info.inputs_read &= ~BITFIELD64_BIT(VARYING_SLOT_POS);
-   BITSET_SET(prog->info.system_values_read, SYSTEM_VALUE_FRAG_COORD);
-
-   for (i = 0; i < prog->arb.NumInstructions; i++) {
-      struct prog_instruction *inst = prog->arb.Instructions + i;
-      const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode);
-      GLuint j;
-
-      for (j = 0; j < numSrc; j++) {
-         if (inst->SrcReg[j].File == PROGRAM_INPUT &&
-             inst->SrcReg[j].Index == VARYING_SLOT_POS) {
-            inst->SrcReg[j].File = PROGRAM_SYSTEM_VALUE;
-            inst->SrcReg[j].Index = SYSTEM_VALUE_FRAG_COORD;
-         }
-      }
-   }
-}
diff --git a/src/mesa/program/programopt.h b/src/mesa/program/programopt.h
index 376a339aea2..8d09987519c 100644
--- a/src/mesa/program/programopt.h
+++ b/src/mesa/program/programopt.h
@@ -47,9 +47,6 @@ _mesa_append_fog_code(struct gl_context *ctx, struct gl_program *fprog,
 extern void
 _mesa_remove_output_reads(struct gl_program *prog, gl_register_file type);
 
-extern void
-_mesa_program_fragment_position_to_sysval(struct gl_program *prog);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 955efccfa77..5420d080625 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -407,7 +407,7 @@ st_translate_prog_to_nir(struct st_context *st, struct gl_program *prog,
       st_get_nir_compiler_options(st, prog->info.stage);
 
    /* Translate to NIR */
-   nir_shader *nir = prog_to_nir(prog, options);
+   nir_shader *nir = prog_to_nir(st->ctx, prog, options);
 
    st_prog_to_nir_postprocess(st, nir, prog);
 
@@ -824,8 +824,6 @@ st_translate_fragment_program(struct st_context *st,
 {
    /* Non-GLSL programs: */
    _mesa_remove_output_reads(fp, PROGRAM_OUTPUT);
-   if (st->ctx->Const.GLSLFragCoordIsSysVal)
-      _mesa_program_fragment_position_to_sysval(fp);
 
    /* This determines which states will be updated when the assembly
     * shader is bound.



More information about the mesa-commit mailing list