summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker/st_program.c
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2017-02-01 15:52:27 +1100
committerTimothy Arceri <[email protected]>2017-02-23 09:20:22 +1100
commit9f506d817ee38e421d7ff3f32a28808c685f66da (patch)
tree9393dd4de35b2c73c307cad9dc7487075497a161 /src/mesa/state_tracker/st_program.c
parentb9de1c2e0241f2ded413ac115b83f0f06788206d (diff)
st/mesa: implement a tgsi on-disk shader cache
Implements a tgsi cache for the OpenGL state tracker. V2: add support for compute shaders Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker/st_program.c')
-rw-r--r--src/mesa/state_tracker/st_program.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 3795f25a74e..4d9250b73cc 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -58,6 +58,7 @@
#include "st_mesa_to_tgsi.h"
#include "st_atifs_to_tgsi.h"
#include "st_nir.h"
+#include "st_shader_cache.h"
#include "cso_cache/cso_context.h"
@@ -364,7 +365,6 @@ st_release_cp_variants(struct st_context *st, struct st_compute_program *stcp)
}
}
-
/**
* Translate a vertex program.
*/
@@ -583,7 +583,6 @@ st_translate_vertex_program(struct st_context *st,
&stvp->tgsi.stream_output);
free_glsl_to_tgsi_visitor(stvp->glsl_to_tgsi);
- stvp->glsl_to_tgsi = NULL;
} else
error = st_translate_mesa_program(st->ctx,
PIPE_SHADER_VERTEX,
@@ -608,8 +607,15 @@ st_translate_vertex_program(struct st_context *st,
return false;
}
- stvp->tgsi.tokens = ureg_get_tokens(ureg, NULL);
+ unsigned num_tokens;
+ stvp->tgsi.tokens = ureg_get_tokens(ureg, &num_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);
+ }
+
return stvp->tgsi.tokens != NULL;
}
@@ -1031,7 +1037,6 @@ st_translate_fragment_program(struct st_context *st,
fs_output_semantic_index);
free_glsl_to_tgsi_visitor(stfp->glsl_to_tgsi);
- stfp->glsl_to_tgsi = NULL;
} else if (stfp->ati_fs)
st_translate_atifs_program(ureg,
stfp->ati_fs,
@@ -1064,8 +1069,15 @@ st_translate_fragment_program(struct st_context *st,
fs_output_semantic_name,
fs_output_semantic_index);
- stfp->tgsi.tokens = ureg_get_tokens(ureg, NULL);
+ unsigned num_tokens;
+ stfp->tgsi.tokens = ureg_get_tokens(ureg, &num_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);
+ }
+
return stfp->tgsi.tokens != NULL;
}
@@ -1600,13 +1612,16 @@ st_translate_program_common(struct st_context *st,
output_semantic_name,
output_semantic_index);
- out_state->tokens = ureg_get_tokens(ureg, NULL);
+ unsigned num_tokens;
+ out_state->tokens = ureg_get_tokens(ureg, &num_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);
+
if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
_mesa_print_program(prog);
debug_printf("\n");