st/glsl: merge link_shader() into st_link_nir()
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 5 Jul 2023 02:31:30 +0000 (12:31 +1000)
committerMarge Bot <emma+marge@anholt.net>
Thu, 6 Jul 2023 01:21:07 +0000 (01:21 +0000)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22846>

src/mesa/state_tracker/st_glsl_to_ir.cpp
src/mesa/state_tracker/st_glsl_to_nir.cpp

index a4c43a7..2f1fe54 100644 (file)
 #include "main/shaderapi.h"
 #include "main/shaderobj.h"
 
-static GLboolean
-link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
-{
-   GLboolean ret;
-   struct st_context *sctx = st_context(ctx);
-   struct pipe_screen *pscreen = sctx->screen;
-
-   /* Return early if we are loading the shader from on-disk cache */
-   if (st_load_nir_from_disk_cache(ctx, prog)) {
-      return GL_TRUE;
-   }
-
-   MESA_TRACE_FUNC();
-
-   assert(prog->data->LinkStatus);
-
-   /* Skip the GLSL steps when using SPIR-V. */
-   if (prog->data->spirv) {
-      return st_link_nir(ctx, prog);
-   }
-
-   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
-      if (prog->_LinkedShaders[i] == NULL)
-         continue;
-
-      struct gl_linked_shader *shader = prog->_LinkedShaders[i];
-      exec_list *ir = shader->ir;
-      gl_shader_stage stage = shader->Stage;
-      const struct gl_shader_compiler_options *options =
-            &ctx->Const.ShaderCompilerOptions[stage];
-
-      enum pipe_shader_type ptarget = pipe_shader_type_from_mesa(stage);
-      bool have_dround = pscreen->get_shader_param(pscreen, ptarget,
-                                                   PIPE_SHADER_CAP_DROUND_SUPPORTED);
-
-      if (!pscreen->get_param(pscreen, PIPE_CAP_INT64_DIVMOD))
-         lower_64bit_integer_instructions(ir, DIV64 | MOD64);
-
-      lower_packing_builtins(ir, ctx->Extensions.ARB_shading_language_packing,
-                             ctx->Extensions.ARB_gpu_shader5,
-                             ctx->st->has_half_float_packing);
-      do_mat_op_to_vec(ir);
-
-      lower_instructions(ir, have_dround,
-                         ctx->Extensions.ARB_gpu_shader5);
-
-      do_vec_index_to_cond_assign(ir);
-      if (options->MaxIfDepth == 0) {
-         lower_discard(ir);
-      }
-
-      validate_ir_tree(ir);
-   }
-
-   ret = st_link_nir(ctx, prog);
-
-   return ret;
-}
-
 extern "C" {
 
 /**
@@ -109,7 +50,7 @@ st_link_glsl_to_nir(struct gl_context *ctx, struct gl_shader_program *prog)
 
    MESA_TRACE_FUNC();
 
-   GLboolean ret = link_shader(ctx, prog);
+   GLboolean ret = st_link_nir(ctx, prog);
     
    if (pctx->link_shader) {
       void *driver_handles[PIPE_SHADER_TYPES];
index 079cedf..f7ccf6b 100644 (file)
@@ -486,11 +486,55 @@ st_link_nir(struct gl_context *ctx,
             struct gl_shader_program *shader_program)
 {
    struct st_context *st = st_context(ctx);
+   struct pipe_screen *pscreen = st->screen;
    struct gl_linked_shader *linked_shader[MESA_SHADER_STAGES];
    unsigned num_shaders = 0;
 
+   /* Return early if we are loading the shader from on-disk cache */
+   if (st_load_nir_from_disk_cache(ctx, shader_program)) {
+      return GL_TRUE;
+   }
+
    MESA_TRACE_FUNC();
 
+   assert(shader_program->data->LinkStatus);
+
+   /* Skip the GLSL steps when using SPIR-V. */
+   if (!shader_program->data->spirv) {
+      for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+         if (shader_program->_LinkedShaders[i] == NULL)
+            continue;
+
+         struct gl_linked_shader *shader = shader_program->_LinkedShaders[i];
+         exec_list *ir = shader->ir;
+         gl_shader_stage stage = shader->Stage;
+         const struct gl_shader_compiler_options *options =
+               &ctx->Const.ShaderCompilerOptions[stage];
+
+         enum pipe_shader_type ptarget = pipe_shader_type_from_mesa(stage);
+         bool have_dround = pscreen->get_shader_param(pscreen, ptarget,
+                                                      PIPE_SHADER_CAP_DROUND_SUPPORTED);
+
+         if (!pscreen->get_param(pscreen, PIPE_CAP_INT64_DIVMOD))
+            lower_64bit_integer_instructions(ir, DIV64 | MOD64);
+
+         lower_packing_builtins(ir, ctx->Extensions.ARB_shading_language_packing,
+                                ctx->Extensions.ARB_gpu_shader5,
+                                ctx->st->has_half_float_packing);
+         do_mat_op_to_vec(ir);
+
+         lower_instructions(ir, have_dround,
+                            ctx->Extensions.ARB_gpu_shader5);
+
+         do_vec_index_to_cond_assign(ir);
+         if (options->MaxIfDepth == 0) {
+            lower_discard(ir);
+         }
+
+         validate_ir_tree(ir);
+      }
+   }
+
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
       if (shader_program->_LinkedShaders[i])
          linked_shader[num_shaders++] = shader_program->_LinkedShaders[i];