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/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;
}