[vulkan] add flush + lock to encoder (host)
- support cross-encoder flushing
- make that thread safe
bug: 135464985
Change-Id: I164fd0d9cf615f58f52192a0a907f7008abc7241
diff --git a/registry/vulkan/xml/cereal/encoder.py b/registry/vulkan/xml/cereal/encoder.py
index 99a3b74..a4d78a6 100644
--- a/registry/vulkan/xml/cereal/encoder.py
+++ b/registry/vulkan/xml/cereal/encoder.py
@@ -16,6 +16,8 @@
public:
VkEncoder(IOStream* stream);
~VkEncoder();
+
+ void flush(); // Cross-thread flushing!!!111
"""
encoder_decl_postamble = """
@@ -31,6 +33,8 @@
using android::aligned_buf_alloc;
using android::aligned_buf_free;
+using android::base::guest::AutoLock;
+using android::base::guest::Lock;
using android::base::Pool;
class VkEncoder::Impl {
@@ -52,6 +56,14 @@
if (!m_logEncodes) return;
ALOGD(\"encoder log: %%s\", text);
}
+
+ void flush() {
+ AutoLock encoderLock(lock);
+ m_stream.flush();
+ }
+
+ Lock lock;
+
private:
VulkanCountingStream m_countingStream;
%s m_stream;
@@ -64,6 +76,10 @@
VkEncoder::VkEncoder(IOStream *stream) :
mImpl(new VkEncoder::Impl(stream)) { }
+void VkEncoder::flush() {
+ mImpl->flush();
+}
+
#define VALIDATE_RET(retType, success, validate) \\
retType goldfish_vk_validateResult = validate; \\
if (goldfish_vk_validateResult != success) return goldfish_vk_validateResult; \\
@@ -147,21 +163,25 @@
def emit_custom_resource_preprocess(typeInfo, api, cgen):
if api.name in ENCODER_CUSTOM_RESOURCE_PREPROCESS:
+ cgen.stmt("encoderLock.unlock()")
cgen.stmt( \
make_event_handler_call( \
"mImpl->resources()", api,
ENCODER_THIS_PARAM,
SUCCESS_RET_TYPES[api.getRetTypeExpr()],
cgen, suffix="_pre"))
+ cgen.stmt("encoderLock.lock()")
def emit_custom_resource_postprocess(typeInfo, api, cgen):
if api.name in ENCODER_CUSTOM_RESOURCE_POSTPROCESS:
+ cgen.stmt("encoderLock.unlock()")
cgen.stmt(make_event_handler_call( \
"mImpl->resources()",
api,
ENCODER_THIS_PARAM,
api.getRetVarExpr(),
cgen))
+ cgen.stmt("encoderLock.lock()")
def emit_count_marshal(typeInfo, param, cgen):
res = \
@@ -259,6 +279,7 @@
self.toWrite.append(localCopyParam)
def emit_parameter_encode_preamble_write(typeInfo, api, cgen):
+ cgen.stmt("AutoLock encoderLock(mImpl->lock)")
cgen.stmt("AEMU_SCOPED_TRACE(\"%s encode\")" % api.name)
cgen.stmt("mImpl->log(\"start %s\")" % api.name)
diff --git a/registry/vulkan/xml/cerealgenerator.py b/registry/vulkan/xml/cerealgenerator.py
index 85b989c..d5e014a 100644
--- a/registry/vulkan/xml/cerealgenerator.py
+++ b/registry/vulkan/xml/cerealgenerator.py
@@ -214,6 +214,7 @@
#include "android/base/AlignedBuf.h"
#include "android/base/Pool.h"
+#include "android/base/synchronization/AndroidLock.h"
#include <cutils/properties.h>