Revert "Revert "Fix VkImageCreateInfo mismatch for AHB sibling V..."
Revert "Revert "Fix VkImageCreateInfo mismatch for AHB sibling V..."
Revert "Revert "Fix VkImageCreateInfo mismatch for AHB sibling V..."
Revert submission 1913972-revert-1909696-aosp-image-ci-mismatch-NCXVEHFTRL
Reason for revert: Reland mismatch VkImageCreateInfo for AHB sibiling VkImage.
Reverted Changes:
I70044e66c:Revert "vulkan-cereal: Remove marshaling/decoding ...
Ifaca8d3e0:Revert "Reland "macOS: Remove Vulkan cereal marsha...
If0baa330b:Revert "Regenerate Vulkan sources"
I84a310fac:Revert "Fix VkImageCreateInfo mismatch for AHB sib...
Id8293bddc:Revert "Rerun codegen"
I0931036ca:Revert "Fix VkImageCreateInfo mismatch for AHB sib...
Ifae1da6bf:Revert "Remove trailing semicolon for DEFINE_ALIAS...
I9dfda4c0e:Revert "Fix VkImageCreateInfo mismatch for AHB sib...
Change-Id: If7c2d73afd1482db3964a57ed718859c7c321e67
diff --git a/protocols/vulkan/xml/cereal/common/vulkantypes.py b/protocols/vulkan/xml/cereal/common/vulkantypes.py
index 6e2c51a..9bff520 100644
--- a/protocols/vulkan/xml/cereal/common/vulkantypes.py
+++ b/protocols/vulkan/xml/cereal/common/vulkantypes.py
@@ -169,6 +169,7 @@
NON_TRIVIAL_TRANSFORMED_TYPES = [
"VkExternalMemoryProperties",
+ "VkImageCreateInfo",
]
TRANSFORMED_TYPES = TRIVIAL_TRANSFORMED_TYPES + NON_TRIVIAL_TRANSFORMED_TYPES
diff --git a/stream-servers/vulkan/VkCommonOperations.cpp b/stream-servers/vulkan/VkCommonOperations.cpp
index 330324f..f6b83ea 100644
--- a/stream-servers/vulkan/VkCommonOperations.cpp
+++ b/stream-servers/vulkan/VkCommonOperations.cpp
@@ -1415,6 +1415,79 @@
return 0;
}
+// pNext, sharingMode, queueFamilyIndexCount, pQueueFamilyIndices, and initialLayout won't be
+// filled.
+static std::unique_ptr<VkImageCreateInfo> generateColorBufferVkImageCreateInfo_locked(
+ VkFormat format, uint32_t width, uint32_t height, VkImageTiling tiling) {
+ const VkFormatProperties* maybeFormatProperties = nullptr;
+ for (const auto& supportInfo : sVkEmulation->imageSupportInfo) {
+ if (supportInfo.format == format && supportInfo.supported) {
+ maybeFormatProperties = &supportInfo.formatProps2.formatProperties;
+ break;
+ }
+ }
+ if (!maybeFormatProperties) {
+ ERR("Format %s is not supported.", string_VkFormat(format));
+ return nullptr;
+ }
+ const VkFormatProperties& formatProperties = *maybeFormatProperties;
+
+ constexpr std::pair<VkFormatFeatureFlags, VkImageUsageFlags> formatUsagePairs[] = {
+ {VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT},
+ {VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT, VK_IMAGE_USAGE_SAMPLED_BIT},
+ {VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT},
+ {VK_FORMAT_FEATURE_TRANSFER_DST_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT},
+ {VK_FORMAT_FEATURE_BLIT_SRC_BIT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT},
+ };
+ VkFormatFeatureFlags tilingFeatures = (tiling == VK_IMAGE_TILING_OPTIMAL)
+ ? formatProperties.optimalTilingFeatures
+ : formatProperties.linearTilingFeatures;
+
+ VkImageUsageFlags usage = 0;
+ for (const auto& formatUsage : formatUsagePairs) {
+ usage |= (tilingFeatures & formatUsage.first) ? formatUsage.second : 0u;
+ }
+
+ return std::make_unique<VkImageCreateInfo>(VkImageCreateInfo{
+ .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+ // The caller is responsible to fill pNext.
+ .pNext = nullptr,
+ .flags = 0,
+ .imageType = VK_IMAGE_TYPE_2D,
+ .format = format,
+ .extent =
+ {
+ .width = width,
+ .height = height,
+ .depth = 1,
+ },
+ .mipLevels = 1,
+ .arrayLayers = 1,
+ .samples = VK_SAMPLE_COUNT_1_BIT,
+ .tiling = tiling,
+ .usage = usage,
+ // The caller is responsible to fill sharingMode.
+ .sharingMode = VK_SHARING_MODE_MAX_ENUM,
+ // The caller is responsible to fill queueFamilyIndexCount.
+ .queueFamilyIndexCount = 0,
+ // The caller is responsible to fill pQueueFamilyIndices.
+ .pQueueFamilyIndices = nullptr,
+ // The caller is responsible to fill initialLayout.
+ .initialLayout = VK_IMAGE_LAYOUT_MAX_ENUM,
+ });
+}
+
+std::unique_ptr<VkImageCreateInfo> generateColorBufferVkImageCreateInfo(VkFormat format,
+ uint32_t width,
+ uint32_t height,
+ VkImageTiling tiling) {
+ if (!sVkEmulation || !sVkEmulation->live) {
+ GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Host Vulkan device lost";
+ }
+ AutoLock lock(sVkEmulationLock);
+ return generateColorBufferVkImageCreateInfo_locked(format, width, height, tiling);
+}
+
// TODO(liyl): Currently we can only specify required memoryProperty
// for a color buffer.
//
@@ -1502,46 +1575,24 @@
res.frameworkFormat = frameworkFormat;
res.frameworkStride = 0;
- res.extent = { (uint32_t)width, (uint32_t)height, 1 };
- res.format = vkFormat;
- res.type = VK_IMAGE_TYPE_2D;
+ VkImageTiling tiling = (memoryProperty & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
+ ? VK_IMAGE_TILING_LINEAR
+ : VK_IMAGE_TILING_OPTIMAL;
+ std::unique_ptr<VkImageCreateInfo> imageCi =
+ generateColorBufferVkImageCreateInfo_locked(vkFormat, width, height, tiling);
+ // pNext will be filled later.
+ imageCi->sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ imageCi->queueFamilyIndexCount = 0;
+ imageCi->pQueueFamilyIndices = nullptr;
+ imageCi->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- res.tiling = (memoryProperty & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
- ? VK_IMAGE_TILING_LINEAR
- : VK_IMAGE_TILING_OPTIMAL;
-
- VkFormatProperties formatProperties = {};
- for (const auto& supportInfo : sVkEmulation->imageSupportInfo) {
- if (supportInfo.format == vkFormat && supportInfo.supported) {
- formatProperties = supportInfo.formatProps2.formatProperties;
- break;
- }
- }
-
- constexpr std::pair<VkFormatFeatureFlags, VkImageUsageFlags>
- formatUsagePairs[] = {
- {VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT},
- {VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
- VK_IMAGE_USAGE_SAMPLED_BIT},
- {VK_FORMAT_FEATURE_TRANSFER_SRC_BIT,
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT},
- {VK_FORMAT_FEATURE_TRANSFER_DST_BIT,
- VK_IMAGE_USAGE_TRANSFER_DST_BIT},
- {VK_FORMAT_FEATURE_BLIT_SRC_BIT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT},
- };
- VkFormatFeatureFlags tilingFeatures =
- (res.tiling == VK_IMAGE_TILING_OPTIMAL)
- ? formatProperties.optimalTilingFeatures
- : formatProperties.linearTilingFeatures;
- res.usageFlags = 0u;
- for (const auto& formatUsage : formatUsagePairs) {
- res.usageFlags |=
- (tilingFeatures & formatUsage.first) ? formatUsage.second : 0u;
- }
- res.createFlags = 0;
-
- res.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ res.extent = imageCi->extent;
+ res.format = imageCi->format;
+ res.type = imageCi->imageType;
+ res.tiling = imageCi->tiling;
+ res.usageFlags = imageCi->usage;
+ res.createFlags = imageCi->flags;
+ res.sharingMode = imageCi->sharingMode;
// Create the image. If external memory is supported, make it external.
VkExternalMemoryImageCreateInfo extImageCi = {
@@ -1555,22 +1606,10 @@
extImageCiPtr = &extImageCi;
}
- VkImageCreateInfo imageCi = {
- VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, extImageCiPtr,
- res.createFlags,
- res.type,
- res.format,
- res.extent,
- 1, 1,
- VK_SAMPLE_COUNT_1_BIT,
- res.tiling,
- res.usageFlags,
- VK_SHARING_MODE_EXCLUSIVE, 0, nullptr,
- VK_IMAGE_LAYOUT_UNDEFINED,
- };
+ imageCi->pNext = extImageCiPtr;
- VkResult createRes = vk->vkCreateImage(sVkEmulation->device, &imageCi,
- nullptr, &res.image);
+ VkResult createRes =
+ vk->vkCreateImage(sVkEmulation->device, imageCi.get(), nullptr, &res.image);
if (createRes != VK_SUCCESS) {
// LOG(VERBOSE) << "Failed to create Vulkan image for ColorBuffer "
// << colorBufferHandle;
@@ -1646,7 +1685,7 @@
glCompatible &&
FrameBuffer::getFB()->importMemoryToColorBuffer(
dupExternalMemory(res.memory.exportedHandle), res.memory.size, false /* dedicated */,
- vulkanOnly, colorBufferHandle, res.image, imageCi)) {
+ vulkanOnly, colorBufferHandle, res.image, *imageCi)) {
res.glExported = true;
}
diff --git a/stream-servers/vulkan/VkCommonOperations.h b/stream-servers/vulkan/VkCommonOperations.h
index d42eaa8..30a5cdf 100644
--- a/stream-servers/vulkan/VkCommonOperations.h
+++ b/stream-servers/vulkan/VkCommonOperations.h
@@ -366,6 +366,11 @@
bool isColorBufferVulkanCompatible(uint32_t colorBufferHandle);
+std::unique_ptr<VkImageCreateInfo> generateColorBufferVkImageCreateInfo(VkFormat format,
+ uint32_t width,
+ uint32_t height,
+ VkImageTiling tiling);
+
bool setupVkColorBuffer(uint32_t colorBufferHandle,
bool vulkanOnly = false,
uint32_t memoryProperty = 0,
diff --git a/stream-servers/vulkan/VkDecoder.cpp b/stream-servers/vulkan/VkDecoder.cpp
index 6b03965..c10778e 100644
--- a/stream-servers/vulkan/VkDecoder.cpp
+++ b/stream-servers/vulkan/VkDecoder.cpp
@@ -3258,6 +3258,7 @@
*(VkImage*)pImage = (VkImage)(VkImage)((VkImage)(*&cgen_var_2));
if (pCreateInfo)
{
+ m_state->transformImpl_VkImageCreateInfo_tohost(pCreateInfo, 1);
transform_tohost_VkImageCreateInfo(m_state, (VkImageCreateInfo*)(pCreateInfo));
}
if (pAllocator)
@@ -23890,6 +23891,7 @@
reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), readStreamPtrPtr);
if (pCreateInfo)
{
+ m_state->transformImpl_VkImageCreateInfo_tohost(pCreateInfo, 1);
transform_tohost_VkImageCreateInfo(m_state, (VkImageCreateInfo*)(pCreateInfo));
}
if (pAllocator)
diff --git a/stream-servers/vulkan/VkDecoderGlobalState.cpp b/stream-servers/vulkan/VkDecoderGlobalState.cpp
index 24139fc..fd07920 100644
--- a/stream-servers/vulkan/VkDecoderGlobalState.cpp
+++ b/stream-servers/vulkan/VkDecoderGlobalState.cpp
@@ -22,7 +22,6 @@
#include "DecompressionShaders.h"
#include "FrameBuffer.h"
-#include "compressedTextureFormats/etc.h"
#include "VkAndroidNativeBuffer.h"
#include "VkCommonOperations.h"
#include "VkDecoderSnapshot.h"
@@ -30,24 +29,26 @@
#include "VulkanDispatch.h"
#include "VulkanStream.h"
#include "base/ArraySize.h"
-#include "base/Optional.h"
+#include "base/ConditionVariable.h"
#include "base/EntityManager.h"
#include "base/HybridEntityManager.h"
-#include "base/Lookup.h"
-#include "base/Stream.h"
-#include "base/ConditionVariable.h"
#include "base/Lock.h"
+#include "base/Lookup.h"
+#include "base/Optional.h"
+#include "base/Stream.h"
#include "base/System.h"
#include "base/Tracing.h"
-#include "common/goldfish_vk_marshaling.h"
-#include "common/goldfish_vk_reserved_marshaling.h"
#include "common/goldfish_vk_deepcopy.h"
#include "common/goldfish_vk_dispatch.h"
-#include "host-common/address_space_device_control_ops.h"
+#include "common/goldfish_vk_marshaling.h"
+#include "common/goldfish_vk_reserved_marshaling.h"
+#include "compressedTextureFormats/etc.h"
#include "host-common/GfxstreamFatalError.h"
-#include "host-common/vm_operations.h"
+#include "host-common/address_space_device_control_ops.h"
#include "host-common/feature_control.h"
+#include "host-common/vm_operations.h"
#include "vk_util.h"
+#include "vulkan/vk_enum_string_helper.h"
#ifndef _WIN32
#include <unistd.h>
@@ -4794,6 +4795,76 @@
}
}
+ void transformImpl_VkImageCreateInfo_tohost(const VkImageCreateInfo* pImageCreateInfos,
+ uint32_t count) {
+ for (uint32_t i = 0; i < count; i++) {
+ VkImageCreateInfo& imageCreateInfo =
+ const_cast<VkImageCreateInfo&>(pImageCreateInfos[i]);
+ const VkExternalMemoryImageCreateInfo* pExternalMemoryImageCi =
+ vk_find_struct<VkExternalMemoryImageCreateInfo>(&imageCreateInfo);
+
+ if (pExternalMemoryImageCi &&
+ (pExternalMemoryImageCi->handleTypes &
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)) {
+ std::unique_ptr<VkImageCreateInfo> colorBufferVkImageCi =
+ goldfish_vk::generateColorBufferVkImageCreateInfo(
+ imageCreateInfo.format, imageCreateInfo.extent.width,
+ imageCreateInfo.extent.height, imageCreateInfo.tiling);
+ if (imageCreateInfo.flags & (~colorBufferVkImageCi->flags)) {
+ ERR("The VkImageCreateInfo to import AHardwareBuffer contains unsupported "
+ "VkImageCreateFlags. All supported VkImageCreateFlags are %s, the input "
+ "VkImageCreateInfo requires support for %s.",
+ string_VkImageCreateFlags(colorBufferVkImageCi->flags).c_str(),
+ string_VkImageCreateFlags(imageCreateInfo.flags).c_str());
+ }
+ imageCreateInfo.flags |= colorBufferVkImageCi->flags;
+ if (imageCreateInfo.imageType != colorBufferVkImageCi->imageType) {
+ ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+ "VkImageType: %s, %s expected.",
+ string_VkImageType(imageCreateInfo.imageType),
+ string_VkImageType(colorBufferVkImageCi->imageType));
+ }
+ // VkImageCreateInfo::extent::{width, height} are guaranteed to match.
+ if (imageCreateInfo.extent.depth != colorBufferVkImageCi->extent.depth) {
+ ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+ "VkExtent::depth: %" PRIu32 ", %" PRIu32 " expected.",
+ imageCreateInfo.extent.depth, colorBufferVkImageCi->extent.depth);
+ }
+ if (imageCreateInfo.mipLevels != colorBufferVkImageCi->mipLevels) {
+ ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+ "mipLevels: %" PRIu32 ", %" PRIu32 " expected.",
+ imageCreateInfo.mipLevels, colorBufferVkImageCi->mipLevels);
+ }
+ if (imageCreateInfo.arrayLayers != colorBufferVkImageCi->arrayLayers) {
+ ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+ "arrayLayers: %" PRIu32 ", %" PRIu32 " expected.",
+ imageCreateInfo.arrayLayers, colorBufferVkImageCi->arrayLayers);
+ }
+ if (imageCreateInfo.samples != colorBufferVkImageCi->samples) {
+ ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+ "VkSampleCountFlagBits: %s, %s expected.",
+ string_VkSampleCountFlagBits(imageCreateInfo.samples),
+ string_VkSampleCountFlagBits(colorBufferVkImageCi->samples));
+ }
+ // VkImageCreateInfo::tiling is guaranteed to match.
+ if (imageCreateInfo.usage & (~colorBufferVkImageCi->usage)) {
+ ERR("The VkImageCreateInfo to import AHardwareBuffer contains unsupported "
+ "VkImageUsageFlags. All supported VkImageUsageFlags are %s, the input "
+ "VkImageCreateInfo requires support for %s.",
+ string_VkImageUsageFlags(imageCreateInfo.usage).c_str(),
+ string_VkImageUsageFlags(colorBufferVkImageCi->usage).c_str());
+ }
+ imageCreateInfo.usage |= colorBufferVkImageCi->usage;
+ // VkImageCreateInfo::{sharingMode, queueFamilyIndexCount, pQueueFamilyIndices,
+ // initialLayout} aren't filled in generateColorBufferVkImageCreateInfo.
+ }
+ }
+ }
+
+ void transformImpl_VkImageCreateInfo_fromhost(const VkImageCreateInfo*, uint32_t) {
+ GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Not yet implemented.";
+ }
+
#define DEFINE_EXTERNAL_HANDLE_TYPE_TRANSFORM(type, field) \
void transformImpl_##type##_tohost(const type* props, uint32_t count) { \
type* mut = (type*)props; \
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h b/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h
index 5963685..c52cb4c 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h
@@ -45,6 +45,7 @@
#define LIST_NON_TRIVIAL_TRANSFORMED_TYPES(f) \
f(VkExternalMemoryProperties) \
+f(VkImageCreateInfo) \
#define LIST_TRANSFORMED_TYPES(f) \
LIST_TRIVIAL_TRANSFORMED_TYPES(f) \