diff options
author | Kristian Høgsberg Kristensen <[email protected]> | 2015-12-03 23:58:05 -0800 |
---|---|---|
committer | Kristian Høgsberg Kristensen <[email protected]> | 2015-12-04 09:51:47 -0800 |
commit | bbb6875f35c783d4f350dc9fbf2e2904b3d47a5a (patch) | |
tree | 3a92815ebd7af2607228900674c98e1ef32c2517 /src/vulkan | |
parent | c3c61d210f0929a71e031dfb3830bf39cee583a4 (diff) |
vk: Map uncached, coherent memory as write-combine
This gives us the required characteristics for the memory type.
Diffstat (limited to 'src/vulkan')
-rw-r--r-- | src/vulkan/anv_allocator.c | 2 | ||||
-rw-r--r-- | src/vulkan/anv_device.c | 14 | ||||
-rw-r--r-- | src/vulkan/anv_gem.c | 7 | ||||
-rw-r--r-- | src/vulkan/anv_private.h | 2 | ||||
-rw-r--r-- | src/vulkan/anv_query.c | 2 |
5 files changed, 17 insertions, 10 deletions
diff --git a/src/vulkan/anv_allocator.c b/src/vulkan/anv_allocator.c index 970d809e8a3..e8129c6d909 100644 --- a/src/vulkan/anv_allocator.c +++ b/src/vulkan/anv_allocator.c @@ -825,7 +825,7 @@ anv_bo_pool_alloc(struct anv_bo_pool *pool, struct anv_bo *bo) assert(new_bo.size == pool->bo_size); - new_bo.map = anv_gem_mmap(pool->device, new_bo.gem_handle, 0, pool->bo_size); + new_bo.map = anv_gem_mmap(pool->device, new_bo.gem_handle, 0, pool->bo_size, 0); if (new_bo.map == NULL) { anv_gem_close(pool->device, new_bo.gem_handle); return vk_error(VK_ERROR_MEMORY_MAP_FAILED); diff --git a/src/vulkan/anv_device.c b/src/vulkan/anv_device.c index a8bc409144d..7e1b552ca7f 100644 --- a/src/vulkan/anv_device.c +++ b/src/vulkan/anv_device.c @@ -121,6 +121,12 @@ anv_physical_device_init(struct anv_physical_device *device, goto fail; } + if (anv_gem_get_param(fd, I915_PARAM_MMAP_VERSION < 1)) { + result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, + "kernel missing wc mmap"); + goto fail; + } + close(fd); brw_process_intel_debug_variable(); @@ -1059,7 +1065,11 @@ VkResult anv_MapMemory( * pointer here, but that may exhaust virtual memory on 32 bit * userspace. */ - mem->map = anv_gem_mmap(device, mem->bo.gem_handle, offset, size); + uint32_t gem_flags = 0; + if (!device->info.has_llc && mem->type_index == 0) + gem_flags |= I915_MMAP_WC; + + mem->map = anv_gem_mmap(device, mem->bo.gem_handle, offset, size, gem_flags); mem->map_size = size; *ppData = mem->map; @@ -1254,7 +1264,7 @@ VkResult anv_CreateFence( goto fail; fence->bo.map = - anv_gem_mmap(device, fence->bo.gem_handle, 0, fence->bo.size); + anv_gem_mmap(device, fence->bo.gem_handle, 0, fence->bo.size, 0); batch.next = batch.start = fence->bo.map; batch.end = fence->bo.map + fence->bo.size; anv_batch_emit(&batch, GEN7_MI_BATCH_BUFFER_END); diff --git a/src/vulkan/anv_gem.c b/src/vulkan/anv_gem.c index 57b8505e156..429f4a29fad 100644 --- a/src/vulkan/anv_gem.c +++ b/src/vulkan/anv_gem.c @@ -84,7 +84,7 @@ anv_gem_close(struct anv_device *device, int gem_handle) */ void* anv_gem_mmap(struct anv_device *device, uint32_t gem_handle, - uint64_t offset, uint64_t size) + uint64_t offset, uint64_t size, uint32_t flags) { struct drm_i915_gem_mmap gem_mmap; int ret; @@ -94,10 +94,7 @@ anv_gem_mmap(struct anv_device *device, uint32_t gem_handle, gem_mmap.offset = offset; gem_mmap.size = size; VG_CLEAR(gem_mmap.addr_ptr); - -#ifdef I915_MMAP_WC - gem_mmap.flags = 0; -#endif + gem_mmap.flags = flags; ret = anv_ioctl(device->fd, DRM_IOCTL_I915_GEM_MMAP, &gem_mmap); if (ret != 0) { diff --git a/src/vulkan/anv_private.h b/src/vulkan/anv_private.h index 7c8cf241624..cc0281a0d9a 100644 --- a/src/vulkan/anv_private.h +++ b/src/vulkan/anv_private.h @@ -597,7 +597,7 @@ struct anv_device { }; void* anv_gem_mmap(struct anv_device *device, - uint32_t gem_handle, uint64_t offset, uint64_t size); + uint32_t gem_handle, uint64_t offset, uint64_t size, uint32_t flags); void anv_gem_munmap(void *p, uint64_t size); uint32_t anv_gem_create(struct anv_device *device, size_t size); void anv_gem_close(struct anv_device *device, int gem_handle); diff --git a/src/vulkan/anv_query.c b/src/vulkan/anv_query.c index 911b9a41264..6f9d7d89aa6 100644 --- a/src/vulkan/anv_query.c +++ b/src/vulkan/anv_query.c @@ -69,7 +69,7 @@ VkResult anv_CreateQueryPool( if (result != VK_SUCCESS) goto fail; - pool->bo.map = anv_gem_mmap(device, pool->bo.gem_handle, 0, size); + pool->bo.map = anv_gem_mmap(device, pool->bo.gem_handle, 0, size, 0); *pQueryPool = anv_query_pool_to_handle(pool); |