#if ANDROID_API_LEVEL >= 26
#include <hardware/gralloc1.h>
-#include <grallocusage/GrallocUsageConversion.h>
#endif
#include <hardware/hardware.h>
VkAndroidHardwareBufferPropertiesANDROID *pProperties)
{
ANV_FROM_HANDLE(anv_device, dev, device_h);
- struct anv_physical_device *pdevice = &dev->instance->physicalDevice;
VkAndroidHardwareBufferFormatPropertiesANDROID *format_prop =
vk_find_struct(pProperties->pNext,
return VK_ERROR_INVALID_EXTERNAL_HANDLE;
/* All memory types. */
- uint32_t memory_types = (1ull << pdevice->memory.type_count) - 1;
+ uint32_t memory_types = (1ull << dev->physical->memory.type_count) - 1;
pProperties->allocationSize = lseek(dma_buf, 0, SEEK_END);
pProperties->memoryTypeBits = memory_types;
if (dma_buf < 0)
return VK_ERROR_INVALID_EXTERNAL_HANDLE;
- VkResult result = anv_device_import_bo(device, dma_buf, 0, &mem->bo);
- assert(VK_SUCCESS);
+ VkResult result = anv_device_import_bo(device, dma_buf, 0,
+ 0 /* client_address */,
+ &mem->bo);
+ assert(result == VK_SUCCESS);
/* "If the vkAllocateMemory command succeeds, the implementation must
* acquire a reference to the imported hardware buffer, which it must
anv_image_from_external(
VkDevice device_h,
const VkImageCreateInfo *base_info,
- const struct VkExternalMemoryImageCreateInfo *create_info,
+ const VkExternalMemoryImageCreateInfo *create_info,
const VkAllocationCallbacks *alloc,
VkImage *out_image_h)
{
#if ANDROID_API_LEVEL >= 26
ANV_FROM_HANDLE(anv_device, device, device_h);
- const struct VkExternalFormatANDROID *ext_info =
+ const VkExternalFormatANDROID *ext_info =
vk_find_struct_const(base_info->pNext, EXTERNAL_FORMAT_ANDROID);
if (ext_info && ext_info->externalFormat != 0) {
};
if (gralloc_info->handle->numFds != 1) {
- return vk_errorf(device->instance, device,
- VK_ERROR_INVALID_EXTERNAL_HANDLE,
+ return vk_errorf(device, device, VK_ERROR_INVALID_EXTERNAL_HANDLE,
"VkNativeBufferANDROID::handle::numFds is %d, "
"expected 1", gralloc_info->handle->numFds);
}
result = anv_device_import_bo(device, dma_buf,
ANV_BO_ALLOC_IMPLICIT_SYNC |
ANV_BO_ALLOC_IMPLICIT_WRITE,
+ 0 /* client_address */,
&bo);
if (result != VK_SUCCESS) {
- return vk_errorf(device->instance, device, result,
+ return vk_errorf(device, device, result,
"failed to import dma-buf from VkNativeBufferANDROID");
}
anv_info.isl_tiling_flags = ISL_TILING_Y0_BIT;
break;
case -1:
- result = vk_errorf(device->instance, device,
- VK_ERROR_INVALID_EXTERNAL_HANDLE,
+ result = vk_errorf(device, device, VK_ERROR_INVALID_EXTERNAL_HANDLE,
"DRM_IOCTL_I915_GEM_GET_TILING failed for "
"VkNativeBufferANDROID");
goto fail_tiling;
default:
- result = vk_errorf(device->instance, device,
- VK_ERROR_INVALID_EXTERNAL_HANDLE,
+ result = vk_errorf(device, device, VK_ERROR_INVALID_EXTERNAL_HANDLE,
"DRM_IOCTL_I915_GEM_GET_TILING returned unknown "
"tiling %d for VkNativeBufferANDROID", i915_tiling);
goto fail_tiling;
goto fail_create;
if (bo->size < image->size) {
- result = vk_errorf(device->instance, device,
- VK_ERROR_INVALID_EXTERNAL_HANDLE,
+ result = vk_errorf(device, device, VK_ERROR_INVALID_EXTERNAL_HANDLE,
"dma-buf from VkNativeBufferANDROID is too small for "
"VkImage: %"PRIu64"B < %"PRIu64"B",
bo->size, image->size);
return result;
}
-VkResult
+static VkResult
format_supported_with_usage(VkDevice device_h, VkFormat format,
VkImageUsageFlags imageUsage)
{
ANV_FROM_HANDLE(anv_device, device, device_h);
- struct anv_physical_device *phys_dev = &device->instance->physicalDevice;
- VkPhysicalDevice phys_dev_h = anv_physical_device_to_handle(phys_dev);
+ VkPhysicalDevice phys_dev_h = anv_physical_device_to_handle(device->physical);
VkResult result;
const VkPhysicalDeviceImageFormatInfo2 image_format_info = {
result = anv_GetPhysicalDeviceImageFormatProperties2(phys_dev_h,
&image_format_info, &image_format_props);
if (result != VK_SUCCESS) {
- return vk_errorf(device->instance, device, result,
+ return vk_errorf(device, device, result,
"anv_GetPhysicalDeviceImageFormatProperties2 failed "
"inside %s", __func__);
}
* gralloc swapchains.
*/
if (imageUsage != 0) {
- return vk_errorf(device->instance, device, VK_ERROR_FORMAT_NOT_SUPPORTED,
+ return vk_errorf(device, device, VK_ERROR_FORMAT_NOT_SUPPORTED,
"unsupported VkImageUsageFlags(0x%x) for gralloc "
"swapchain", imageUsage);
}
*/
switch (format) {
case VK_FORMAT_B8G8R8A8_UNORM:
- case VK_FORMAT_B5G6R5_UNORM_PACK16:
+ case VK_FORMAT_R5G6B5_UNORM_PACK16:
case VK_FORMAT_R8G8B8A8_UNORM:
case VK_FORMAT_R8G8B8A8_SRGB:
*grallocUsage |= GRALLOC_USAGE_HW_FB |
return VK_SUCCESS;
}
-
#if ANDROID_API_LEVEL >= 26
VkResult anv_GetSwapchainGrallocUsage2ANDROID(
VkDevice device_h,
if (result != VK_SUCCESS)
return result;
- android_convertGralloc0To1Usage(grallocUsage, grallocProducerUsage,
- grallocConsumerUsage);
+ /* Setup gralloc1 usage flags from gralloc0 flags. */
+
+ if (grallocUsage & GRALLOC_USAGE_HW_RENDER) {
+ *grallocProducerUsage |= GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET;
+ *grallocConsumerUsage |= GRALLOC1_CONSUMER_USAGE_CLIENT_TARGET;
+ }
+
+ if (grallocUsage & GRALLOC_USAGE_HW_TEXTURE) {
+ *grallocConsumerUsage |= GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE;
+ }
+
+ if (grallocUsage & (GRALLOC_USAGE_HW_FB |
+ GRALLOC_USAGE_HW_COMPOSER |
+ GRALLOC_USAGE_EXTERNAL_DISP)) {
+ *grallocProducerUsage |= GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET;
+ *grallocConsumerUsage |= GRALLOC1_CONSUMER_USAGE_HWCOMPOSER;
+ }
return VK_SUCCESS;
}
VkImageUsageFlags imageUsage,
int* grallocUsage)
{
- ANV_FROM_HANDLE(anv_device, device, device_h);
- struct anv_physical_device *phys_dev = &device->instance->physicalDevice;
- VkPhysicalDevice phys_dev_h = anv_physical_device_to_handle(phys_dev);
VkResult result;
*grallocUsage = 0;
* VkFence.
*/
if (sync_wait(nativeFenceFd, /*timeout*/ -1) < 0) {
- result = vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
+ result = vk_errorf(device, device, VK_ERROR_DEVICE_LOST,
"%s: failed to wait on nativeFenceFd=%d",
__func__, nativeFenceFd);
}
result = anv_QueueSubmit(anv_queue_to_handle(&device->queue), 1,
&submit, fence_h);
if (result != VK_SUCCESS) {
- return vk_errorf(device->instance, device, result,
+ return vk_errorf(device, device, result,
"anv_QueueSubmit failed inside %s", __func__);
}
}