vulkan: remove use of lock in syncEncodersFor(CommandBuffer|Queue)
Change-Id: Ib3a15ed0da0134b36b29837b8f403a7710d06d25
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index b00a562..e0ab5ef 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -15,6 +15,8 @@
#include "ResourceTracker.h"
+#include "Resources.h"
+
#include "android/base/Optional.h"
#include "android/base/threads/AndroidWorkPool.h"
@@ -276,13 +278,11 @@
};
struct VkCommandBuffer_Info {
- VkEncoder* lastUsedEncoder = nullptr;
- uint32_t sequenceNumber = 0;
+ uint32_t placeholder;
};
struct VkQueue_Info {
- VkEncoder* lastUsedEncoder = nullptr;
- uint32_t sequenceNumber = 0;
+ uint32_t placeholder;
};
// custom guest-side structs for images/buffers because of AHardwareBuffer :((
@@ -394,29 +394,20 @@
}
void unregister_VkCommandBuffer(VkCommandBuffer commandBuffer) {
- AutoLock lock(mLock);
+ struct goldfish_VkCommandBuffer* cb = as_goldfish_VkCommandBuffer(commandBuffer);
+ if (!cb) return;
+ if (cb->lastUsedEncoder) { cb->lastUsedEncoder->decRef(); }
- auto it = info_VkCommandBuffer.find(commandBuffer);
- if (it == info_VkCommandBuffer.end()) return;
- auto& info = it->second;
- if (info.lastUsedEncoder) {
- info.lastUsedEncoder->decRef();
- }
- info.lastUsedEncoder = nullptr;
+ AutoLock lock(mLock);
info_VkCommandBuffer.erase(commandBuffer);
}
void unregister_VkQueue(VkQueue queue) {
- AutoLock lock(mLock);
+ struct goldfish_VkQueue* q = as_goldfish_VkQueue(queue);
+ if (!q) return;
+ if (q->lastUsedEncoder) { q->lastUsedEncoder->decRef(); }
- auto it = info_VkQueue.find(queue);
- if (it == info_VkQueue.end()) return;
- auto& info = it->second;
- auto lastUsedEncoder = info.lastUsedEncoder;
- if (info.lastUsedEncoder) {
- info.lastUsedEncoder->decRef();
- }
- info.lastUsedEncoder = nullptr;
+ AutoLock lock(mLock);
info_VkQueue.erase(queue);
}
@@ -4927,45 +4918,28 @@
}
uint32_t syncEncodersForCommandBuffer(VkCommandBuffer commandBuffer, VkEncoder* currentEncoder) {
- AutoLock lock(mLock);
-
- auto it = info_VkCommandBuffer.find(commandBuffer);
- if (it == info_VkCommandBuffer.end()) return 0;
-
- auto& info = it->second;
+ struct goldfish_VkCommandBuffer* cb = as_goldfish_VkCommandBuffer(commandBuffer);
+ if (!cb) return 0;
currentEncoder->incRef();
- auto lastEncoder = info.lastUsedEncoder;
- info.lastUsedEncoder = currentEncoder;
+ auto lastEncoder = cb->lastUsedEncoder;
+
+ cb->lastUsedEncoder = currentEncoder;
+
if (!lastEncoder) return 0;
- auto oldSeq = info.sequenceNumber;
- bool lookupAgain = false;
if (lastEncoder != currentEncoder) {
- info.sequenceNumber += 2;
- lookupAgain = true;
- lock.unlock();
-
+ auto oldSeq = cb->sequenceNumber;
+ cb->sequenceNumber += 2;
lastEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, false, oldSeq + 1);
lastEncoder->flush();
-
currentEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, true, oldSeq + 2);
-
- lock.lock();
}
if (lastEncoder->decRef()) {
- if (lookupAgain) {
- auto it2 = info_VkCommandBuffer.find(commandBuffer);
- if (it2 == info_VkCommandBuffer.end()) return 0;
- auto& info2 = it2->second;
- info2.lastUsedEncoder = nullptr;
- } else {
- info.lastUsedEncoder = nullptr;
- }
+ cb->lastUsedEncoder = nullptr;
}
-
return 0;
}
@@ -4974,42 +4948,27 @@
return 0;
}
- AutoLock lock(mLock);
-
- auto it = info_VkQueue.find(queue);
- if (it == info_VkQueue.end()) return 0;
-
- auto& info = it->second;
+ struct goldfish_VkQueue* q = as_goldfish_VkQueue(queue);
+ if (!q) return 0;
currentEncoder->incRef();
- auto lastEncoder = info.lastUsedEncoder;
- info.lastUsedEncoder = currentEncoder;
+ auto lastEncoder = q->lastUsedEncoder;
+
+ q->lastUsedEncoder = currentEncoder;
+
if (!lastEncoder) return 0;
- auto oldSeq = info.sequenceNumber;
- bool lookupAgain = false;
if (lastEncoder != currentEncoder) {
- info.sequenceNumber += 2;
- lookupAgain = true;
- lock.unlock();
-
+ auto oldSeq = q->sequenceNumber;
+ q->sequenceNumber += 2;
lastEncoder->vkQueueHostSyncGOOGLE(queue, false, oldSeq + 1);
lastEncoder->flush();
currentEncoder->vkQueueHostSyncGOOGLE(queue, true, oldSeq + 2);
-
- lock.lock();
}
if (lastEncoder->decRef()) {
- if (lookupAgain) {
- auto it2 = info_VkQueue.find(queue);
- if (it2 == info_VkQueue.end()) return 0;
- auto& info2 = it2->second;
- info2.lastUsedEncoder = nullptr;
- } else {
- info.lastUsedEncoder = nullptr;
- }
+ q->lastUsedEncoder = nullptr;
}
return 0;