[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();