[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>