[vulkan] Fix color buffer lifetime on fuchsia.
Use rcOpenColorBuffer when importing a color buffer. This is
needed to ensure that color buffer is not closed while
imported.
Change-Id: I636a4bb13ca7a48581f991a81dcc3ad9fee892f9
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index a40fe23..2ba1511 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -481,10 +481,13 @@
uint32_t r = rcEnc->rcCreateColorBuffer(rcEnc, width, height, format);
return r;
},
+ [](uint32_t id) {
+ VK_HOST_CONNECTION()
+ rcEnc->rcOpenColorBuffer(rcEnc, id);
+ },
[](uint32_t id){
- VK_HOST_CONNECTION((uint32_t)0)
+ VK_HOST_CONNECTION()
rcEnc->rcCloseColorBuffer(rcEnc, id);
- return 0u;
});
#else
goldfish_vk::ResourceTracker::get();
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 4f928c2..181b49b 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -257,6 +257,7 @@
SubAlloc subAlloc;
AHardwareBuffer* ahw = nullptr;
zx_handle_t vmoHandle = ZX_HANDLE_INVALID;
+ uint32_t cbHandle = 0;
};
// custom guest-side structs for images/buffers because of AHardwareBuffer :((
@@ -336,6 +337,10 @@
AHardwareBuffer_release(memInfo.ahw);
}
+ if (memInfo.cbHandle) {
+ (*mCloseColorBuffer)(memInfo.cbHandle);
+ }
+
if (memInfo.vmoHandle != ZX_HANDLE_INVALID) {
zx_handle_close(memInfo.vmoHandle);
}
@@ -443,7 +448,8 @@
uint8_t* ptr,
uint32_t memoryTypeIndex,
AHardwareBuffer* ahw = nullptr,
- zx_handle_t vmoHandle = ZX_HANDLE_INVALID) {
+ zx_handle_t vmoHandle = ZX_HANDLE_INVALID,
+ uint32_t cbHandle = 0) {
AutoLock lock(mLock);
auto& deviceInfo = info_VkDevice[device];
auto& info = info_VkDeviceMemory[memory];
@@ -454,6 +460,7 @@
info.memoryTypeIndex = memoryTypeIndex;
info.ahw = ahw;
info.vmoHandle = vmoHandle;
+ info.cbHandle = cbHandle;
}
void setImageInfo(VkImage image,
@@ -579,8 +586,10 @@
}
void setColorBufferFunctions(PFN_CreateColorBuffer create,
+ PFN_OpenColorBuffer open,
PFN_CloseColorBuffer close) {
mCreateColorBuffer = create;
+ mOpenColorBuffer = open;
mCloseColorBuffer = close;
}
@@ -1498,6 +1507,7 @@
// to the AHardwareBuffer on the host via an "import" operation.
AHardwareBuffer* ahw = nullptr;
zx_handle_t vmo_handle = ZX_HANDLE_INVALID;
+ uint32_t cbHandle = 0;
if (exportAllocateInfoPtr) {
exportAhb =
@@ -1599,7 +1609,7 @@
#endif
if (cb) {
- importCbInfo.colorBuffer = cb;
+ cbHandle = importCbInfo.colorBuffer = cb;
structChain =
vk_append_struct(structChain, (vk_struct_common*)(&importCbInfo));
}
@@ -1610,7 +1620,9 @@
if (!isHostVisibleMemoryTypeIndexForGuest(
&mHostVisibleMemoryVirtInfo,
finalAllocInfo.memoryTypeIndex)) {
-
+ if (cbHandle) {
+ (*mOpenColorBuffer)(cbHandle);
+ }
input_result =
enc->vkAllocateMemory(
device, &finalAllocInfo, pAllocator, pMemory);
@@ -1624,7 +1636,8 @@
0, nullptr,
finalAllocInfo.memoryTypeIndex,
ahw,
- vmo_handle);
+ vmo_handle,
+ cbHandle);
return VK_SUCCESS;
}
@@ -2826,6 +2839,7 @@
std::unique_ptr<EmulatorFeatureInfo> mFeatureInfo;
std::unique_ptr<GoldfishAddressSpaceBlockProvider> mGoldfishAddressSpaceBlockProvider;
PFN_CreateColorBuffer mCreateColorBuffer;
+ PFN_OpenColorBuffer mOpenColorBuffer;
PFN_CloseColorBuffer mCloseColorBuffer;
std::vector<VkExtensionProperties> mHostInstanceExtensions;
@@ -2920,8 +2934,10 @@
}
void ResourceTracker::setColorBufferFunctions(
- PFN_CreateColorBuffer create, PFN_CloseColorBuffer close) {
- mImpl->setColorBufferFunctions(create, close);
+ PFN_CreateColorBuffer create,
+ PFN_OpenColorBuffer open,
+ PFN_CloseColorBuffer close) {
+ mImpl->setColorBufferFunctions(create, open, close);
}
VkResult ResourceTracker::on_vkEnumerateInstanceExtensionProperties(
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index 57eadda..a26c3a2 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -29,7 +29,8 @@
namespace goldfish_vk {
typedef uint32_t (*PFN_CreateColorBuffer)(uint32_t width, uint32_t height, uint32_t format);
-typedef uint32_t (*PFN_CloseColorBuffer)(uint32_t id);
+typedef void (*PFN_OpenColorBuffer)(uint32_t id);
+typedef void (*PFN_CloseColorBuffer)(uint32_t id);
class ResourceTracker {
public:
@@ -299,7 +300,9 @@
uint32_t getApiVersionFromDevice(VkDevice device) const;
bool hasInstanceExtension(VkInstance instance, const std::string& name) const;
bool hasDeviceExtension(VkDevice instance, const std::string& name) const;
- void setColorBufferFunctions(PFN_CreateColorBuffer create, PFN_CloseColorBuffer close);
+ void setColorBufferFunctions(PFN_CreateColorBuffer create,
+ PFN_OpenColorBuffer open,
+ PFN_CloseColorBuffer close);
// Transforms
void deviceMemoryTransform_tohost(