[vulkan] put null optinal string marshaling behind a flag (guest)
bug: 111137294
System images without the support need different marshaling
Change-Id: Iff950810d34d347022deee7928848b5cf7bee544
diff --git a/system/OpenglSystemCommon/EmulatorFeatureInfo.h b/system/OpenglSystemCommon/EmulatorFeatureInfo.h
index 518273a..d3228f5 100644
--- a/system/OpenglSystemCommon/EmulatorFeatureInfo.h
+++ b/system/OpenglSystemCommon/EmulatorFeatureInfo.h
@@ -79,6 +79,9 @@
// Deferred Vulkan commands
static const char kDeferredVulkanCommands[] = "ANDROID_EMU_deferred_vulkan_commands";
+// Vulkan null optional strings
+static const char kVulkanNullOptionalStrings[] = "ANDROID_EMU_vulkan_null_optional_strings";
+
// Struct describing available emulator features
struct EmulatorFeatureInfo {
@@ -89,7 +92,8 @@
glesMaxVersion(GLES_MAX_VERSION_2),
hasDirectMem(false),
hasVulkan(false),
- hasDeferredVulkanCommands(false) { }
+ hasDeferredVulkanCommands(false),
+ hasVulkanNullOptionalStrings(false) { }
SyncImpl syncImpl;
DmaImpl dmaImpl;
@@ -98,6 +102,7 @@
bool hasDirectMem;
bool hasVulkan;
bool hasDeferredVulkanCommands;
+ bool hasVulkanNullOptionalStrings;
};
#endif // __COMMON_EMULATOR_FEATURE_INFO_H
diff --git a/system/OpenglSystemCommon/HostConnection.cpp b/system/OpenglSystemCommon/HostConnection.cpp
index b6d465c..a6d19a8 100644
--- a/system/OpenglSystemCommon/HostConnection.cpp
+++ b/system/OpenglSystemCommon/HostConnection.cpp
@@ -292,6 +292,7 @@
queryAndSetHostCompositionImpl(m_rcEnc);
queryAndSetDirectMemSupport(m_rcEnc);
queryAndSetVulkanSupport(m_rcEnc);
+ queryAndSetVulkanNullOptionalStringsSupport(m_rcEnc);
if (m_processPipe) {
m_processPipe->processPipeInit(m_rcEnc);
}
@@ -447,3 +448,10 @@
rcEnc->featureInfo()->hasDeferredVulkanCommands = true;
}
}
+
+void HostConnection::queryAndSetVulkanNullOptionalStringsSupport(ExtendedRCEncoderContext* rcEnc) {
+ std::string glExtensions = queryGLExtensions(rcEnc);
+ if (glExtensions.find(kVulkanNullOptionalStrings) != std::string::npos) {
+ rcEnc->featureInfo()->hasVulkanNullOptionalStrings = true;
+ }
+}
diff --git a/system/OpenglSystemCommon/HostConnection.h b/system/OpenglSystemCommon/HostConnection.h
index 922c35c..2f9f83f 100644
--- a/system/OpenglSystemCommon/HostConnection.h
+++ b/system/OpenglSystemCommon/HostConnection.h
@@ -166,6 +166,7 @@
void queryAndSetDirectMemSupport(ExtendedRCEncoderContext *rcEnc);
void queryAndSetVulkanSupport(ExtendedRCEncoderContext *rcEnc);
void queryAndSetDeferredVulkanCommandsSupport(ExtendedRCEncoderContext *rcEnc);
+ void queryAndSetVulkanNullOptionalStringsSupport(ExtendedRCEncoderContext *rcEnc);
private:
IOStream *m_stream;
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index a5f1f89..dd73ca6 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -315,13 +315,13 @@
ALOGE("vulkan: Failed to get renderControl encoder context\n"); \
return ret; \
} \
+ goldfish_vk::ResourceTracker::get()->setupFeatures(rcEnc->featureInfo_const()); \
+ auto hostSupportsVulkan = goldfish_vk::ResourceTracker::get()->hostSupportsVulkan(); \
goldfish_vk::VkEncoder *vkEnc = hostCon->vkEncoder(); \
if (!vkEnc) { \
ALOGE("vulkan: Failed to get Vulkan encoder\n"); \
return ret; \
} \
- goldfish_vk::ResourceTracker::get()->setupFeatures(rcEnc->featureInfo_const()); \
- auto hostSupportsVulkan = goldfish_vk::ResourceTracker::get()->hostSupportsVulkan(); \
VKAPI_ATTR
VkResult EnumerateInstanceExtensionProperties(
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index bf8a928..d3bd3ff 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -563,6 +563,10 @@
}
}
#endif
+
+ if (mFeatureInfo->hasVulkanNullOptionalStrings) {
+ mStreamFeatureBits |= VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT;
+ }
}
bool hostSupportsVulkan() const {
@@ -575,6 +579,10 @@
return mHostVisibleMemoryVirtInfo.virtualizationSupported;
}
+ uint32_t getStreamFeatures() const {
+ return mStreamFeatureBits;
+ }
+
bool supportsDeferredCommands() const {
if (!mFeatureInfo) return false;
return mFeatureInfo->hasDeferredVulkanCommands;
@@ -3172,6 +3180,7 @@
mutable Lock mLock;
HostVisibleMemoryVirtualizationInfo mHostVisibleMemoryVirtInfo;
std::unique_ptr<EmulatorFeatureInfo> mFeatureInfo;
+ uint32_t mStreamFeatureBits = 0;
std::unique_ptr<GoldfishAddressSpaceBlockProvider> mGoldfishAddressSpaceBlockProvider;
std::vector<VkExtensionProperties> mHostInstanceExtensions;
@@ -3252,6 +3261,10 @@
return mImpl->usingDirectMapping();
}
+uint32_t ResourceTracker::getStreamFeatures() const {
+ return mImpl->getStreamFeatures();
+}
+
uint32_t ResourceTracker::getApiVersionFromInstance(VkInstance instance) const {
return mImpl->getApiVersionFromInstance(instance);
}
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index 6429d6f..0f26c46 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -349,6 +349,7 @@
void setupFeatures(const EmulatorFeatureInfo* features);
bool hostSupportsVulkan() const;
bool usingDirectMapping() const;
+ uint32_t getStreamFeatures() const;
uint32_t getApiVersionFromInstance(VkInstance instance) const;
uint32_t getApiVersionFromDevice(VkDevice device) const;
bool hasInstanceExtension(VkInstance instance, const std::string& name) const;
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index 3b3cd9b..1048141 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -944,10 +944,17 @@
}
countingStream->rewind();
{
- // WARNING PTR CHECK
- uint64_t cgen_var_53 = (uint64_t)(uintptr_t)local_pLayerName;
- countingStream->putBe64(cgen_var_53);
- if (local_pLayerName)
+ if (countingStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+ {
+ // WARNING PTR CHECK
+ uint64_t cgen_var_53 = (uint64_t)(uintptr_t)local_pLayerName;
+ countingStream->putBe64(cgen_var_53);
+ if (local_pLayerName)
+ {
+ countingStream->putString(local_pLayerName);
+ }
+ }
+ else
{
countingStream->putString(local_pLayerName);
}
@@ -974,10 +981,17 @@
uint32_t opcode_vkEnumerateInstanceExtensionProperties = OP_vkEnumerateInstanceExtensionProperties;
stream->write(&opcode_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t));
stream->write(&packetSize_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t));
- // WARNING PTR CHECK
- uint64_t cgen_var_56 = (uint64_t)(uintptr_t)local_pLayerName;
- stream->putBe64(cgen_var_56);
- if (local_pLayerName)
+ if (stream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+ {
+ // WARNING PTR CHECK
+ uint64_t cgen_var_56 = (uint64_t)(uintptr_t)local_pLayerName;
+ stream->putBe64(cgen_var_56);
+ if (local_pLayerName)
+ {
+ stream->putString(local_pLayerName);
+ }
+ }
+ else
{
stream->putString(local_pLayerName);
}
@@ -1067,10 +1081,17 @@
uint64_t cgen_var_61;
countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_61, 1);
countingStream->write((uint64_t*)&cgen_var_61, 1 * 8);
- // WARNING PTR CHECK
- uint64_t cgen_var_62 = (uint64_t)(uintptr_t)local_pLayerName;
- countingStream->putBe64(cgen_var_62);
- if (local_pLayerName)
+ if (countingStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+ {
+ // WARNING PTR CHECK
+ uint64_t cgen_var_62 = (uint64_t)(uintptr_t)local_pLayerName;
+ countingStream->putBe64(cgen_var_62);
+ if (local_pLayerName)
+ {
+ countingStream->putString(local_pLayerName);
+ }
+ }
+ else
{
countingStream->putString(local_pLayerName);
}
@@ -1100,10 +1121,17 @@
uint64_t cgen_var_65;
stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_65, 1);
stream->write((uint64_t*)&cgen_var_65, 1 * 8);
- // WARNING PTR CHECK
- uint64_t cgen_var_66 = (uint64_t)(uintptr_t)local_pLayerName;
- stream->putBe64(cgen_var_66);
- if (local_pLayerName)
+ if (stream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+ {
+ // WARNING PTR CHECK
+ uint64_t cgen_var_66 = (uint64_t)(uintptr_t)local_pLayerName;
+ stream->putBe64(cgen_var_66);
+ if (local_pLayerName)
+ {
+ stream->putString(local_pLayerName);
+ }
+ }
+ else
{
stream->putString(local_pLayerName);
}
diff --git a/system/vulkan_enc/VulkanStreamGuest.cpp b/system/vulkan_enc/VulkanStreamGuest.cpp
index bbb5437..d6ebf50 100644
--- a/system/vulkan_enc/VulkanStreamGuest.cpp
+++ b/system/vulkan_enc/VulkanStreamGuest.cpp
@@ -14,6 +14,7 @@
#include "VulkanStreamGuest.h"
#include "IOStream.h"
+#include "ResourceTracker.h"
#include "android/base/Pool.h"
#include "android/base/Tracing.h"
@@ -27,7 +28,10 @@
class VulkanStreamGuest::Impl : public android::base::Stream {
public:
- Impl(IOStream* stream) : mStream(stream) { unsetHandleMapping(); }
+ Impl(IOStream* stream) : mStream(stream) {
+ unsetHandleMapping();
+ mFeatureBits = ResourceTracker::get()->getStreamFeatures();
+ }
~Impl() { }
@@ -77,6 +81,10 @@
commitWrite();
}
+ uint32_t getFeatureBits() const {
+ return mFeatureBits;
+ }
+
private:
size_t oustandingWriteBuffer() const {
return mWritePos;
@@ -107,6 +115,7 @@
IOStream* mStream = nullptr;
DefaultHandleMapping mDefaultHandleMapping;
VulkanHandleMapping* mCurrentHandleMapping;
+ uint32_t mFeatureBits = 0;
};
VulkanStreamGuest::VulkanStreamGuest(IOStream *stream) :
@@ -178,6 +187,10 @@
mImpl->flush();
}
+uint32_t VulkanStreamGuest::getFeatureBits() const {
+ return mImpl->getFeatureBits();
+}
+
VulkanCountingStream::VulkanCountingStream() : VulkanStreamGuest(nullptr) { }
VulkanCountingStream::~VulkanCountingStream() = default;
diff --git a/system/vulkan_enc/VulkanStreamGuest.h b/system/vulkan_enc/VulkanStreamGuest.h
index 8fa4aaa..d70b9fb 100644
--- a/system/vulkan_enc/VulkanStreamGuest.h
+++ b/system/vulkan_enc/VulkanStreamGuest.h
@@ -16,6 +16,8 @@
#include "android/base/files/Stream.h"
#include "android/base/files/StreamSerializing.h"
+#include "goldfish_vk_private_defs.h"
+
#include "VulkanHandleMapping.h"
#include <memory>
@@ -51,6 +53,9 @@
VulkanHandleMapping* handleMapping() const;
void flush();
+
+ uint32_t getFeatureBits() const;
+
private:
class Impl;
std::unique_ptr<Impl> mImpl;
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index 6b88092..80afa5f 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -52,18 +52,32 @@
vkStream->write((const void*)forMarshaling->pNext, sizeof(VkStructureType));
marshal_extension_struct(vkStream, forMarshaling->pNext);
}
- // WARNING PTR CHECK
- uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pApplicationName;
- vkStream->putBe64(cgen_var_0);
- if (forMarshaling->pApplicationName)
+ if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+ {
+ // WARNING PTR CHECK
+ uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pApplicationName;
+ vkStream->putBe64(cgen_var_0);
+ if (forMarshaling->pApplicationName)
+ {
+ vkStream->putString(forMarshaling->pApplicationName);
+ }
+ }
+ else
{
vkStream->putString(forMarshaling->pApplicationName);
}
vkStream->write((uint32_t*)&forMarshaling->applicationVersion, sizeof(uint32_t));
- // WARNING PTR CHECK
- uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pEngineName;
- vkStream->putBe64(cgen_var_1);
- if (forMarshaling->pEngineName)
+ if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+ {
+ // WARNING PTR CHECK
+ uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pEngineName;
+ vkStream->putBe64(cgen_var_1);
+ if (forMarshaling->pEngineName)
+ {
+ vkStream->putString(forMarshaling->pEngineName);
+ }
+ }
+ else
{
vkStream->putString(forMarshaling->pEngineName);
}
@@ -84,27 +98,41 @@
vkStream->read((void*)(&pNext_placeholder), sizeof(VkStructureType));
unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
}
- // WARNING PTR CHECK
- const char* check_pApplicationName;
- check_pApplicationName = (const char*)(uintptr_t)vkStream->getBe64();
- if (forUnmarshaling->pApplicationName)
+ if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
{
- if (!(check_pApplicationName))
+ // WARNING PTR CHECK
+ const char* check_pApplicationName;
+ check_pApplicationName = (const char*)(uintptr_t)vkStream->getBe64();
+ if (forUnmarshaling->pApplicationName)
{
- fprintf(stderr, "fatal: forUnmarshaling->pApplicationName inconsistent between guest and host\n");
+ if (!(check_pApplicationName))
+ {
+ fprintf(stderr, "fatal: forUnmarshaling->pApplicationName inconsistent between guest and host\n");
+ }
+ vkStream->loadStringInPlace((char**)&forUnmarshaling->pApplicationName);
}
+ }
+ else
+ {
vkStream->loadStringInPlace((char**)&forUnmarshaling->pApplicationName);
}
vkStream->read((uint32_t*)&forUnmarshaling->applicationVersion, sizeof(uint32_t));
- // WARNING PTR CHECK
- const char* check_pEngineName;
- check_pEngineName = (const char*)(uintptr_t)vkStream->getBe64();
- if (forUnmarshaling->pEngineName)
+ if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
{
- if (!(check_pEngineName))
+ // WARNING PTR CHECK
+ const char* check_pEngineName;
+ check_pEngineName = (const char*)(uintptr_t)vkStream->getBe64();
+ if (forUnmarshaling->pEngineName)
{
- fprintf(stderr, "fatal: forUnmarshaling->pEngineName inconsistent between guest and host\n");
+ if (!(check_pEngineName))
+ {
+ fprintf(stderr, "fatal: forUnmarshaling->pEngineName inconsistent between guest and host\n");
+ }
+ vkStream->loadStringInPlace((char**)&forUnmarshaling->pEngineName);
}
+ }
+ else
+ {
vkStream->loadStringInPlace((char**)&forUnmarshaling->pEngineName);
}
vkStream->read((uint32_t*)&forUnmarshaling->engineVersion, sizeof(uint32_t));
@@ -11590,10 +11618,17 @@
}
vkStream->write((VkObjectType*)&forMarshaling->objectType, sizeof(VkObjectType));
vkStream->write((uint64_t*)&forMarshaling->objectHandle, sizeof(uint64_t));
- // WARNING PTR CHECK
- uint64_t cgen_var_334 = (uint64_t)(uintptr_t)forMarshaling->pObjectName;
- vkStream->putBe64(cgen_var_334);
- if (forMarshaling->pObjectName)
+ if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+ {
+ // WARNING PTR CHECK
+ uint64_t cgen_var_334 = (uint64_t)(uintptr_t)forMarshaling->pObjectName;
+ vkStream->putBe64(cgen_var_334);
+ if (forMarshaling->pObjectName)
+ {
+ vkStream->putString(forMarshaling->pObjectName);
+ }
+ }
+ else
{
vkStream->putString(forMarshaling->pObjectName);
}
@@ -11614,15 +11649,22 @@
}
vkStream->read((VkObjectType*)&forUnmarshaling->objectType, sizeof(VkObjectType));
vkStream->read((uint64_t*)&forUnmarshaling->objectHandle, sizeof(uint64_t));
- // WARNING PTR CHECK
- const char* check_pObjectName;
- check_pObjectName = (const char*)(uintptr_t)vkStream->getBe64();
- if (forUnmarshaling->pObjectName)
+ if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
{
- if (!(check_pObjectName))
+ // WARNING PTR CHECK
+ const char* check_pObjectName;
+ check_pObjectName = (const char*)(uintptr_t)vkStream->getBe64();
+ if (forUnmarshaling->pObjectName)
{
- fprintf(stderr, "fatal: forUnmarshaling->pObjectName inconsistent between guest and host\n");
+ if (!(check_pObjectName))
+ {
+ fprintf(stderr, "fatal: forUnmarshaling->pObjectName inconsistent between guest and host\n");
+ }
+ vkStream->loadStringInPlace((char**)&forUnmarshaling->pObjectName);
}
+ }
+ else
+ {
vkStream->loadStringInPlace((char**)&forUnmarshaling->pObjectName);
}
}
@@ -11713,10 +11755,17 @@
marshal_extension_struct(vkStream, forMarshaling->pNext);
}
vkStream->write((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
- // WARNING PTR CHECK
- uint64_t cgen_var_338 = (uint64_t)(uintptr_t)forMarshaling->pMessageIdName;
- vkStream->putBe64(cgen_var_338);
- if (forMarshaling->pMessageIdName)
+ if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+ {
+ // WARNING PTR CHECK
+ uint64_t cgen_var_338 = (uint64_t)(uintptr_t)forMarshaling->pMessageIdName;
+ vkStream->putBe64(cgen_var_338);
+ if (forMarshaling->pMessageIdName)
+ {
+ vkStream->putString(forMarshaling->pMessageIdName);
+ }
+ }
+ else
{
vkStream->putString(forMarshaling->pMessageIdName);
}
@@ -11771,15 +11820,22 @@
unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
}
vkStream->read((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
- // WARNING PTR CHECK
- const char* check_pMessageIdName;
- check_pMessageIdName = (const char*)(uintptr_t)vkStream->getBe64();
- if (forUnmarshaling->pMessageIdName)
+ if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
{
- if (!(check_pMessageIdName))
+ // WARNING PTR CHECK
+ const char* check_pMessageIdName;
+ check_pMessageIdName = (const char*)(uintptr_t)vkStream->getBe64();
+ if (forUnmarshaling->pMessageIdName)
{
- fprintf(stderr, "fatal: forUnmarshaling->pMessageIdName inconsistent between guest and host\n");
+ if (!(check_pMessageIdName))
+ {
+ fprintf(stderr, "fatal: forUnmarshaling->pMessageIdName inconsistent between guest and host\n");
+ }
+ vkStream->loadStringInPlace((char**)&forUnmarshaling->pMessageIdName);
}
+ }
+ else
+ {
vkStream->loadStringInPlace((char**)&forUnmarshaling->pMessageIdName);
}
vkStream->read((int32_t*)&forUnmarshaling->messageIdNumber, sizeof(int32_t));
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index 35d4425..3607967 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -523,6 +523,9 @@
((VkExternalSemaphoreHandleTypeFlagBits)0x00100000)
#endif // VK_FUCHSIA_external_semaphore
+// VulkanStream features
+#define VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT (1 << 0)
+
#ifdef __cplusplus
} // extern "C"
#endif