r600/radeonsi: enable glsl/tgsi on-disk cache
[mesa.git] / src / gallium / drivers / radeon / r600_pipe_common.c
index 51137655faef8ae400f990ede147224eca41708b..bae6d6fb3dab3a87fc73491bd0f86c191c43dc5d 100644 (file)
 #define HAVE_LLVM 0
 #endif
 
+#if HAVE_LLVM
+#include <llvm-c/TargetMachine.h>
+#endif
+
 #ifndef MESA_LLVM_VERSION_PATCH
 #define MESA_LLVM_VERSION_PATCH 0
 #endif
@@ -193,7 +197,9 @@ void r600_draw_rectangle(struct blitter_context *blitter,
        /* Upload vertices. The hw rectangle has only 3 vertices,
         * I guess the 4th one is derived from the first 3.
         * The vertex specification should match u_blitter's vertex element state. */
-       u_upload_alloc(rctx->uploader, 0, sizeof(float) * 24, 256, &offset, &buf, (void**)&vb);
+       u_upload_alloc(rctx->b.stream_uploader, 0, sizeof(float) * 24,
+                      rctx->screen->info.tcc_cache_line_size,
+                       &offset, &buf, (void**)&vb);
        if (!buf)
                return;
 
@@ -561,13 +567,6 @@ bool r600_common_context_init(struct r600_common_context *rctx,
        rctx->family = rscreen->family;
        rctx->chip_class = rscreen->chip_class;
 
-       if (rscreen->chip_class >= CIK)
-               rctx->max_db = MAX2(8, rscreen->info.num_render_backends);
-       else if (rscreen->chip_class >= EVERGREEN)
-               rctx->max_db = 8;
-       else
-               rctx->max_db = 4;
-
        rctx->b.invalidate_resource = r600_invalidate_resource;
        rctx->b.transfer_map = u_transfer_map_vtbl;
        rctx->b.transfer_flush_region = u_transfer_flush_region_vtbl;
@@ -604,14 +603,18 @@ bool r600_common_context_init(struct r600_common_context *rctx,
 
        rctx->allocator_zeroed_memory =
                u_suballocator_create(&rctx->b, rscreen->info.gart_page_size,
-                                     0, PIPE_USAGE_DEFAULT, true);
+                                     0, PIPE_USAGE_DEFAULT, 0, true);
        if (!rctx->allocator_zeroed_memory)
                return false;
 
-       rctx->uploader = u_upload_create(&rctx->b, 1024 * 1024,
-                                       PIPE_BIND_INDEX_BUFFER |
-                                       PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STREAM);
-       if (!rctx->uploader)
+       rctx->b.stream_uploader = u_upload_create(&rctx->b, 1024 * 1024,
+                                                 0, PIPE_USAGE_STREAM);
+       if (!rctx->b.stream_uploader)
+               return false;
+
+       rctx->b.const_uploader = u_upload_create(&rctx->b, 128 * 1024,
+                                                0, PIPE_USAGE_DEFAULT);
+       if (!rctx->b.const_uploader)
                return false;
 
        rctx->ctx = rctx->ws->ctx_create(rctx->ws);
@@ -654,9 +657,10 @@ void r600_common_context_cleanup(struct r600_common_context *rctx)
        if (rctx->ctx)
                rctx->ws->ctx_destroy(rctx->ctx);
 
-       if (rctx->uploader) {
-               u_upload_destroy(rctx->uploader);
-       }
+       if (rctx->b.stream_uploader)
+               u_upload_destroy(rctx->b.stream_uploader);
+       if (rctx->b.const_uploader)
+               u_upload_destroy(rctx->b.const_uploader);
 
        slab_destroy_child(&rctx->pool_transfers);
 
@@ -779,6 +783,41 @@ static const char* r600_get_chip_name(struct r600_common_screen *rscreen)
        }
 }
 
