gfxstream guest: Add vkGetLinearImageLayout2GOOGLE
See host change (aosp/1997493) for details.
Bug: fxbug.dev/94188
Change-Id: I1a6798a387032c09c06871d5bbe6198559495a22
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index c5104da..2fbeb75 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -4341,7 +4341,6 @@
local_pAllocator = nullptr;
if (local_pCreateInfo)
{
- sResourceTracker->transformImpl_VkImageCreateInfo_tohost(local_pCreateInfo, 1);
transform_tohost_VkImageCreateInfo(sResourceTracker, (VkImageCreateInfo*)(local_pCreateInfo));
}
if (local_pAllocator)
@@ -37686,7 +37685,6 @@
local_pAllocator = nullptr;
if (local_pCreateInfo)
{
- sResourceTracker->transformImpl_VkImageCreateInfo_tohost(local_pCreateInfo, 1);
transform_tohost_VkImageCreateInfo(sResourceTracker, (VkImageCreateInfo*)(local_pCreateInfo));
}
if (local_pAllocator)
@@ -38380,6 +38378,68 @@
if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
}
+void VkEncoder::vkGetLinearImageLayout2GOOGLE(
+ VkDevice device,
+ const VkImageCreateInfo* pCreateInfo,
+ VkDeviceSize* pOffset,
+ VkDeviceSize* pRowPitchAlignment,
+ uint32_t doLock)
+{
+ (void)doLock;
+ bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
+ if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
+ auto stream = mImpl->stream();
+ auto pool = mImpl->pool();
+ VkDevice local_device;
+ VkImageCreateInfo* local_pCreateInfo;
+ local_device = device;
+ local_pCreateInfo = nullptr;
+ if (pCreateInfo)
+ {
+ local_pCreateInfo = (VkImageCreateInfo*)pool->alloc(sizeof(const VkImageCreateInfo));
+ deepcopy_VkImageCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkImageCreateInfo*)(local_pCreateInfo));
+ }
+ if (local_pCreateInfo)
+ {
+ transform_tohost_VkImageCreateInfo(sResourceTracker, (VkImageCreateInfo*)(local_pCreateInfo));
+ }
+ size_t count = 0;
+ size_t* countPtr = &count;
+ {
+ uint64_t cgen_var_0;
+ *countPtr += 1 * 8;
+ count_VkImageCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
+ *countPtr += sizeof(VkDeviceSize);
+ *countPtr += sizeof(VkDeviceSize);
+ }
+ uint32_t packetSize_vkGetLinearImageLayout2GOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
+ uint8_t* streamPtr = stream->reserve(packetSize_vkGetLinearImageLayout2GOOGLE);
+ uint8_t** streamPtrPtr = &streamPtr;
+ uint32_t opcode_vkGetLinearImageLayout2GOOGLE = OP_vkGetLinearImageLayout2GOOGLE;
+ uint32_t seqno; if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
+ memcpy(streamPtr, &opcode_vkGetLinearImageLayout2GOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+ memcpy(streamPtr, &packetSize_vkGetLinearImageLayout2GOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+ if (queueSubmitWithCommandsEnabled) { memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); }
+ uint64_t cgen_var_0;
+ *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
+ memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
+ *streamPtrPtr += 1 * 8;
+ reservedmarshal_VkImageCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+ memcpy(*streamPtrPtr, (VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
+ *streamPtrPtr += sizeof(VkDeviceSize);
+ memcpy(*streamPtrPtr, (VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
+ *streamPtrPtr += sizeof(VkDeviceSize);
+ stream->read((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
+ stream->read((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
+ ++encodeCount;;
+ if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+ {
+ pool->freeAll();
+ stream->clearPool();
+ }
+ if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
+}
+
void VkEncoder::vkQueueFlushCommandsGOOGLE(
VkQueue queue,
VkCommandBuffer commandBuffer,
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index 06dcbfb..b0e7d8e 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -3343,6 +3343,12 @@
VkDeviceSize* pOffset,
VkDeviceSize* pRowPitchAlignment,
uint32_t doLock);
+ void vkGetLinearImageLayout2GOOGLE(
+ VkDevice device,
+ const VkImageCreateInfo* pCreateInfo,
+ VkDeviceSize* pOffset,
+ VkDeviceSize* pRowPitchAlignment,
+ uint32_t doLock);
void vkQueueFlushCommandsGOOGLE(
VkQueue queue,
VkCommandBuffer commandBuffer,
diff --git a/system/vulkan_enc/func_table.cpp b/system/vulkan_enc/func_table.cpp
index 8664cec..a267ffb 100644
--- a/system/vulkan_enc/func_table.cpp
+++ b/system/vulkan_enc/func_table.cpp
@@ -8479,6 +8479,31 @@
auto vkEnc = ResourceTracker::getThreadLocalEncoder();
vkEnc->vkGetLinearImageLayoutGOOGLE(device, format, pOffset, pRowPitchAlignment, true /* do lock */);
}
+static void entry_vkGetLinearImageLayout2GOOGLE(
+ VkDevice device,
+ const VkImageCreateInfo* pCreateInfo,
+ VkDeviceSize* pOffset,
+ VkDeviceSize* pRowPitchAlignment)
+{
+ AEMU_SCOPED_TRACE("vkGetLinearImageLayout2GOOGLE");
+ auto vkEnc = ResourceTracker::getThreadLocalEncoder();
+ vkEnc->vkGetLinearImageLayout2GOOGLE(device, pCreateInfo, pOffset, pRowPitchAlignment, true /* do lock */);
+}
+static void dynCheck_entry_vkGetLinearImageLayout2GOOGLE(
+ VkDevice device,
+ const VkImageCreateInfo* pCreateInfo,
+ VkDeviceSize* pOffset,
+ VkDeviceSize* pRowPitchAlignment)
+{
+ auto resources = ResourceTracker::get();
+ if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream"))
+ {
+ sOnInvalidDynamicallyCheckedCall("vkGetLinearImageLayout2GOOGLE", "VK_GOOGLE_gfxstream");
+ }
+ AEMU_SCOPED_TRACE("vkGetLinearImageLayout2GOOGLE");
+ auto vkEnc = ResourceTracker::getThreadLocalEncoder();
+ vkEnc->vkGetLinearImageLayout2GOOGLE(device, pCreateInfo, pOffset, pRowPitchAlignment, true /* do lock */);
+}
static void entry_vkQueueFlushCommandsGOOGLE(
VkQueue queue,
VkCommandBuffer commandBuffer,
@@ -11331,6 +11356,10 @@
{
return nullptr;
}
+ if (!strcmp(name, "vkGetLinearImageLayout2GOOGLE"))
+ {
+ return nullptr;
+ }
if (!strcmp(name, "vkQueueFlushCommandsGOOGLE"))
{
return nullptr;
@@ -13917,6 +13946,10 @@
{
return (void*)dynCheck_entry_vkGetLinearImageLayoutGOOGLE;
}
+ if (!strcmp(name, "vkGetLinearImageLayout2GOOGLE"))
+ {
+ return (void*)dynCheck_entry_vkGetLinearImageLayout2GOOGLE;
+ }
if (!strcmp(name, "vkQueueFlushCommandsGOOGLE"))
{
bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
@@ -16664,6 +16697,11 @@
bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
return hasExt ? (void*)entry_vkGetLinearImageLayoutGOOGLE : nullptr;
}
+ if (!strcmp(name, "vkGetLinearImageLayout2GOOGLE"))
+ {
+ bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
+ return hasExt ? (void*)entry_vkGetLinearImageLayout2GOOGLE : nullptr;
+ }
if (!strcmp(name, "vkQueueFlushCommandsGOOGLE"))
{
bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.cpp b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
index d1e0efe..8b070f6 100644
--- a/system/vulkan_enc/goldfish_vk_counting_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
@@ -30,6 +30,7 @@
#include <cstring>
+
namespace goldfish_vk {
void count_extension_struct(
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
index 1d42aad..f0fb307 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
@@ -28,6 +28,8 @@
#include "goldfish_vk_extension_structs_guest.h"
#include "goldfish_vk_private_defs.h"
+#include <cstring>
+
#include "vk_util.h"
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
index 95ca034..a98bf32 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
@@ -28,6 +28,8 @@
#include "goldfish_vk_extension_structs_guest.h"
#include "goldfish_vk_private_defs.h"
+#include <cstring>
+
namespace goldfish_vk {
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index 967b5bc..607fc0a 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -28,6 +28,8 @@
#include "goldfish_vk_extension_structs_guest.h"
#include "goldfish_vk_private_defs.h"
+#include <cstring>
+
namespace goldfish_vk {
@@ -35993,6 +35995,12 @@
return "OP_vkGetPhysicalDeviceToolPropertiesEXT";
}
#endif
+#ifdef VK_GOOGLE_gfxstream
+ case OP_vkGetLinearImageLayout2GOOGLE:
+ {
+ return "OP_vkGetLinearImageLayout2GOOGLE";
+ }
+#endif
#ifdef VK_EXT_acquire_drm_display
case OP_vkGetDrmDisplayEXT:
{
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
index 28058c4..21901f6 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
@@ -8565,6 +8565,7 @@
#define OP_vkQueueWaitIdleAsyncGOOGLE 20331
#define OP_vkQueueBindSparseAsyncGOOGLE 20332
#define OP_vkGetLinearImageLayoutGOOGLE 20333
+#define OP_vkGetLinearImageLayout2GOOGLE 282325414
#define OP_vkQueueFlushCommandsGOOGLE 20340
#define OP_vkQueueCommitDescriptorSetUpdatesGOOGLE 267932433
#define OP_vkCollectDescriptorPoolIdsGOOGLE 213659202
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index 8266158..e591608 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -413,6 +413,7 @@
VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence);
typedef VkResult (VKAPI_PTR *PFN_vkGetLinearImageLayoutGOOGLE)(VkDevice device, VkFormat format, VkDeviceSize* pOffset, VkDeviceSize* pRowPitchAlignment);
+typedef VkResult (VKAPI_PTR *PFN_vkGetLinearImageLayout2GOOGLE)(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkDeviceSize* pOffset, VkDeviceSize* pRowPitchAlignment);
typedef void (VKAPI_PTR *PFN_vkQueueFlushCommandsGOOGLE)(VkQueue queue, VkDeviceSize dataSize, const void* pData);
typedef void (VKAPI_PTR *PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)(VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools, uint32_t descriptorSetCount, const VkDescriptorSetLayout* pDescriptorSetLayouts, const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool, const uint32_t* pDescriptorSetPendingAllocation, const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount, const VkWriteDescriptorSet* pPendingDescriptorWrites);
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
index 3627a05..c25ff93 100644
--- a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
@@ -28,6 +28,8 @@
#include "goldfish_vk_extension_structs_guest.h"
#include "goldfish_vk_private_defs.h"
+#include <cstring>
+
#include "Resources.h"
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.cpp b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
index b86ee88..d10fba1 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
@@ -28,6 +28,8 @@
#include "goldfish_vk_extension_structs_guest.h"
#include "goldfish_vk_private_defs.h"
+#include <cstring>
+
#include "ResourceTracker.h"
@@ -10156,7 +10158,6 @@
}
if (toTransform->pCreateInfo)
{
- resourceTracker->transformImpl_VkImageCreateInfo_tohost(toTransform->pCreateInfo, 1);
transform_tohost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(toTransform->pCreateInfo));
}
}
@@ -10173,7 +10174,6 @@
}
if (toTransform->pCreateInfo)
{
- resourceTracker->transformImpl_VkImageCreateInfo_fromhost(toTransform->pCreateInfo, 1);
transform_fromhost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(toTransform->pCreateInfo));
}
}
@@ -18686,7 +18686,6 @@
{
transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
}
- resourceTracker->transformImpl_VkImageCreateInfo_tohost(&toTransform->imageCreateInfo, 1);
transform_tohost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(&toTransform->imageCreateInfo));
if (toTransform->pColorSpaces)
{
@@ -18704,7 +18703,6 @@
{
transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
}
- resourceTracker->transformImpl_VkImageCreateInfo_fromhost(&toTransform->imageCreateInfo, 1);
transform_fromhost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(&toTransform->imageCreateInfo));
if (toTransform->pColorSpaces)
{
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.h b/system/vulkan_enc/goldfish_vk_transform_guest.h
index cba6f67..61030d8 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.h
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.h
@@ -46,7 +46,6 @@
#define LIST_NON_TRIVIAL_TRANSFORMED_TYPES(f) \
f(VkExternalMemoryProperties) \
-f(VkImageCreateInfo) \
#define LIST_TRANSFORMED_TYPES(f) \
LIST_TRIVIAL_TRANSFORMED_TYPES(f) \