st/glsl_to_tgsi: store num_tgsi_tokens in st_*_program
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 28 Nov 2017 10:43:12 +0000 (21:43 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Wed, 17 Jan 2018 12:43:28 +0000 (23:43 +1100)
We will need this for ARB_get_program_binary binary support.

Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_program.h
src/mesa/state_tracker/st_shader_cache.c
src/mesa/state_tracker/st_shader_cache.h

index 05e6042f4250ea2a2f44aa5483cd48362ff1eaf5..9f8bf5f76fd4c097c0831b851b3a8b11a7407eeb 100644 (file)
@@ -534,13 +534,12 @@ st_translate_vertex_program(struct st_context *st,
       return false;
    }
 
-   unsigned num_tokens;
-   stvp->tgsi.tokens = ureg_get_tokens(ureg, &num_tokens);
+   stvp->tgsi.tokens = ureg_get_tokens(ureg, &stvp->num_tgsi_tokens);
    ureg_destroy(ureg);
 
    if (stvp->glsl_to_tgsi) {
       stvp->glsl_to_tgsi = NULL;
-      st_store_tgsi_in_disk_cache(st, &stvp->Base, NULL, num_tokens);
+      st_store_tgsi_in_disk_cache(st, &stvp->Base, NULL);
    }
 
    return stvp->tgsi.tokens != NULL;
@@ -992,13 +991,12 @@ st_translate_fragment_program(struct st_context *st,
                                 fs_output_semantic_name,
                                 fs_output_semantic_index);
 
-   unsigned num_tokens;
-   stfp->tgsi.tokens = ureg_get_tokens(ureg, &num_tokens);
+   stfp->tgsi.tokens = ureg_get_tokens(ureg, &stfp->num_tgsi_tokens);
    ureg_destroy(ureg);
 
    if (stfp->glsl_to_tgsi) {
       stfp->glsl_to_tgsi = NULL;
-      st_store_tgsi_in_disk_cache(st, &stfp->Base, NULL, num_tokens);
+      st_store_tgsi_in_disk_cache(st, &stfp->Base, NULL);
    }
 
    return stfp->tgsi.tokens != NULL;
@@ -1400,15 +1398,20 @@ st_translate_program_common(struct st_context *st,
                         output_semantic_name,
                         output_semantic_index);
 
-   unsigned num_tokens;
-   out_state->tokens = ureg_get_tokens(ureg, &num_tokens);
+   if (tgsi_processor == PIPE_SHADER_COMPUTE) {
+      struct st_compute_program *stcp = (struct st_compute_program *) prog;
+      out_state->tokens = ureg_get_tokens(ureg, &stcp->num_tgsi_tokens);
+   } else {
+      struct st_common_program *stcp = (struct st_common_program *) prog;
+      out_state->tokens = ureg_get_tokens(ureg, &stcp->num_tgsi_tokens);
+   }
    ureg_destroy(ureg);
 
    st_translate_stream_output_info(glsl_to_tgsi,
                                    outputMapping,
                                    &out_state->stream_output);
 
-   st_store_tgsi_in_disk_cache(st, prog, out_state, num_tokens);
+   st_store_tgsi_in_disk_cache(st, prog, out_state);
 
    if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
       _mesa_print_program(prog);
index 0e6c8e00c6ef18755f8c037e6767b8d6e535ff37..a520ffbecb4852c611531168ee0ed9427c886949 100644 (file)
@@ -150,6 +150,9 @@ struct st_fragment_program
    struct gl_shader_program *shader_program;
 
    struct st_fp_variant *variants;
+
+   /* Used by the shader cache and ARB_get_program_binary */
+   unsigned num_tgsi_tokens;
 };
 
 
@@ -222,6 +225,9 @@ struct st_vertex_program
 
    /** SHA1 hash of linked tgsi shader program, used for on-disk cache */
    unsigned char sha1[20];
+
+   /* Used by the shader cache and ARB_get_program_binary */
+   unsigned num_tgsi_tokens;
 };
 
 
@@ -264,6 +270,9 @@ struct st_common_program
 
    /** SHA1 hash of linked tgsi shader program, used for on-disk cache */
    unsigned char sha1[20];
+
+   /* Used by the shader cache and ARB_get_program_binary */
+   unsigned num_tgsi_tokens;
 };
 
 
@@ -284,6 +293,9 @@ struct st_compute_program
 
    /** SHA1 hash of linked tgsi shader program, used for on-disk cache */
    unsigned char sha1[20];
+
+   /* Used by the shader cache and ARB_get_program_binary */
+   unsigned num_tgsi_tokens;
 };
 
 
index a5e33133b3c48e0f5185eaa52b4f79b4e77c0c54..a9413fb0534156f4e98857198e81af15a54b1a12 100644 (file)
@@ -56,8 +56,7 @@ write_tgsi_to_cache(struct blob *blob, struct pipe_shader_state *tgsi,
  */
 void
 st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program *prog,
-                            struct pipe_shader_state *out_state,
-                            unsigned num_tokens)
+                            struct pipe_shader_state *out_state)
 {
    if (!st->ctx->Cache)
       return;
@@ -83,24 +82,28 @@ st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program *prog,
                        sizeof(stvp->result_to_output));
 
       write_stream_out_to_cache(&blob, &stvp->tgsi);
-      write_tgsi_to_cache(&blob, &stvp->tgsi, prog, num_tokens);
+      write_tgsi_to_cache(&blob, &stvp->tgsi, prog, stvp->num_tgsi_tokens);
       break;
    }
    case MESA_SHADER_TESS_CTRL:
    case MESA_SHADER_TESS_EVAL:
    case MESA_SHADER_GEOMETRY: {
+      struct st_common_program *stcp = (struct st_common_program *) prog;
+
       write_stream_out_to_cache(&blob, out_state);
-      write_tgsi_to_cache(&blob, out_state, prog, num_tokens);
+      write_tgsi_to_cache(&blob, out_state, prog, stcp->num_tgsi_tokens);
       break;
    }
    case MESA_SHADER_FRAGMENT: {
       struct st_fragment_program *stfp = (struct st_fragment_program *) prog;
 
-      write_tgsi_to_cache(&blob, &stfp->tgsi, prog, num_tokens);
+      write_tgsi_to_cache(&blob, &stfp->tgsi, prog, stfp->num_tgsi_tokens);
       break;
    }
    case MESA_SHADER_COMPUTE: {
-      write_tgsi_to_cache(&blob, out_state, prog, num_tokens);
+      struct st_compute_program *stcp = (struct st_compute_program *) prog;
+
+      write_tgsi_to_cache(&blob, out_state, prog, stcp->num_tgsi_tokens);
       break;
    }
    default:
index 090d7d85cc88ff8b713f3b0cc04eb916be0dae92..7644d437521f4d25adf90916ad95463fe269c1b3 100644 (file)
@@ -38,8 +38,7 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
 
 void
 st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program *prog,
-                            struct pipe_shader_state *out_state,
-                            unsigned num_tokens);
+                            struct pipe_shader_state *out_state);
 
 #ifdef __cplusplus
 }