Mesa (main): turnip: make possible to create read-only bo with tu_bo_init_new
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon May 17 18:50:05 UTC 2021
Module: Mesa
Branch: main
Commit: 413e7c6dc86961bcc0163ffe739169bc8283a21d
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=413e7c6dc86961bcc0163ffe739169bc8283a21d
Author: Danylo Piliaiev <dpiliaiev at igalia.com>
Date: Fri May 14 18:05:02 2021 +0300
turnip: make possible to create read-only bo with tu_bo_init_new
GPU won't be able to write to such BOs, which would to useful for
cmdstream BOs.
Move "bool dump" to the new flags along the way.
Signed-off-by: Danylo Piliaiev <dpiliaiev at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10807>
---
src/freedreno/vulkan/tu_cs.c | 3 ++-
src/freedreno/vulkan/tu_descriptor_set.c | 2 +-
src/freedreno/vulkan/tu_device.c | 12 ++++++++----
src/freedreno/vulkan/tu_drm.c | 8 ++++++--
src/freedreno/vulkan/tu_kgsl.c | 7 ++++++-
src/freedreno/vulkan/tu_private.h | 10 +++++++++-
src/freedreno/vulkan/tu_query.c | 2 +-
7 files changed, 33 insertions(+), 11 deletions(-)
diff --git a/src/freedreno/vulkan/tu_cs.c b/src/freedreno/vulkan/tu_cs.c
index e356b35cb2c..d29fca13f8b 100644
--- a/src/freedreno/vulkan/tu_cs.c
+++ b/src/freedreno/vulkan/tu_cs.c
@@ -110,7 +110,8 @@ tu_cs_add_bo(struct tu_cs *cs, uint32_t size)
return VK_ERROR_OUT_OF_HOST_MEMORY;
VkResult result =
- tu_bo_init_new(cs->device, new_bo, size * sizeof(uint32_t), true);
+ tu_bo_init_new(cs->device, new_bo, size * sizeof(uint32_t),
+ TU_BO_ALLOC_ALLOW_DUMP);
if (result != VK_SUCCESS) {
free(new_bo);
return result;
diff --git a/src/freedreno/vulkan/tu_descriptor_set.c b/src/freedreno/vulkan/tu_descriptor_set.c
index 4a89271a908..04f3673b1bb 100644
--- a/src/freedreno/vulkan/tu_descriptor_set.c
+++ b/src/freedreno/vulkan/tu_descriptor_set.c
@@ -557,7 +557,7 @@ tu_CreateDescriptorPool(VkDevice _device,
}
if (bo_size) {
- ret = tu_bo_init_new(device, &pool->bo, bo_size, true);
+ ret = tu_bo_init_new(device, &pool->bo, bo_size, TU_BO_ALLOC_ALLOW_DUMP);
if (ret)
goto fail_alloc;
diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c
index a003a4c6911..677c67563ab 100644
--- a/src/freedreno/vulkan/tu_device.c
+++ b/src/freedreno/vulkan/tu_device.c
@@ -1357,7 +1357,8 @@ tu_CreateDevice(VkPhysicalDevice physicalDevice,
if (custom_border_colors)
global_size += TU_BORDER_COLOR_COUNT * sizeof(struct bcolor_entry);
- result = tu_bo_init_new(device, &device->global_bo, global_size, false);
+ result = tu_bo_init_new(device, &device->global_bo, global_size,
+ TU_BO_ALLOC_NO_FLAGS);
if (result != VK_SUCCESS) {
vk_startup_errorf(device->instance, result, "BO init");
goto fail_global_bo;
@@ -1588,7 +1589,8 @@ tu_get_scratch_bo(struct tu_device *dev, uint64_t size, struct tu_bo **bo)
}
unsigned bo_size = 1ull << size_log2;
- VkResult result = tu_bo_init_new(dev, &dev->scratch_bos[index].bo, bo_size, false);
+ VkResult result = tu_bo_init_new(dev, &dev->scratch_bos[index].bo, bo_size,
+ TU_BO_ALLOC_NO_FLAGS);
if (result != VK_SUCCESS) {
mtx_unlock(&dev->scratch_bos[index].construct_mtx);
return result;
@@ -1778,7 +1780,8 @@ tu_AllocateMemory(VkDevice _device,
}
} else {
result =
- tu_bo_init_new(device, &mem->bo, pAllocateInfo->allocationSize, false);
+ tu_bo_init_new(device, &mem->bo, pAllocateInfo->allocationSize,
+ TU_BO_ALLOC_NO_FLAGS);
}
@@ -2005,7 +2008,8 @@ tu_CreateEvent(VkDevice _device,
if (!event)
return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
- VkResult result = tu_bo_init_new(device, &event->bo, 0x1000, false);
+ VkResult result = tu_bo_init_new(device, &event->bo, 0x1000,
+ TU_BO_ALLOC_NO_FLAGS);
if (result != VK_SUCCESS)
goto fail_alloc;
diff --git a/src/freedreno/vulkan/tu_drm.c b/src/freedreno/vulkan/tu_drm.c
index a668556eca3..08dffeac5f7 100644
--- a/src/freedreno/vulkan/tu_drm.c
+++ b/src/freedreno/vulkan/tu_drm.c
@@ -279,7 +279,8 @@ tu_bo_init(struct tu_device *dev,
}
VkResult
-tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size, bool dump)
+tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size,
+ enum tu_bo_alloc_flags flags)
{
/* TODO: Choose better flags. As of 2018-11-12, freedreno/drm/msm_bo.c
* always sets `flags = MSM_BO_WC`, and we copy that behavior here.
@@ -289,12 +290,15 @@ tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size, bool dump
.flags = MSM_BO_WC
};
+ if (flags & TU_BO_ALLOC_GPU_READ_ONLY)
+ req.flags |= MSM_BO_GPU_READONLY;
+
int ret = drmCommandWriteRead(dev->fd,
DRM_MSM_GEM_NEW, &req, sizeof(req));
if (ret)
return vk_error(dev->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
- return tu_bo_init(dev, bo, req.handle, size, dump);
+ return tu_bo_init(dev, bo, req.handle, size, flags & TU_BO_ALLOC_ALLOW_DUMP);
}
VkResult
diff --git a/src/freedreno/vulkan/tu_kgsl.c b/src/freedreno/vulkan/tu_kgsl.c
index 6d968415f46..697c212c6b5 100644
--- a/src/freedreno/vulkan/tu_kgsl.c
+++ b/src/freedreno/vulkan/tu_kgsl.c
@@ -81,11 +81,16 @@ tu_drm_submitqueue_close(const struct tu_device *dev, uint32_t queue_id)
}
VkResult
-tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size, bool dump)
+tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size,
+ enum tu_bo_alloc_flags flags)
{
struct kgsl_gpumem_alloc_id req = {
.size = size,
};
+
+ if (flags & TU_BO_ALLOC_GPU_READ_ONLY)
+ req.flags |= KGSL_MEMFLAGS_GPUREADONLY;
+
int ret;
ret = safe_ioctl(dev->physical_device->local_fd,
diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h
index 341c7c90a7c..8d3c5bc5a7d 100644
--- a/src/freedreno/vulkan/tu_private.h
+++ b/src/freedreno/vulkan/tu_private.h
@@ -423,8 +423,16 @@ tu_device_is_lost(struct tu_device *device)
VkResult
tu_device_submit_deferred_locked(struct tu_device *dev);
+enum tu_bo_alloc_flags
+{
+ TU_BO_ALLOC_NO_FLAGS = 0,
+ TU_BO_ALLOC_ALLOW_DUMP = 1 << 0,
+ TU_BO_ALLOC_GPU_READ_ONLY = 1 << 1,
+};
+
VkResult
-tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size, bool dump);
+tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size,
+ enum tu_bo_alloc_flags flags);
VkResult
tu_bo_init_dmabuf(struct tu_device *dev,
struct tu_bo *bo,
diff --git a/src/freedreno/vulkan/tu_query.c b/src/freedreno/vulkan/tu_query.c
index da8330057a6..b83b4f4bb70 100644
--- a/src/freedreno/vulkan/tu_query.c
+++ b/src/freedreno/vulkan/tu_query.c
@@ -317,7 +317,7 @@ tu_CreateQueryPool(VkDevice _device,
}
VkResult result = tu_bo_init_new(device, &pool->bo,
- pCreateInfo->queryCount * slot_size, false);
+ pCreateInfo->queryCount * slot_size, TU_BO_ALLOC_NO_FLAGS);
if (result != VK_SUCCESS) {
vk_object_free(&device->vk, pAllocator, pool);
return result;
More information about the mesa-commit
mailing list