[vulkan] Plumb IOStream to VulkanStream

bug: 111137294

and implement actual read/write

Change-Id: Ia1c6ae45518f35783f0d055e086988944845d10c
diff --git a/system/OpenglSystemCommon/HostConnection.cpp b/system/OpenglSystemCommon/HostConnection.cpp
index 63c6f34..b2a3fb9 100644
--- a/system/OpenglSystemCommon/HostConnection.cpp
+++ b/system/OpenglSystemCommon/HostConnection.cpp
@@ -228,6 +228,14 @@
     return m_gl2Enc;
 }
 
+VkEncoder *HostConnection::vkEncoder()
+{
+    if (!m_vkEnc) {
+        m_vkEnc = new VkEncoder(m_stream);
+    }
+    return m_vkEnc;
+}
+
 ExtendedRCEncoderContext *HostConnection::rcEncoder()
 {
     if (!m_rcEnc) {
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index d266b6b..1d7c9c2 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -11,6 +11,19 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
+#include "VkEncoder.h"
 
-// TODO
-void placeholder() { }
+#include "IOStream.h"
+#include "VulkanStream.h"
+
+class VkEncoder::Impl {
+public:
+    Impl(IOStream* stream) : m_stream(stream) {
+
+    }
+private:
+    goldfish_vk::VulkanStream m_stream;
+};
+
+VkEncoder::VkEncoder(IOStream *stream) :
+    mImpl(new VkEncoder::Impl(stream)) { }
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index 4ea28e2..2278082 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -16,12 +16,17 @@
 #ifdef GOLDFISH_VULKAN
 #pragma once
 
-#include "IOStream.h"
+#include <memory>
+
+class IOStream;
 
 class VkEncoder {
 public:
-    VkEncoder(IOStream*) { }
-    ~VkEncoder() { }
+    VkEncoder(IOStream* stream);
+    ~VkEncoder();
+private:
+    class Impl;
+    std::unique_ptr<Impl> mImpl;
 };
 
 #else
diff --git a/system/vulkan_enc/VulkanStream.cpp b/system/vulkan_enc/VulkanStream.cpp
index 662c545..bd3ffc5 100644
--- a/system/vulkan_enc/VulkanStream.cpp
+++ b/system/vulkan_enc/VulkanStream.cpp
@@ -13,6 +13,8 @@
 // limitations under the License.
 #include "VulkanStream.h"
 
+#include "IOStream.h"
+
 #include "android/base/Pool.h"
 
 #include <vector>
@@ -24,7 +26,7 @@
 
 class VulkanStream::Impl : public android::base::Stream {
 public:
-    Impl() { }
+    Impl(IOStream* stream) : mStream(stream) { }
 
     ~Impl() { }
 
@@ -75,7 +77,11 @@
 
     ssize_t read(void *buffer, size_t size) override {
         commitWrite();
-        return readFully(buffer, size);
+        if (!mStream->readback(buffer, size)) {
+            ALOGE("FATAL: Could not read back %zu bytes", size);
+            abort();
+        }
+        return size;
     }
 
 private:
@@ -93,6 +99,14 @@
             abort();
         }
 
+        int written =
+            mStream->writeFully(mWriteBuffer.data(), mWritePos);
+
+        if (written != mWritePos) {
+            ALOGE("FATAL: Did not write exactly %zu bytes! (Got %d)",
+                  mWritePos, written);
+            abort();
+        }
         mWritePos = 0;
     }
 
@@ -105,17 +119,17 @@
         return size;
     }
 
-    ssize_t readFully(void *buffer, size_t size) {
-        return size;
-    }
-
     android::base::Pool mPool { 8, 4096, 64 };
 
     size_t mWritePos = 0;
     std::vector<uint8_t> mWriteBuffer;
+    IOStream* mStream = nullptr;
 };
 
-VulkanStream::VulkanStream() : mImpl(new VulkanStream::Impl()) {}
+VulkanStream::VulkanStream(IOStream *stream) :
+    mImpl(new VulkanStream::Impl(stream)) { }
+
+VulkanStream::~VulkanStream() = default;
 
 bool VulkanStream::valid() {
     return mImpl->valid();
diff --git a/system/vulkan_enc/VulkanStream.h b/system/vulkan_enc/VulkanStream.h
index 1b42458..21b08f0 100644
--- a/system/vulkan_enc/VulkanStream.h
+++ b/system/vulkan_enc/VulkanStream.h
@@ -18,12 +18,14 @@
 
 #include <memory>
 
+class IOStream;
+
 namespace goldfish_vk {
 
 class VulkanStream : public android::base::Stream {
 public:
-    VulkanStream();
-    ~VulkanStream() = default;
+    VulkanStream(IOStream* stream);
+    ~VulkanStream();
 
     // Returns whether the connection is valid.
     bool valid();