Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> --- Android.common.mk | 3 ++ include/vulkan/vulkan_intel.h | 12 +++++ src/intel/Android.vulkan.mk | 4 +- src/intel/Makefile.sources | 3 ++ src/intel/vulkan/anv_entrypoints_gen.py | 24 ++++++++++ src/intel/vulkan/anv_extensions.py | 1 + src/intel/vulkan/anv_image.c | 69 +++++++++++++++++++++++++++ src/intel/vulkan/anv_wsi_android.c | 82 +++++++++++++++++++++++++++++++++ src/vulkan/registry/vk.xml | 2 +- 9 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 src/intel/vulkan/anv_wsi_android.c
diff --git a/Android.common.mk b/Android.common.mk index ecbbd87165..66f9ccdeec 100644 --- a/Android.common.mk +++ b/Android.common.mk @@ -103,6 +103,9 @@ endif LOCAL_CFLAGS_32 += -DDEFAULT_DRIVER_DIR=\"/system/lib/$(MESA_DRI_MODULE_REL_PATH)\" LOCAL_CFLAGS_64 += -DDEFAULT_DRIVER_DIR=\"/system/lib64/$(MESA_DRI_MODULE_REL_PATH)\" +# Enable VK_ANDROID_native_buffer +LOCAL_CFLAGS += -DVK_USE_PLATFORM_ANDROID_KHR + # uncomment to keep the debug symbols #LOCAL_STRIP_MODULE := false diff --git a/include/vulkan/vulkan_intel.h b/include/vulkan/vulkan_intel.h index 8ede61b53d..23078fcc34 100644 --- a/include/vulkan/vulkan_intel.h +++ b/include/vulkan/vulkan_intel.h @@ -55,6 +55,18 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateDmaBufImageINTEL( #endif +#ifdef VK_USE_PLATFORM_ANDROID_KHR +#ifndef PFN_vkGetSwapchainGrallocUsageANDROID +typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainGrallocUsageANDROID)(VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, int* grallocUsage); +#endif +#ifndef PFN_vkAcquireImageANDROID +typedef VkResult (VKAPI_PTR *PFN_vkAcquireImageANDROID)(VkDevice device, VkImage image, int nativeFenceFd, VkSemaphore semaphore, VkFence fence); +#endif +#ifndef PFN_vkQueueSignalReleaseImageANDROID +typedef VkResult (VKAPI_PTR *PFN_vkQueueSignalReleaseImageANDROID)(VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image, int* pNativeFenceFd); +#endif +#endif + #ifdef __cplusplus } // extern "C" #endif // __cplusplus diff --git a/src/intel/Android.vulkan.mk b/src/intel/Android.vulkan.mk index 44edafd24f..bd5ec01468 100644 --- a/src/intel/Android.vulkan.mk +++ b/src/intel/Android.vulkan.mk @@ -194,12 +194,14 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES intermediates := $(call local-generated-sources-dir) -LOCAL_SRC_FILES := $(VULKAN_FILES) +LOCAL_SRC_FILES := $(VULKAN_FILES) $(VULKAN_WSI_ANDROID_FILES) LOCAL_C_INCLUDES := \ $(ANV_INCLUDES) \ $(MESA_TOP)/src/compiler +LOCAL_CFLAGS += -isystem frameworks/native/vulkan/include + LOCAL_WHOLE_STATIC_LIBRARIES := \ libmesa_anv_entrypoints \ libmesa_genxml \ diff --git a/src/intel/Makefile.sources b/src/intel/Makefile.sources index 4074ba9ee5..752e137b6b 100644 --- a/src/intel/Makefile.sources +++ b/src/intel/Makefile.sources @@ -232,6 +232,9 @@ VULKAN_WSI_WAYLAND_FILES := \ VULKAN_WSI_X11_FILES := \ vulkan/anv_wsi_x11.c +VULKAN_WSI_ANDROID_FILES := \ + vulkan/anv_wsi_android.c + VULKAN_GEM_FILES := \ vulkan/anv_gem.c diff --git a/src/intel/vulkan/anv_entrypoints_gen.py b/src/intel/vulkan/anv_entrypoints_gen.py index f5c527ed92..7ddfcad839 100644 --- a/src/intel/vulkan/anv_entrypoints_gen.py +++ b/src/intel/vulkan/anv_entrypoints_gen.py @@ -360,6 +360,30 @@ def main(): 'VkImage* pImage', len(entrypoints), cal_hash('vkCreateDmaBufImageINTEL'), None)) + # Insert Android specific entrypoints + entrypoints.append(('VkResult', 'GetSwapchainGrallocUsageANDROID', + 'VkDevice device, ' + + 'VkFormat fmt, ' + + 'VkImageUsageFlags usage, ' + + 'int *grallocUsage', len(entrypoints), + cal_hash('vkGetSwapchainGrallocUsageANDROID'), None)) + + entrypoints.append(('VkResult', 'AcquireImageANDROID', + 'VkDevice device, ' + + 'VkImage image, ' + + 'int nativeFenceFd, ' + + 'VkSemaphore semaphore, ' + + 'VkFence fence', len(entrypoints), + cal_hash('vkAcquireImageANDROID'), None)) + + entrypoints.append(('VkResult', 'QueueSignalReleaseImageANDROID', + 'VkQueue queue, ' + + 'uint32_t waitSemaphoreCount, ' + + 'const VkSemaphore* pWaitSemaphores, ' + + 'VkImage image, ' + + 'int *pNativeFenceFd', len(entrypoints), + cal_hash('vkQueueSignalReleaseImageANDROID'), None)) + # For outputting entrypoints.h we generate a anv_EntryPoint() prototype # per entry point. with open(os.path.join(args.outdir, 'anv_entrypoints.h'), 'wb') as f: diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_extensions.py index 6b3d72e4b4..598be4d49a 100644 --- a/src/intel/vulkan/anv_extensions.py +++ b/src/intel/vulkan/anv_extensions.py @@ -71,6 +71,7 @@ EXTENSIONS = [ Extension('VK_KHR_surface', 25, True), Extension('VK_KHR_swapchain', 68, True), Extension('VK_KHR_variable_pointers', 1, True), + Extension('VK_ANDROID_native_buffer', 4, 'VK_USE_PLATFORM_ANDROID_KHR'), Extension('VK_KHR_wayland_surface', 6, 'VK_USE_PLATFORM_WAYLAND_KHR'), Extension('VK_KHR_xcb_surface', 6, 'VK_USE_PLATFORM_XCB_KHR'), Extension('VK_KHR_xlib_surface', 6, 'VK_USE_PLATFORM_XLIB_KHR'), diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 4f0a818b08..36f2b073aa 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -30,9 +30,14 @@ #include "anv_private.h" #include "util/debug.h" +#include "vulkan/util/vk_util.h" #include "vk_format_info.h" +#ifdef VK_USE_PLATFORM_ANDROID_KHR +#include <vulkan/vk_android_native_buffer.h> +#endif + /** * Exactly one bit must be set in \a aspect. */ @@ -338,6 +343,61 @@ make_surface(const struct anv_device *dev, return VK_SUCCESS; } +#ifdef VK_USE_PLATFORM_ANDROID_KHR +static int +anv_ioctl(int fd, unsigned long request, void *arg) +{ + int ret; + + do { + ret = ioctl(fd, request, arg); + } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); + + return ret; +} + +static VkResult +android_anv_image_create(VkDevice _device, + const VkAllocationCallbacks* alloc, + const VkImageCreateInfo *pCreateInfo, + const VkNativeBufferANDROID* buffer, + VkImage *pImage) +{ + struct anv_device *device = anv_device_from_handle(_device); + const native_handle_t* handle = (const native_handle_t*) (buffer->handle); + + struct drm_i915_gem_get_tiling get_tiling = { + .handle = anv_gem_fd_to_handle(device, handle->data[0]), + }; + + if (anv_ioctl(device->fd, DRM_IOCTL_I915_GEM_GET_TILING, + &get_tiling)) + return VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR; + + uint32_t stride = buffer->stride; + + if (get_tiling.tiling_mode == I915_TILING_X) + stride *= 4; + + VkDeviceMemory pMem; + VkDmaBufImageCreateInfo dmabufInfo = { + .sType = VK_STRUCTURE_TYPE_DMA_BUF_IMAGE_CREATE_INFO_INTEL, + .pNext = NULL, + .fd = handle->data[0], + .format = pCreateInfo->format, + .extent = { + .width = pCreateInfo->extent.width, + .height = pCreateInfo->extent.height, + .depth = pCreateInfo->extent.depth, + }, + .strideInBytes = stride, + }; + + return anv_CreateDmaBufImageINTEL(_device, &dmabufInfo, alloc, &pMem, + pImage); +} +#endif + VkResult anv_image_create(VkDevice _device, const struct anv_image_create_info *create_info, @@ -358,6 +418,15 @@ anv_image_create(VkDevice _device, anv_assert(pCreateInfo->extent.height > 0); anv_assert(pCreateInfo->extent.depth > 0); +#ifdef VK_USE_PLATFORM_ANDROID_KHR + vk_foreach_struct(image_ext, pCreateInfo->pNext) { + if (image_ext->sType == VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID) + return android_anv_image_create(_device, alloc, pCreateInfo, + (const VkNativeBufferANDROID *) + image_ext, pImage); + } +#endif + image = vk_zalloc2(&device->alloc, alloc, sizeof(*image), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (!image) diff --git a/src/intel/vulkan/anv_wsi_android.c b/src/intel/vulkan/anv_wsi_android.c new file mode 100644 index 0000000000..4e38e5f305 --- /dev/null +++ b/src/intel/vulkan/anv_wsi_android.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2017 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include <libsync.h> +#include <util/hash_table.h> +#include "vk_format_info.h" +#include "anv_private.h" + +/* libhardware/include/hardware/gralloc.h */ +enum { + GRALLOC_USAGE_HW_TEXTURE = 0x00000100, + GRALLOC_USAGE_HW_RENDER = 0x00000200, + GRALLOC_USAGE_HW_FB = 0x00001000, +}; + +VkResult +anv_GetSwapchainGrallocUsageANDROID(VkDevice device, + VkFormat format, + VkImageUsageFlags imageUsage, + int* grallocUsage) +{ + VkImageUsageFlags usageSrc = + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | + VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; + + VkImageUsageFlags usageDst = + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + + /* used for texturing */ + if (imageUsage & usageSrc) + *grallocUsage |= GRALLOC_USAGE_HW_TEXTURE; + + /* used for rendering */ + if (imageUsage & usageDst) + *grallocUsage |= GRALLOC_USAGE_HW_RENDER; + + return VK_SUCCESS; +} + +VkResult +anv_AcquireImageANDROID(VkDevice device, + VkImage image, + int nativeFenceFd, + VkSemaphore semaphore, + VkFence fence) +{ + sync_wait(nativeFenceFd, -1); + close(nativeFenceFd); + return VK_SUCCESS; +} + +VkResult +anv_QueueSignalReleaseImageANDROID(VkQueue queue, + uint32_t waitSemaphoreCount, + const VkSemaphore* pWaitSemaphores, + VkImage image, + int* pNativeFenceFd) +{ + if (pNativeFenceFd) + *pNativeFenceFd = -1; + return VK_SUCCESS; +} diff --git a/src/vulkan/registry/vk.xml b/src/vulkan/registry/vk.xml index f0a1cd625b..cef80b997c 100644 --- a/src/vulkan/registry/vk.xml +++ b/src/vulkan/registry/vk.xml @@ -5500,7 +5500,7 @@ private version is maintained in the 1.0 branch of the member gitlab server. <command name="vkGetPhysicalDeviceWin32PresentationSupportKHR"/> </require> </extension> - <extension name="VK_ANDROID_native_buffer" number="11" supported="disabled"> + <extension name="VK_ANDROID_native_buffer" number="11" type="device" supported="vulkan"> <require> <enum value="4" name="VK_ANDROID_NATIVE_BUFFER_SPEC_VERSION"/> <enum value="11" name="VK_ANDROID_NATIVE_BUFFER_NUMBER"/> -- 2.13.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev