vk/device: Use a bo pool for batch buffers
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 25 May 2015 22:46:48 +0000 (15:46 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 27 May 2015 18:48:28 +0000 (11:48 -0700)
src/vulkan/device.c
src/vulkan/private.h

index 3729a3c544cbb5fe6b7f364823b3bcdbe56bc6fe..5c2e276210d63b2316bf7162bf357a8b415ce20a 100644 (file)
@@ -303,6 +303,8 @@ parse_debug_flags(struct anv_device *device)
    }
 }
 
+static const uint32_t BATCH_SIZE = 1 << 15;
+
 VkResult anv_CreateDevice(
     VkPhysicalDevice                            _physicalDevice,
     const VkDeviceCreateInfo*                   pCreateInfo,
@@ -333,6 +335,8 @@ VkResult anv_CreateDevice(
    if (device->context_id == -1)
       goto fail_fd;
 
+   anv_bo_pool_init(&device->batch_bo_pool, device, BATCH_SIZE);
+
    anv_block_pool_init(&device->dynamic_state_block_pool, device, 2048);
 
    anv_state_pool_init(&device->dynamic_state_pool,
@@ -381,6 +385,8 @@ VkResult anv_DestroyDevice(
 
    anv_compiler_destroy(device->compiler);
 
+
+   anv_bo_pool_finish(&device->batch_bo_pool);
    anv_block_pool_finish(&device->dynamic_state_block_pool);
    anv_block_pool_finish(&device->instruction_block_pool);
    anv_block_pool_finish(&device->surface_state_block_pool);
@@ -495,41 +501,25 @@ VkResult anv_GetDeviceQueue(
    return VK_SUCCESS;
 }
 
-static const uint32_t BATCH_SIZE = 8192;
-
 VkResult
 anv_batch_init(struct anv_batch *batch, struct anv_device *device)
 {
    VkResult result;
 
-   result = anv_bo_init_new(&batch->bo, device, BATCH_SIZE);
+   result = anv_bo_pool_alloc(&device->batch_bo_pool, &batch->bo);
    if (result != VK_SUCCESS)
       return result;
 
-   batch->bo.map =
-      anv_gem_mmap(device, batch->bo.gem_handle, 0, BATCH_SIZE);
-   if (batch->bo.map == NULL) {
-      result = vk_error(VK_ERROR_MEMORY_MAP_FAILED);
-      goto fail_bo;
-   }
-
    batch->cmd_relocs.num_relocs = 0;
    batch->next = batch->bo.map;
 
    return VK_SUCCESS;
-
- fail_bo:
-   anv_gem_close(device, batch->bo.gem_handle);
-
-   return result;
-
 }
 
 void
 anv_batch_finish(struct anv_batch *batch, struct anv_device *device)
 {
-   anv_gem_munmap(batch->bo.map, BATCH_SIZE);
-   anv_gem_close(device, batch->bo.gem_handle);
+   anv_bo_pool_free(&device->batch_bo_pool, &batch->bo);
 }
 
 void
index 5b7f936cdc3ac8124f33b00ae28f6f46f68672ab..6e43258c90317a378851cf5d682054b0e4c81cdf 100644 (file)
@@ -320,6 +320,8 @@ struct anv_device {
     bool                                        no_hw;
     bool                                        dump_aub;
 
+    struct anv_bo_pool                          batch_bo_pool;
+
     struct anv_block_pool                       dynamic_state_block_pool;
     struct anv_state_pool                       dynamic_state_pool;
 
@@ -421,7 +423,7 @@ struct anv_address {
 static inline uint64_t
 __gen_combine_address(struct anv_batch *batch, void *location,
                       const struct anv_address address, uint32_t delta)
-{   
+{
    if (address.bo == NULL) {
       return delta;
    } else {