vknulldrv: Implement VkImage
Change-Id: Ief50f433fc9b1ad4f4b0ee28912993d59d9df411
(cherry picked from commit cd1a7c4312ac5828682e580fdbbad7b10dbf5a45)
diff --git a/vulkan/nulldrv/null_driver.cpp b/vulkan/nulldrv/null_driver.cpp
index 2cd25bd..c31fcb0 100644
--- a/vulkan/nulldrv/null_driver.cpp
+++ b/vulkan/nulldrv/null_driver.cpp
@@ -421,6 +421,66 @@
}
// -----------------------------------------------------------------------------
+// Image
+
+struct Image {
+ typedef VkImage HandleType;
+ VkDeviceSize size;
+};
+template <>
+struct HandleTraits<VkImage> {
+ typedef Image* PointerType;
+};
+
+VkResult CreateImage(VkDevice device,
+ const VkImageCreateInfo* create_info,
+ VkImage* image_handle) {
+ if (create_info->imageType != VK_IMAGE_TYPE_2D ||
+ create_info->format != VK_FORMAT_R8G8B8A8_UNORM ||
+ create_info->mipLevels != 1) {
+ ALOGE("CreateImage: not yet implemented: type=%d format=%d mips=%u",
+ create_info->imageType, create_info->format,
+ create_info->mipLevels);
+ return VK_ERROR_UNAVAILABLE;
+ }
+
+ VkDeviceSize size =
+ VkDeviceSize(create_info->extent.width * create_info->extent.height) *
+ create_info->arraySize * create_info->samples * 4u;
+ ALOGW_IF(size > kMaxDeviceMemory,
+ "CreateImage: image size 0x%" PRIx64
+ " exceeds max device memory size 0x%" PRIx64,
+ size, kMaxDeviceMemory);
+
+ const VkAllocCallbacks* alloc = device->instance->alloc;
+ Image* image = static_cast<Image*>(
+ alloc->pfnAlloc(alloc->pUserData, sizeof(Image), alignof(Image),
+ VK_SYSTEM_ALLOC_TYPE_API_OBJECT));
+ if (!image)
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+ image->size = size;
+ *image_handle = GetHandleToObject(image);
+ return VK_SUCCESS;
+}
+
+VkResult GetImageMemoryRequirements(VkDevice,
+ VkImage image_handle,
+ VkMemoryRequirements* requirements) {
+ Image* image = GetObjectFromHandle(image_handle);
+ requirements->size = image->size;
+ requirements->alignment = 16; // allow fast Neon/SSE memcpy
+ requirements->memoryTypeBits = 0x1;
+ return VK_SUCCESS;
+}
+
+VkResult DestroyImage(VkDevice device, VkImage image_handle) {
+ const VkAllocCallbacks* alloc = device->instance->alloc;
+ Image* image = GetObjectFromHandle(image_handle);
+ alloc->pfnFree(alloc->pUserData, image);
+ return VK_SUCCESS;
+}
+
+// -----------------------------------------------------------------------------
// No-op types
VkResult CreateAttachmentView(VkDevice device,
@@ -695,11 +755,6 @@
return VK_SUCCESS;
}
-VkResult GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements) {
- ALOGV("TODO: vk%s", __FUNCTION__);
- return VK_SUCCESS;
-}
-
VkResult BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset) {
ALOGV("TODO: vk%s", __FUNCTION__);
return VK_SUCCESS;
@@ -793,16 +848,6 @@
return VK_SUCCESS;
}
-VkResult CreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage) {
- ALOGV("TODO: vk%s", __FUNCTION__);
- return VK_SUCCESS;
-}
-
-VkResult DestroyImage(VkDevice device, VkImage image) {
- ALOGV("TODO: vk%s", __FUNCTION__);
- return VK_SUCCESS;
-}
-
VkResult GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout) {
ALOGV("TODO: vk%s", __FUNCTION__);
return VK_SUCCESS;