<div dir="ltr"><div>Acked-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>></div><div><br></div><div>Marek</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jan 17, 2019 at 1:17 AM Timothy Arceri <<a href="mailto:tarceri@itsqueeze.com">tarceri@itsqueeze.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Currently only add a cache key for a shader once it is linked.<br>
However games like Team Fortress 2 compile a whole bunch of shaders<br>
which are never actually linked. These compiled shaders can take<br>
up a bunch of memory.<br>
<br>
This patch changes things so that we add the key for the shader to<br>
the cache as soon as it is compiled. This means on a warm cache we<br>
can avoid the wasted memory from these shaders. Worst case scenario<br>
is we need to compile the shaders at link time but this can happen<br>
anyway if the shader has been evicted from the cache.<br>
<br>
Reduces memory use in Team Fortress 2 from 1.3GB -> 770MB on a<br>
warm cache from start up to the game menu.<br>
---<br>
 src/compiler/glsl/glsl_parser_extras.cpp | 9 +++++++++<br>
 src/compiler/glsl/shader_cache.cpp       | 7 +------<br>
 2 files changed, 10 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp<br>
index 200df7759b..655399a812 100644<br>
--- a/src/compiler/glsl/glsl_parser_extras.cpp<br>
+++ b/src/compiler/glsl/glsl_parser_extras.cpp<br>
@@ -2155,6 +2155,15 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,<br>
<br>
    delete state->symbols;<br>
    ralloc_free(state);<br>
+<br>
+   if (ctx->Cache) {<br>
+      char sha1_buf[41];<br>
+      disk_cache_put_key(ctx->Cache, shader->sha1);<br>
+      if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {<br>
+         _mesa_sha1_format(sha1_buf, shader->sha1);<br>
+         fprintf(stderr, "marking shader: %s\n", sha1_buf);<br>
+      }<br>
+   }<br>
 }<br>
<br>
 } /* extern "C" */<br>
diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp<br>
index 879511a9d7..581098b88f 100644<br>
--- a/src/compiler/glsl/shader_cache.cpp<br>
+++ b/src/compiler/glsl/shader_cache.cpp<br>
@@ -121,20 +121,15 @@ shader_cache_write_program_metadata(struct gl_context *ctx,<br>
    if (!cache_item_metadata.keys)<br>
       goto fail;<br>
<br>
-   char sha1_buf[41];<br>
    for (unsigned i = 0; i < prog->NumShaders; i++) {<br>
-      disk_cache_put_key(cache, prog->Shaders[i]->sha1);<br>
       memcpy(cache_item_metadata.keys[i], prog->Shaders[i]->sha1,<br>
              sizeof(cache_key));<br>
-      if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {<br>
-         _mesa_sha1_format(sha1_buf, prog->Shaders[i]->sha1);<br>
-         fprintf(stderr, "marking shader: %s\n", sha1_buf);<br>
-      }<br>
    }<br>
<br>
    disk_cache_put(cache, prog->data->sha1, metadata.data, metadata.size,<br>
                   &cache_item_metadata);<br>
<br>
+   char sha1_buf[41];<br>
    if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {<br>
       _mesa_sha1_format(sha1_buf, prog->data->sha1);<br>
       fprintf(stderr, "putting program metadata in cache: %s\n", sha1_buf);<br>
-- <br>
2.20.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>