Mesa (main): turnip: Add CrOS Gralloc support
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sat Jun 26 19:02:33 UTC 2021
Module: Mesa
Branch: main
Commit: e74366b18a3ed3e2c5a649c287abd3739b957011
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e74366b18a3ed3e2c5a649c287abd3739b957011
Author: Rob Clark <robdclark at chromium.org>
Date: Fri Jun 25 12:45:03 2021 -0700
turnip: Add CrOS Gralloc support
Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11612>
---
src/freedreno/vulkan/tu_android.c | 91 ++++++++++++++++++++++++++++++++++++---
src/freedreno/vulkan/tu_private.h | 9 ++++
2 files changed, 94 insertions(+), 6 deletions(-)
diff --git a/src/freedreno/vulkan/tu_android.c b/src/freedreno/vulkan/tu_android.c
index 1eb6709bbd6..e59c9e605f4 100644
--- a/src/freedreno/vulkan/tu_android.c
+++ b/src/freedreno/vulkan/tu_android.c
@@ -60,7 +60,7 @@ PUBLIC struct hwvulkan_module_t HAL_MODULE_INFO_SYM = {
.module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
.hal_api_version = HARDWARE_MAKE_API_VERSION(1, 0),
.id = HWVULKAN_HARDWARE_MODULE_ID,
- .name = "AMD Vulkan HAL",
+ .name = "Turnip Vulkan HAL",
.author = "Google",
.methods =
&(hw_module_methods_t){
@@ -116,11 +116,11 @@ tu_hal_close(struct hw_device_t *dev)
}
/* get dma-buf and modifier from gralloc info */
-VkResult
-tu_gralloc_info(struct tu_device *device,
- const VkNativeBufferANDROID *gralloc_info,
- int *dma_buf,
- uint64_t *modifier)
+static VkResult
+tu_gralloc_info_other(struct tu_device *device,
+ const VkNativeBufferANDROID *gralloc_info,
+ int *dma_buf,
+ uint64_t *modifier)
{
const uint32_t *handle_fds = (uint32_t *)gralloc_info->handle->data;
@@ -172,8 +172,87 @@ tu_gralloc_info(struct tu_device *device,
*modifier = ubwc ? DRM_FORMAT_MOD_QCOM_COMPRESSED : DRM_FORMAT_MOD_LINEAR;
return VK_SUCCESS;
+}
+
+static const char cros_gralloc_module_name[] = "CrOS Gralloc";
+
+#define CROS_GRALLOC_DRM_GET_BUFFER_INFO 4
+#define CROS_GRALLOC_DRM_GET_USAGE 5
+#define CROS_GRALLOC_DRM_GET_USAGE_FRONT_RENDERING_BIT 0x1
+
+struct cros_gralloc0_buffer_info {
+ uint32_t drm_fourcc;
+ int num_fds;
+ int fds[4];
+ uint64_t modifier;
+ int offset[4];
+ int stride[4];
+};
+
+static VkResult
+tu_gralloc_info_cros(struct tu_device *device,
+ const VkNativeBufferANDROID *gralloc_info,
+ int *dma_buf,
+ uint64_t *modifier)
+
+{
+ const gralloc_module_t *gralloc = device->gralloc;
+ struct cros_gralloc0_buffer_info info;
+ int ret;
+
+ ret = gralloc->perform(gralloc, CROS_GRALLOC_DRM_GET_BUFFER_INFO,
+ gralloc_info->handle, &info);
+ if (ret)
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
+
+ *dma_buf = info.fds[0];
+ *modifier = info.modifier;
+
+ return VK_SUCCESS;
+}
+
+VkResult
+tu_gralloc_info(struct tu_device *device,
+ const VkNativeBufferANDROID *gralloc_info,
+ int *dma_buf,
+ uint64_t *modifier)
+
+{
+ if (!device->gralloc) {
+ /* get gralloc module for gralloc buffer info query */
+ int ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID,
+ (const hw_module_t **)&device->gralloc);
+
+ if (ret) {
+ /* This is *slightly* awkward, but if we are asked to import
+ * a gralloc handle, and there is no gralloc, it is some sort
+ * of invalid handle.
+ */
+ return vk_startup_errorf(device->instance,
+ VK_ERROR_INVALID_EXTERNAL_HANDLE,
+ "Could not open gralloc\n");
+ }
+
+ const gralloc_module_t *gralloc = device->gralloc;
+ mesa_logi("opened gralloc module name: %s", gralloc->common.name);
+ /* TODO not sure qcom gralloc module name, but we should check
+ * for it here and move the special gmsm handling out of
+ * tu_gralloc_info_other()
+ */
+ if (!strcmp(gralloc->common.name, cros_gralloc_module_name) && gralloc->perform) {
+ device->gralloc_type = TU_GRALLOC_CROS;
+ } else {
+ device->gralloc_type = TU_GRALLOC_OTHER;
+ }
+ }
+
+ if (device->gralloc_type == TU_GRALLOC_CROS) {
+ return tu_gralloc_info_cros(device, gralloc_info, dma_buf, modifier);
+ } else {
+ return tu_gralloc_info_other(device, gralloc_info, dma_buf, modifier);
+ }
}
/**
diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h
index 90fd45bcff8..c0324be48eb 100644
--- a/src/freedreno/vulkan/tu_private.h
+++ b/src/freedreno/vulkan/tu_private.h
@@ -407,6 +407,15 @@ struct tu_device
* new submit is executed. */
pthread_cond_t timeline_cond;
pthread_mutex_t submit_mutex;
+
+#ifdef ANDROID
+ const void *gralloc;
+ enum {
+ TU_GRALLOC_UNKNOWN,
+ TU_GRALLOC_CROS,
+ TU_GRALLOC_OTHER,
+ } gralloc_type;
+#endif
};
VkResult _tu_device_set_lost(struct tu_device *device,
More information about the mesa-commit
mailing list