summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFaith Ekstrand <faith.ekstrand@collabora.com>2023-03-20 18:41:31 -0500
committerMarge Bot <emma+marge@anholt.net>2023-03-31 14:57:03 +0000
commitb16cfe23ef1c2e2c5fdc07d95fa80b7859105fa5 (patch)
tree270be74c029acf68ba75b95f627ee9317b2b1ef3 /src
parentd75f797246c0eab0a51d41a8c829bd7d2d8cc2b3 (diff)
downloadmesa-b16cfe23ef1c2e2c5fdc07d95fa80b7859105fa5.tar.gz
mesa-b16cfe23ef1c2e2c5fdc07d95fa80b7859105fa5.tar.bz2
mesa-b16cfe23ef1c2e2c5fdc07d95fa80b7859105fa5.zip
vulkan,anv,hasvk,radv: Unify Android hardware buffer creation
Reviewed-by: Lina Versace <lina@kiwitree.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22038>
Diffstat (limited to 'src')
-rw-r--r--src/amd/vulkan/radv_android.c42
-rw-r--r--src/intel/vulkan/anv_android.c44
-rw-r--r--src/intel/vulkan_hasvk/anv_android.c44
-rw-r--r--src/vulkan/runtime/vk_android.c65
-rw-r--r--src/vulkan/runtime/vk_android.h3
5 files changed, 73 insertions, 125 deletions
diff --git a/src/amd/vulkan/radv_android.c b/src/amd/vulkan/radv_android.c
index a537cbb3cc4..5d050cf183f 100644
--- a/src/amd/vulkan/radv_android.c
+++ b/src/amd/vulkan/radv_android.c
@@ -736,48 +736,10 @@ radv_create_ahb_memory(struct radv_device *device, struct radv_device_memory *me
unsigned priority, const VkMemoryAllocateInfo *pAllocateInfo)
{
#if RADV_SUPPORT_ANDROID_HARDWARE_BUFFER
- const VkMemoryDedicatedAllocateInfo *dedicated_info =
- vk_find_struct_const(pAllocateInfo->pNext, MEMORY_DEDICATED_ALLOCATE_INFO);
-
- uint32_t w = 0;
- uint32_t h = 1;
- uint32_t layers = 1;
- uint32_t format = 0;
- uint64_t usage = 0;
-
- /* If caller passed dedicated information. */
- if (dedicated_info && dedicated_info->image) {
- RADV_FROM_HANDLE(radv_image, image, dedicated_info->image);
- w = image->info.width;
- h = image->info.height;
- layers = image->info.array_size;
- format = radv_ahb_format_for_vk_format(image->vk.format);
- usage = vk_image_usage_to_ahb_usage(image->vk.create_flags, image->vk.usage);
- } else if (dedicated_info && dedicated_info->buffer) {
- RADV_FROM_HANDLE(radv_buffer, buffer, dedicated_info->buffer);
- w = buffer->vk.size;
- format = AHARDWAREBUFFER_FORMAT_BLOB;
- usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
- } else {
- w = pAllocateInfo->allocationSize;
- format = AHARDWAREBUFFER_FORMAT_BLOB;
- usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
- }
-
- struct AHardwareBuffer *android_hardware_buffer = NULL;
- struct AHardwareBuffer_Desc desc = {
- .width = w,
- .height = h,
- .layers = layers,
- .format = format,
- .usage = usage,
- };
-
- if (AHardwareBuffer_allocate(&desc, &android_hardware_buffer) != 0)
+ mem->android_hardware_buffer = vk_alloc_ahardware_buffer(pAllocateInfo);
+ if (mem->android_hardware_buffer == NULL)
return VK_ERROR_OUT_OF_HOST_MEMORY;
- mem->android_hardware_buffer = android_hardware_buffer;
-
const struct VkImportAndroidHardwareBufferInfoANDROID import_info = {
.buffer = mem->android_hardware_buffer,
};
diff --git a/src/intel/vulkan/anv_android.c b/src/intel/vulkan/anv_android.c
index b93b2156cf7..a0260aaadb3 100644
--- a/src/intel/vulkan/anv_android.c
+++ b/src/intel/vulkan/anv_android.c
@@ -385,48 +385,8 @@ anv_create_ahw_memory(VkDevice device_h,
const VkMemoryAllocateInfo *pAllocateInfo)
{
#if ANDROID_API_LEVEL >= 26
- const VkMemoryDedicatedAllocateInfo *dedicated_info =
- vk_find_struct_const(pAllocateInfo->pNext,
- MEMORY_DEDICATED_ALLOCATE_INFO);
-
- uint32_t w = 0;
- uint32_t h = 1;
- uint32_t layers = 1;
- uint32_t format = 0;
- uint64_t usage = 0;
-
- /* If caller passed dedicated information. */
- if (dedicated_info && dedicated_info->image) {
- ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
- w = image->vk.extent.width;
- h = image->vk.extent.height;
- layers = image->vk.array_layers;
- format = anv_ahw_format_for_vk_format(image->vk.format);
- usage = vk_image_usage_to_ahb_usage(image->vk.create_flags,
- image->vk.usage);
- } else if (dedicated_info && dedicated_info->buffer) {
- ANV_FROM_HANDLE(anv_buffer, buffer, dedicated_info->buffer);
- w = buffer->vk.size;
- format = AHARDWAREBUFFER_FORMAT_BLOB;
- usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
- AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
- } else {
- w = pAllocateInfo->allocationSize;
- format = AHARDWAREBUFFER_FORMAT_BLOB;
- usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
- AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
- }
-
- struct AHardwareBuffer *ahw = NULL;
- struct AHardwareBuffer_Desc desc = {
- .width = w,
- .height = h,
- .layers = layers,
- .format = format,
- .usage = usage,
- };
-
- if (AHardwareBuffer_allocate(&desc, &ahw) != 0)
+ struct AHardwareBuffer *ahw = vk_alloc_ahardware_buffer(pAllocateInfo);
+ if (ahw == NULL)
return VK_ERROR_OUT_OF_HOST_MEMORY;
const VkImportAndroidHardwareBufferInfoANDROID import_info = {
diff --git a/src/intel/vulkan_hasvk/anv_android.c b/src/intel/vulkan_hasvk/anv_android.c
index a964a729762..50a9a2768ed 100644
--- a/src/intel/vulkan_hasvk/anv_android.c
+++ b/src/intel/vulkan_hasvk/anv_android.c
@@ -384,48 +384,8 @@ anv_create_ahw_memory(VkDevice device_h,
const VkMemoryAllocateInfo *pAllocateInfo)
{
#if ANDROID_API_LEVEL >= 26
- const VkMemoryDedicatedAllocateInfo *dedicated_info =
- vk_find_struct_const(pAllocateInfo->pNext,
- MEMORY_DEDICATED_ALLOCATE_INFO);
-
- uint32_t w = 0;
- uint32_t h = 1;
- uint32_t layers = 1;
- uint32_t format = 0;
- uint64_t usage = 0;
-
- /* If caller passed dedicated information. */
- if (dedicated_info && dedicated_info->image) {
- ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
- w = image->vk.extent.width;
- h = image->vk.extent.height;
- layers = image->vk.array_layers;
- format = anv_ahw_format_for_vk_format(image->vk.format);
- usage = vk_image_usage_to_ahb_usage(image->vk.create_flags,
- image->vk.usage);
- } else if (dedicated_info && dedicated_info->buffer) {
- ANV_FROM_HANDLE(anv_buffer, buffer, dedicated_info->buffer);
- w = buffer->vk.size;
- format = AHARDWAREBUFFER_FORMAT_BLOB;
- usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
- AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
- } else {
- w = pAllocateInfo->allocationSize;
- format = AHARDWAREBUFFER_FORMAT_BLOB;
- usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
- AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
- }
-
- struct AHardwareBuffer *ahw = NULL;
- struct AHardwareBuffer_Desc desc = {
- .width = w,
- .height = h,
- .layers = layers,
- .format = format,
- .usage = usage,
- };
-
- if (AHardwareBuffer_allocate(&desc, &ahw) != 0)
+ struct AHardwareBuffer *ahw = vk_alloc_ahardware_buffer(pAllocateInfo);
+ if (ahw == NULL)
return VK_ERROR_OUT_OF_HOST_MEMORY;
const VkImportAndroidHardwareBufferInfoANDROID import_info = {
diff --git a/src/vulkan/runtime/vk_android.c b/src/vulkan/runtime/vk_android.c
index 862a9374ee7..eb54b1d1cbf 100644
--- a/src/vulkan/runtime/vk_android.c
+++ b/src/vulkan/runtime/vk_android.c
@@ -23,13 +23,22 @@
#include "vk_android.h"
+#include "vk_buffer.h"
#include "vk_common_entrypoints.h"
#include "vk_device.h"
+#include "vk_image.h"
#include "vk_log.h"
#include "vk_queue.h"
+#include "vk_util.h"
#include "util/libsync.h"
+#include <hardware/gralloc.h>
+
+#if ANDROID_API_LEVEL >= 26
+#include <hardware/gralloc1.h>
+#endif
+
#include <unistd.h>
#if ANDROID_API_LEVEL >= 26
@@ -84,7 +93,61 @@ vk_image_usage_to_ahb_usage(const VkImageCreateFlags vk_create,
if (ahb_usage == 0)
ahb_usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
- return ahb_usage
+ return ahb_usage;
+}
+
+struct AHardwareBuffer *
+vk_alloc_ahardware_buffer(const VkMemoryAllocateInfo *pAllocateInfo)
+{
+ const VkMemoryDedicatedAllocateInfo *dedicated_info =
+ vk_find_struct_const(pAllocateInfo->pNext,
+ MEMORY_DEDICATED_ALLOCATE_INFO);
+
+ uint32_t w = 0;
+ uint32_t h = 1;
+ uint32_t layers = 1;
+ uint32_t format = 0;
+ uint64_t usage = 0;
+
+ /* If caller passed dedicated information. */
+ if (dedicated_info && dedicated_info->image) {
+ VK_FROM_HANDLE(vk_image, image, dedicated_info->image);
+ w = image->extent.width;
+ h = image->extent.height;
+ layers = image->array_layers;
+ assert(image->ahardware_buffer_format != 0);
+ /* TODO: This feels a bit sketchy. We should probably be taking the
+ * external format into account somehow.
+ */
+ format = image->ahardware_buffer_format;
+ usage = vk_image_usage_to_ahb_usage(image->create_flags,
+ image->usage);
+ } else if (dedicated_info && dedicated_info->buffer) {
+ VK_FROM_HANDLE(vk_buffer, buffer, dedicated_info->buffer);
+ w = buffer->size;
+ format = AHARDWAREBUFFER_FORMAT_BLOB;
+ usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
+ AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
+ } else {
+ w = pAllocateInfo->allocationSize;
+ format = AHARDWAREBUFFER_FORMAT_BLOB;
+ usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
+ AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
+ }
+
+ struct AHardwareBuffer_Desc desc = {
+ .width = w,
+ .height = h,
+ .layers = layers,
+ .format = format,
+ .usage = usage,
+ };
+
+ struct AHardwareBuffer *ahb;
+ if (AHardwareBuffer_allocate(&desc, &ahb) != 0)
+ return NULL;
+
+ return ahb;
}
#endif /* ANDROID_API_LEVEL >= 26 */
diff --git a/src/vulkan/runtime/vk_android.h b/src/vulkan/runtime/vk_android.h
index 668b01febdf..25b346c4f88 100644
--- a/src/vulkan/runtime/vk_android.h
+++ b/src/vulkan/runtime/vk_android.h
@@ -32,6 +32,9 @@ extern "C" {
#if ANDROID_API_LEVEL >= 26
uint64_t vk_image_usage_to_ahb_usage(const VkImageCreateFlags vk_create,
const VkImageUsageFlags vk_usage);
+
+struct AHardwareBuffer *
+vk_alloc_ahardware_buffer(const VkMemoryAllocateInfo *pAllocateInfo);
#endif
#ifdef __cplusplus