lavapipe: use common vk_device_memory::ahardware_buffer
This drops most of the lavapipe specific codes for AHB handling. Reviewed-by: Konstantin Seurer <konstantin.seurer@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36252>
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
#if ANDROID_API_LEVEL >= 26
|
||||
#include <hardware/gralloc1.h>
|
||||
#include <vndk/hardware_buffer.h>
|
||||
#endif
|
||||
|
||||
#include <vulkan/vk_android_native_buffer.h>
|
||||
@@ -115,10 +116,10 @@ lvp_QueueSignalReleaseImageANDROID(VkQueue _queue,
|
||||
}
|
||||
|
||||
VkResult
|
||||
lvp_import_ahb_memory(struct lvp_device *device, struct lvp_device_memory *mem,
|
||||
const VkImportAndroidHardwareBufferInfoANDROID *info)
|
||||
lvp_import_ahb_memory(struct lvp_device *device, struct lvp_device_memory *mem)
|
||||
{
|
||||
const native_handle_t *handle = AHardwareBuffer_getNativeHandle(info->buffer);
|
||||
const native_handle_t *handle =
|
||||
AHardwareBuffer_getNativeHandle(mem->vk.ahardware_buffer);
|
||||
int dma_buf = (handle && handle->numFds) ? handle->data[0] : -1;
|
||||
if (dma_buf < 0)
|
||||
return VK_ERROR_INVALID_EXTERNAL_HANDLE;
|
||||
@@ -128,51 +129,9 @@ lvp_import_ahb_memory(struct lvp_device *device, struct lvp_device_memory *mem,
|
||||
if (!result)
|
||||
return VK_ERROR_INVALID_EXTERNAL_HANDLE;
|
||||
|
||||
AHardwareBuffer_acquire(info->buffer);
|
||||
mem->android_hardware_buffer = info->buffer;
|
||||
mem->size = size;
|
||||
mem->map = device->pscreen->map_memory(device->pscreen, mem->pmem);
|
||||
mem->memory_type = LVP_DEVICE_MEMORY_TYPE_DMA_BUF;
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
VkResult
|
||||
lvp_create_ahb_memory(struct lvp_device *device, struct lvp_device_memory *mem,
|
||||
const VkMemoryAllocateInfo *pAllocateInfo)
|
||||
{
|
||||
mem->android_hardware_buffer = vk_alloc_ahardware_buffer(pAllocateInfo);
|
||||
if (mem->android_hardware_buffer == NULL)
|
||||
return VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||
|
||||
const struct VkImportAndroidHardwareBufferInfoANDROID import_info = {
|
||||
.buffer = mem->android_hardware_buffer,
|
||||
};
|
||||
|
||||
VkResult result = lvp_import_ahb_memory(device, mem, &import_info);
|
||||
|
||||
/* Release a reference to avoid leak for AHB allocation. */
|
||||
AHardwareBuffer_release(mem->android_hardware_buffer);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#if ANDROID_API_LEVEL >= 26
|
||||
VkResult
|
||||
lvp_GetMemoryAndroidHardwareBufferANDROID(
|
||||
VkDevice device,
|
||||
const VkMemoryGetAndroidHardwareBufferInfoANDROID *pInfo,
|
||||
struct AHardwareBuffer **pBuffer)
|
||||
{
|
||||
LVP_FROM_HANDLE(lvp_device_memory, mem, pInfo->memory);
|
||||
|
||||
if (mem->android_hardware_buffer) {
|
||||
*pBuffer = mem->android_hardware_buffer;
|
||||
/* Increase refcount. */
|
||||
AHardwareBuffer_acquire(*pBuffer);
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
return VK_ERROR_INVALID_EXTERNAL_HANDLE;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1960,14 +1960,10 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_AllocateMemory(
|
||||
ASSERTED const VkExportMemoryAllocateInfo *export_info = NULL;
|
||||
ASSERTED const VkImportMemoryFdInfoKHR *import_info = NULL;
|
||||
const VkMemoryAllocateFlagsInfo *mem_flags = NULL;
|
||||
#if DETECT_OS_ANDROID
|
||||
ASSERTED const VkImportAndroidHardwareBufferInfoANDROID *ahb_import_info = NULL;
|
||||
#endif
|
||||
const VkImportMemoryHostPointerInfoEXT *host_ptr_info = NULL;
|
||||
VkResult error = VK_ERROR_OUT_OF_DEVICE_MEMORY;
|
||||
assert(pAllocateInfo->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO);
|
||||
int priority = 0;
|
||||
UNUSED bool is_ahb_export_alloc = false;
|
||||
|
||||
vk_foreach_struct_const(ext, pAllocateInfo->pNext) {
|
||||
switch ((unsigned)ext->sType) {
|
||||
@@ -1991,22 +1987,11 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_AllocateMemory(
|
||||
case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
|
||||
mem_flags = (void*)ext;
|
||||
break;
|
||||
#if DETECT_OS_ANDROID
|
||||
case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
|
||||
ahb_import_info = (VkImportAndroidHardwareBufferInfoANDROID*)ext;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if DETECT_OS_ANDROID
|
||||
is_ahb_export_alloc = !ahb_import_info && export_info &&
|
||||
export_info->handleTypes & VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
|
||||
#endif
|
||||
|
||||
#ifdef PIPE_MEMORY_FD
|
||||
if (import_info != NULL && import_info->fd < 0) {
|
||||
return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE);
|
||||
@@ -2022,10 +2007,6 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_AllocateMemory(
|
||||
mem->backed_fd = -1;
|
||||
mem->size = pAllocateInfo->allocationSize;
|
||||
|
||||
#if DETECT_OS_ANDROID
|
||||
mem->android_hardware_buffer = NULL;
|
||||
#endif
|
||||
|
||||
if (host_ptr_info) {
|
||||
mem->mem_alloc = (struct llvmpipe_memory_allocation) {
|
||||
.cpu_addr = host_ptr_info->pHostPointer,
|
||||
@@ -2035,12 +2016,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_AllocateMemory(
|
||||
mem->memory_type = LVP_DEVICE_MEMORY_TYPE_USER_PTR;
|
||||
}
|
||||
#if DETECT_OS_ANDROID
|
||||
else if(ahb_import_info) {
|
||||
error = lvp_import_ahb_memory(device, mem, ahb_import_info);
|
||||
if (error != VK_SUCCESS)
|
||||
goto fail;
|
||||
} else if (is_ahb_export_alloc) {
|
||||
error = lvp_create_ahb_memory(device, mem, pAllocateInfo);
|
||||
else if (mem->vk.ahardware_buffer) {
|
||||
error = lvp_import_ahb_memory(device, mem);
|
||||
if (error != VK_SUCCESS)
|
||||
goto fail;
|
||||
}
|
||||
@@ -2130,11 +2107,6 @@ VKAPI_ATTR void VKAPI_CALL lvp_FreeMemory(
|
||||
break;
|
||||
#ifdef PIPE_MEMORY_FD
|
||||
case LVP_DEVICE_MEMORY_TYPE_DMA_BUF:
|
||||
#if DETECT_OS_ANDROID
|
||||
if (mem->android_hardware_buffer)
|
||||
AHardwareBuffer_release(mem->android_hardware_buffer);
|
||||
FALLTHROUGH;
|
||||
#endif
|
||||
case LVP_DEVICE_MEMORY_TYPE_OPAQUE_FD:
|
||||
device->pscreen->free_memory_fd(device->pscreen, mem->pmem);
|
||||
if(mem->backed_fd >= 0)
|
||||
|
||||
@@ -49,10 +49,6 @@
|
||||
#include "drm-uapi/drm_fourcc.h"
|
||||
#endif
|
||||
|
||||
#if DETECT_OS_ANDROID
|
||||
#include <vndk/hardware_buffer.h>
|
||||
#endif
|
||||
|
||||
/* Pre-declarations needed for WSI entrypoints */
|
||||
struct wl_surface;
|
||||
struct wl_display;
|
||||
@@ -253,9 +249,6 @@ struct lvp_device_memory {
|
||||
void * map;
|
||||
enum lvp_device_memory_type memory_type;
|
||||
int backed_fd;
|
||||
#if DETECT_OS_ANDROID
|
||||
struct AHardwareBuffer *android_hardware_buffer;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct lvp_pipe_sync {
|
||||
@@ -809,11 +802,7 @@ lvp_nv_dgc_token_to_cmd_type(const VkIndirectCommandsLayoutTokenNV *token);
|
||||
|
||||
#if DETECT_OS_ANDROID
|
||||
VkResult
|
||||
lvp_import_ahb_memory(struct lvp_device *device, struct lvp_device_memory *mem,
|
||||
const VkImportAndroidHardwareBufferInfoANDROID *info);
|
||||
VkResult
|
||||
lvp_create_ahb_memory(struct lvp_device *device, struct lvp_device_memory *mem,
|
||||
const VkMemoryAllocateInfo *pAllocateInfo);
|
||||
lvp_import_ahb_memory(struct lvp_device *device, struct lvp_device_memory *mem);
|
||||
#endif
|
||||
|
||||
enum vk_cmd_type
|
||||
|
||||
Reference in New Issue
Block a user