vk: Implement a basic pipeline cache
authorKristian Høgsberg Kristensen <krh@owl.jf.intel.com>
Tue, 5 Jan 2016 20:00:54 +0000 (12:00 -0800)
committerKristian Høgsberg Kristensen <krh@owl.jf.intel.com>
Tue, 5 Jan 2016 20:03:21 +0000 (12:03 -0800)
This is not really a cache yet, but it allows us to share one state
stream for all pipelines, which means we can bump the block size without
wasting a lot of memory.

src/vulkan/anv_device.c
src/vulkan/anv_meta.c
src/vulkan/anv_meta_clear.c
src/vulkan/anv_pipeline.c
src/vulkan/anv_private.h
src/vulkan/gen7_pipeline.c
src/vulkan/gen8_pipeline.c

index 30ab0b2e739a4d09e4c6f18f87635aa0a2fe90cf..74b813e9e4022d98bc476c2d4aac31e992bb7a40 100644 (file)
@@ -723,7 +723,9 @@ VkResult anv_CreateDevice(
    anv_state_pool_init(&device->dynamic_state_pool,
                        &device->dynamic_state_block_pool);
 
-   anv_block_pool_init(&device->instruction_block_pool, device, 8192);
+   anv_block_pool_init(&device->instruction_block_pool, device, 64 * 1024);
+   anv_pipeline_cache_init(&device->default_pipeline_cache, device);
+
    anv_block_pool_init(&device->surface_state_block_pool, device, 4096);
 
    anv_state_pool_init(&device->surface_state_pool,
index bb37899ce3756f59de80b2cfcd96c36fe16162ee..75473a1b18cb8c1c30c045b2b281cc7ac1a8680b 100644 (file)
@@ -392,6 +392,7 @@ anv_device_init_meta_blit_state(struct anv_device *device)
 
    pipeline_shader_stages[1].module = anv_shader_module_to_handle(&fs_2d);
    result = anv_graphics_pipeline_create(anv_device_to_handle(device),
+      VK_NULL_HANDLE,
       &vk_pipeline_info, &anv_pipeline_info,
       NULL, &device->meta_state.blit.pipeline_2d_src);
    if (result != VK_SUCCESS)
@@ -399,6 +400,7 @@ anv_device_init_meta_blit_state(struct anv_device *device)
 
    pipeline_shader_stages[1].module = anv_shader_module_to_handle(&fs_3d);
    result = anv_graphics_pipeline_create(anv_device_to_handle(device),
+      VK_NULL_HANDLE,
       &vk_pipeline_info, &anv_pipeline_info,
       NULL, &device->meta_state.blit.pipeline_3d_src);
    if (result != VK_SUCCESS)
index 6873c4e8e6b2a8bf3537a775327e1539736c5294..1a4300c07e329440b9359a75f830d0fa1171c721 100644 (file)
@@ -130,6 +130,7 @@ create_pipeline(struct anv_device *device,
 
    VkPipeline pipeline_h;
    result = anv_graphics_pipeline_create(device_h,
+      VK_NULL_HANDLE,
       &(VkGraphicsPipelineCreateInfo) {
          .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
          .stageCount = 2,
index ad47f9661e4792445bd8ab573bb752c10eb320ee..97ad96b46bd9e61ac8a62656cac79a48e61ab315 100644 (file)
@@ -146,15 +146,67 @@ anv_shader_compile_to_nir(struct anv_device *device,
    return nir;
 }
 
+void
+anv_pipeline_cache_init(struct anv_pipeline_cache *cache,
+                        struct anv_device *device)
+{
+   cache->device = device;
+   anv_state_stream_init(&cache->program_stream,
+                         &device->instruction_block_pool);
+   pthread_mutex_init(&cache->mutex, NULL);
+}
+
+void
+anv_pipeline_cache_finish(struct anv_pipeline_cache *cache)
+{
+   anv_state_stream_finish(&cache->program_stream);
+   pthread_mutex_destroy(&cache->mutex);
+}
+
+static uint32_t
+anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache,
+                                 const void *data, size_t size)
+{
+   pthread_mutex_lock(&cache->mutex);
+
+   struct anv_state state =
+      anv_state_stream_alloc(&cache->program_stream, size, 64);
+
+   pthread_mutex_unlock(&cache->mutex);
+
+   assert(size < cache->program_stream.block_pool->block_size);
+
+   memcpy(state.map, data, size);
+
+   if (!cache->device->info.has_llc)
+      anv_state_clflush(state);
+
+   return state.offset;
+}
+
 VkResult anv_CreatePipelineCache(
-    VkDevice                                    device,
+    VkDevice                                    _device,
     const VkPipelineCacheCreateInfo*            pCreateInfo,
     const VkAllocationCallbacks*                pAllocator,
     VkPipelineCache*                            pPipelineCache)
 {
-   *pPipelineCache = (VkPipelineCache)1;
+   ANV_FROM_HANDLE(anv_device, device, _device);
+   struct anv_pipeline_cache *cache;
 
-   stub_return(VK_SUCCESS);
+   assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO);
+   assert(pCreateInfo->flags == 0);
+
+   cache = anv_alloc2(&device->alloc, pAllocator,
+                       sizeof(*cache), 8,
+                       VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+   if (cache == NULL)
+      return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
+
+   anv_pipeline_cache_init(cache, device);
+
+   *pPipelineCache = anv_pipeline_cache_to_handle(cache);
+
+   return VK_SUCCESS;
 }
 
 void anv_DestroyPipelineCache(
@@ -162,6 +214,12 @@ void anv_DestroyPipelineCache(
     VkPipelineCache                             _cache,
     const VkAllocationCallbacks*                pAllocator)
 {
+   ANV_FROM_HANDLE(anv_device, device, _device);
+   ANV_FROM_HANDLE(anv_pipeline_cache, cache, _cache);
+
+   anv_pipeline_cache_finish(cache);
+
+   anv_free2(&device->alloc, pAllocator, cache);
 }
 
 VkResult anv_GetPipelineCacheData(
@@ -171,7 +229,8 @@ VkResult anv_GetPipelineCacheData(
     void*                                       pData)
 {
    *pDataSize = 0;
-   stub_return(VK_SUCCESS);
+
+   return VK_SUCCESS;
 }
 
 VkResult anv_MergePipelineCaches(
@@ -193,7 +252,6 @@ void anv_DestroyPipeline(
 
    anv_reloc_list_finish(&pipeline->batch_relocs,
                          pAllocator ? pAllocator : &device->alloc);
-   anv_state_stream_finish(&pipeline->program_stream);
    if (pipeline->blend_state.map)
       anv_state_pool_free(&device->dynamic_state_pool, pipeline->blend_state);
    anv_free2(&device->alloc, pAllocator, pipeline);
@@ -390,23 +448,6 @@ anv_pipeline_compile(struct anv_pipeline *pipeline,
    return nir;
 }
 
-static uint32_t
-anv_pipeline_upload_kernel(struct anv_pipeline *pipeline,
-                           const void *data, size_t size)
-{
-   struct anv_state state =
-      anv_state_stream_alloc(&pipeline->program_stream, size, 64);
-
-   assert(size < pipeline->program_stream.block_pool->block_size);
-
-   memcpy(state.map, data, size);
-
-   if (!pipeline->device->info.has_llc)
-      anv_state_clflush(state);
-
-   return state.offset;
-}
-
 static void
 anv_pipeline_add_compiled_stage(struct anv_pipeline *pipeline,
                                 gl_shader_stage stage,
@@ -432,6 +473,7 @@ anv_pipeline_add_compiled_stage(struct anv_pipeline *pipeline,
 
 static VkResult
 anv_pipeline_compile_vs(struct anv_pipeline *pipeline,
+                        struct anv_pipeline_cache *cache,
                         const VkGraphicsPipelineCreateInfo *info,
                         struct anv_shader_module *module,
                         const char *entrypoint)
@@ -476,7 +518,7 @@ anv_pipeline_compile_vs(struct anv_pipeline *pipeline,
    }
 
    const uint32_t offset =
-      anv_pipeline_upload_kernel(pipeline, shader_code, code_size);
+      anv_pipeline_cache_upload_kernel(cache, shader_code, code_size);
    if (prog_data->base.dispatch_mode == DISPATCH_MODE_SIMD8) {
       pipeline->vs_simd8 = offset;
       pipeline->vs_vec4 = NO_KERNEL;
@@ -495,6 +537,7 @@ anv_pipeline_compile_vs(struct anv_pipeline *pipeline,
 
 static VkResult
 anv_pipeline_compile_gs(struct anv_pipeline *pipeline,
+                        struct anv_pipeline_cache *cache,
                         const VkGraphicsPipelineCreateInfo *info,
                         struct anv_shader_module *module,
                         const char *entrypoint)
@@ -537,7 +580,7 @@ anv_pipeline_compile_gs(struct anv_pipeline *pipeline,
 
    /* TODO: SIMD8 GS */
    pipeline->gs_kernel =
-      anv_pipeline_upload_kernel(pipeline, shader_code, code_size);
+      anv_pipeline_cache_upload_kernel(cache, shader_code, code_size);
    pipeline->gs_vertex_count = nir->info.gs.vertices_in;
 
    ralloc_free(mem_ctx);
@@ -550,6 +593,7 @@ anv_pipeline_compile_gs(struct anv_pipeline *pipeline,
 
 static VkResult
 anv_pipeline_compile_fs(struct anv_pipeline *pipeline,
+                        struct anv_pipeline_cache *cache,
                         const VkGraphicsPipelineCreateInfo *info,
                         struct anv_shader_module *module,
                         const char *entrypoint)
@@ -590,8 +634,8 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline,
       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
    }
 
-   uint32_t offset = anv_pipeline_upload_kernel(pipeline,
-                                                shader_code, code_size);
+   uint32_t offset =
+      anv_pipeline_cache_upload_kernel(cache, shader_code, code_size);
    if (prog_data->no_8)
       pipeline->ps_simd8 = NO_KERNEL;
    else
@@ -627,6 +671,7 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline,
 
 VkResult
 anv_pipeline_compile_cs(struct anv_pipeline *pipeline,
+                        struct anv_pipeline_cache *cache,
                         const VkComputePipelineCreateInfo *info,
                         struct anv_shader_module *module,
                         const char *entrypoint)
@@ -664,8 +709,8 @@ anv_pipeline_compile_cs(struct anv_pipeline *pipeline,
       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
    }
 
-   pipeline->cs_simd = anv_pipeline_upload_kernel(pipeline,
-                                                  shader_code, code_size);
+   pipeline->cs_simd =
+      anv_pipeline_cache_upload_kernel(cache, shader_code, code_size);
    ralloc_free(mem_ctx);
 
    anv_pipeline_add_compiled_stage(pipeline, MESA_SHADER_COMPUTE,
@@ -945,7 +990,9 @@ anv_pipeline_validate_create_info(const VkGraphicsPipelineCreateInfo *info)
 }
 
 VkResult
-anv_pipeline_init(struct anv_pipeline *pipeline, struct anv_device *device,
+anv_pipeline_init(struct anv_pipeline *pipeline,
+                  struct anv_device *device,
+                  struct anv_pipeline_cache *cache,
                   const VkGraphicsPipelineCreateInfo *pCreateInfo,
                   const struct anv_graphics_pipeline_create_info *extra,
                   const VkAllocationCallbacks *alloc)
@@ -971,9 +1018,6 @@ anv_pipeline_init(struct anv_pipeline *pipeline, struct anv_device *device,
    pipeline->batch.end = pipeline->batch.start + sizeof(pipeline->batch_data);
    pipeline->batch.relocs = &pipeline->batch_relocs;
 
-   anv_state_stream_init(&pipeline->program_stream,
-                         &device->instruction_block_pool);
-
    anv_pipeline_init_dynamic_state(pipeline, pCreateInfo);
 
    if (pCreateInfo->pTessellationState)
@@ -1005,13 +1049,13 @@ anv_pipeline_init(struct anv_pipeline *pipeline, struct anv_device *device,
 
       switch (pCreateInfo->pStages[i].stage) {
       case VK_SHADER_STAGE_VERTEX_BIT:
-         anv_pipeline_compile_vs(pipeline, pCreateInfo, module, entrypoint);
+         anv_pipeline_compile_vs(pipeline, cache, pCreateInfo, module, entrypoint);
          break;
       case VK_SHADER_STAGE_GEOMETRY_BIT:
-         anv_pipeline_compile_gs(pipeline, pCreateInfo, module, entrypoint);
+         anv_pipeline_compile_gs(pipeline, cache, pCreateInfo, module, entrypoint);
          break;
       case VK_SHADER_STAGE_FRAGMENT_BIT:
-         anv_pipeline_compile_fs(pipeline, pCreateInfo, module, entrypoint);
+         anv_pipeline_compile_fs(pipeline, cache, pCreateInfo, module, entrypoint);
          break;
       default:
          anv_finishme("Unsupported shader stage");
@@ -1083,23 +1127,28 @@ anv_pipeline_init(struct anv_pipeline *pipeline, struct anv_device *device,
 VkResult
 anv_graphics_pipeline_create(
    VkDevice _device,
+   VkPipelineCache _cache,
    const VkGraphicsPipelineCreateInfo *pCreateInfo,
    const struct anv_graphics_pipeline_create_info *extra,
    const VkAllocationCallbacks *pAllocator,
    VkPipeline *pPipeline)
 {
    ANV_FROM_HANDLE(anv_device, device, _device);
+   ANV_FROM_HANDLE(anv_pipeline_cache, cache, _cache);
+
+   if (cache == NULL)
+      cache = &device->default_pipeline_cache;
 
    switch (device->info.gen) {
    case 7:
       if (device->info.is_haswell)
-         return gen75_graphics_pipeline_create(_device, pCreateInfo, extra, pAllocator, pPipeline);
+         return gen75_graphics_pipeline_create(_device, cache, pCreateInfo, extra, pAllocator, pPipeline);
       else
-         return gen7_graphics_pipeline_create(_device, pCreateInfo, extra, pAllocator, pPipeline);
+         return gen7_graphics_pipeline_create(_device, cache, pCreateInfo, extra, pAllocator, pPipeline);
    case 8:
-      return gen8_graphics_pipeline_create(_device, pCreateInfo, extra, pAllocator, pPipeline);
+      return gen8_graphics_pipeline_create(_device, cache, pCreateInfo, extra, pAllocator, pPipeline);
    case 9:
-      return gen9_graphics_pipeline_create(_device, pCreateInfo, extra, pAllocator, pPipeline);
+      return gen9_graphics_pipeline_create(_device, cache, pCreateInfo, extra, pAllocator, pPipeline);
    default:
       unreachable("unsupported gen\n");
    }
@@ -1117,7 +1166,9 @@ VkResult anv_CreateGraphicsPipelines(
 
    unsigned i = 0;
    for (; i < count; i++) {
-      result = anv_graphics_pipeline_create(_device, &pCreateInfos[i],
+      result = anv_graphics_pipeline_create(_device,
+                                            pipelineCache,
+                                            &pCreateInfos[i],
                                             NULL, pAllocator, &pPipelines[i]);
       if (result != VK_SUCCESS) {
          for (unsigned j = 0; j < i; j++) {
@@ -1133,22 +1184,27 @@ VkResult anv_CreateGraphicsPipelines(
 
 static VkResult anv_compute_pipeline_create(
     VkDevice                                    _device,
+    VkPipelineCache                             _cache,
     const VkComputePipelineCreateInfo*          pCreateInfo,
     const VkAllocationCallbacks*                pAllocator,
     VkPipeline*                                 pPipeline)
 {
    ANV_FROM_HANDLE(anv_device, device, _device);
+   ANV_FROM_HANDLE(anv_pipeline_cache, cache, _cache);
+
+   if (cache == NULL)
+      cache = &device->default_pipeline_cache;
 
    switch (device->info.gen) {
    case 7:
       if (device->info.is_haswell)
-         return gen75_compute_pipeline_create(_device, pCreateInfo, pAllocator, pPipeline);
+         return gen75_compute_pipeline_create(_device, cache, pCreateInfo, pAllocator, pPipeline);
       else
-         return gen7_compute_pipeline_create(_device, pCreateInfo, pAllocator, pPipeline);
+         return gen7_compute_pipeline_create(_device, cache, pCreateInfo, pAllocator, pPipeline);
    case 8:
-      return gen8_compute_pipeline_create(_device, pCreateInfo, pAllocator, pPipeline);
+      return gen8_compute_pipeline_create(_device, cache, pCreateInfo, pAllocator, pPipeline);
    case 9:
-      return gen9_compute_pipeline_create(_device, pCreateInfo, pAllocator, pPipeline);
+      return gen9_compute_pipeline_create(_device, cache, pCreateInfo, pAllocator, pPipeline);
    default:
       unreachable("unsupported gen\n");
    }
@@ -1166,7 +1222,8 @@ VkResult anv_CreateComputePipelines(
 
    unsigned i = 0;
    for (; i < count; i++) {
-      result = anv_compute_pipeline_create(_device, &pCreateInfos[i],
+      result = anv_compute_pipeline_create(_device, pipelineCache,
+                                           &pCreateInfos[i],
                                            pAllocator, &pPipelines[i]);
       if (result != VK_SUCCESS) {
          for (unsigned j = 0; j < i; j++) {
index 8667b45cfc0bb7295323e10386269e3d25d61a47..59e8005904d4aa005c5654393799e0923b9892a2 100644 (file)
@@ -577,6 +577,16 @@ struct anv_queue {
     struct anv_state_pool *                     pool;
 };
 
+struct anv_pipeline_cache {
+   struct anv_device *                          device;
+   struct anv_state_stream                      program_stream;
+   pthread_mutex_t                              mutex;
+};
+
+void anv_pipeline_cache_init(struct anv_pipeline_cache *cache,
+                             struct anv_device *device);
+void anv_pipeline_cache_finish(struct anv_pipeline_cache *cache);
+
 struct anv_device {
     VK_LOADER_DATA                              _loader_data;
 
@@ -595,6 +605,8 @@ struct anv_device {
     struct anv_state_pool                       dynamic_state_pool;
 
     struct anv_block_pool                       instruction_block_pool;
+    struct anv_pipeline_cache                   default_pipeline_cache;
+
     struct anv_block_pool                       surface_state_block_pool;
     struct anv_state_pool                       surface_state_pool;
 
@@ -1288,7 +1300,6 @@ struct anv_pipeline {
    } urb;
 
    VkShaderStageFlags                           active_stages;
-   struct anv_state_stream                      program_stream;
    struct anv_state                             blend_state;
    uint32_t                                     vs_simd8;
    uint32_t                                     vs_vec4;
@@ -1337,18 +1348,21 @@ struct anv_graphics_pipeline_create_info {
 
 VkResult
 anv_pipeline_init(struct anv_pipeline *pipeline, struct anv_device *device,
+                  struct anv_pipeline_cache *cache,
                   const VkGraphicsPipelineCreateInfo *pCreateInfo,
                   const struct anv_graphics_pipeline_create_info *extra,
                   const VkAllocationCallbacks *alloc);
 
 VkResult
 anv_pipeline_compile_cs(struct anv_pipeline *pipeline,
+                        struct anv_pipeline_cache *cache,
                         const VkComputePipelineCreateInfo *info,
                         struct anv_shader_module *module,
                         const char *entrypoint_name);
 
 VkResult
 anv_graphics_pipeline_create(VkDevice device,
+                             VkPipelineCache cache,
                              const VkGraphicsPipelineCreateInfo *pCreateInfo,
                              const struct anv_graphics_pipeline_create_info *extra,
                              const VkAllocationCallbacks *alloc,
@@ -1356,6 +1370,7 @@ anv_graphics_pipeline_create(VkDevice device,
 
 VkResult
 gen7_graphics_pipeline_create(VkDevice _device,
+                              struct anv_pipeline_cache *cache,
                               const VkGraphicsPipelineCreateInfo *pCreateInfo,
                               const struct anv_graphics_pipeline_create_info *extra,
                               const VkAllocationCallbacks *alloc,
@@ -1363,6 +1378,7 @@ gen7_graphics_pipeline_create(VkDevice _device,
 
 VkResult
 gen75_graphics_pipeline_create(VkDevice _device,
+                               struct anv_pipeline_cache *cache,
                                const VkGraphicsPipelineCreateInfo *pCreateInfo,
                                const struct anv_graphics_pipeline_create_info *extra,
                                const VkAllocationCallbacks *alloc,
@@ -1370,34 +1386,40 @@ gen75_graphics_pipeline_create(VkDevice _device,
 
 VkResult
 gen8_graphics_pipeline_create(VkDevice _device,
+                              struct anv_pipeline_cache *cache,
                               const VkGraphicsPipelineCreateInfo *pCreateInfo,
                               const struct anv_graphics_pipeline_create_info *extra,
                               const VkAllocationCallbacks *alloc,
                               VkPipeline *pPipeline);
 VkResult
 gen9_graphics_pipeline_create(VkDevice _device,
+                              struct anv_pipeline_cache *cache,
                               const VkGraphicsPipelineCreateInfo *pCreateInfo,
                               const struct anv_graphics_pipeline_create_info *extra,
                               const VkAllocationCallbacks *alloc,
                               VkPipeline *pPipeline);
 VkResult
 gen7_compute_pipeline_create(VkDevice _device,
+                             struct anv_pipeline_cache *cache,
                              const VkComputePipelineCreateInfo *pCreateInfo,
                              const VkAllocationCallbacks *alloc,
                              VkPipeline *pPipeline);
 VkResult
 gen75_compute_pipeline_create(VkDevice _device,
+                              struct anv_pipeline_cache *cache,
                               const VkComputePipelineCreateInfo *pCreateInfo,
                               const VkAllocationCallbacks *alloc,
                               VkPipeline *pPipeline);
 
 VkResult
 gen8_compute_pipeline_create(VkDevice _device,
+                             struct anv_pipeline_cache *cache,
                              const VkComputePipelineCreateInfo *pCreateInfo,
                              const VkAllocationCallbacks *alloc,
                              VkPipeline *pPipeline);
 VkResult
 gen9_compute_pipeline_create(VkDevice _device,
+                             struct anv_pipeline_cache *cache,
                              const VkComputePipelineCreateInfo *pCreateInfo,
                              const VkAllocationCallbacks *alloc,
                              VkPipeline *pPipeline);
@@ -1698,6 +1720,7 @@ ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_event, VkEvent)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_framebuffer, VkFramebuffer)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_image, VkImage)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_image_view, VkImageView);
+ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline_cache, VkPipelineCache)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline, VkPipeline)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline_layout, VkPipelineLayout)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_query_pool, VkQueryPool)
index 7dedcac08af98a7612061c05fbbe8d8209492c08..9b90c6e312035928be67e5103ee4b0f207b4f031 100644 (file)
@@ -264,6 +264,7 @@ scratch_space(const struct brw_stage_prog_data *prog_data)
 GENX_FUNC(GEN7, GEN75) VkResult
 genX(graphics_pipeline_create)(
     VkDevice                                    _device,
+    struct anv_pipeline_cache *                 cache,
     const VkGraphicsPipelineCreateInfo*         pCreateInfo,
     const struct anv_graphics_pipeline_create_info *extra,
     const VkAllocationCallbacks*                pAllocator,
@@ -280,7 +281,8 @@ genX(graphics_pipeline_create)(
    if (pipeline == NULL)
       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
 
-   result = anv_pipeline_init(pipeline, device, pCreateInfo, extra, pAllocator);
+   result = anv_pipeline_init(pipeline, device, cache,
+                              pCreateInfo, extra, pAllocator);
    if (result != VK_SUCCESS) {
       anv_free2(&device->alloc, pAllocator, pipeline);
       return result;
@@ -520,6 +522,7 @@ genX(graphics_pipeline_create)(
 GENX_FUNC(GEN7, GEN75) VkResult
 genX(compute_pipeline_create)(
     VkDevice                                    _device,
+    struct anv_pipeline_cache *                 cache,
     const VkComputePipelineCreateInfo*          pCreateInfo,
     const VkAllocationCallbacks*                pAllocator,
     VkPipeline*                                 pPipeline)
index a405d290d50c2cb52fcdfe35751c96c747765228..e6cb145d522dbaa147baf0d78bc2c16da159554a 100644 (file)
@@ -273,6 +273,7 @@ emit_ds_state(struct anv_pipeline *pipeline,
 VkResult
 genX(graphics_pipeline_create)(
     VkDevice                                    _device,
+    struct anv_pipeline_cache *                 cache,
     const VkGraphicsPipelineCreateInfo*         pCreateInfo,
     const struct anv_graphics_pipeline_create_info *extra,
     const VkAllocationCallbacks*                pAllocator,
@@ -290,7 +291,8 @@ genX(graphics_pipeline_create)(
    if (pipeline == NULL)
       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
 
-   result = anv_pipeline_init(pipeline, device, pCreateInfo, extra, pAllocator);
+   result = anv_pipeline_init(pipeline, device, cache,
+                              pCreateInfo, extra, pAllocator);
    if (result != VK_SUCCESS) {
       anv_free2(&device->alloc, pAllocator, pipeline);
       return result;
@@ -603,6 +605,7 @@ genX(graphics_pipeline_create)(
 
 VkResult genX(compute_pipeline_create)(
     VkDevice                                    _device,
+    struct anv_pipeline_cache *                 cache,
     const VkComputePipelineCreateInfo*          pCreateInfo,
     const VkAllocationCallbacks*                pAllocator,
     VkPipeline*                                 pPipeline)
@@ -633,9 +636,6 @@ VkResult genX(compute_pipeline_create)(
    pipeline->batch.end = pipeline->batch.start + sizeof(pipeline->batch_data);
    pipeline->batch.relocs = &pipeline->batch_relocs;
 
-   anv_state_stream_init(&pipeline->program_stream,
-                         &device->instruction_block_pool);
-
    /* When we free the pipeline, we detect stages based on the NULL status
     * of various prog_data pointers.  Make them NULL by default.
     */
@@ -651,7 +651,7 @@ VkResult genX(compute_pipeline_create)(
 
    assert(pCreateInfo->stage.stage == VK_SHADER_STAGE_COMPUTE_BIT);
    ANV_FROM_HANDLE(anv_shader_module, module,  pCreateInfo->stage.module);
-   anv_pipeline_compile_cs(pipeline, pCreateInfo, module,
+   anv_pipeline_compile_cs(pipeline, cache, pCreateInfo, module,
                            pCreateInfo->stage.pName);
 
    pipeline->use_repclear = false;