+static void r600_disk_cache_create(struct r600_common_screen *rscreen)
+{
+       uint32_t mesa_timestamp;
+       if (disk_cache_get_function_timestamp(r600_disk_cache_create,
+                                             &mesa_timestamp)) {
+               char *timestamp_str;
+               int res = -1;
+               if (rscreen->chip_class < SI) {
+                       res = asprintf(&timestamp_str, "%u",mesa_timestamp);
+               }
+#if HAVE_LLVM
+               else {
+                       uint32_t llvm_timestamp;
+                       if (disk_cache_get_function_timestamp(LLVMInitializeAMDGPUTargetInfo,
+                                                             &llvm_timestamp)) {
+                               res = asprintf(&timestamp_str, "%u_%u",
+                                              mesa_timestamp, llvm_timestamp);
+                       }
+               }
+#endif
+               if (res != -1) {
+                       rscreen->disk_shader_cache =
+                               disk_cache_create(r600_get_chip_name(rscreen),
+                                                 timestamp_str);
+                       free(timestamp_str);
+               }
+       }
+}
+
+static struct disk_cache *r600_get_disk_shader_cache(struct pipe_screen *pscreen)
+{
+       struct r600_common_screen *rscreen = (struct r600_common_screen*)pscreen;
+       return rscreen->disk_shader_cache;
+}
+
 static const char* r600_get_name(struct pipe_screen* pscreen)
 {
        struct r600_common_screen *rscreen = (struct r600_common_screen*)pscreen;
@@ -1234,6 +1273,7 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen,
        rscreen->b.get_name = r600_get_name;
        rscreen->b.get_vendor = r600_get_vendor;
        rscreen->b.get_device_vendor = r600_get_device_vendor;
+       rscreen->b.get_disk_shader_cache = r600_get_disk_shader_cache;
        rscreen->b.get_compute_param = r600_get_compute_param;
        rscreen->b.get_paramf = r600_get_paramf;
        rscreen->b.get_timestamp = r600_get_timestamp;
@@ -1259,6 +1299,8 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen,
        rscreen->chip_class = rscreen->info.chip_class;
        rscreen->debug_flags = debug_get_flags_option("R600_DEBUG", common_debug_options, 0);
 
+       r600_disk_cache_create(rscreen);
+
        slab_create_parent(&rscreen->pool_transfers, sizeof(struct r600_transfer), 64);
 
        rscreen->force_aniso = MIN2(16, debug_get_num_option("R600_TEX_ANISO", -1));
@@ -1279,6 +1321,7 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen,
                printf("chip_class = %i\n", rscreen->info.chip_class);
                printf("gart_size = %i MB\n", (int)DIV_ROUND_UP(rscreen->info.gart_size, 1024*1024));
                printf("vram_size = %i MB\n", (int)DIV_ROUND_UP(rscreen->info.vram_size, 1024*1024));
+               printf("vram_vis_size = %i MB\n", (int)DIV_ROUND_UP(rscreen->info.vram_vis_size, 1024*1024));
                printf("max_alloc_size = %i MB\n",
                       (int)DIV_ROUND_UP(rscreen->info.max_alloc_size, 1024*1024));
                printf("has_virtual_memory = %i\n", rscreen->info.has_virtual_memory);
@@ -1307,6 +1350,7 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen,
                printf("num_render_backends = %i\n", rscreen->info.num_render_backends);
                printf("num_tile_pipes = %i\n", rscreen->info.num_tile_pipes);
                printf("pipe_interleave_bytes = %i\n", rscreen->info.pipe_interleave_bytes);
+               printf("enabled_rb_mask = 0x%x\n", rscreen->info.enabled_rb_mask);
        }
        return true;
 }
@@ -1322,6 +1366,7 @@ void r600_destroy_common_screen(struct r600_common_screen *rscreen)
 
        slab_destroy_parent(&rscreen->pool_transfers);
 
+       disk_cache_destroy(rscreen->disk_shader_cache);
        rscreen->ws->destroy(rscreen->ws);
        FREE(rscreen);
 }