From 4a5b234d5e955db722968c52efd60676abf30fef Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Thu, 25 Apr 2024 08:10:06 -0400 Subject: [PATCH] tu: Plumb through raytracing fuse Part-of: --- src/freedreno/vulkan/tu_device.h | 1 + src/freedreno/vulkan/tu_knl_drm_msm.cc | 12 ++++++++++++ src/freedreno/vulkan/tu_knl_drm_virtio.cc | 16 ++++++++++++++++ src/freedreno/vulkan/tu_knl_kgsl.cc | 13 +++++++++++++ 4 files changed, 42 insertions(+) diff --git a/src/freedreno/vulkan/tu_device.h b/src/freedreno/vulkan/tu_device.h index e38540ead2e..d736080727a 100644 --- a/src/freedreno/vulkan/tu_device.h +++ b/src/freedreno/vulkan/tu_device.h @@ -118,6 +118,7 @@ struct tu_physical_device int32_t reserved_set_idx; bool has_set_iova; + bool has_raytracing; uint64_t va_start; uint64_t va_size; diff --git a/src/freedreno/vulkan/tu_knl_drm_msm.cc b/src/freedreno/vulkan/tu_knl_drm_msm.cc index 749e0593651..08831e7ce2a 100644 --- a/src/freedreno/vulkan/tu_knl_drm_msm.cc +++ b/src/freedreno/vulkan/tu_knl_drm_msm.cc @@ -77,6 +77,17 @@ tu_drm_get_gmem_base(const struct tu_physical_device *dev, uint64_t *base) return tu_drm_get_param(dev->local_fd, MSM_PARAM_GMEM_BASE, base); } +static bool +tu_drm_get_raytracing(const struct tu_physical_device *dev) +{ + uint64_t value; + int ret = tu_drm_get_param(dev->local_fd, MSM_PARAM_RAYTRACING, &value); + if (ret) + return false; + + return value; +} + static int tu_drm_get_va_prop(const struct tu_physical_device *dev, uint64_t *va_start, uint64_t *va_size) @@ -1039,6 +1050,7 @@ tu_knl_drm_msm_load(struct tu_instance *instance, device->has_set_iova = !tu_drm_get_va_prop(device, &device->va_start, &device->va_size); + device->has_raytracing = tu_drm_get_raytracing(device); device->has_preemption = tu_drm_has_preemption(device); diff --git a/src/freedreno/vulkan/tu_knl_drm_virtio.cc b/src/freedreno/vulkan/tu_knl_drm_virtio.cc index 9895b704634..a5685ede188 100644 --- a/src/freedreno/vulkan/tu_knl_drm_virtio.cc +++ b/src/freedreno/vulkan/tu_knl_drm_virtio.cc @@ -299,6 +299,19 @@ virtio_device_get_suspend_count(struct tu_device *dev, uint64_t *suspend_count) return ret; } + +static bool +tu_drm_get_raytracing(struct vdrm_device *vdrm) +{ + uint64_t value; + int ret = tu_drm_get_param(vdrm, MSM_PARAM_RAYTRACING, &value); + if (ret) + return false; + + return value; +} + + static VkResult virtio_device_check_status(struct tu_device *device) { @@ -1214,6 +1227,9 @@ tu_knl_drm_virtio_load(struct tu_instance *instance, device->submitqueue_priority_count = caps.u.msm.priorities; + /* TODO add a cap for this */ + device->has_raytracing = tu_drm_get_raytracing(vdrm); + device->syncobj_type = vk_drm_syncobj_get_type(fd); /* we don't support DRM_CAP_SYNCOBJ_TIMELINE, but drm-shim does */ if (!(device->syncobj_type.features & VK_SYNC_FEATURE_TIMELINE)) diff --git a/src/freedreno/vulkan/tu_knl_kgsl.cc b/src/freedreno/vulkan/tu_knl_kgsl.cc index cfb91c93a09..d9dcd64d3f9 100644 --- a/src/freedreno/vulkan/tu_knl_kgsl.cc +++ b/src/freedreno/vulkan/tu_knl_kgsl.cc @@ -1382,6 +1382,17 @@ static const struct tu_knl kgsl_knl_funcs = { .queue_wait_fence = kgsl_queue_wait_fence, }; +static bool +tu_kgsl_get_raytracing(int fd) +{ + uint32_t value; + int ret = get_kgsl_prop(fd, KGSL_PROP_IS_RAYTRACING_ENABLED, &value, sizeof(value)); + if (ret) + return false; + + return value; +} + VkResult tu_knl_kgsl_load(struct tu_instance *instance, int fd) { @@ -1458,6 +1469,8 @@ tu_knl_kgsl_load(struct tu_instance *instance, int fd) device->gmem_size = debug_get_num_option("TU_GMEM", info.gmem_sizebytes); device->gmem_base = gmem_iova; + device->has_raytracing = tu_kgsl_get_raytracing(fd); + device->submitqueue_priority_count = 1; device->timeline_type = vk_sync_timeline_get_type(&vk_kgsl_sync_type);