diff --git a/OWNERS b/OWNERS
index f2fc3cd..ec67e03 100644
--- a/OWNERS
+++ b/OWNERS
@@ -5,6 +5,7 @@
 kaiyili@google.com
 lfy@google.com
 liyl@google.com
+msandy@google.com
 natsu@google.com
 rkir@google.com
 tutankhamen@google.com
diff --git a/meson.build b/meson.build
index 05ef561..8e2c9a6 100644
--- a/meson.build
+++ b/meson.build
@@ -60,6 +60,7 @@
 # Subdirectories #
 #================#
 
+subdir('third-party')
 subdir('fuchsia')
 subdir('platform')
 subdir('android-emu/aemu/base')
diff --git a/platform/include/VirtGpu.h b/platform/include/VirtGpu.h
index 6bf976d..bfa3f37 100644
--- a/platform/include/VirtGpu.h
+++ b/platform/include/VirtGpu.h
@@ -19,6 +19,8 @@
 #include <cstdint>
 #include <memory>
 
+#include "virtgpu_gfxstream_protocol.h"
+
 enum VirtGpuParamId {
     kParam3D,
     kParamCapsetFix,
@@ -157,6 +159,7 @@
     static VirtGpuDevice mInstance;
     int64_t mDeviceHandle;
     struct VirtGpuParam mParams[kParamMax];
+    struct gfxstreamCapset mGfxstreamCapset;
 };
 
 // HACK: We can use android::base::EnumFlags, but we'll have to do more guest
diff --git a/platform/include/virtgpu_gfxstream_protocol.h b/platform/include/virtgpu_gfxstream_protocol.h
index 6bf26a2..325fa9c 100644
--- a/platform/include/virtgpu_gfxstream_protocol.h
+++ b/platform/include/virtgpu_gfxstream_protocol.h
@@ -65,4 +65,14 @@
     uint32_t imageHandleHi;
 };
 
+struct gfxstreamCapset {
+    uint32_t protocolVersion;
+
+    // ASG Ring Parameters
+    uint32_t ringSize;
+    uint32_t bufferSize;
+
+    uint32_t pad;
+};
+
 #endif
diff --git a/platform/linux/VirtGpuDevice.cpp b/platform/linux/VirtGpuDevice.cpp
index 6f4f86c..8faece4 100644
--- a/platform/linux/VirtGpuDevice.cpp
+++ b/platform/linux/VirtGpuDevice.cpp
@@ -25,6 +25,7 @@
 
 #include "VirtGpu.h"
 #include "virtgpu_drm.h"
+#include "virtgpu_gfxstream_protocol.h"
 
 #define PARAM(x) \
     (struct VirtGpuParam) { x, #x, 0 }
@@ -48,6 +49,7 @@
     };
 
     int ret;
+    struct drm_virtgpu_get_caps get_caps = {0};
     struct drm_virtgpu_context_init init = {0};
     struct drm_virtgpu_context_set_param ctx_set_params[2] = {{0}};
 
@@ -62,7 +64,7 @@
         get_param.param = params[i].param;
         get_param.value = (uint64_t)(uintptr_t)&params[i].value;
 
-        int ret = drmIoctl(mDeviceHandle, DRM_IOCTL_VIRTGPU_GETPARAM, &get_param);
+        ret = drmIoctl(mDeviceHandle, DRM_IOCTL_VIRTGPU_GETPARAM, &get_param);
         if (ret) {
             ALOGE("virtgpu backend not enabling %s", params[i].name);
         }
@@ -70,6 +72,19 @@
         mParams[i] = params[i];
     }
 
+    get_caps.cap_set_id = static_cast<uint32_t>(capset);
+    if (capset == kCapsetGfxStream) {
+        get_caps.size = sizeof(struct gfxstreamCapset);
+        get_caps.addr = (unsigned long long)&mGfxstreamCapset;
+    }
+
+    ret = drmIoctl(mDeviceHandle, DRM_IOCTL_VIRTGPU_GET_CAPS, &get_caps);
+    if (ret) {
+        // Don't fail get capabilities just yet, AEMU doesn't use this API
+        // yet (b/272121235);
+        ALOGE("DRM_IOCTL_VIRTGPU_GET_CAPS failed with %s", strerror(errno));
+    }
+
 
     ctx_set_params[0].param = VIRTGPU_CONTEXT_PARAM_NUM_RINGS;
     ctx_set_params[0].value = 1;
diff --git a/system/GLESv2_enc/IOStream2.cpp b/system/GLESv2_enc/IOStream2.cpp
index cf292ea..2a704b7 100644
--- a/system/GLESv2_enc/IOStream2.cpp
+++ b/system/GLESv2_enc/IOStream2.cpp
@@ -51,7 +51,7 @@
         char* start = (char*)pixels + startOffset;
 
         for (int i = 0; i < height; i++) {
-            if (pixelRowSize != width * bpp) {
+            if (pixelRowSize > width * bpp) {
                 size_t rowSlack = pixelRowSize - width * bpp;
                 std::vector<char> rowSlackToDiscard(rowSlack, 0);
                 readback(start, width * bpp);
@@ -111,7 +111,7 @@
             char* start = (char*)pixels + startOffset;
 
             for (int i = 0; i < height; i++) {
-                if (pixelRowSize != width * bpp) {
+                if (pixelRowSize > width * bpp) {
                     size_t rowSlack = pixelRowSize - width * bpp;
                     std::vector<char> rowSlackToDiscard(rowSlack, 0);
                     writeFully(start, width * bpp);
@@ -174,15 +174,14 @@
 
             char* start = (char*)pixels + startOffset;
 
-            size_t rowSlack = pixelRowSize - width * bpp;
-            std::vector<char> rowSlackToDiscard(rowSlack, 0);
-
             size_t imageSlack = totalImageSize - pixelImageSize;
             std::vector<char> imageSlackToDiscard(imageSlack, 0);
 
             for (int k = 0; k < depth; ++k) {
                 for (int i = 0; i < height; i++) {
-                    if (pixelRowSize != width * bpp) {
+                    if (pixelRowSize > width * bpp) {
+                        size_t rowSlack = pixelRowSize - width * bpp;
+                        std::vector<char> rowSlackToDiscard(rowSlack, 0);
                         writeFully(start, width * bpp);
                         writeFully(&rowSlackToDiscard[0], rowSlack);
                         writeFully(&paddingToDiscard[0], paddingSize);
diff --git a/system/codecs/omx/avcdec/GoldfishAVCDec.cpp b/system/codecs/omx/avcdec/GoldfishAVCDec.cpp
index d90241d..02c0dc1 100644
--- a/system/codecs/omx/avcdec/GoldfishAVCDec.cpp
+++ b/system/codecs/omx/avcdec/GoldfishAVCDec.cpp
@@ -360,7 +360,6 @@
         }
 
         {
-            nsecs_t timeDelay, timeTaken;
 
             if (!setDecodeArgs(inHeader, outHeader)) {
                 ALOGE("Decoder arg setup failed");
@@ -369,11 +368,6 @@
                 return;
             }
 
-            mTimeStart = systemTime();
-            /* Compute time elapsed between end of previous decode()
-             * to start of current decode() */
-            timeDelay = mTimeStart - mTimeEnd;
-
             // TODO: We also need to send the timestamp
             h264_result_t h264Res = {(int)MediaH264Decoder::Err::NoErr, 0};
             if (inHeader != nullptr) {
@@ -417,10 +411,6 @@
                 getVUIParams(img);
             }
 
-            mTimeEnd = systemTime();
-            /* Compute time taken for decode() */
-            timeTaken = mTimeEnd - mTimeStart;
-
 
             if (inHeader) {
                 DDD("input time stamp %lld flag %d", inHeader->nTimeStamp, (int)(inHeader->nFlags));
diff --git a/system/magma/magma.cpp b/system/magma/magma.cpp
new file mode 100644
index 0000000..65a5a6c
--- /dev/null
+++ b/system/magma/magma.cpp
@@ -0,0 +1,351 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// 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 <assert.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <virtgpu_drm.h>
+#include <xf86drm.h>
+
+#include <limits>
+#include <mutex>
+#include <thread>
+
+#include "AddressSpaceStream.h"
+#include "EncoderDebug.h"
+#include "magma_enc.h"
+
+static uint64_t get_ns_monotonic(bool raw) {
+    struct timespec time;
+    int ret = clock_gettime(raw ? CLOCK_MONOTONIC_RAW : CLOCK_MONOTONIC, &time);
+    if (ret < 0) return 0;
+    return static_cast<uint64_t>(time.tv_sec) * 1000000000ULL + time.tv_nsec;
+}
+
+class MagmaClientContext : public magma_encoder_context_t {
+   public:
+    MagmaClientContext(AddressSpaceStream* stream);
+
+    AddressSpaceStream* stream() {
+        return reinterpret_cast<AddressSpaceStream*>(magma_encoder_context_t::m_stream);
+    }
+
+    magma_status_t get_fd_for_buffer(magma_buffer_t buffer, int* fd_out);
+
+    std::mutex& mutex() { return m_mutex_; }
+
+    static magma_status_t magma_device_import(void* self, magma_handle_t device_channel,
+                                              magma_device_t* device_out);
+    static magma_status_t magma_device_query(void* self, magma_device_t device, uint64_t id,
+                                             magma_handle_t* handle_out, uint64_t* value_out);
+    static magma_status_t magma_connection_export_buffer(void* self, magma_connection_t connection,
+                                                         magma_buffer_t buffer,
+                                                         magma_handle_t* handle_out);
+    static magma_status_t magma_poll(void* self, magma_poll_item_t* items, uint32_t count,
+                                     uint64_t timeout_ns);
+
+    static void set_thread_local_context_lock(std::unique_lock<std::mutex>* lock) { t_lock = lock; }
+
+    static std::unique_lock<std::mutex>* get_thread_local_context_lock() { return t_lock; }
+
+    magma_device_import_client_proc_t magma_device_import_enc_;
+    magma_device_query_client_proc_t magma_device_query_enc_;
+    magma_poll_client_proc_t magma_poll_enc_;
+
+    int render_node_fd_;
+
+    std::mutex m_mutex_;
+    static thread_local std::unique_lock<std::mutex>* t_lock;
+};
+
+// This makes the mutex lock available to decoding methods that can take time
+// (eg magma_poll), to prevent one thread from locking out others.
+class ContextLock {
+   public:
+    ContextLock(MagmaClientContext* context) : m_context_(context), m_lock_(context->mutex()) {
+        m_context_->set_thread_local_context_lock(&m_lock_);
+    }
+
+    ~ContextLock() { m_context_->set_thread_local_context_lock(nullptr); }
+
+   private:
+    MagmaClientContext* m_context_;
+    std::unique_lock<std::mutex> m_lock_;
+};
+
+// static
+thread_local std::unique_lock<std::mutex>* MagmaClientContext::t_lock;
+
+MagmaClientContext::MagmaClientContext(AddressSpaceStream* stream)
+    : magma_encoder_context_t(stream, new ChecksumCalculator) {
+    magma_device_import_enc_ = magma_client_context_t::magma_device_import;
+    magma_device_query_enc_ = magma_client_context_t::magma_device_query;
+    magma_poll_enc_ = magma_client_context_t::magma_poll;
+
+    magma_client_context_t::magma_device_import = &MagmaClientContext::magma_device_import;
+    magma_client_context_t::magma_device_query = &MagmaClientContext::magma_device_query;
+    magma_client_context_t::magma_connection_export_buffer =
+        &MagmaClientContext::magma_connection_export_buffer;
+    magma_client_context_t::magma_poll = &MagmaClientContext::magma_poll;
+}
+
+// static
+magma_status_t MagmaClientContext::magma_device_import(void* self, magma_handle_t device_channel,
+                                                       magma_device_t* device_out) {
+    auto context = reinterpret_cast<MagmaClientContext*>(self);
+
+    magma_handle_t placeholder = 0xacbd1234;  // not used
+
+    magma_status_t status = context->magma_device_import_enc_(self, placeholder, device_out);
+
+    // The local fd isn't needed, just close it.
+    int fd = device_channel;
+    close(fd);
+
+    return status;
+}
+
+magma_status_t MagmaClientContext::get_fd_for_buffer(magma_buffer_t buffer, int* fd_out) {
+    // TODO(b/272555972): remove deprecated magma API use
+    uint64_t id = magma_buffer_get_id(this, buffer);
+    if (id == 0) {
+        ALOGE("%s: magma_get_buffer_id failed\n", __func__);
+        return MAGMA_STATUS_INVALID_ARGS;
+    }
+
+    uint64_t size = magma_buffer_get_size(this, buffer);
+    if (size == 0) {
+        ALOGE("%s: magma_get_buffer_size failed\n", __func__);
+        return MAGMA_STATUS_INVALID_ARGS;
+    }
+
+    // TODO(fxbug.dev/122604): Evaluate deferred guest resource creation.
+    auto blob = VirtGpuDevice::getInstance(VirtGpuCapset::kCapsetGfxStream)
+                    .createBlob({.size = size,
+                                 .flags = kBlobFlagMappable | kBlobFlagShareable,
+                                 .blobMem = kBlobMemHost3d,
+                                 .blobId = id});
+    if (!blob) {
+        return MAGMA_STATUS_INTERNAL_ERROR;
+    }
+
+    VirtGpuExternalHandle handle{};
+    int result = blob->exportBlob(handle);
+    if (result != 0 || handle.osHandle < 0) {
+        return MAGMA_STATUS_INTERNAL_ERROR;
+    }
+
+    *fd_out = handle.osHandle;
+
+    return MAGMA_STATUS_OK;
+}
+
+magma_status_t MagmaClientContext::magma_device_query(void* self, magma_device_t device,
+                                                      uint64_t id, magma_handle_t* handle_out,
+                                                      uint64_t* value_out) {
+    auto context = reinterpret_cast<MagmaClientContext*>(self);
+
+    magma_buffer_t buffer = 0;
+    uint64_t value = 0;
+    {
+        magma_handle_t handle;
+        magma_status_t status = context->magma_device_query_enc_(self, device, id, &handle, &value);
+        if (status != MAGMA_STATUS_OK) {
+            ALOGE("magma_device_query_enc failed: %d\n", status);
+            return status;
+        }
+        // magma_buffer_t and magma_handle_t are both gem_handles on the server.
+        buffer = handle;
+    }
+
+    if (!buffer) {
+        if (!value_out) return MAGMA_STATUS_INVALID_ARGS;
+
+        *value_out = value;
+
+        if (handle_out) {
+            *handle_out = -1;
+        }
+
+        return MAGMA_STATUS_OK;
+    }
+
+    if (!handle_out) return MAGMA_STATUS_INVALID_ARGS;
+
+    int fd;
+    magma_status_t status = context->get_fd_for_buffer(buffer, &fd);
+    if (status != MAGMA_STATUS_OK) return status;
+
+    *handle_out = fd;
+
+    return MAGMA_STATUS_OK;
+}
+
+magma_status_t MagmaClientContext::magma_connection_export_buffer(void* self,
+                                                                  magma_connection_t connection,
+                                                                  magma_buffer_t buffer,
+                                                                  magma_handle_t* handle_out) {
+    auto context = reinterpret_cast<MagmaClientContext*>(self);
+
+    int fd;
+    magma_status_t status = context->get_fd_for_buffer(buffer, &fd);
+    if (status != MAGMA_STATUS_OK) return status;
+
+    *handle_out = fd;
+
+    return MAGMA_STATUS_OK;
+}
+
+// We can't pass a non-zero timeout to the server, as that would block the server from handling
+// requests from other threads. So we busy wait here, which isn't ideal; however if the server did
+// block, gfxstream would busy wait for the response anyway.
+magma_status_t MagmaClientContext::magma_poll(void* self, magma_poll_item_t* items, uint32_t count,
+                                              uint64_t timeout_ns) {
+    auto context = reinterpret_cast<MagmaClientContext*>(self);
+
+    int64_t time_start = static_cast<int64_t>(get_ns_monotonic(false));
+
+    int64_t abs_timeout_ns = time_start + timeout_ns;
+
+    if (abs_timeout_ns < time_start) {
+        abs_timeout_ns = std::numeric_limits<int64_t>::max();
+    }
+
+    bool warned_for_long_poll = false;
+
+    while (true) {
+        magma_status_t status = context->magma_poll_enc_(self, items, count, 0);
+
+        if (status != MAGMA_STATUS_TIMED_OUT) return status;
+
+        // Not ready, allow other threads to work in with us
+        get_thread_local_context_lock()->unlock();
+
+        std::this_thread::yield();
+
+        int64_t time_now = static_cast<int64_t>(get_ns_monotonic(false));
+
+        // TODO(fxb/122604): Add back-off to the busy loop, ideally based on recent sleep
+        // patterns (e.g. start polling shortly before next expected burst).
+        if (!warned_for_long_poll && time_now - time_start > 5000000000) {
+            ALOGE("magma_poll: long poll detected (%lu us)", (time_now - time_start) / 1000);
+            warned_for_long_poll = true;
+        }
+
+        if (time_now >= abs_timeout_ns) break;
+
+        get_thread_local_context_lock()->lock();
+    }
+
+    return MAGMA_STATUS_TIMED_OUT;
+}
+
+template <typename T, typename U>
+static T SafeCast(const U& value) {
+    if (value > std::numeric_limits<T>::max() || value < std::numeric_limits<T>::min()) {
+        abort();
+    }
+    return static_cast<T>(value);
+}
+
+// We have a singleton client context for all threads.  We want all client
+// threads served by a single server RenderThread.
+MagmaClientContext* GetMagmaContext() {
+    static MagmaClientContext* s_context;
+    static std::once_flag once_flag;
+
+    std::call_once(once_flag, []() {
+        auto stream = createVirtioGpuAddressSpaceStream(nullptr);
+        assert(stream);
+
+        // RenderThread expects flags: send zero 'clientFlags' to the host.
+        {
+            auto pClientFlags =
+                reinterpret_cast<unsigned int*>(stream->allocBuffer(sizeof(unsigned int)));
+            *pClientFlags = 0;
+            stream->commitBuffer(sizeof(unsigned int));
+        }
+
+        s_context = new MagmaClientContext(stream);
+        auto render_node_fd =
+            VirtGpuDevice::getInstance(VirtGpuCapset::kCapsetGfxStream).getDeviceHandle();
+        s_context->render_node_fd_ = SafeCast<int>(render_node_fd);
+
+        ALOGE("Created new context\n");
+        fflush(stdout);
+    });
+
+    return s_context;
+}
+
+// Used in magma_entry.cpp
+// Always lock around the encoding methods because we have a singleton context.
+#define GET_CONTEXT                              \
+    MagmaClientContext* ctx = GetMagmaContext(); \
+    ContextLock lock(ctx)
+
+#include "magma_entry.cpp"
+
+// Stubs
+extern "C" {
+
+magma_status_t magma_execute_immediate_commands2(
+    magma_connection_t connection, uint32_t context_id, uint64_t command_count,
+    struct magma_inline_command_buffer* command_buffers) {
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t magma_export(magma_connection_t connection, magma_buffer_t buffer,
+                            magma_handle_t* buffer_handle_out) {
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t magma_import(magma_connection_t connection, magma_handle_t buffer_handle,
+                            magma_buffer_t* buffer_out) {
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t magma_export_semaphore(magma_connection_t connection, magma_semaphore_t semaphore,
+                                      magma_handle_t* semaphore_handle_out) {
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t magma_import_semaphore(magma_connection_t connection,
+                                      magma_handle_t semaphore_handle,
+                                      magma_semaphore_t* semaphore_out) {
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t magma_virt_create_image(magma_connection_t connection,
+                                       magma_image_create_info_t* create_info,
+                                       magma_buffer_t* image_out) {
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t magma_virt_get_image_info(magma_connection_t connection, magma_buffer_t image,
+                                         magma_image_info_t* image_info_out) {
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t magma_buffer_range_op(magma_connection_t connection, magma_buffer_t buffer,
+                                     uint32_t options, uint64_t start_offset, uint64_t length) {
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t magma_flush(magma_connection_t connection) { return MAGMA_STATUS_UNIMPLEMENTED; }
+}
diff --git a/system/magma/magma_enc/magma_client_context.cpp b/system/magma/magma_enc/magma_client_context.cpp
new file mode 100644
index 0000000..80ca212
--- /dev/null
+++ b/system/magma/magma_enc/magma_client_context.cpp
@@ -0,0 +1,64 @@
+// Generated Code - DO NOT EDIT !!
+// generated by 'emugen'
+
+
+#include <string.h>
+#include "magma_client_context.h"
+
+
+#include <stdio.h>
+
+int magma_client_context_t::initDispatchByName(void *(*getProc)(const char *, void *userData), void *userData)
+{
+	magma_device_import = (magma_device_import_client_proc_t) getProc("magma_device_import", userData);
+	magma_device_release = (magma_device_release_client_proc_t) getProc("magma_device_release", userData);
+	magma_device_query = (magma_device_query_client_proc_t) getProc("magma_device_query", userData);
+	magma_device_create_connection = (magma_device_create_connection_client_proc_t) getProc("magma_device_create_connection", userData);
+	magma_connection_release = (magma_connection_release_client_proc_t) getProc("magma_connection_release", userData);
+	magma_connection_get_error = (magma_connection_get_error_client_proc_t) getProc("magma_connection_get_error", userData);
+	magma_connection_create_context = (magma_connection_create_context_client_proc_t) getProc("magma_connection_create_context", userData);
+	magma_connection_release_context = (magma_connection_release_context_client_proc_t) getProc("magma_connection_release_context", userData);
+	magma_connection_create_buffer = (magma_connection_create_buffer_client_proc_t) getProc("magma_connection_create_buffer", userData);
+	magma_connection_release_buffer = (magma_connection_release_buffer_client_proc_t) getProc("magma_connection_release_buffer", userData);
+	magma_connection_export_buffer = (magma_connection_export_buffer_client_proc_t) getProc("magma_connection_export_buffer", userData);
+	magma_connection_import_buffer = (magma_connection_import_buffer_client_proc_t) getProc("magma_connection_import_buffer", userData);
+	magma_connection_create_semaphore = (magma_connection_create_semaphore_client_proc_t) getProc("magma_connection_create_semaphore", userData);
+	magma_connection_release_semaphore = (magma_connection_release_semaphore_client_proc_t) getProc("magma_connection_release_semaphore", userData);
+	magma_connection_export_semaphore = (magma_connection_export_semaphore_client_proc_t) getProc("magma_connection_export_semaphore", userData);
+	magma_connection_import_semaphore = (magma_connection_import_semaphore_client_proc_t) getProc("magma_connection_import_semaphore", userData);
+	magma_connection_buffer_range_op = (magma_connection_buffer_range_op_client_proc_t) getProc("magma_connection_buffer_range_op", userData);
+	magma_connection_map_buffer = (magma_connection_map_buffer_client_proc_t) getProc("magma_connection_map_buffer", userData);
+	magma_connection_unmap_buffer = (magma_connection_unmap_buffer_client_proc_t) getProc("magma_connection_unmap_buffer", userData);
+	magma_connection_execute_command = (magma_connection_execute_command_client_proc_t) getProc("magma_connection_execute_command", userData);
+	magma_connection_execute_immediate_commands = (magma_connection_execute_immediate_commands_client_proc_t) getProc("magma_connection_execute_immediate_commands", userData);
+	magma_connection_flush = (magma_connection_flush_client_proc_t) getProc("magma_connection_flush", userData);
+	magma_connection_get_notification_channel_handle = (magma_connection_get_notification_channel_handle_client_proc_t) getProc("magma_connection_get_notification_channel_handle", userData);
+	magma_connection_read_notification_channel = (magma_connection_read_notification_channel_client_proc_t) getProc("magma_connection_read_notification_channel", userData);
+	magma_buffer_get_id = (magma_buffer_get_id_client_proc_t) getProc("magma_buffer_get_id", userData);
+	magma_buffer_get_size = (magma_buffer_get_size_client_proc_t) getProc("magma_buffer_get_size", userData);
+	magma_buffer_clean_cache = (magma_buffer_clean_cache_client_proc_t) getProc("magma_buffer_clean_cache", userData);
+	magma_buffer_set_cache_policy = (magma_buffer_set_cache_policy_client_proc_t) getProc("magma_buffer_set_cache_policy", userData);
+	magma_buffer_get_cache_policy = (magma_buffer_get_cache_policy_client_proc_t) getProc("magma_buffer_get_cache_policy", userData);
+	magma_buffer_set_name = (magma_buffer_set_name_client_proc_t) getProc("magma_buffer_set_name", userData);
+	magma_buffer_get_info = (magma_buffer_get_info_client_proc_t) getProc("magma_buffer_get_info", userData);
+	magma_buffer_get_handle = (magma_buffer_get_handle_client_proc_t) getProc("magma_buffer_get_handle", userData);
+	magma_semaphore_get_id = (magma_semaphore_get_id_client_proc_t) getProc("magma_semaphore_get_id", userData);
+	magma_semaphore_signal = (magma_semaphore_signal_client_proc_t) getProc("magma_semaphore_signal", userData);
+	magma_semaphore_reset = (magma_semaphore_reset_client_proc_t) getProc("magma_semaphore_reset", userData);
+	magma_poll = (magma_poll_client_proc_t) getProc("magma_poll", userData);
+	magma_initialize_tracing = (magma_initialize_tracing_client_proc_t) getProc("magma_initialize_tracing", userData);
+	magma_initialize_logging = (magma_initialize_logging_client_proc_t) getProc("magma_initialize_logging", userData);
+	magma_connection_enable_performance_counter_access = (magma_connection_enable_performance_counter_access_client_proc_t) getProc("magma_connection_enable_performance_counter_access", userData);
+	magma_connection_enable_performance_counters = (magma_connection_enable_performance_counters_client_proc_t) getProc("magma_connection_enable_performance_counters", userData);
+	magma_connection_create_performance_counter_buffer_pool = (magma_connection_create_performance_counter_buffer_pool_client_proc_t) getProc("magma_connection_create_performance_counter_buffer_pool", userData);
+	magma_connection_release_performance_counter_buffer_pool = (magma_connection_release_performance_counter_buffer_pool_client_proc_t) getProc("magma_connection_release_performance_counter_buffer_pool", userData);
+	magma_connection_add_performance_counter_buffer_offsets_to_pool = (magma_connection_add_performance_counter_buffer_offsets_to_pool_client_proc_t) getProc("magma_connection_add_performance_counter_buffer_offsets_to_pool", userData);
+	magma_connection_remove_performance_counter_buffer_from_pool = (magma_connection_remove_performance_counter_buffer_from_pool_client_proc_t) getProc("magma_connection_remove_performance_counter_buffer_from_pool", userData);
+	magma_connection_dump_performance_counters = (magma_connection_dump_performance_counters_client_proc_t) getProc("magma_connection_dump_performance_counters", userData);
+	magma_connection_clear_performance_counters = (magma_connection_clear_performance_counters_client_proc_t) getProc("magma_connection_clear_performance_counters", userData);
+	magma_connection_read_performance_counter_completion = (magma_connection_read_performance_counter_completion_client_proc_t) getProc("magma_connection_read_performance_counter_completion", userData);
+	magma_virt_connection_create_image = (magma_virt_connection_create_image_client_proc_t) getProc("magma_virt_connection_create_image", userData);
+	magma_virt_connection_get_image_info = (magma_virt_connection_get_image_info_client_proc_t) getProc("magma_virt_connection_get_image_info", userData);
+	return 0;
+}
+
diff --git a/system/magma/magma_enc/magma_client_context.h b/system/magma/magma_enc/magma_client_context.h
new file mode 100644
index 0000000..a7cf69b
--- /dev/null
+++ b/system/magma/magma_enc/magma_client_context.h
@@ -0,0 +1,71 @@
+// Generated Code - DO NOT EDIT !!
+// generated by 'emugen'
+#ifndef __magma_client_context_t_h
+#define __magma_client_context_t_h
+
+#include "magma_client_proc.h"
+
+#include "magma_types.h"
+
+
+struct magma_client_context_t {
+
+	magma_device_import_client_proc_t magma_device_import;
+	magma_device_release_client_proc_t magma_device_release;
+	magma_device_query_client_proc_t magma_device_query;
+	magma_device_create_connection_client_proc_t magma_device_create_connection;
+	magma_connection_release_client_proc_t magma_connection_release;
+	magma_connection_get_error_client_proc_t magma_connection_get_error;
+	magma_connection_create_context_client_proc_t magma_connection_create_context;
+	magma_connection_release_context_client_proc_t magma_connection_release_context;
+	magma_connection_create_buffer_client_proc_t magma_connection_create_buffer;
+	magma_connection_release_buffer_client_proc_t magma_connection_release_buffer;
+	magma_connection_export_buffer_client_proc_t magma_connection_export_buffer;
+	magma_connection_import_buffer_client_proc_t magma_connection_import_buffer;
+	magma_connection_create_semaphore_client_proc_t magma_connection_create_semaphore;
+	magma_connection_release_semaphore_client_proc_t magma_connection_release_semaphore;
+	magma_connection_export_semaphore_client_proc_t magma_connection_export_semaphore;
+	magma_connection_import_semaphore_client_proc_t magma_connection_import_semaphore;
+	magma_connection_buffer_range_op_client_proc_t magma_connection_buffer_range_op;
+	magma_connection_map_buffer_client_proc_t magma_connection_map_buffer;
+	magma_connection_unmap_buffer_client_proc_t magma_connection_unmap_buffer;
+	magma_connection_execute_command_client_proc_t magma_connection_execute_command;
+	magma_connection_execute_immediate_commands_client_proc_t magma_connection_execute_immediate_commands;
+	magma_connection_flush_client_proc_t magma_connection_flush;
+	magma_connection_get_notification_channel_handle_client_proc_t magma_connection_get_notification_channel_handle;
+	magma_connection_read_notification_channel_client_proc_t magma_connection_read_notification_channel;
+	magma_buffer_get_id_client_proc_t magma_buffer_get_id;
+	magma_buffer_get_size_client_proc_t magma_buffer_get_size;
+	magma_buffer_clean_cache_client_proc_t magma_buffer_clean_cache;
+	magma_buffer_set_cache_policy_client_proc_t magma_buffer_set_cache_policy;
+	magma_buffer_get_cache_policy_client_proc_t magma_buffer_get_cache_policy;
+	magma_buffer_set_name_client_proc_t magma_buffer_set_name;
+	magma_buffer_get_info_client_proc_t magma_buffer_get_info;
+	magma_buffer_get_handle_client_proc_t magma_buffer_get_handle;
+	magma_semaphore_get_id_client_proc_t magma_semaphore_get_id;
+	magma_semaphore_signal_client_proc_t magma_semaphore_signal;
+	magma_semaphore_reset_client_proc_t magma_semaphore_reset;
+	magma_poll_client_proc_t magma_poll;
+	magma_initialize_tracing_client_proc_t magma_initialize_tracing;
+	magma_initialize_logging_client_proc_t magma_initialize_logging;
+	magma_connection_enable_performance_counter_access_client_proc_t magma_connection_enable_performance_counter_access;
+	magma_connection_enable_performance_counters_client_proc_t magma_connection_enable_performance_counters;
+	magma_connection_create_performance_counter_buffer_pool_client_proc_t magma_connection_create_performance_counter_buffer_pool;
+	magma_connection_release_performance_counter_buffer_pool_client_proc_t magma_connection_release_performance_counter_buffer_pool;
+	magma_connection_add_performance_counter_buffer_offsets_to_pool_client_proc_t magma_connection_add_performance_counter_buffer_offsets_to_pool;
+	magma_connection_remove_performance_counter_buffer_from_pool_client_proc_t magma_connection_remove_performance_counter_buffer_from_pool;
+	magma_connection_dump_performance_counters_client_proc_t magma_connection_dump_performance_counters;
+	magma_connection_clear_performance_counters_client_proc_t magma_connection_clear_performance_counters;
+	magma_connection_read_performance_counter_completion_client_proc_t magma_connection_read_performance_counter_completion;
+	magma_virt_connection_create_image_client_proc_t magma_virt_connection_create_image;
+	magma_virt_connection_get_image_info_client_proc_t magma_virt_connection_get_image_info;
+	virtual ~magma_client_context_t() {}
+
+	typedef magma_client_context_t *CONTEXT_ACCESSOR_TYPE(void);
+	static void setContextAccessor(CONTEXT_ACCESSOR_TYPE *f);
+	int initDispatchByName( void *(*getProc)(const char *name, void *userData), void *userData);
+	virtual void setError(unsigned int  error){ (void)error; }
+	virtual unsigned int getError(){ return 0; }
+};
+
+#endif
diff --git a/system/magma/magma_enc/magma_client_proc.h b/system/magma/magma_enc/magma_client_proc.h
new file mode 100644
index 0000000..08f05d9
--- /dev/null
+++ b/system/magma/magma_enc/magma_client_proc.h
@@ -0,0 +1,66 @@
+// Generated Code - DO NOT EDIT !!
+// generated by 'emugen'
+#ifndef __magma_client_proc_t_h
+#define __magma_client_proc_t_h
+
+
+
+#include "magma_types.h"
+#ifdef _MSC_VER
+#include <stdint.h>
+#endif
+#ifndef magma_APIENTRY
+#define magma_APIENTRY 
+#endif
+typedef magma_status_t (magma_APIENTRY *magma_device_import_client_proc_t) (void * ctx, magma_handle_t, magma_device_t*);
+typedef void (magma_APIENTRY *magma_device_release_client_proc_t) (void * ctx, magma_device_t);
+typedef magma_status_t (magma_APIENTRY *magma_device_query_client_proc_t) (void * ctx, magma_device_t, uint64_t, magma_handle_t*, uint64_t*);
+typedef magma_status_t (magma_APIENTRY *magma_device_create_connection_client_proc_t) (void * ctx, magma_device_t, magma_connection_t*);
+typedef void (magma_APIENTRY *magma_connection_release_client_proc_t) (void * ctx, magma_connection_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_get_error_client_proc_t) (void * ctx, magma_connection_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_create_context_client_proc_t) (void * ctx, magma_connection_t, uint32_t*);
+typedef void (magma_APIENTRY *magma_connection_release_context_client_proc_t) (void * ctx, magma_connection_t, uint32_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_create_buffer_client_proc_t) (void * ctx, magma_connection_t, uint64_t, uint64_t*, magma_buffer_t*);
+typedef void (magma_APIENTRY *magma_connection_release_buffer_client_proc_t) (void * ctx, magma_connection_t, magma_buffer_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_export_buffer_client_proc_t) (void * ctx, magma_connection_t, magma_buffer_t, magma_handle_t*);
+typedef magma_status_t (magma_APIENTRY *magma_connection_import_buffer_client_proc_t) (void * ctx, magma_connection_t, magma_handle_t, magma_buffer_t*);
+typedef magma_status_t (magma_APIENTRY *magma_connection_create_semaphore_client_proc_t) (void * ctx, magma_connection_t, magma_semaphore_t*);
+typedef void (magma_APIENTRY *magma_connection_release_semaphore_client_proc_t) (void * ctx, magma_connection_t, magma_semaphore_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_export_semaphore_client_proc_t) (void * ctx, magma_connection_t, magma_semaphore_t, magma_handle_t*);
+typedef magma_status_t (magma_APIENTRY *magma_connection_import_semaphore_client_proc_t) (void * ctx, magma_connection_t, magma_handle_t, magma_semaphore_t*);
+typedef magma_status_t (magma_APIENTRY *magma_connection_buffer_range_op_client_proc_t) (void * ctx, magma_connection_t, magma_buffer_t, uint32_t, uint64_t, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_map_buffer_client_proc_t) (void * ctx, magma_connection_t, uint64_t, magma_buffer_t, uint64_t, uint64_t, uint64_t);
+typedef void (magma_APIENTRY *magma_connection_unmap_buffer_client_proc_t) (void * ctx, magma_connection_t, uint64_t, magma_buffer_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_execute_command_client_proc_t) (void * ctx, uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_execute_immediate_commands_client_proc_t) (void * ctx, uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_flush_client_proc_t) (void * ctx, magma_connection_t);
+typedef magma_handle_t (magma_APIENTRY *magma_connection_get_notification_channel_handle_client_proc_t) (void * ctx, magma_connection_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_read_notification_channel_client_proc_t) (void * ctx, magma_connection_t, void*, uint64_t, uint64_t*, magma_bool_t*);
+typedef uint64_t (magma_APIENTRY *magma_buffer_get_id_client_proc_t) (void * ctx, magma_buffer_t);
+typedef uint64_t (magma_APIENTRY *magma_buffer_get_size_client_proc_t) (void * ctx, magma_buffer_t);
+typedef magma_status_t (magma_APIENTRY *magma_buffer_clean_cache_client_proc_t) (void * ctx, magma_buffer_t, uint64_t, uint64_t, magma_cache_operation_t);
+typedef magma_status_t (magma_APIENTRY *magma_buffer_set_cache_policy_client_proc_t) (void * ctx, magma_buffer_t, magma_cache_policy_t);
+typedef magma_status_t (magma_APIENTRY *magma_buffer_get_cache_policy_client_proc_t) (void * ctx, magma_buffer_t, magma_cache_policy_t*);
+typedef magma_status_t (magma_APIENTRY *magma_buffer_set_name_client_proc_t) (void * ctx, magma_buffer_t, void*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_buffer_get_info_client_proc_t) (void * ctx, uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_buffer_get_handle_client_proc_t) (void * ctx, magma_buffer_t, magma_handle_t*);
+typedef uint64_t (magma_APIENTRY *magma_semaphore_get_id_client_proc_t) (void * ctx, magma_semaphore_t);
+typedef void (magma_APIENTRY *magma_semaphore_signal_client_proc_t) (void * ctx, magma_semaphore_t);
+typedef void (magma_APIENTRY *magma_semaphore_reset_client_proc_t) (void * ctx, magma_semaphore_t);
+typedef magma_status_t (magma_APIENTRY *magma_poll_client_proc_t) (void * ctx, magma_poll_item_t*, uint32_t, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_initialize_tracing_client_proc_t) (void * ctx, magma_handle_t);
+typedef magma_status_t (magma_APIENTRY *magma_initialize_logging_client_proc_t) (void * ctx, magma_handle_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_enable_performance_counter_access_client_proc_t) (void * ctx, magma_connection_t, magma_handle_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_enable_performance_counters_client_proc_t) (void * ctx, magma_connection_t, uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_create_performance_counter_buffer_pool_client_proc_t) (void * ctx, magma_connection_t, magma_perf_count_pool_t*, magma_handle_t*);
+typedef magma_status_t (magma_APIENTRY *magma_connection_release_performance_counter_buffer_pool_client_proc_t) (void * ctx, magma_connection_t, magma_perf_count_pool_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_add_performance_counter_buffer_offsets_to_pool_client_proc_t) (void * ctx, uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_remove_performance_counter_buffer_from_pool_client_proc_t) (void * ctx, magma_connection_t, magma_perf_count_pool_t, magma_buffer_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_dump_performance_counters_client_proc_t) (void * ctx, magma_connection_t, magma_perf_count_pool_t, uint32_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_clear_performance_counters_client_proc_t) (void * ctx, magma_connection_t, uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_read_performance_counter_completion_client_proc_t) (void * ctx, magma_connection_t, magma_perf_count_pool_t, uint32_t*, uint64_t*, uint32_t*, uint64_t*, uint32_t*);
+typedef magma_status_t (magma_APIENTRY *magma_virt_connection_create_image_client_proc_t) (void * ctx, uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_virt_connection_get_image_info_client_proc_t) (void * ctx, uint64_t*, uint64_t);
+
+
+#endif
diff --git a/system/magma/magma_enc/magma_enc.cpp b/system/magma/magma_enc/magma_enc.cpp
new file mode 100644
index 0000000..153d708
--- /dev/null
+++ b/system/magma/magma_enc/magma_enc.cpp
@@ -0,0 +1,2199 @@
+// Generated Code - DO NOT EDIT !!
+// generated by 'emugen'
+
+
+#include <string.h>
+#include "magma_opcodes.h"
+
+#include "magma_enc.h"
+
+
+#include <vector>
+
+#include <stdio.h>
+
+// TODO(fxbug.dev/122605): Why is modification needed for these two includes?
+#include "aemu/base/Tracing.h"
+#include "cutils/log.h"
+
+#include "EncoderDebug.h"
+
+namespace {
+
+void enc_unsupported()
+{
+	ALOGE("Function is unsupported\n");
+}
+
+magma_status_t magma_device_import_enc(void *self , magma_handle_t device_channel, magma_device_t* device_out)
+{
+	ENCODER_DEBUG_LOG("magma_device_import(device_channel:0x%x, device_out:%p)", device_channel, device_out);
+	AEMU_SCOPED_TRACE("magma_device_import encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_device_out =  sizeof(magma_device_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 4 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_device_import;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &device_channel, 4); ptr += 4;
+	memcpy(ptr, &__size_device_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(device_out, __size_device_out);
+	if (useChecksum) checksumCalculator->addBuffer(device_out, __size_device_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_device_import: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+void magma_device_release_enc(void *self , magma_device_t device)
+{
+	ENCODER_DEBUG_LOG("magma_device_release(device:%lu)", device);
+	AEMU_SCOPED_TRACE("magma_device_release encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_device_release;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &device, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+}
+
+magma_status_t magma_device_query_enc(void *self , magma_device_t device, uint64_t id, magma_handle_t* result_buffer_out, uint64_t* result_out)
+{
+	ENCODER_DEBUG_LOG("magma_device_query(device:%lu, id:%lu, result_buffer_out:%p, result_out:%p)", device, id, result_buffer_out, result_out);
+	AEMU_SCOPED_TRACE("magma_device_query encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_result_buffer_out =  sizeof(magma_handle_t);
+	const unsigned int __size_result_out =  sizeof(uint64_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 0 + 0 + 2*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_device_query;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &device, 8); ptr += 8;
+		memcpy(ptr, &id, 8); ptr += 8;
+	memcpy(ptr, &__size_result_buffer_out, 4); ptr += 4;
+	memcpy(ptr, &__size_result_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(result_buffer_out, __size_result_buffer_out);
+	if (useChecksum) checksumCalculator->addBuffer(result_buffer_out, __size_result_buffer_out);
+	stream->readback(result_out, __size_result_out);
+	if (useChecksum) checksumCalculator->addBuffer(result_out, __size_result_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_device_query: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_device_create_connection_enc(void *self , magma_device_t device, magma_connection_t* connection_out)
+{
+	ENCODER_DEBUG_LOG("magma_device_create_connection(device:%lu, connection_out:%p)", device, connection_out);
+	AEMU_SCOPED_TRACE("magma_device_create_connection encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_connection_out =  sizeof(magma_connection_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_device_create_connection;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &device, 8); ptr += 8;
+	memcpy(ptr, &__size_connection_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(connection_out, __size_connection_out);
+	if (useChecksum) checksumCalculator->addBuffer(connection_out, __size_connection_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_device_create_connection: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+void magma_connection_release_enc(void *self , magma_connection_t connection)
+{
+	ENCODER_DEBUG_LOG("magma_connection_release(connection:%lu)", connection);
+	AEMU_SCOPED_TRACE("magma_connection_release encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_release;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+}
+
+magma_status_t magma_connection_get_error_enc(void *self , magma_connection_t connection)
+{
+	ENCODER_DEBUG_LOG("magma_connection_get_error(connection:%lu)", connection);
+	AEMU_SCOPED_TRACE("magma_connection_get_error encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_get_error;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_get_error: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_create_context_enc(void *self , magma_connection_t connection, uint32_t* context_id_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_create_context(connection:%lu, context_id_out:%p)", connection, context_id_out);
+	AEMU_SCOPED_TRACE("magma_connection_create_context encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_context_id_out =  sizeof(uint32_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_create_context;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+	memcpy(ptr, &__size_context_id_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(context_id_out, __size_context_id_out);
+	if (useChecksum) checksumCalculator->addBuffer(context_id_out, __size_context_id_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_create_context: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+void magma_connection_release_context_enc(void *self , magma_connection_t connection, uint32_t context_id)
+{
+	ENCODER_DEBUG_LOG("magma_connection_release_context(connection:%lu, context_id:%u)", connection, context_id);
+	AEMU_SCOPED_TRACE("magma_connection_release_context encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_release_context;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &context_id, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+}
+
+magma_status_t magma_connection_create_buffer_enc(void *self , magma_connection_t connection, uint64_t size, uint64_t* size_out, magma_buffer_t* buffer_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_create_buffer(connection:%lu, size:%lu, size_out:%p, buffer_out:%p)", connection, size, size_out, buffer_out);
+	AEMU_SCOPED_TRACE("magma_connection_create_buffer encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_size_out =  sizeof(uint64_t);
+	const unsigned int __size_buffer_out =  sizeof(magma_buffer_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 0 + 0 + 2*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_create_buffer;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &size, 8); ptr += 8;
+	memcpy(ptr, &__size_size_out, 4); ptr += 4;
+	memcpy(ptr, &__size_buffer_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(size_out, __size_size_out);
+	if (useChecksum) checksumCalculator->addBuffer(size_out, __size_size_out);
+	stream->readback(buffer_out, __size_buffer_out);
+	if (useChecksum) checksumCalculator->addBuffer(buffer_out, __size_buffer_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_create_buffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+void magma_connection_release_buffer_enc(void *self , magma_connection_t connection, magma_buffer_t buffer)
+{
+	ENCODER_DEBUG_LOG("magma_connection_release_buffer(connection:%lu, buffer:%lu)", connection, buffer);
+	AEMU_SCOPED_TRACE("magma_connection_release_buffer encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_release_buffer;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &buffer, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+}
+
+magma_status_t magma_connection_export_buffer_enc(void *self , magma_connection_t connection, magma_buffer_t buffer, magma_handle_t* buffer_handle_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_export_buffer(connection:%lu, buffer:%lu, buffer_handle_out:%p)", connection, buffer, buffer_handle_out);
+	AEMU_SCOPED_TRACE("magma_connection_export_buffer encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_buffer_handle_out =  sizeof(magma_handle_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_export_buffer;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &buffer, 8); ptr += 8;
+	memcpy(ptr, &__size_buffer_handle_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(buffer_handle_out, __size_buffer_handle_out);
+	if (useChecksum) checksumCalculator->addBuffer(buffer_handle_out, __size_buffer_handle_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_export_buffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_import_buffer_enc(void *self , magma_connection_t connection, magma_handle_t buffer_handle, magma_buffer_t* buffer_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_import_buffer(connection:%lu, buffer_handle:0x%x, buffer_out:%p)", connection, buffer_handle, buffer_out);
+	AEMU_SCOPED_TRACE("magma_connection_import_buffer encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_buffer_out =  sizeof(magma_buffer_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 4 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_import_buffer;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &buffer_handle, 4); ptr += 4;
+	memcpy(ptr, &__size_buffer_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(buffer_out, __size_buffer_out);
+	if (useChecksum) checksumCalculator->addBuffer(buffer_out, __size_buffer_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_import_buffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_create_semaphore_enc(void *self , magma_connection_t connection, magma_semaphore_t* semaphore_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_create_semaphore(connection:%lu, semaphore_out:%p)", connection, semaphore_out);
+	AEMU_SCOPED_TRACE("magma_connection_create_semaphore encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_semaphore_out =  sizeof(magma_semaphore_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_create_semaphore;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+	memcpy(ptr, &__size_semaphore_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(semaphore_out, __size_semaphore_out);
+	if (useChecksum) checksumCalculator->addBuffer(semaphore_out, __size_semaphore_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_create_semaphore: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+void magma_connection_release_semaphore_enc(void *self , magma_connection_t connection, magma_semaphore_t semaphore)
+{
+	ENCODER_DEBUG_LOG("magma_connection_release_semaphore(connection:%lu, semaphore:%lu)", connection, semaphore);
+	AEMU_SCOPED_TRACE("magma_connection_release_semaphore encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_release_semaphore;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &semaphore, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+}
+
+magma_status_t magma_connection_export_semaphore_enc(void *self , magma_connection_t connection, magma_semaphore_t semaphore, magma_handle_t* semaphore_handle_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_export_semaphore(connection:%lu, semaphore:%lu, semaphore_handle_out:%p)", connection, semaphore, semaphore_handle_out);
+	AEMU_SCOPED_TRACE("magma_connection_export_semaphore encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_semaphore_handle_out =  sizeof(magma_handle_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_export_semaphore;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &semaphore, 8); ptr += 8;
+	memcpy(ptr, &__size_semaphore_handle_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(semaphore_handle_out, __size_semaphore_handle_out);
+	if (useChecksum) checksumCalculator->addBuffer(semaphore_handle_out, __size_semaphore_handle_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_export_semaphore: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_import_semaphore_enc(void *self , magma_connection_t connection, magma_handle_t semaphore_handle, magma_semaphore_t* semaphore_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_import_semaphore(connection:%lu, semaphore_handle:0x%x, semaphore_out:%p)", connection, semaphore_handle, semaphore_out);
+	AEMU_SCOPED_TRACE("magma_connection_import_semaphore encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_semaphore_out =  sizeof(magma_semaphore_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 4 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_import_semaphore;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &semaphore_handle, 4); ptr += 4;
+	memcpy(ptr, &__size_semaphore_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(semaphore_out, __size_semaphore_out);
+	if (useChecksum) checksumCalculator->addBuffer(semaphore_out, __size_semaphore_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_import_semaphore: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_buffer_range_op_enc(void *self , magma_connection_t connection, magma_buffer_t buffer, uint32_t options, uint64_t start_offset, uint64_t length)
+{
+	ENCODER_DEBUG_LOG("magma_connection_buffer_range_op(connection:%lu, buffer:%lu, options:%u, start_offset:%lu, length:%lu)", connection, buffer, options, start_offset, length);
+	AEMU_SCOPED_TRACE("magma_connection_buffer_range_op encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 4 + 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_buffer_range_op;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &buffer, 8); ptr += 8;
+		memcpy(ptr, &options, 4); ptr += 4;
+		memcpy(ptr, &start_offset, 8); ptr += 8;
+		memcpy(ptr, &length, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_buffer_range_op: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_map_buffer_enc(void *self , magma_connection_t connection, uint64_t hw_va, magma_buffer_t buffer, uint64_t offset, uint64_t length, uint64_t map_flags)
+{
+	ENCODER_DEBUG_LOG("magma_connection_map_buffer(connection:%lu, hw_va:%lu, buffer:%lu, offset:%lu, length:%lu, map_flags:%lu)", connection, hw_va, buffer, offset, length, map_flags);
+	AEMU_SCOPED_TRACE("magma_connection_map_buffer encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 8 + 8 + 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_map_buffer;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &hw_va, 8); ptr += 8;
+		memcpy(ptr, &buffer, 8); ptr += 8;
+		memcpy(ptr, &offset, 8); ptr += 8;
+		memcpy(ptr, &length, 8); ptr += 8;
+		memcpy(ptr, &map_flags, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_map_buffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+void magma_connection_unmap_buffer_enc(void *self , magma_connection_t connection, uint64_t hw_va, magma_buffer_t buffer)
+{
+	ENCODER_DEBUG_LOG("magma_connection_unmap_buffer(connection:%lu, hw_va:%lu, buffer:%lu)", connection, hw_va, buffer);
+	AEMU_SCOPED_TRACE("magma_connection_unmap_buffer encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_unmap_buffer;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &hw_va, 8); ptr += 8;
+		memcpy(ptr, &buffer, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+}
+
+magma_status_t magma_connection_execute_command_enc(void *self , uint64_t* parameters, uint64_t parameter_count)
+{
+	ENCODER_DEBUG_LOG("magma_connection_execute_command(parameters:%p, parameter_count:%lu)", parameters, parameter_count);
+	AEMU_SCOPED_TRACE("magma_connection_execute_command encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_parameters =  parameter_count * sizeof(uint64_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + __size_parameters + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_execute_command;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+	memcpy(ptr, &__size_parameters, 4); ptr += 4;
+	memcpy(ptr, parameters, __size_parameters);ptr += __size_parameters;
+		memcpy(ptr, &parameter_count, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(parameters, __size_parameters);
+	if (useChecksum) checksumCalculator->addBuffer(parameters, __size_parameters);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_execute_command: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_execute_immediate_commands_enc(void *self , uint64_t* parameters, uint64_t parameter_count)
+{
+	ENCODER_DEBUG_LOG("magma_connection_execute_immediate_commands(parameters:%p, parameter_count:%lu)", parameters, parameter_count);
+	AEMU_SCOPED_TRACE("magma_connection_execute_immediate_commands encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_parameters =  parameter_count * sizeof(uint64_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + __size_parameters + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_execute_immediate_commands;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+	memcpy(ptr, &__size_parameters, 4); ptr += 4;
+	memcpy(ptr, parameters, __size_parameters);ptr += __size_parameters;
+		memcpy(ptr, &parameter_count, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(parameters, __size_parameters);
+	if (useChecksum) checksumCalculator->addBuffer(parameters, __size_parameters);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_execute_immediate_commands: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_flush_enc(void *self , magma_connection_t connection)
+{
+	ENCODER_DEBUG_LOG("magma_connection_flush(connection:%lu)", connection);
+	AEMU_SCOPED_TRACE("magma_connection_flush encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_flush;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_flush: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_handle_t magma_connection_get_notification_channel_handle_enc(void *self , magma_connection_t connection)
+{
+	ENCODER_DEBUG_LOG("magma_connection_get_notification_channel_handle(connection:%lu)", connection);
+	AEMU_SCOPED_TRACE("magma_connection_get_notification_channel_handle encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_get_notification_channel_handle;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_handle_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_get_notification_channel_handle: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_read_notification_channel_enc(void *self , magma_connection_t connection, void* buffer, uint64_t buffer_size, uint64_t* buffer_size_out, magma_bool_t* more_data_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_read_notification_channel(connection:%lu, buffer:%p, buffer_size:%lu, buffer_size_out:%p, more_data_out:%p)", connection, buffer, buffer_size, buffer_size_out, more_data_out);
+	AEMU_SCOPED_TRACE("magma_connection_read_notification_channel encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_buffer =  buffer_size;
+	const unsigned int __size_buffer_size_out =  sizeof(uint64_t);
+	const unsigned int __size_more_data_out =  sizeof(magma_bool_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 0 + 8 + 0 + 0 + 3*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_read_notification_channel;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+	memcpy(ptr, &__size_buffer, 4); ptr += 4;
+		memcpy(ptr, &buffer_size, 8); ptr += 8;
+	memcpy(ptr, &__size_buffer_size_out, 4); ptr += 4;
+	memcpy(ptr, &__size_more_data_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(buffer, __size_buffer);
+	if (useChecksum) checksumCalculator->addBuffer(buffer, __size_buffer);
+	stream->readback(buffer_size_out, __size_buffer_size_out);
+	if (useChecksum) checksumCalculator->addBuffer(buffer_size_out, __size_buffer_size_out);
+	stream->readback(more_data_out, __size_more_data_out);
+	if (useChecksum) checksumCalculator->addBuffer(more_data_out, __size_more_data_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_read_notification_channel: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+uint64_t magma_buffer_get_id_enc(void *self , magma_buffer_t buffer)
+{
+	ENCODER_DEBUG_LOG("magma_buffer_get_id(buffer:%lu)", buffer);
+	AEMU_SCOPED_TRACE("magma_buffer_get_id encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_buffer_get_id;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &buffer, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	uint64_t retval;
+	stream->readback(&retval, 8);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 8);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_buffer_get_id: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+uint64_t magma_buffer_get_size_enc(void *self , magma_buffer_t buffer)
+{
+	ENCODER_DEBUG_LOG("magma_buffer_get_size(buffer:%lu)", buffer);
+	AEMU_SCOPED_TRACE("magma_buffer_get_size encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_buffer_get_size;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &buffer, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	uint64_t retval;
+	stream->readback(&retval, 8);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 8);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_buffer_get_size: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_buffer_clean_cache_enc(void *self , magma_buffer_t buffer, uint64_t offset, uint64_t size, magma_cache_operation_t operation)
+{
+	ENCODER_DEBUG_LOG("magma_buffer_clean_cache(buffer:%lu, offset:%lu, size:%lu, operation:%d)", buffer, offset, size, operation);
+	AEMU_SCOPED_TRACE("magma_buffer_clean_cache encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 8 + 4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_buffer_clean_cache;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &buffer, 8); ptr += 8;
+		memcpy(ptr, &offset, 8); ptr += 8;
+		memcpy(ptr, &size, 8); ptr += 8;
+		memcpy(ptr, &operation, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_buffer_clean_cache: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_buffer_set_cache_policy_enc(void *self , magma_buffer_t buffer, magma_cache_policy_t policy)
+{
+	ENCODER_DEBUG_LOG("magma_buffer_set_cache_policy(buffer:%lu, policy:%d)", buffer, policy);
+	AEMU_SCOPED_TRACE("magma_buffer_set_cache_policy encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_buffer_set_cache_policy;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &buffer, 8); ptr += 8;
+		memcpy(ptr, &policy, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_buffer_set_cache_policy: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_buffer_get_cache_policy_enc(void *self , magma_buffer_t buffer, magma_cache_policy_t* cache_policy_out)
+{
+	ENCODER_DEBUG_LOG("magma_buffer_get_cache_policy(buffer:%lu, cache_policy_out:%p)", buffer, cache_policy_out);
+	AEMU_SCOPED_TRACE("magma_buffer_get_cache_policy encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_cache_policy_out =  sizeof(magma_cache_policy_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_buffer_get_cache_policy;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &buffer, 8); ptr += 8;
+	memcpy(ptr, &__size_cache_policy_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(cache_policy_out, __size_cache_policy_out);
+	if (useChecksum) checksumCalculator->addBuffer(cache_policy_out, __size_cache_policy_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_buffer_get_cache_policy: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_buffer_set_name_enc(void *self , magma_buffer_t buffer, void* name, uint64_t name_size)
+{
+	ENCODER_DEBUG_LOG("magma_buffer_set_name(buffer:%lu, name:%p, name_size:%lu)", buffer, name, name_size);
+	AEMU_SCOPED_TRACE("magma_buffer_set_name encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_name =  name_size;
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + __size_name + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_buffer_set_name;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &buffer, 8); ptr += 8;
+	memcpy(ptr, &__size_name, 4); ptr += 4;
+	memcpy(ptr, name, __size_name);ptr += __size_name;
+		memcpy(ptr, &name_size, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_buffer_set_name: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_buffer_get_info_enc(void *self , uint64_t* parameters, uint64_t parameter_count)
+{
+	ENCODER_DEBUG_LOG("magma_buffer_get_info(parameters:%p, parameter_count:%lu)", parameters, parameter_count);
+	AEMU_SCOPED_TRACE("magma_buffer_get_info encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_parameters =  parameter_count * sizeof(uint64_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + __size_parameters + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_buffer_get_info;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+	memcpy(ptr, &__size_parameters, 4); ptr += 4;
+	memcpy(ptr, parameters, __size_parameters);ptr += __size_parameters;
+		memcpy(ptr, &parameter_count, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(parameters, __size_parameters);
+	if (useChecksum) checksumCalculator->addBuffer(parameters, __size_parameters);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_buffer_get_info: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_buffer_get_handle_enc(void *self , magma_buffer_t buffer, magma_handle_t* handle_out)
+{
+	ENCODER_DEBUG_LOG("magma_buffer_get_handle(buffer:%lu, handle_out:%p)", buffer, handle_out);
+	AEMU_SCOPED_TRACE("magma_buffer_get_handle encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_handle_out =  sizeof(magma_handle_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_buffer_get_handle;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &buffer, 8); ptr += 8;
+	memcpy(ptr, &__size_handle_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(handle_out, __size_handle_out);
+	if (useChecksum) checksumCalculator->addBuffer(handle_out, __size_handle_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_buffer_get_handle: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+uint64_t magma_semaphore_get_id_enc(void *self , magma_semaphore_t semaphore)
+{
+	ENCODER_DEBUG_LOG("magma_semaphore_get_id(semaphore:%lu)", semaphore);
+	AEMU_SCOPED_TRACE("magma_semaphore_get_id encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_semaphore_get_id;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &semaphore, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	uint64_t retval;
+	stream->readback(&retval, 8);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 8);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_semaphore_get_id: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+void magma_semaphore_signal_enc(void *self , magma_semaphore_t semaphore)
+{
+	ENCODER_DEBUG_LOG("magma_semaphore_signal(semaphore:%lu)", semaphore);
+	AEMU_SCOPED_TRACE("magma_semaphore_signal encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_semaphore_signal;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &semaphore, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+}
+
+void magma_semaphore_reset_enc(void *self , magma_semaphore_t semaphore)
+{
+	ENCODER_DEBUG_LOG("magma_semaphore_reset(semaphore:%lu)", semaphore);
+	AEMU_SCOPED_TRACE("magma_semaphore_reset encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_semaphore_reset;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &semaphore, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+}
+
+magma_status_t magma_poll_enc(void *self , magma_poll_item_t* items, uint32_t count, uint64_t timeout_ns)
+{
+	ENCODER_DEBUG_LOG("magma_poll(items:%p, count:%u, timeout_ns:%lu)", items, count, timeout_ns);
+	AEMU_SCOPED_TRACE("magma_poll encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_items =  count * sizeof(magma_poll_item_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + __size_items + 4 + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_poll;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+	memcpy(ptr, &__size_items, 4); ptr += 4;
+	memcpy(ptr, items, __size_items);ptr += __size_items;
+		memcpy(ptr, &count, 4); ptr += 4;
+		memcpy(ptr, &timeout_ns, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(items, __size_items);
+	if (useChecksum) checksumCalculator->addBuffer(items, __size_items);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_poll: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_initialize_tracing_enc(void *self , magma_handle_t channel)
+{
+	ENCODER_DEBUG_LOG("magma_initialize_tracing(channel:0x%x)", channel);
+	AEMU_SCOPED_TRACE("magma_initialize_tracing encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_initialize_tracing;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &channel, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_initialize_tracing: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_initialize_logging_enc(void *self , magma_handle_t channel)
+{
+	ENCODER_DEBUG_LOG("magma_initialize_logging(channel:0x%x)", channel);
+	AEMU_SCOPED_TRACE("magma_initialize_logging encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_initialize_logging;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &channel, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_initialize_logging: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_enable_performance_counter_access_enc(void *self , magma_connection_t connection, magma_handle_t channel)
+{
+	ENCODER_DEBUG_LOG("magma_connection_enable_performance_counter_access(connection:%lu, channel:0x%x)", connection, channel);
+	AEMU_SCOPED_TRACE("magma_connection_enable_performance_counter_access encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_enable_performance_counter_access;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &channel, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_enable_performance_counter_access: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_enable_performance_counters_enc(void *self , magma_connection_t connection, uint64_t* counters, uint64_t counters_count)
+{
+	ENCODER_DEBUG_LOG("magma_connection_enable_performance_counters(connection:%lu, counters:%p, counters_count:%lu)", connection, counters, counters_count);
+	AEMU_SCOPED_TRACE("magma_connection_enable_performance_counters encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_counters =  counters_count * sizeof(uint64_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + __size_counters + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_enable_performance_counters;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+	memcpy(ptr, &__size_counters, 4); ptr += 4;
+	memcpy(ptr, counters, __size_counters);ptr += __size_counters;
+		memcpy(ptr, &counters_count, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_enable_performance_counters: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_create_performance_counter_buffer_pool_enc(void *self , magma_connection_t connection, magma_perf_count_pool_t* pool_id_out, magma_handle_t* notification_handle_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_create_performance_counter_buffer_pool(connection:%lu, pool_id_out:%p, notification_handle_out:%p)", connection, pool_id_out, notification_handle_out);
+	AEMU_SCOPED_TRACE("magma_connection_create_performance_counter_buffer_pool encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_pool_id_out =  sizeof(magma_perf_count_pool_t);
+	const unsigned int __size_notification_handle_out =  sizeof(magma_handle_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 0 + 0 + 2*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_create_performance_counter_buffer_pool;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+	memcpy(ptr, &__size_pool_id_out, 4); ptr += 4;
+	memcpy(ptr, &__size_notification_handle_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(pool_id_out, __size_pool_id_out);
+	if (useChecksum) checksumCalculator->addBuffer(pool_id_out, __size_pool_id_out);
+	stream->readback(notification_handle_out, __size_notification_handle_out);
+	if (useChecksum) checksumCalculator->addBuffer(notification_handle_out, __size_notification_handle_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_create_performance_counter_buffer_pool: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_release_performance_counter_buffer_pool_enc(void *self , magma_connection_t connection, magma_perf_count_pool_t pool_id)
+{
+	ENCODER_DEBUG_LOG("magma_connection_release_performance_counter_buffer_pool(connection:%lu, pool_id:%lu)", connection, pool_id);
+	AEMU_SCOPED_TRACE("magma_connection_release_performance_counter_buffer_pool encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_release_performance_counter_buffer_pool;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &pool_id, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_release_performance_counter_buffer_pool: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_add_performance_counter_buffer_offsets_to_pool_enc(void *self , uint64_t* parameters, uint64_t parameter_count)
+{
+	ENCODER_DEBUG_LOG("magma_connection_add_performance_counter_buffer_offsets_to_pool(parameters:%p, parameter_count:%lu)", parameters, parameter_count);
+	AEMU_SCOPED_TRACE("magma_connection_add_performance_counter_buffer_offsets_to_pool encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_parameters =  parameter_count * sizeof(uint64_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + __size_parameters + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_add_performance_counter_buffer_offsets_to_pool;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+	memcpy(ptr, &__size_parameters, 4); ptr += 4;
+	memcpy(ptr, parameters, __size_parameters);ptr += __size_parameters;
+		memcpy(ptr, &parameter_count, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(parameters, __size_parameters);
+	if (useChecksum) checksumCalculator->addBuffer(parameters, __size_parameters);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_add_performance_counter_buffer_offsets_to_pool: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_remove_performance_counter_buffer_from_pool_enc(void *self , magma_connection_t connection, magma_perf_count_pool_t pool_id, magma_buffer_t buffer)
+{
+	ENCODER_DEBUG_LOG("magma_connection_remove_performance_counter_buffer_from_pool(connection:%lu, pool_id:%lu, buffer:%lu)", connection, pool_id, buffer);
+	AEMU_SCOPED_TRACE("magma_connection_remove_performance_counter_buffer_from_pool encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 8;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_remove_performance_counter_buffer_from_pool;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &pool_id, 8); ptr += 8;
+		memcpy(ptr, &buffer, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_remove_performance_counter_buffer_from_pool: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_dump_performance_counters_enc(void *self , magma_connection_t connection, magma_perf_count_pool_t pool_id, uint32_t trigger_id)
+{
+	ENCODER_DEBUG_LOG("magma_connection_dump_performance_counters(connection:%lu, pool_id:%lu, trigger_id:%u)", connection, pool_id, trigger_id);
+	AEMU_SCOPED_TRACE("magma_connection_dump_performance_counters encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_dump_performance_counters;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &pool_id, 8); ptr += 8;
+		memcpy(ptr, &trigger_id, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_dump_performance_counters: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_clear_performance_counters_enc(void *self , magma_connection_t connection, uint64_t* counters, uint64_t counters_count)
+{
+	ENCODER_DEBUG_LOG("magma_connection_clear_performance_counters(connection:%lu, counters:%p, counters_count:%lu)", connection, counters, counters_count);
+	AEMU_SCOPED_TRACE("magma_connection_clear_performance_counters encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_counters =  counters_count * sizeof(uint64_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + __size_counters + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_clear_performance_counters;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+	memcpy(ptr, &__size_counters, 4); ptr += 4;
+	memcpy(ptr, counters, __size_counters);ptr += __size_counters;
+		memcpy(ptr, &counters_count, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_clear_performance_counters: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_connection_read_performance_counter_completion_enc(void *self , magma_connection_t connection, magma_perf_count_pool_t pool_id, uint32_t* trigger_id_out, uint64_t* buffer_id_out, uint32_t* buffer_offset_out, uint64_t* time_out, uint32_t* result_flags_out)
+{
+	ENCODER_DEBUG_LOG("magma_connection_read_performance_counter_completion(connection:%lu, pool_id:%lu, trigger_id_out:%p, buffer_id_out:%p, buffer_offset_out:%p, time_out:%p, result_flags_out:%p)", connection, pool_id, trigger_id_out, buffer_id_out, buffer_offset_out, time_out, result_flags_out);
+	AEMU_SCOPED_TRACE("magma_connection_read_performance_counter_completion encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_trigger_id_out =  sizeof(uint32_t);
+	const unsigned int __size_buffer_id_out =  sizeof(uint64_t);
+	const unsigned int __size_buffer_offset_out =  sizeof(uint32_t);
+	const unsigned int __size_time_out =  sizeof(uint64_t);
+	const unsigned int __size_result_flags_out =  sizeof(uint32_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 8 + 8 + 0 + 0 + 0 + 0 + 0 + 5*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_connection_read_performance_counter_completion;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &connection, 8); ptr += 8;
+		memcpy(ptr, &pool_id, 8); ptr += 8;
+	memcpy(ptr, &__size_trigger_id_out, 4); ptr += 4;
+	memcpy(ptr, &__size_buffer_id_out, 4); ptr += 4;
+	memcpy(ptr, &__size_buffer_offset_out, 4); ptr += 4;
+	memcpy(ptr, &__size_time_out, 4); ptr += 4;
+	memcpy(ptr, &__size_result_flags_out, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(trigger_id_out, __size_trigger_id_out);
+	if (useChecksum) checksumCalculator->addBuffer(trigger_id_out, __size_trigger_id_out);
+	stream->readback(buffer_id_out, __size_buffer_id_out);
+	if (useChecksum) checksumCalculator->addBuffer(buffer_id_out, __size_buffer_id_out);
+	stream->readback(buffer_offset_out, __size_buffer_offset_out);
+	if (useChecksum) checksumCalculator->addBuffer(buffer_offset_out, __size_buffer_offset_out);
+	stream->readback(time_out, __size_time_out);
+	if (useChecksum) checksumCalculator->addBuffer(time_out, __size_time_out);
+	stream->readback(result_flags_out, __size_result_flags_out);
+	if (useChecksum) checksumCalculator->addBuffer(result_flags_out, __size_result_flags_out);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_connection_read_performance_counter_completion: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_virt_connection_create_image_enc(void *self , uint64_t* parameters, uint64_t parameter_count)
+{
+	ENCODER_DEBUG_LOG("magma_virt_connection_create_image(parameters:%p, parameter_count:%lu)", parameters, parameter_count);
+	AEMU_SCOPED_TRACE("magma_virt_connection_create_image encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_parameters =  parameter_count * sizeof(uint64_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + __size_parameters + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_virt_connection_create_image;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+	memcpy(ptr, &__size_parameters, 4); ptr += 4;
+	memcpy(ptr, parameters, __size_parameters);ptr += __size_parameters;
+		memcpy(ptr, &parameter_count, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(parameters, __size_parameters);
+	if (useChecksum) checksumCalculator->addBuffer(parameters, __size_parameters);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_virt_connection_create_image: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+magma_status_t magma_virt_connection_get_image_info_enc(void *self , uint64_t* parameters, uint64_t parameter_count)
+{
+	ENCODER_DEBUG_LOG("magma_virt_connection_get_image_info(parameters:%p, parameter_count:%lu)", parameters, parameter_count);
+	AEMU_SCOPED_TRACE("magma_virt_connection_get_image_info encode");
+
+	magma_encoder_context_t *ctx = (magma_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_parameters =  parameter_count * sizeof(uint64_t);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + __size_parameters + 8 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_magma_virt_connection_get_image_info;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+	memcpy(ptr, &__size_parameters, 4); ptr += 4;
+	memcpy(ptr, parameters, __size_parameters);ptr += __size_parameters;
+		memcpy(ptr, &parameter_count, 8); ptr += 8;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(parameters, __size_parameters);
+	if (useChecksum) checksumCalculator->addBuffer(parameters, __size_parameters);
+
+	magma_status_t retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("magma_virt_connection_get_image_info: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+}  // namespace
+
+magma_encoder_context_t::magma_encoder_context_t(IOStream *stream, ChecksumCalculator *checksumCalculator)
+{
+	m_stream = stream;
+	m_checksumCalculator = checksumCalculator;
+
+	this->magma_device_import = &magma_device_import_enc;
+	this->magma_device_release = &magma_device_release_enc;
+	this->magma_device_query = &magma_device_query_enc;
+	this->magma_device_create_connection = &magma_device_create_connection_enc;
+	this->magma_connection_release = &magma_connection_release_enc;
+	this->magma_connection_get_error = &magma_connection_get_error_enc;
+	this->magma_connection_create_context = &magma_connection_create_context_enc;
+	this->magma_connection_release_context = &magma_connection_release_context_enc;
+	this->magma_connection_create_buffer = &magma_connection_create_buffer_enc;
+	this->magma_connection_release_buffer = &magma_connection_release_buffer_enc;
+	this->magma_connection_export_buffer = &magma_connection_export_buffer_enc;
+	this->magma_connection_import_buffer = &magma_connection_import_buffer_enc;
+	this->magma_connection_create_semaphore = &magma_connection_create_semaphore_enc;
+	this->magma_connection_release_semaphore = &magma_connection_release_semaphore_enc;
+	this->magma_connection_export_semaphore = &magma_connection_export_semaphore_enc;
+	this->magma_connection_import_semaphore = &magma_connection_import_semaphore_enc;
+	this->magma_connection_buffer_range_op = &magma_connection_buffer_range_op_enc;
+	this->magma_connection_map_buffer = &magma_connection_map_buffer_enc;
+	this->magma_connection_unmap_buffer = &magma_connection_unmap_buffer_enc;
+	this->magma_connection_execute_command = &magma_connection_execute_command_enc;
+	this->magma_connection_execute_immediate_commands = &magma_connection_execute_immediate_commands_enc;
+	this->magma_connection_flush = &magma_connection_flush_enc;
+	this->magma_connection_get_notification_channel_handle = &magma_connection_get_notification_channel_handle_enc;
+	this->magma_connection_read_notification_channel = &magma_connection_read_notification_channel_enc;
+	this->magma_buffer_get_id = &magma_buffer_get_id_enc;
+	this->magma_buffer_get_size = &magma_buffer_get_size_enc;
+	this->magma_buffer_clean_cache = &magma_buffer_clean_cache_enc;
+	this->magma_buffer_set_cache_policy = &magma_buffer_set_cache_policy_enc;
+	this->magma_buffer_get_cache_policy = &magma_buffer_get_cache_policy_enc;
+	this->magma_buffer_set_name = &magma_buffer_set_name_enc;
+	this->magma_buffer_get_info = &magma_buffer_get_info_enc;
+	this->magma_buffer_get_handle = &magma_buffer_get_handle_enc;
+	this->magma_semaphore_get_id = &magma_semaphore_get_id_enc;
+	this->magma_semaphore_signal = &magma_semaphore_signal_enc;
+	this->magma_semaphore_reset = &magma_semaphore_reset_enc;
+	this->magma_poll = &magma_poll_enc;
+	this->magma_initialize_tracing = &magma_initialize_tracing_enc;
+	this->magma_initialize_logging = &magma_initialize_logging_enc;
+	this->magma_connection_enable_performance_counter_access = &magma_connection_enable_performance_counter_access_enc;
+	this->magma_connection_enable_performance_counters = &magma_connection_enable_performance_counters_enc;
+	this->magma_connection_create_performance_counter_buffer_pool = &magma_connection_create_performance_counter_buffer_pool_enc;
+	this->magma_connection_release_performance_counter_buffer_pool = &magma_connection_release_performance_counter_buffer_pool_enc;
+	this->magma_connection_add_performance_counter_buffer_offsets_to_pool = &magma_connection_add_performance_counter_buffer_offsets_to_pool_enc;
+	this->magma_connection_remove_performance_counter_buffer_from_pool = &magma_connection_remove_performance_counter_buffer_from_pool_enc;
+	this->magma_connection_dump_performance_counters = &magma_connection_dump_performance_counters_enc;
+	this->magma_connection_clear_performance_counters = &magma_connection_clear_performance_counters_enc;
+	this->magma_connection_read_performance_counter_completion = &magma_connection_read_performance_counter_completion_enc;
+	this->magma_virt_connection_create_image = &magma_virt_connection_create_image_enc;
+	this->magma_virt_connection_get_image_info = &magma_virt_connection_get_image_info_enc;
+}
+
diff --git a/system/magma/magma_enc/magma_enc.h b/system/magma/magma_enc/magma_enc.h
new file mode 100644
index 0000000..c4a6df5
--- /dev/null
+++ b/system/magma/magma_enc/magma_enc.h
@@ -0,0 +1,23 @@
+// Generated Code - DO NOT EDIT !!
+// generated by 'emugen'
+
+#ifndef GUARD_magma_encoder_context_t
+#define GUARD_magma_encoder_context_t
+
+#include "IOStream.h"
+#include "ChecksumCalculator.h"
+#include "magma_client_context.h"
+
+
+#include <stdint.h>
+
+struct magma_encoder_context_t : public magma_client_context_t {
+
+	IOStream *m_stream;
+	ChecksumCalculator *m_checksumCalculator;
+
+	magma_encoder_context_t(IOStream *stream, ChecksumCalculator *checksumCalculator);
+	virtual uint64_t lockAndWriteDma(void*, uint32_t) { return 0; }
+};
+
+#endif  // GUARD_magma_encoder_context_t
diff --git a/system/magma/magma_enc/magma_entry.cpp b/system/magma/magma_enc/magma_entry.cpp
new file mode 100644
index 0000000..b099440
--- /dev/null
+++ b/system/magma/magma_enc/magma_entry.cpp
@@ -0,0 +1,358 @@
+// Generated Code - DO NOT EDIT !!
+// generated by 'emugen'
+#include <stdio.h>
+#include <stdlib.h>
+#include "magma_client_context.h"
+
+extern "C" {
+	magma_status_t magma_device_import(magma_handle_t device_channel, magma_device_t* device_out);
+	void magma_device_release(magma_device_t device);
+	magma_status_t magma_device_query(magma_device_t device, uint64_t id, magma_handle_t* result_buffer_out, uint64_t* result_out);
+	magma_status_t magma_device_create_connection(magma_device_t device, magma_connection_t* connection_out);
+	void magma_connection_release(magma_connection_t connection);
+	magma_status_t magma_connection_get_error(magma_connection_t connection);
+	magma_status_t magma_connection_create_context(magma_connection_t connection, uint32_t* context_id_out);
+	void magma_connection_release_context(magma_connection_t connection, uint32_t context_id);
+	magma_status_t magma_connection_create_buffer(magma_connection_t connection, uint64_t size, uint64_t* size_out, magma_buffer_t* buffer_out);
+	void magma_connection_release_buffer(magma_connection_t connection, magma_buffer_t buffer);
+	magma_status_t magma_connection_export_buffer(magma_connection_t connection, magma_buffer_t buffer, magma_handle_t* buffer_handle_out);
+	magma_status_t magma_connection_import_buffer(magma_connection_t connection, magma_handle_t buffer_handle, magma_buffer_t* buffer_out);
+	magma_status_t magma_connection_create_semaphore(magma_connection_t connection, magma_semaphore_t* semaphore_out);
+	void magma_connection_release_semaphore(magma_connection_t connection, magma_semaphore_t semaphore);
+	magma_status_t magma_connection_export_semaphore(magma_connection_t connection, magma_semaphore_t semaphore, magma_handle_t* semaphore_handle_out);
+	magma_status_t magma_connection_import_semaphore(magma_connection_t connection, magma_handle_t semaphore_handle, magma_semaphore_t* semaphore_out);
+	magma_status_t magma_connection_buffer_range_op(magma_connection_t connection, magma_buffer_t buffer, uint32_t options, uint64_t start_offset, uint64_t length);
+	magma_status_t magma_connection_map_buffer(magma_connection_t connection, uint64_t hw_va, magma_buffer_t buffer, uint64_t offset, uint64_t length, uint64_t map_flags);
+	void magma_connection_unmap_buffer(magma_connection_t connection, uint64_t hw_va, magma_buffer_t buffer);
+	magma_status_t magma_connection_execute_command(uint64_t* parameters, uint64_t parameter_count);
+	magma_status_t magma_connection_execute_immediate_commands(uint64_t* parameters, uint64_t parameter_count);
+	magma_status_t magma_connection_flush(magma_connection_t connection);
+	magma_handle_t magma_connection_get_notification_channel_handle(magma_connection_t connection);
+	magma_status_t magma_connection_read_notification_channel(magma_connection_t connection, void* buffer, uint64_t buffer_size, uint64_t* buffer_size_out, magma_bool_t* more_data_out);
+	uint64_t magma_buffer_get_id(magma_buffer_t buffer);
+	uint64_t magma_buffer_get_size(magma_buffer_t buffer);
+	magma_status_t magma_buffer_clean_cache(magma_buffer_t buffer, uint64_t offset, uint64_t size, magma_cache_operation_t operation);
+	magma_status_t magma_buffer_set_cache_policy(magma_buffer_t buffer, magma_cache_policy_t policy);
+	magma_status_t magma_buffer_get_cache_policy(magma_buffer_t buffer, magma_cache_policy_t* cache_policy_out);
+	magma_status_t magma_buffer_set_name(magma_buffer_t buffer, void* name, uint64_t name_size);
+	magma_status_t magma_buffer_get_info(uint64_t* parameters, uint64_t parameter_count);
+	magma_status_t magma_buffer_get_handle(magma_buffer_t buffer, magma_handle_t* handle_out);
+	uint64_t magma_semaphore_get_id(magma_semaphore_t semaphore);
+	void magma_semaphore_signal(magma_semaphore_t semaphore);
+	void magma_semaphore_reset(magma_semaphore_t semaphore);
+	magma_status_t magma_poll(magma_poll_item_t* items, uint32_t count, uint64_t timeout_ns);
+	magma_status_t magma_initialize_tracing(magma_handle_t channel);
+	magma_status_t magma_initialize_logging(magma_handle_t channel);
+	magma_status_t magma_connection_enable_performance_counter_access(magma_connection_t connection, magma_handle_t channel);
+	magma_status_t magma_connection_enable_performance_counters(magma_connection_t connection, uint64_t* counters, uint64_t counters_count);
+	magma_status_t magma_connection_create_performance_counter_buffer_pool(magma_connection_t connection, magma_perf_count_pool_t* pool_id_out, magma_handle_t* notification_handle_out);
+	magma_status_t magma_connection_release_performance_counter_buffer_pool(magma_connection_t connection, magma_perf_count_pool_t pool_id);
+	magma_status_t magma_connection_add_performance_counter_buffer_offsets_to_pool(uint64_t* parameters, uint64_t parameter_count);
+	magma_status_t magma_connection_remove_performance_counter_buffer_from_pool(magma_connection_t connection, magma_perf_count_pool_t pool_id, magma_buffer_t buffer);
+	magma_status_t magma_connection_dump_performance_counters(magma_connection_t connection, magma_perf_count_pool_t pool_id, uint32_t trigger_id);
+	magma_status_t magma_connection_clear_performance_counters(magma_connection_t connection, uint64_t* counters, uint64_t counters_count);
+	magma_status_t magma_connection_read_performance_counter_completion(magma_connection_t connection, magma_perf_count_pool_t pool_id, uint32_t* trigger_id_out, uint64_t* buffer_id_out, uint32_t* buffer_offset_out, uint64_t* time_out, uint32_t* result_flags_out);
+	magma_status_t magma_virt_connection_create_image(uint64_t* parameters, uint64_t parameter_count);
+	magma_status_t magma_virt_connection_get_image_info(uint64_t* parameters, uint64_t parameter_count);
+};
+
+#ifndef GET_CONTEXT
+static magma_client_context_t::CONTEXT_ACCESSOR_TYPE *getCurrentContext = NULL;
+void magma_client_context_t::setContextAccessor(CONTEXT_ACCESSOR_TYPE *f) { getCurrentContext = f; }
+#define GET_CONTEXT magma_client_context_t * ctx = getCurrentContext()
+#endif
+
+magma_status_t magma_device_import(magma_handle_t device_channel, magma_device_t* device_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_device_import(ctx, device_channel, device_out);
+}
+
+void magma_device_release(magma_device_t device)
+{
+	GET_CONTEXT;
+	ctx->magma_device_release(ctx, device);
+}
+
+magma_status_t magma_device_query(magma_device_t device, uint64_t id, magma_handle_t* result_buffer_out, uint64_t* result_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_device_query(ctx, device, id, result_buffer_out, result_out);
+}
+
+magma_status_t magma_device_create_connection(magma_device_t device, magma_connection_t* connection_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_device_create_connection(ctx, device, connection_out);
+}
+
+void magma_connection_release(magma_connection_t connection)
+{
+	GET_CONTEXT;
+	ctx->magma_connection_release(ctx, connection);
+}
+
+magma_status_t magma_connection_get_error(magma_connection_t connection)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_get_error(ctx, connection);
+}
+
+magma_status_t magma_connection_create_context(magma_connection_t connection, uint32_t* context_id_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_create_context(ctx, connection, context_id_out);
+}
+
+void magma_connection_release_context(magma_connection_t connection, uint32_t context_id)
+{
+	GET_CONTEXT;
+	ctx->magma_connection_release_context(ctx, connection, context_id);
+}
+
+magma_status_t magma_connection_create_buffer(magma_connection_t connection, uint64_t size, uint64_t* size_out, magma_buffer_t* buffer_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_create_buffer(ctx, connection, size, size_out, buffer_out);
+}
+
+void magma_connection_release_buffer(magma_connection_t connection, magma_buffer_t buffer)
+{
+	GET_CONTEXT;
+	ctx->magma_connection_release_buffer(ctx, connection, buffer);
+}
+
+magma_status_t magma_connection_export_buffer(magma_connection_t connection, magma_buffer_t buffer, magma_handle_t* buffer_handle_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_export_buffer(ctx, connection, buffer, buffer_handle_out);
+}
+
+magma_status_t magma_connection_import_buffer(magma_connection_t connection, magma_handle_t buffer_handle, magma_buffer_t* buffer_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_import_buffer(ctx, connection, buffer_handle, buffer_out);
+}
+
+magma_status_t magma_connection_create_semaphore(magma_connection_t connection, magma_semaphore_t* semaphore_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_create_semaphore(ctx, connection, semaphore_out);
+}
+
+void magma_connection_release_semaphore(magma_connection_t connection, magma_semaphore_t semaphore)
+{
+	GET_CONTEXT;
+	ctx->magma_connection_release_semaphore(ctx, connection, semaphore);
+}
+
+magma_status_t magma_connection_export_semaphore(magma_connection_t connection, magma_semaphore_t semaphore, magma_handle_t* semaphore_handle_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_export_semaphore(ctx, connection, semaphore, semaphore_handle_out);
+}
+
+magma_status_t magma_connection_import_semaphore(magma_connection_t connection, magma_handle_t semaphore_handle, magma_semaphore_t* semaphore_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_import_semaphore(ctx, connection, semaphore_handle, semaphore_out);
+}
+
+magma_status_t magma_connection_buffer_range_op(magma_connection_t connection, magma_buffer_t buffer, uint32_t options, uint64_t start_offset, uint64_t length)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_buffer_range_op(ctx, connection, buffer, options, start_offset, length);
+}
+
+magma_status_t magma_connection_map_buffer(magma_connection_t connection, uint64_t hw_va, magma_buffer_t buffer, uint64_t offset, uint64_t length, uint64_t map_flags)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_map_buffer(ctx, connection, hw_va, buffer, offset, length, map_flags);
+}
+
+void magma_connection_unmap_buffer(magma_connection_t connection, uint64_t hw_va, magma_buffer_t buffer)
+{
+	GET_CONTEXT;
+	ctx->magma_connection_unmap_buffer(ctx, connection, hw_va, buffer);
+}
+
+magma_status_t magma_connection_execute_command(uint64_t* parameters, uint64_t parameter_count)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_execute_command(ctx, parameters, parameter_count);
+}
+
+magma_status_t magma_connection_execute_immediate_commands(uint64_t* parameters, uint64_t parameter_count)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_execute_immediate_commands(ctx, parameters, parameter_count);
+}
+
+magma_status_t magma_connection_flush(magma_connection_t connection)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_flush(ctx, connection);
+}
+
+magma_handle_t magma_connection_get_notification_channel_handle(magma_connection_t connection)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_get_notification_channel_handle(ctx, connection);
+}
+
+magma_status_t magma_connection_read_notification_channel(magma_connection_t connection, void* buffer, uint64_t buffer_size, uint64_t* buffer_size_out, magma_bool_t* more_data_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_read_notification_channel(ctx, connection, buffer, buffer_size, buffer_size_out, more_data_out);
+}
+
+uint64_t magma_buffer_get_id(magma_buffer_t buffer)
+{
+	GET_CONTEXT;
+	return ctx->magma_buffer_get_id(ctx, buffer);
+}
+
+uint64_t magma_buffer_get_size(magma_buffer_t buffer)
+{
+	GET_CONTEXT;
+	return ctx->magma_buffer_get_size(ctx, buffer);
+}
+
+magma_status_t magma_buffer_clean_cache(magma_buffer_t buffer, uint64_t offset, uint64_t size, magma_cache_operation_t operation)
+{
+	GET_CONTEXT;
+	return ctx->magma_buffer_clean_cache(ctx, buffer, offset, size, operation);
+}
+
+magma_status_t magma_buffer_set_cache_policy(magma_buffer_t buffer, magma_cache_policy_t policy)
+{
+	GET_CONTEXT;
+	return ctx->magma_buffer_set_cache_policy(ctx, buffer, policy);
+}
+
+magma_status_t magma_buffer_get_cache_policy(magma_buffer_t buffer, magma_cache_policy_t* cache_policy_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_buffer_get_cache_policy(ctx, buffer, cache_policy_out);
+}
+
+magma_status_t magma_buffer_set_name(magma_buffer_t buffer, void* name, uint64_t name_size)
+{
+	GET_CONTEXT;
+	return ctx->magma_buffer_set_name(ctx, buffer, name, name_size);
+}
+
+magma_status_t magma_buffer_get_info(uint64_t* parameters, uint64_t parameter_count)
+{
+	GET_CONTEXT;
+	return ctx->magma_buffer_get_info(ctx, parameters, parameter_count);
+}
+
+magma_status_t magma_buffer_get_handle(magma_buffer_t buffer, magma_handle_t* handle_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_buffer_get_handle(ctx, buffer, handle_out);
+}
+
+uint64_t magma_semaphore_get_id(magma_semaphore_t semaphore)
+{
+	GET_CONTEXT;
+	return ctx->magma_semaphore_get_id(ctx, semaphore);
+}
+
+void magma_semaphore_signal(magma_semaphore_t semaphore)
+{
+	GET_CONTEXT;
+	ctx->magma_semaphore_signal(ctx, semaphore);
+}
+
+void magma_semaphore_reset(magma_semaphore_t semaphore)
+{
+	GET_CONTEXT;
+	ctx->magma_semaphore_reset(ctx, semaphore);
+}
+
+magma_status_t magma_poll(magma_poll_item_t* items, uint32_t count, uint64_t timeout_ns)
+{
+	GET_CONTEXT;
+	return ctx->magma_poll(ctx, items, count, timeout_ns);
+}
+
+magma_status_t magma_initialize_tracing(magma_handle_t channel)
+{
+	GET_CONTEXT;
+	return ctx->magma_initialize_tracing(ctx, channel);
+}
+
+magma_status_t magma_initialize_logging(magma_handle_t channel)
+{
+	GET_CONTEXT;
+	return ctx->magma_initialize_logging(ctx, channel);
+}
+
+magma_status_t magma_connection_enable_performance_counter_access(magma_connection_t connection, magma_handle_t channel)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_enable_performance_counter_access(ctx, connection, channel);
+}
+
+magma_status_t magma_connection_enable_performance_counters(magma_connection_t connection, uint64_t* counters, uint64_t counters_count)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_enable_performance_counters(ctx, connection, counters, counters_count);
+}
+
+magma_status_t magma_connection_create_performance_counter_buffer_pool(magma_connection_t connection, magma_perf_count_pool_t* pool_id_out, magma_handle_t* notification_handle_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_create_performance_counter_buffer_pool(ctx, connection, pool_id_out, notification_handle_out);
+}
+
+magma_status_t magma_connection_release_performance_counter_buffer_pool(magma_connection_t connection, magma_perf_count_pool_t pool_id)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_release_performance_counter_buffer_pool(ctx, connection, pool_id);
+}
+
+magma_status_t magma_connection_add_performance_counter_buffer_offsets_to_pool(uint64_t* parameters, uint64_t parameter_count)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_add_performance_counter_buffer_offsets_to_pool(ctx, parameters, parameter_count);
+}
+
+magma_status_t magma_connection_remove_performance_counter_buffer_from_pool(magma_connection_t connection, magma_perf_count_pool_t pool_id, magma_buffer_t buffer)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_remove_performance_counter_buffer_from_pool(ctx, connection, pool_id, buffer);
+}
+
+magma_status_t magma_connection_dump_performance_counters(magma_connection_t connection, magma_perf_count_pool_t pool_id, uint32_t trigger_id)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_dump_performance_counters(ctx, connection, pool_id, trigger_id);
+}
+
+magma_status_t magma_connection_clear_performance_counters(magma_connection_t connection, uint64_t* counters, uint64_t counters_count)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_clear_performance_counters(ctx, connection, counters, counters_count);
+}
+
+magma_status_t magma_connection_read_performance_counter_completion(magma_connection_t connection, magma_perf_count_pool_t pool_id, uint32_t* trigger_id_out, uint64_t* buffer_id_out, uint32_t* buffer_offset_out, uint64_t* time_out, uint32_t* result_flags_out)
+{
+	GET_CONTEXT;
+	return ctx->magma_connection_read_performance_counter_completion(ctx, connection, pool_id, trigger_id_out, buffer_id_out, buffer_offset_out, time_out, result_flags_out);
+}
+
+magma_status_t magma_virt_connection_create_image(uint64_t* parameters, uint64_t parameter_count)
+{
+	GET_CONTEXT;
+	return ctx->magma_virt_connection_create_image(ctx, parameters, parameter_count);
+}
+
+magma_status_t magma_virt_connection_get_image_info(uint64_t* parameters, uint64_t parameter_count)
+{
+	GET_CONTEXT;
+	return ctx->magma_virt_connection_get_image_info(ctx, parameters, parameter_count);
+}
+
diff --git a/system/magma/magma_enc/magma_ftable.h b/system/magma/magma_enc/magma_ftable.h
new file mode 100644
index 0000000..34cc962
--- /dev/null
+++ b/system/magma/magma_enc/magma_ftable.h
@@ -0,0 +1,64 @@
+// Generated Code - DO NOT EDIT !!
+// generated by 'emugen'
+#ifndef __magma_client_ftable_t_h
+#define __magma_client_ftable_t_h
+
+
+static const struct _magma_funcs_by_name {
+	const char *name;
+	void *proc;
+} magma_funcs_by_name[] = {
+	{"magma_device_import", (void*)magma_device_import},
+	{"magma_device_release", (void*)magma_device_release},
+	{"magma_device_query", (void*)magma_device_query},
+	{"magma_device_create_connection", (void*)magma_device_create_connection},
+	{"magma_connection_release", (void*)magma_connection_release},
+	{"magma_connection_get_error", (void*)magma_connection_get_error},
+	{"magma_connection_create_context", (void*)magma_connection_create_context},
+	{"magma_connection_release_context", (void*)magma_connection_release_context},
+	{"magma_connection_create_buffer", (void*)magma_connection_create_buffer},
+	{"magma_connection_release_buffer", (void*)magma_connection_release_buffer},
+	{"magma_connection_export_buffer", (void*)magma_connection_export_buffer},
+	{"magma_connection_import_buffer", (void*)magma_connection_import_buffer},
+	{"magma_connection_create_semaphore", (void*)magma_connection_create_semaphore},
+	{"magma_connection_release_semaphore", (void*)magma_connection_release_semaphore},
+	{"magma_connection_export_semaphore", (void*)magma_connection_export_semaphore},
+	{"magma_connection_import_semaphore", (void*)magma_connection_import_semaphore},
+	{"magma_connection_buffer_range_op", (void*)magma_connection_buffer_range_op},
+	{"magma_connection_map_buffer", (void*)magma_connection_map_buffer},
+	{"magma_connection_unmap_buffer", (void*)magma_connection_unmap_buffer},
+	{"magma_connection_execute_command", (void*)magma_connection_execute_command},
+	{"magma_connection_execute_immediate_commands", (void*)magma_connection_execute_immediate_commands},
+	{"magma_connection_flush", (void*)magma_connection_flush},
+	{"magma_connection_get_notification_channel_handle", (void*)magma_connection_get_notification_channel_handle},
+	{"magma_connection_read_notification_channel", (void*)magma_connection_read_notification_channel},
+	{"magma_buffer_get_id", (void*)magma_buffer_get_id},
+	{"magma_buffer_get_size", (void*)magma_buffer_get_size},
+	{"magma_buffer_clean_cache", (void*)magma_buffer_clean_cache},
+	{"magma_buffer_set_cache_policy", (void*)magma_buffer_set_cache_policy},
+	{"magma_buffer_get_cache_policy", (void*)magma_buffer_get_cache_policy},
+	{"magma_buffer_set_name", (void*)magma_buffer_set_name},
+	{"magma_buffer_get_info", (void*)magma_buffer_get_info},
+	{"magma_buffer_get_handle", (void*)magma_buffer_get_handle},
+	{"magma_semaphore_get_id", (void*)magma_semaphore_get_id},
+	{"magma_semaphore_signal", (void*)magma_semaphore_signal},
+	{"magma_semaphore_reset", (void*)magma_semaphore_reset},
+	{"magma_poll", (void*)magma_poll},
+	{"magma_initialize_tracing", (void*)magma_initialize_tracing},
+	{"magma_initialize_logging", (void*)magma_initialize_logging},
+	{"magma_connection_enable_performance_counter_access", (void*)magma_connection_enable_performance_counter_access},
+	{"magma_connection_enable_performance_counters", (void*)magma_connection_enable_performance_counters},
+	{"magma_connection_create_performance_counter_buffer_pool", (void*)magma_connection_create_performance_counter_buffer_pool},
+	{"magma_connection_release_performance_counter_buffer_pool", (void*)magma_connection_release_performance_counter_buffer_pool},
+	{"magma_connection_add_performance_counter_buffer_offsets_to_pool", (void*)magma_connection_add_performance_counter_buffer_offsets_to_pool},
+	{"magma_connection_remove_performance_counter_buffer_from_pool", (void*)magma_connection_remove_performance_counter_buffer_from_pool},
+	{"magma_connection_dump_performance_counters", (void*)magma_connection_dump_performance_counters},
+	{"magma_connection_clear_performance_counters", (void*)magma_connection_clear_performance_counters},
+	{"magma_connection_read_performance_counter_completion", (void*)magma_connection_read_performance_counter_completion},
+	{"magma_virt_connection_create_image", (void*)magma_virt_connection_create_image},
+	{"magma_virt_connection_get_image_info", (void*)magma_virt_connection_get_image_info},
+};
+static const int magma_num_funcs = sizeof(magma_funcs_by_name) / sizeof(struct _magma_funcs_by_name);
+
+
+#endif
diff --git a/system/magma/magma_enc/magma_opcodes.h b/system/magma/magma_enc/magma_opcodes.h
new file mode 100644
index 0000000..8b2d2a2
--- /dev/null
+++ b/system/magma/magma_enc/magma_opcodes.h
@@ -0,0 +1,58 @@
+// Generated Code - DO NOT EDIT !!
+// generated by 'emugen'
+#ifndef __GUARD_magma_opcodes_h_
+#define __GUARD_magma_opcodes_h_
+
+#define OP_magma_device_import 					100000
+#define OP_magma_device_release 					100001
+#define OP_magma_device_query 					100002
+#define OP_magma_device_create_connection 					100003
+#define OP_magma_connection_release 					100004
+#define OP_magma_connection_get_error 					100005
+#define OP_magma_connection_create_context 					100006
+#define OP_magma_connection_release_context 					100007
+#define OP_magma_connection_create_buffer 					100008
+#define OP_magma_connection_release_buffer 					100009
+#define OP_magma_connection_export_buffer 					100010
+#define OP_magma_connection_import_buffer 					100011
+#define OP_magma_connection_create_semaphore 					100012
+#define OP_magma_connection_release_semaphore 					100013
+#define OP_magma_connection_export_semaphore 					100014
+#define OP_magma_connection_import_semaphore 					100015
+#define OP_magma_connection_buffer_range_op 					100016
+#define OP_magma_connection_map_buffer 					100017
+#define OP_magma_connection_unmap_buffer 					100018
+#define OP_magma_connection_execute_command 					100019
+#define OP_magma_connection_execute_immediate_commands 					100020
+#define OP_magma_connection_flush 					100021
+#define OP_magma_connection_get_notification_channel_handle 					100022
+#define OP_magma_connection_read_notification_channel 					100023
+#define OP_magma_buffer_get_id 					100024
+#define OP_magma_buffer_get_size 					100025
+#define OP_magma_buffer_clean_cache 					100026
+#define OP_magma_buffer_set_cache_policy 					100027
+#define OP_magma_buffer_get_cache_policy 					100028
+#define OP_magma_buffer_set_name 					100029
+#define OP_magma_buffer_get_info 					100030
+#define OP_magma_buffer_get_handle 					100031
+#define OP_magma_semaphore_get_id 					100032
+#define OP_magma_semaphore_signal 					100033
+#define OP_magma_semaphore_reset 					100034
+#define OP_magma_poll 					100035
+#define OP_magma_initialize_tracing 					100036
+#define OP_magma_initialize_logging 					100037
+#define OP_magma_connection_enable_performance_counter_access 					100038
+#define OP_magma_connection_enable_performance_counters 					100039
+#define OP_magma_connection_create_performance_counter_buffer_pool 					100040
+#define OP_magma_connection_release_performance_counter_buffer_pool 					100041
+#define OP_magma_connection_add_performance_counter_buffer_offsets_to_pool 					100042
+#define OP_magma_connection_remove_performance_counter_buffer_from_pool 					100043
+#define OP_magma_connection_dump_performance_counters 					100044
+#define OP_magma_connection_clear_performance_counters 					100045
+#define OP_magma_connection_read_performance_counter_completion 					100046
+#define OP_magma_virt_connection_create_image 					100047
+#define OP_magma_virt_connection_get_image_info 					100048
+#define OP_last 					100049
+
+
+#endif
diff --git a/system/magma/magma_enc_util.cpp b/system/magma/magma_enc_util.cpp
new file mode 100644
index 0000000..2980625
--- /dev/null
+++ b/system/magma/magma_enc_util.cpp
@@ -0,0 +1,58 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// 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 "magma_enc_util.h"
+
+#include <cstring>
+
+namespace magma_enc_util {
+
+size_t size_command_descriptor(magma_command_descriptor* descriptor) {
+    uint64_t size = sizeof(magma_command_descriptor);
+    size += sizeof(magma_exec_resource) * descriptor->resource_count;
+    size += sizeof(magma_exec_command_buffer) * descriptor->command_buffer_count;
+    size +=
+        sizeof(uint64_t) * (descriptor->wait_semaphore_count + descriptor->signal_semaphore_count);
+    return size;
+}
+
+void pack_command_descriptor(void* void_ptr, magma_connection_t connection, uint32_t context_id,
+                             magma_command_descriptor* descriptor) {
+    magma_exec_resource* resources = descriptor->resources;
+    magma_exec_command_buffer* command_buffers = descriptor->command_buffers;
+    uint64_t* semaphore_ids = descriptor->semaphore_ids;
+
+    magma_command_descriptor desc_copy = *descriptor;
+    desc_copy.resources = 0;
+    desc_copy.command_buffers = 0;
+    desc_copy.semaphore_ids = 0;
+
+    auto ptr = reinterpret_cast<uint8_t*>(void_ptr);
+
+    memcpy(ptr, &desc_copy, sizeof(magma_command_descriptor));
+    ptr += sizeof(magma_command_descriptor);
+
+    memcpy(ptr, resources, sizeof(magma_exec_resource) * descriptor->resource_count);
+    ptr += sizeof(magma_exec_resource) * descriptor->resource_count;
+
+    memcpy(ptr, command_buffers,
+           sizeof(magma_exec_command_buffer) * descriptor->command_buffer_count);
+    ptr += sizeof(magma_exec_command_buffer) * descriptor->command_buffer_count;
+
+    memcpy(
+        ptr, semaphore_ids,
+        sizeof(uint64_t) * (descriptor->wait_semaphore_count + descriptor->signal_semaphore_count));
+}
+
+}  // namespace magma_enc_util
diff --git a/system/magma/magma_enc_util.h b/system/magma/magma_enc_util.h
new file mode 100644
index 0000000..8d67a10
--- /dev/null
+++ b/system/magma/magma_enc_util.h
@@ -0,0 +1,27 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// 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.
+
+#pragma once
+
+#include <log/log.h>
+#include <magma/magma_common_defs.h>
+#include <stddef.h>
+
+namespace magma_enc_util {
+
+size_t size_command_descriptor(magma_command_descriptor* descriptor);
+void pack_command_descriptor(void* ptr, magma_connection_t connection, uint32_t context_id,
+                             magma_command_descriptor* descriptor);
+
+}  // namespace magma_enc_util
diff --git a/system/magma/magma_types.h b/system/magma/magma_types.h
new file mode 100644
index 0000000..9b13cce
--- /dev/null
+++ b/system/magma/magma_types.h
@@ -0,0 +1,15 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// 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 <magma/magma_common_defs.h>
diff --git a/system/magma/meson.build b/system/magma/meson.build
new file mode 100644
index 0000000..2c9681e
--- /dev/null
+++ b/system/magma/meson.build
@@ -0,0 +1,40 @@
+# Copyright 2023 Android Open Source Project
+# SPDX-License-Identifier: MIT
+
+files_lib_magma_enc = files(
+    'magma.cpp',
+    'magma_enc_util.cpp',
+    'magma_enc/magma_enc.cpp',
+    'magma_enc/magma_entry.cpp',
+    'magma_enc/magma_client_context.cpp',
+  )
+
+inc_magma_enc = include_directories('magma_enc')
+
+lib_magma_enc = static_library(
+   'magma',
+   files_lib_magma_enc,
+   cpp_args: cpp_args + [
+      '-Wno-misleading-indentation',
+      '-Wno-unused-function',
+   ],
+   include_directories: [inc_magma, inc_magma_enc, inc_android_emu, inc_host, inc_android_compat,
+                         inc_opengl_codec, inc_opengl_system, inc_render_enc, inc_system,
+                         inc_goldfish_address_space, inc_platform],
+   link_with: [
+      lib_platform,
+      lib_stream, # for ASG
+      lib_codec_common, # for checksums
+      lib_emu_android_base, # for tracing
+      lib_android_compat # for logging
+   ],
+   dependencies: [
+    fuchsia_magma_dep,
+    dependency('libdrm')
+   ],
+)
+
+lib_magma_gfxstream_dep = declare_dependency(
+   include_directories: [inc_magma, inc_magma_enc],
+   link_with: [lib_magma_enc],
+)
diff --git a/system/meson.build b/system/meson.build
index 53ab876..af8f8e9 100644
--- a/system/meson.build
+++ b/system/meson.build
@@ -1,6 +1,7 @@
 # Copyright 2022 Android Open Source Project
 # SPDX-License-Identifier: MIT
 
+inc_magma = include_directories('magma')
 inc_opengl_system = include_directories('OpenglSystemCommon')
 inc_render_enc = include_directories('renderControl_enc')
 inc_vulkan_enc = include_directories('vulkan_enc')
@@ -9,3 +10,4 @@
 subdir('renderControl_enc')
 subdir('OpenglSystemCommon')
 subdir('vulkan')
+subdir('magma')
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index ccdccfd..6f70fb0 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -16,7 +16,7 @@
 // Autogenerated module VkEncoder
 //
 // (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
-// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -58353,204 +58353,6 @@
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-VkResult VkEncoder::vkRegisterImageColorBufferGOOGLE(VkDevice device, VkImage image,
-                                                     uint32_t colorBuffer, uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkRegisterImageColorBufferGOOGLE in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG("vkRegisterImageColorBufferGOOGLE(device:%p, image:%p, colorBuffer:%d)",
-                      device, image, colorBuffer);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkImage local_image;
-    uint32_t local_colorBuffer;
-    local_device = device;
-    local_image = image;
-    local_colorBuffer = colorBuffer;
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_1;
-        *countPtr += 1 * 8;
-        *countPtr += sizeof(uint32_t);
-    }
-    uint32_t packetSize_vkRegisterImageColorBufferGOOGLE =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize =
-        std::make_optional(packetSize_vkRegisterImageColorBufferGOOGLE);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterImageColorBufferGOOGLE);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkRegisterImageColorBufferGOOGLE = OP_vkRegisterImageColorBufferGOOGLE;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    memcpy(*streamPtrPtr, (uint32_t*)&local_colorBuffer, sizeof(uint32_t));
-    *streamPtrPtr += sizeof(uint32_t);
-    if (watchdog) {
-        size_t watchdogBufSize = std::min<size_t>(
-            static_cast<size_t>(packetSize_vkRegisterImageColorBufferGOOGLE), kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    stream->read(&vkRegisterImageColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkRegisterImageColorBufferGOOGLE_VkResult_return;
-}
-
-VkResult VkEncoder::vkRegisterBufferColorBufferGOOGLE(VkDevice device, VkBuffer buffer,
-                                                      uint32_t colorBuffer, uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkRegisterBufferColorBufferGOOGLE in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG("vkRegisterBufferColorBufferGOOGLE(device:%p, buffer:%p, colorBuffer:%d)",
-                      device, buffer, colorBuffer);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkBuffer local_buffer;
-    uint32_t local_colorBuffer;
-    local_device = device;
-    local_buffer = buffer;
-    local_colorBuffer = colorBuffer;
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_1;
-        *countPtr += 1 * 8;
-        *countPtr += sizeof(uint32_t);
-    }
-    uint32_t packetSize_vkRegisterBufferColorBufferGOOGLE =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize =
-        std::make_optional(packetSize_vkRegisterBufferColorBufferGOOGLE);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterBufferColorBufferGOOGLE);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkRegisterBufferColorBufferGOOGLE = OP_vkRegisterBufferColorBufferGOOGLE;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkBuffer((*&local_buffer));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    memcpy(*streamPtrPtr, (uint32_t*)&local_colorBuffer, sizeof(uint32_t));
-    *streamPtrPtr += sizeof(uint32_t);
-    if (watchdog) {
-        size_t watchdogBufSize = std::min<size_t>(
-            static_cast<size_t>(packetSize_vkRegisterBufferColorBufferGOOGLE), kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    stream->read(&vkRegisterBufferColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
-}
-
 VkResult VkEncoder::vkMapMemoryIntoAddressSpaceGOOGLE(VkDevice device, VkDeviceMemory memory,
                                                       uint64_t* pAddress, uint32_t doLock) {
     std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index 46878e2..e5a66db 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -16,7 +16,7 @@
 // Autogenerated module VkEncoder
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -1963,10 +1963,6 @@
                                      const VkBool32* pColorWriteEnables, uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_gfxstream
-    VkResult vkRegisterImageColorBufferGOOGLE(VkDevice device, VkImage image, uint32_t colorBuffer,
-                                              uint32_t doLock);
-    VkResult vkRegisterBufferColorBufferGOOGLE(VkDevice device, VkBuffer buffer,
-                                               uint32_t colorBuffer, uint32_t doLock);
     VkResult vkMapMemoryIntoAddressSpaceGOOGLE(VkDevice device, VkDeviceMemory memory,
                                                uint64_t* pAddress, uint32_t doLock);
     void vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
diff --git a/system/vulkan_enc/func_table.cpp b/system/vulkan_enc/func_table.cpp
index af9f673..7b5a27c 100644
--- a/system/vulkan_enc/func_table.cpp
+++ b/system/vulkan_enc/func_table.cpp
@@ -16,7 +16,7 @@
 // Autogenerated module func_table
 //
 // (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
-// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -8128,51 +8128,6 @@
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-static VkResult entry_vkRegisterImageColorBufferGOOGLE(VkDevice device, VkImage image,
-                                                       uint32_t colorBuffer) {
-    AEMU_SCOPED_TRACE("vkRegisterImageColorBufferGOOGLE");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterImageColorBufferGOOGLE_VkResult_return =
-        vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer, true /* do lock */);
-    return vkRegisterImageColorBufferGOOGLE_VkResult_return;
-}
-static VkResult dynCheck_entry_vkRegisterImageColorBufferGOOGLE(VkDevice device, VkImage image,
-                                                                uint32_t colorBuffer) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream")) {
-        sOnInvalidDynamicallyCheckedCall("vkRegisterImageColorBufferGOOGLE", "VK_GOOGLE_gfxstream");
-    }
-    AEMU_SCOPED_TRACE("vkRegisterImageColorBufferGOOGLE");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterImageColorBufferGOOGLE_VkResult_return =
-        vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer, true /* do lock */);
-    return vkRegisterImageColorBufferGOOGLE_VkResult_return;
-}
-static VkResult entry_vkRegisterBufferColorBufferGOOGLE(VkDevice device, VkBuffer buffer,
-                                                        uint32_t colorBuffer) {
-    AEMU_SCOPED_TRACE("vkRegisterBufferColorBufferGOOGLE");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterBufferColorBufferGOOGLE_VkResult_return =
-        vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer, true /* do lock */);
-    return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
-}
-static VkResult dynCheck_entry_vkRegisterBufferColorBufferGOOGLE(VkDevice device, VkBuffer buffer,
-                                                                 uint32_t colorBuffer) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream")) {
-        sOnInvalidDynamicallyCheckedCall("vkRegisterBufferColorBufferGOOGLE",
-                                         "VK_GOOGLE_gfxstream");
-    }
-    AEMU_SCOPED_TRACE("vkRegisterBufferColorBufferGOOGLE");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterBufferColorBufferGOOGLE_VkResult_return =
-        vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer, true /* do lock */);
-    return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
-}
 static VkResult entry_vkMapMemoryIntoAddressSpaceGOOGLE(VkDevice device, VkDeviceMemory memory,
                                                         uint64_t* pAddress) {
     AEMU_SCOPED_TRACE("vkMapMemoryIntoAddressSpaceGOOGLE");
@@ -10819,12 +10774,6 @@
     }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-    if (!strcmp(name, "vkRegisterImageColorBufferGOOGLE")) {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkRegisterBufferColorBufferGOOGLE")) {
-        return nullptr;
-    }
     if (!strcmp(name, "vkMapMemoryIntoAddressSpaceGOOGLE")) {
         return nullptr;
     }
@@ -13006,14 +12955,6 @@
     }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-    if (!strcmp(name, "vkRegisterImageColorBufferGOOGLE")) {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
-        return hasExt ? (void*)dynCheck_entry_vkRegisterImageColorBufferGOOGLE : nullptr;
-    }
-    if (!strcmp(name, "vkRegisterBufferColorBufferGOOGLE")) {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
-        return hasExt ? (void*)dynCheck_entry_vkRegisterBufferColorBufferGOOGLE : nullptr;
-    }
     if (!strcmp(name, "vkMapMemoryIntoAddressSpaceGOOGLE")) {
         bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
         return hasExt ? (void*)dynCheck_entry_vkMapMemoryIntoAddressSpaceGOOGLE : nullptr;
@@ -15260,14 +15201,6 @@
     }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-    if (!strcmp(name, "vkRegisterImageColorBufferGOOGLE")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
-        return hasExt ? (void*)entry_vkRegisterImageColorBufferGOOGLE : nullptr;
-    }
-    if (!strcmp(name, "vkRegisterBufferColorBufferGOOGLE")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
-        return hasExt ? (void*)entry_vkRegisterBufferColorBufferGOOGLE : nullptr;
-    }
     if (!strcmp(name, "vkMapMemoryIntoAddressSpaceGOOGLE")) {
         bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
         return hasExt ? (void*)entry_vkMapMemoryIntoAddressSpaceGOOGLE : nullptr;
diff --git a/system/vulkan_enc/func_table.h b/system/vulkan_enc/func_table.h
index bda48a8..a7b7b66 100644
--- a/system/vulkan_enc/func_table.h
+++ b/system/vulkan_enc/func_table.h
@@ -16,7 +16,7 @@
 // Autogenerated module func_table
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.cpp b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
index f359126..2a023a7 100644
--- a/system/vulkan_enc/goldfish_vk_counting_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_counting_guest
 //
 // (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
-// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -13755,25 +13755,6 @@
     *count += sizeof(uint32_t);
 }
 
-void count_VkImportPhysicalAddressGOOGLE(uint32_t featureBits, VkStructureType rootType,
-                                         const VkImportPhysicalAddressGOOGLE* toCount,
-                                         size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += sizeof(uint64_t);
-    *count += sizeof(VkDeviceSize);
-    *count += sizeof(VkFormat);
-    *count += sizeof(VkImageTiling);
-    *count += sizeof(uint32_t);
-}
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void count_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
@@ -16480,13 +16461,6 @@
                         count);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
-                    count_VkImportPhysicalAddressGOOGLE(
-                        featureBits, rootType,
-                        reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension),
-                        count);
-                    break;
-                }
                 default: {
                     count_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
                         featureBits, rootType,
@@ -17284,12 +17258,6 @@
                 reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), count);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            count_VkImportPhysicalAddressGOOGLE(
-                featureBits, rootType,
-                reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), count);
-            break;
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.h b/system/vulkan_enc/goldfish_vk_counting_guest.h
index 6e959ad..2e29028 100644
--- a/system/vulkan_enc/goldfish_vk_counting_guest.h
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.h
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_counting_guest
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -3415,10 +3415,6 @@
 void count_VkImportBufferGOOGLE(uint32_t featureBits, VkStructureType rootType,
                                 const VkImportBufferGOOGLE* toCount, size_t* count);
 
-void count_VkImportPhysicalAddressGOOGLE(uint32_t featureBits, VkStructureType rootType,
-                                         const VkImportPhysicalAddressGOOGLE* toCount,
-                                         size_t* count);
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void count_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
index c88a3cf..8d30be3 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_deepcopy_guest
 //
 // (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
-// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -17024,28 +17024,6 @@
     }
 }
 
-void deepcopy_VkImportPhysicalAddressGOOGLE(Allocator* alloc, VkStructureType rootType,
-                                            const VkImportPhysicalAddressGOOGLE* from,
-                                            VkImportPhysicalAddressGOOGLE* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-}
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void deepcopy_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
@@ -20054,13 +20032,6 @@
                             structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
-                    deepcopy_VkImportPhysicalAddressGOOGLE(
-                        alloc, rootType,
-                        reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension),
-                        reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
-                    break;
-                }
                 default: {
                     deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
                         alloc, rootType,
@@ -20920,13 +20891,6 @@
                 reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            deepcopy_VkImportPhysicalAddressGOOGLE(
-                alloc, rootType,
-                reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension),
-                reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
-            break;
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.h b/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
index 2c59e5b..679ddf0 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_deepcopy_guest
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -3774,10 +3774,6 @@
 void deepcopy_VkImportBufferGOOGLE(Allocator* alloc, VkStructureType rootType,
                                    const VkImportBufferGOOGLE* from, VkImportBufferGOOGLE* to);
 
-void deepcopy_VkImportPhysicalAddressGOOGLE(Allocator* alloc, VkStructureType rootType,
-                                            const VkImportPhysicalAddressGOOGLE* from,
-                                            VkImportPhysicalAddressGOOGLE* to);
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void deepcopy_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
diff --git a/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp b/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
index d2c499f..aef23e9 100644
--- a/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_extension_structs_guest
 //
 // (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
-// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -1553,10 +1553,6 @@
                     return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
-                    return sizeof(VkImportPhysicalAddressGOOGLE);
-                    break;
-                }
                 default: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
                     break;
@@ -1943,9 +1939,6 @@
         case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
             return sizeof(VkImportBufferGOOGLE);
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            return sizeof(VkImportPhysicalAddressGOOGLE);
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
@@ -2985,10 +2978,6 @@
                     return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
-                    return sizeof(VkImportPhysicalAddressGOOGLE);
-                    break;
-                }
                 default: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
                     break;
@@ -3375,9 +3364,6 @@
         case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
             return sizeof(VkImportBufferGOOGLE);
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            return sizeof(VkImportPhysicalAddressGOOGLE);
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
diff --git a/system/vulkan_enc/goldfish_vk_extension_structs_guest.h b/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
index ae0e5df..67d83d7 100644
--- a/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
+++ b/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_extension_structs_guest
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
index 2759863..21eee10 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_handlemap_guest
 //
 // (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
-// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -7794,15 +7794,6 @@
     }
 }
 
-void handlemap_VkImportPhysicalAddressGOOGLE(VulkanHandleMapping* handlemap,
-                                             VkImportPhysicalAddressGOOGLE* toMap) {
-    (void)handlemap;
-    (void)toMap;
-    if (toMap->pNext) {
-        handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
-    }
-}
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void handlemap_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
@@ -10484,11 +10475,6 @@
                 handlemap, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            handlemap_VkImportPhysicalAddressGOOGLE(
-                handlemap, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
-            break;
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.h b/system/vulkan_enc/goldfish_vk_handlemap_guest.h
index 6e4c295..a37c141 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.h
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.h
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_handlemap_guest
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -2883,9 +2883,6 @@
 
 void handlemap_VkImportBufferGOOGLE(VulkanHandleMapping* handlemap, VkImportBufferGOOGLE* toMap);
 
-void handlemap_VkImportPhysicalAddressGOOGLE(VulkanHandleMapping* handlemap,
-                                             VkImportPhysicalAddressGOOGLE* toMap);
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void handlemap_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index c6a3cc5..3fb53d2 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_marshaling_guest
 //
 // (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
-// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -24876,37 +24876,6 @@
     vkStream->read((uint32_t*)&forUnmarshaling->buffer, sizeof(uint32_t));
 }
 
-void marshal_VkImportPhysicalAddressGOOGLE(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                           const VkImportPhysicalAddressGOOGLE* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint64_t*)&forMarshaling->physicalAddress, sizeof(uint64_t));
-    vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
-    vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
-    vkStream->write((VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
-    vkStream->write((uint32_t*)&forMarshaling->tilingParameter, sizeof(uint32_t));
-}
-
-void unmarshal_VkImportPhysicalAddressGOOGLE(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                             VkImportPhysicalAddressGOOGLE* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    forUnmarshaling->sType = VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint64_t*)&forUnmarshaling->physicalAddress, sizeof(uint64_t));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
-    vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
-    vkStream->read((VkImageTiling*)&forUnmarshaling->tiling, sizeof(VkImageTiling));
-    vkStream->read((uint32_t*)&forUnmarshaling->tilingParameter, sizeof(uint32_t));
-}
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void marshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
@@ -28018,12 +27987,6 @@
                             structExtension));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
-                    marshal_VkImportPhysicalAddressGOOGLE(
-                        vkStream, rootType,
-                        reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension));
-                    break;
-                }
                 default: {
                     marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
                         vkStream, rootType,
@@ -28743,12 +28706,6 @@
                 vkStream, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            marshal_VkImportPhysicalAddressGOOGLE(
-                vkStream, rootType,
-                reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension));
-            break;
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
@@ -30707,12 +30664,6 @@
                             structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
-                    unmarshal_VkImportPhysicalAddressGOOGLE(
-                        vkStream, rootType,
-                        reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
-                    break;
-                }
                 default: {
                     unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
                         vkStream, rootType,
@@ -31423,12 +31374,6 @@
                 vkStream, rootType, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            unmarshal_VkImportPhysicalAddressGOOGLE(
-                vkStream, rootType,
-                reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
-            break;
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
@@ -32584,12 +32529,6 @@
         case OP_vkMapMemoryIntoAddressSpaceGOOGLE: {
             return "OP_vkMapMemoryIntoAddressSpaceGOOGLE";
         }
-        case OP_vkRegisterImageColorBufferGOOGLE: {
-            return "OP_vkRegisterImageColorBufferGOOGLE";
-        }
-        case OP_vkRegisterBufferColorBufferGOOGLE: {
-            return "OP_vkRegisterBufferColorBufferGOOGLE";
-        }
         case OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE: {
             return "OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE";
         }
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
index 5ed2791..316e356 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_marshaling_guest
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -6680,14 +6680,6 @@
 void unmarshal_VkImportBufferGOOGLE(VulkanStreamGuest* vkStream, VkStructureType rootType,
                                     VkImportBufferGOOGLE* forUnmarshaling);
 
-void marshal_VkImportPhysicalAddressGOOGLE(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                           const VkImportPhysicalAddressGOOGLE* forMarshaling);
-
-void unmarshal_VkImportPhysicalAddressGOOGLE(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                             VkImportPhysicalAddressGOOGLE* forUnmarshaling);
-
-#define OP_vkRegisterImageColorBufferGOOGLE 20318
-#define OP_vkRegisterBufferColorBufferGOOGLE 20319
 #define OP_vkMapMemoryIntoAddressSpaceGOOGLE 20317
 #define OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE 20320
 #define OP_vkBeginCommandBufferAsyncGOOGLE 20321
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
index 6960311..2631f9b 100644
--- a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_reserved_marshaling_guest
 //
 // (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
-// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -16559,29 +16559,6 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedmarshal_VkImportPhysicalAddressGOOGLE(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkImportPhysicalAddressGOOGLE* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (uint64_t*)&forMarshaling->physicalAddress, sizeof(uint64_t));
-    *ptr += sizeof(uint64_t);
-    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
-    *ptr += sizeof(VkDeviceSize);
-    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
-    *ptr += sizeof(VkFormat);
-    memcpy(*ptr, (VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
-    *ptr += sizeof(VkImageTiling);
-    memcpy(*ptr, (uint32_t*)&forMarshaling->tilingParameter, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
-}
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void reservedmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
@@ -19389,13 +19366,6 @@
                         ptr);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
-                    reservedmarshal_VkImportPhysicalAddressGOOGLE(
-                        vkStream, rootType,
-                        reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension),
-                        ptr);
-                    break;
-                }
                 default: {
                     reservedmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
                         vkStream, rootType,
@@ -20189,12 +20159,6 @@
                 ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            reservedmarshal_VkImportPhysicalAddressGOOGLE(
-                vkStream, rootType,
-                reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), ptr);
-            break;
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
index a1ed9ad..1449dfd 100644
--- a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_reserved_marshaling_guest
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -3705,10 +3705,6 @@
 void reservedmarshal_VkImportBufferGOOGLE(VulkanStreamGuest* vkStream, VkStructureType rootType,
                                           const VkImportBufferGOOGLE* forMarshaling, uint8_t** ptr);
 
-void reservedmarshal_VkImportPhysicalAddressGOOGLE(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkImportPhysicalAddressGOOGLE* forMarshaling, uint8_t** ptr);
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void reservedmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.cpp b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
index 3a3aa43..a5dab78 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_transform_guest
 //
 // (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
-// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -15254,24 +15254,6 @@
     }
 }
 
-void transform_tohost_VkImportPhysicalAddressGOOGLE(ResourceTracker* resourceTracker,
-                                                    VkImportPhysicalAddressGOOGLE* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkImportPhysicalAddressGOOGLE(ResourceTracker* resourceTracker,
-                                                      VkImportPhysicalAddressGOOGLE* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void transform_tohost_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
@@ -18412,12 +18394,6 @@
                 resourceTracker, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            transform_tohost_VkImportPhysicalAddressGOOGLE(
-                resourceTracker,
-                reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
-            break;
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
@@ -20908,12 +20884,6 @@
                 resourceTracker, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
-            transform_fromhost_VkImportPhysicalAddressGOOGLE(
-                resourceTracker,
-                reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
-            break;
-        }
 #endif
 #ifdef VK_EXT_global_priority_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.h b/system/vulkan_enc/goldfish_vk_transform_guest.h
index 2b70e3d..acbf057 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.h
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.h
@@ -16,7 +16,7 @@
 // Autogenerated module goldfish_vk_transform_guest
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
@@ -5566,12 +5566,6 @@
 void transform_fromhost_VkImportBufferGOOGLE(ResourceTracker* resourceTracker,
                                              VkImportBufferGOOGLE* toTransform);
 
-void transform_tohost_VkImportPhysicalAddressGOOGLE(ResourceTracker* resourceTracker,
-                                                    VkImportPhysicalAddressGOOGLE* toTransform);
-
-void transform_fromhost_VkImportPhysicalAddressGOOGLE(ResourceTracker* resourceTracker,
-                                                      VkImportPhysicalAddressGOOGLE* toTransform);
-
 #endif
 #ifdef VK_EXT_global_priority_query
 void transform_tohost_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
diff --git a/system/vulkan_enc/vulkan_gfxstream.h b/system/vulkan_enc/vulkan_gfxstream.h
index 1c55e09..a2c922e 100644
--- a/system/vulkan_enc/vulkan_gfxstream.h
+++ b/system/vulkan_enc/vulkan_gfxstream.h
@@ -43,20 +43,6 @@
     uint32_t buffer;
 } VkImportBufferGOOGLE;
 
-typedef struct VkImportPhysicalAddressGOOGLE {
-    VkStructureType sType;
-    void* pNext;
-    uint64_t physicalAddress;
-    VkDeviceSize size;
-    VkFormat format;
-    VkImageTiling tiling;
-    uint32_t tilingParameter;
-} VkImportPhysicalAddressGOOGLE;
-
-typedef VkResult(VKAPI_PTR* PFN_vkRegisterImageColorBufferGOOGLE)(VkDevice device, VkImage image,
-                                                                  uint32_t colorBuffer);
-typedef VkResult(VKAPI_PTR* PFN_vkRegisterBufferColorBufferGOOGLE)(VkDevice device, VkBuffer buffer,
-                                                                   uint32_t colorBuffer);
 typedef VkResult(VKAPI_PTR* PFN_vkMapMemoryIntoAddressSpaceGOOGLE)(VkDevice device,
                                                                    VkDeviceMemory memory,
                                                                    uint64_t* pAddress);
@@ -126,12 +112,6 @@
                                                                      VkDeviceSize dataSize);
 
 #ifndef VK_NO_PROTOTYPES
-VKAPI_ATTR VkResult VKAPI_CALL vkRegisterImageColorBufferGOOGLE(VkDevice device, VkImage image,
-                                                                uint32_t colorBuffer);
-
-VKAPI_ATTR VkResult VKAPI_CALL vkRegisterBufferColorBufferGOOGLE(VkDevice device, VkBuffer buffer,
-                                                                 uint32_t colorBuffer);
-
 VKAPI_ATTR VkResult VKAPI_CALL vkMapMemoryIntoAddressSpaceGOOGLE(VkDevice device,
                                                                  VkDeviceMemory memory,
                                                                  uint64_t* pAddress);
diff --git a/system/vulkan_enc/vulkan_gfxstream_structure_type.h b/system/vulkan_enc/vulkan_gfxstream_structure_type.h
index b66918b..4df95ec 100644
--- a/system/vulkan_enc/vulkan_gfxstream_structure_type.h
+++ b/system/vulkan_enc/vulkan_gfxstream_structure_type.h
@@ -16,7 +16,7 @@
 // Autogenerated module vulkan_gfxstream_structure_type
 //
 // (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
-// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+// cereal -o ../vulkan-cereal/stream-servers/vulkan/cereal
 //
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
diff --git a/third-party/fuchsia/LICENSE b/third-party/fuchsia/LICENSE
new file mode 100644
index 0000000..7ed244f
--- /dev/null
+++ b/third-party/fuchsia/LICENSE
@@ -0,0 +1,24 @@
+Copyright 2019 The Fuchsia Authors.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/third-party/fuchsia/README b/third-party/fuchsia/README
new file mode 100644
index 0000000..e315413
--- /dev/null
+++ b/third-party/fuchsia/README
@@ -0,0 +1 @@
+These files come from fuchsia.googlesource.com. Once Magma is in the Fuchsia SDK (https://fxbug.dev/116007, https://fxbug.dev/111471), these files should be removed and the Fuchsia SDK added as a proper dependency (https://fxbug.dev/122678).
diff --git a/third-party/fuchsia/magma/include/magma/magma_common_defs.h b/third-party/fuchsia/magma/include/magma/magma_common_defs.h
new file mode 100644
index 0000000..3fde38c
--- /dev/null
+++ b/third-party/fuchsia/magma/include/magma/magma_common_defs.h
@@ -0,0 +1,332 @@
+// Copyright 2016 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SRC_GRAPHICS_LIB_MAGMA_INCLUDE_MAGMA_MAGMA_COMMON_DEFS_H_
+#define SRC_GRAPHICS_LIB_MAGMA_INCLUDE_MAGMA_MAGMA_COMMON_DEFS_H_
+
+#include <stdint.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+// This header is C, so clang-tidy shouldn't recommend using C++ features.
+// NOLINTBEGIN(modernize-use-using)
+
+// LINT.IfChange(version)
+// This version should be incremented whenever the Magma API changes.
+#define MAGMA_API_VERSION 1
+// LINT.ThenChange()
+
+// LINT.IfChange
+#if defined(__Fuchsia__)
+// The entrypoints should be exported from libmagma_client.a. ICDs should use a
+// version script to re-exporting magma entrypoints.
+#define MAGMA_EXPORT __attribute__((visibility("default")))
+#else
+#define MAGMA_EXPORT
+#endif
+
+typedef uint64_t magma_query_t;
+
+// This is a list of vendor-neutral queries that can be passed to magma_query.
+// Returns the hardware vendor ID (simple result) - should be the PCI ID of the GPU vendor
+// if possible, or the Khronos vendor ID otherwise.
+#define MAGMA_QUERY_VENDOR_ID ((magma_query_t)0)
+// Returns the hardware device ID (simple result)
+#define MAGMA_QUERY_DEVICE_ID ((magma_query_t)1)
+// 2 was MAGMA_QUERY_IS_TEST_RESTART_SUPPORTED
+// Returns true if MAGMA_QUERY_TOTAL_TIME is supported (simple result)
+#define MAGMA_QUERY_IS_TOTAL_TIME_SUPPORTED ((magma_query_t)3)
+// 4 was MAGMA_QUERY_MINIMUM_MAPPABLE_ADDRESS
+// Upper 32bits: max inflight messages, lower 32bits: max inflight memory (MB) (simple result)
+#define MAGMA_QUERY_MAXIMUM_INFLIGHT_PARAMS ((magma_query_t)5)
+
+// All vendor-specific queries IDs that can be passed to magma_query must be >=
+// MAGMA_QUERY_VENDOR_PARAM_0.
+#define MAGMA_QUERY_VENDOR_PARAM_0 ((magma_query_t)10000)
+
+// This is a list of vendor-neutral queries that can be passed to magma_query.
+// Returns a struct magma_total_time_query_result (buffer result)
+#define MAGMA_QUERY_TOTAL_TIME ((magma_query_t)500)
+
+// reserved ID to represent an invalid object
+#define MAGMA_INVALID_OBJECT_ID ((uint64_t)0ull)
+
+// All vendor-specific command buffer flags must be >=
+// MAGMA_COMMAND_BUFFER_VENDOR_FLAGS_0.
+#define MAGMA_COMMAND_BUFFER_VENDOR_FLAGS_0 ((uint64_t)(1ull << 16))
+
+typedef int32_t magma_status_t;
+
+// possible values for magma_status_t
+#define MAGMA_STATUS_OK ((magma_status_t)(0))
+#define MAGMA_STATUS_INTERNAL_ERROR ((magma_status_t)(-1))
+#define MAGMA_STATUS_INVALID_ARGS ((magma_status_t)(-2))
+#define MAGMA_STATUS_ACCESS_DENIED ((magma_status_t)(-3))
+#define MAGMA_STATUS_MEMORY_ERROR ((magma_status_t)(-4))
+#define MAGMA_STATUS_CONTEXT_KILLED ((magma_status_t)(-5))
+#define MAGMA_STATUS_CONNECTION_LOST ((magma_status_t)(-6))
+#define MAGMA_STATUS_TIMED_OUT ((magma_status_t)(-7))
+#define MAGMA_STATUS_UNIMPLEMENTED ((magma_status_t)(-8))
+// This error means that an object was not in the right state for an operation on it.
+#define MAGMA_STATUS_BAD_STATE ((magma_status_t)(-9))
+#define MAGMA_STATUS_ALIAS_FOR_LAST MAGMA_STATUS_BAD_STATE
+
+typedef uint32_t magma_cache_operation_t;
+// possible values for magma_cache_operation_t
+#define MAGMA_CACHE_OPERATION_CLEAN ((magma_cache_operation_t)0)
+#define MAGMA_CACHE_OPERATION_CLEAN_INVALIDATE ((magma_cache_operation_t)1)
+
+typedef uint32_t magma_cache_policy_t;
+// possible values for magma_cache_policy_t
+#define MAGMA_CACHE_POLICY_CACHED ((magma_cache_policy_t)0)
+#define MAGMA_CACHE_POLICY_WRITE_COMBINING ((magma_cache_policy_t)1)
+#define MAGMA_CACHE_POLICY_UNCACHED ((magma_cache_policy_t)2)
+
+#define MAGMA_DUMP_TYPE_NORMAL ((uint32_t)(1 << 0))
+
+#define MAGMA_PERF_COUNTER_RESULT_DISCONTINUITY ((uint32_t)(1 << 0))
+
+typedef uint32_t magma_format_t;
+
+// Values must match fuchsia.sysmem.PixelFormatType
+#define MAGMA_FORMAT_INVALID ((magma_format_t)0)
+#define MAGMA_FORMAT_R8G8B8A8 ((magma_format_t)1)
+#define MAGMA_FORMAT_BGRA32 ((magma_format_t)101)
+#define MAGMA_FORMAT_I420 ((magma_format_t)102)
+#define MAGMA_FORMAT_M420 ((magma_format_t)103)
+#define MAGMA_FORMAT_NV12 ((magma_format_t)104)
+#define MAGMA_FORMAT_YUY2 ((magma_format_t)105)
+#define MAGMA_FORMAT_MJPEG ((magma_format_t)106)
+#define MAGMA_FORMAT_YV12 ((magma_format_t)107)
+#define MAGMA_FORMAT_BGR24 ((magma_format_t)108)
+#define MAGMA_FORMAT_RGB565 ((magma_format_t)109)
+#define MAGMA_FORMAT_RGB332 ((magma_format_t)110)
+#define MAGMA_FORMAT_RGB2220 ((magma_format_t)111)
+#define MAGMA_FORMAT_L8 ((magma_format_t)112)
+#define MAGMA_FORMAT_R8 ((magma_format_t)113)
+#define MAGMA_FORMAT_R8G8 ((magma_format_t)114)
+
+typedef uint64_t magma_format_modifier_t;
+// These must match the fuchsia.sysmem format modifier values.
+#define MAGMA_FORMAT_MODIFIER_LINEAR ((magma_format_modifier_t)0x0000000000000000)
+
+#define MAGMA_FORMAT_MODIFIER_INTEL_X_TILED ((magma_format_modifier_t)0x0100000000000001)
+#define MAGMA_FORMAT_MODIFIER_INTEL_Y_TILED ((magma_format_modifier_t)0x0100000000000002)
+#define MAGMA_FORMAT_MODIFIER_INTEL_YF_TILED ((magma_format_modifier_t)0x0100000000000003)
+
+#define MAGMA_FORMAT_MODIFIER_INTEL_Y_TILED_CCS ((magma_format_modifier_t)0x0100000001000002)
+#define MAGMA_FORMAT_MODIFIER_INTEL_YF_TILED_CCS ((magma_format_modifier_t)0x0100000001000003)
+
+#define MAGMA_FORMAT_MODIFIER_ARM_YUV_BIT ((magma_format_modifier_t)0x10)
+#define MAGMA_FORMAT_MODIFIER_ARM_SPLIT_BLOCK_BIT ((magma_format_modifier_t)0x20)
+#define MAGMA_FORMAT_MODIFIER_ARM_SPARSE_BIT ((magma_format_modifier_t)0x40)
+#define MAGMA_FORMAT_MODIFIER_ARM_BCH_BIT ((magma_format_modifier_t)0x800)
+#define MAGMA_FORMAT_MODIFIER_ARM_TE_BIT ((magma_format_modifier_t)0x1000)
+#define MAGMA_FORMAT_MODIFIER_ARM_TILED_HEADER_BIT ((magma_format_modifier_t)0x2000)
+
+#define MAGMA_FORMAT_MODIFIER_ARM ((magma_format_modifier_t)0x0800000000000000)
+#define MAGMA_FORMAT_MODIFIER_ARM_AFBC_16X16 ((magma_format_modifier_t)0x0800000000000001)
+#define MAGMA_FORMAT_MODIFIER_ARM_AFBC_32X8 ((magma_format_modifier_t)0x0800000000000002)
+#define MAGMA_FORMAT_MODIFIER_ARM_LINEAR_TE ((magma_format_modifier_t)0x0800000000001000)
+#define MAGMA_FORMAT_MODIFIER_ARM_AFBC_16X16_TE ((magma_format_modifier_t)0x0800000000001001)
+#define MAGMA_FORMAT_MODIFIER_ARM_AFBC_32X8_TE ((magma_format_modifier_t)0x0800000000001002)
+
+#define MAGMA_FORMAT_MODIFIER_ARM_AFBC_16X16_YUV_TILED_HEADER \
+  ((magma_format_modifier_t)0x0800000000002011)
+
+#define MAGMA_FORMAT_MODIFIER_ARM_AFBC_16X16_SPLIT_BLOCK_SPARSE_YUV \
+  ((magma_format_modifier_t)0x0800000000000071)
+#define MAGMA_FORMAT_MODIFIER_ARM_AFBC_16X16_SPLIT_BLOCK_SPARSE_YUV_TE \
+  ((magma_format_modifier_t)0x0800000000001071)
+
+#define MAGMA_FORMAT_MODIFIER_ARM_AFBC_16X16_SPLIT_BLOCK_SPARSE_YUV_TILED_HEADER \
+  ((magma_format_modifier_t)0x0800000000002071)
+#define MAGMA_FORMAT_MODIFIER_ARM_AFBC_16X16_SPLIT_BLOCK_SPARSE_YUV_TE_TILED_HEADER \
+  ((magma_format_modifier_t)0x0800000000003071)
+
+typedef uint32_t magma_colorspace_t;
+
+// Must match fuchsia.sysmem.ColorSpaceType values.
+#define MAGMA_COLORSPACE_INVALID ((magma_colorspace_t)0)
+#define MAGMA_COLORSPACE_SRGB ((magma_colorspace_t)1)
+#define MAGMA_COLORSPACE_REC601_NTSC ((magma_colorspace_t)2)
+#define MAGMA_COLORSPACE_REC601_NTSC_FULL_RANGE ((magma_colorspace_t)3)
+#define MAGMA_COLORSPACE_REC601_PAL ((magma_colorspace_t)4)
+#define MAGMA_COLORSPACE_REC601_PAL_FULL_RANGE ((magma_colorspace_t)5)
+#define MAGMA_COLORSPACE_REC709 ((magma_colorspace_t)6)
+#define MAGMA_COLORSPACE_REC2020 ((magma_colorspace_t)7)
+#define MAGMA_COLORSPACE_REC2100 ((magma_colorspace_t)8)
+
+typedef uint32_t magma_coherency_domain_t;
+
+#define MAGMA_COHERENCY_DOMAIN_CPU ((magma_coherency_domain_t)0)
+#define MAGMA_COHERENCY_DOMAIN_RAM ((magma_coherency_domain_t)1)
+#define MAGMA_COHERENCY_DOMAIN_INACCESSIBLE ((magma_coherency_domain_t)2)
+
+#define MAGMA_POLL_TYPE_SEMAPHORE ((uint32_t)1)
+#define MAGMA_POLL_TYPE_HANDLE ((uint32_t)2)
+
+#define MAGMA_POLL_CONDITION_READABLE ((uint32_t)1)
+#define MAGMA_POLL_CONDITION_SIGNALED ((uint32_t)3)
+
+typedef uint32_t magma_buffer_range_op_t;
+
+// Eagerly populate hardware page tables with the pages mapping in this range, committing pages as
+// needed. This is not needed for MAGMA_MAP_FLAG_GROWABLE allocations, since the page tables
+// will be populated on demand.
+#define MAGMA_BUFFER_RANGE_OP_POPULATE_TABLES ((magma_buffer_range_op_t)1)
+// Commit memory on the client thread. Hardware page tables may not be populated. This should be
+// used
+// before POPULATE_TABLES to ensure the expensive work of committing pages happens with the
+// correct priority and without blocking the processing in the MSD of commands from other threads
+// from the same connection.
+#define MAGMA_BUFFER_RANGE_OP_COMMIT ((magma_buffer_range_op_t)2)
+// Depopulate hardware page table mappings for this range. This prevents the hardware from
+// accessing
+// pages in that range, but the pages retain their contents.
+#define MAGMA_BUFFER_RANGE_OP_DEPOPULATE_TABLES ((magma_buffer_range_op_t)3)
+// Decommit memory wholy on the client thread. This may fail if the MSD currently has the page
+// tables populated.
+#define MAGMA_BUFFER_RANGE_OP_DECOMMIT ((magma_buffer_range_op_t)4)
+
+// Set `is_secure` flag in the `BufferMemorySettings` so protected memory is allocated.
+#define MAGMA_SYSMEM_FLAG_PROTECTED ((uint32_t)(1 << 0))
+// This flag is only used to modify the name of the buffer to signal that the client requested it
+// using vkAllocateMemory or similar.
+#define MAGMA_SYSMEM_FLAG_FOR_CLIENT ((uint32_t)(1 << 2))
+
+#define MAGMA_MAX_IMAGE_PLANES ((uint32_t)4)
+
+#define MAGMA_MAX_DRM_FORMAT_MODIFIERS ((uint32_t)16)
+
+// Normal bool doesn't have to be a particular size.
+typedef uint8_t magma_bool_t;
+
+typedef uint64_t magma_device_t;
+
+typedef uint64_t magma_buffer_t;
+
+typedef uint64_t magma_semaphore_t;
+
+typedef uint64_t magma_perf_count_pool_t;
+
+typedef uint64_t magma_connection_t;
+
+// An opaque handle that corresponds to a fuchsia.sysmem.Allocator connection to sysmem.
+typedef uint64_t magma_sysmem_connection_t;
+
+// Corresponds to a zx_handle_t on Fuchsia.
+typedef uint32_t magma_handle_t;
+
+typedef struct magma_poll_item {
+  union {
+    magma_semaphore_t semaphore;
+    magma_handle_t handle;
+  };
+  uint32_t type;
+  uint32_t condition;
+  uint32_t result;
+  uint32_t unused;
+} magma_poll_item_t;
+
+// A buffer referenced by a command buffer descriptor
+typedef struct magma_exec_resource {
+  uint64_t buffer_id;
+  uint64_t offset;
+  uint64_t length;
+} magma_exec_resource_t;
+
+// A resource to be executed by a command buffer descriptor
+typedef struct magma_exec_command_buffer {
+  uint32_t resource_index;
+  uint32_t unused;
+  uint64_t start_offset;
+} __attribute__((__aligned__(8))) magma_exec_command_buffer_t;
+
+typedef struct magma_command_descriptor {
+  // The count of `resources` that may be referenced by the hardware. These must have been
+  // mapped to the hardware previously.
+  uint32_t resource_count;
+  // The count of `command_buffers` to be executed as a unit.
+  uint32_t command_buffer_count;
+  // The count of `semaphore_ids` to be waited upon before beginning execution; these
+  // will be reset after all have been signaled.
+  uint32_t wait_semaphore_count;
+  // The count of `semaphore_ids` to be signaled after execution is complete.
+  uint32_t signal_semaphore_count;
+
+  struct magma_exec_resource* resources;
+  struct magma_exec_command_buffer* command_buffers;
+  // List of semaphore IDs: first the wait semaphore IDs, followed by signal semaphore IDs.
+  uint64_t* semaphore_ids;
+
+  uint64_t flags;
+
+} __attribute__((__aligned__(8))) magma_command_descriptor_t;
+
+typedef struct magma_inline_command_buffer {
+  void* data;
+  uint64_t size;
+  uint64_t* semaphore_ids;
+  uint32_t semaphore_count;
+} magma_inline_command_buffer_t;
+
+typedef struct magma_total_time_query_result {
+  uint64_t gpu_time_ns;        // GPU time in ns since driver start.
+  uint64_t monotonic_time_ns;  // monotonic clock time measured at same time CPU time was.
+} magma_total_time_query_result_t;
+
+typedef struct magma_buffer_offset {
+  uint64_t buffer_id;
+  uint64_t offset;
+  uint64_t length;
+} magma_buffer_offset_t;
+
+// The top 16 bits are reserved for vendor-specific flags.
+#define MAGMA_MAP_FLAG_VENDOR_SHIFT ((uint64_t)16)
+
+#define MAGMA_MAP_FLAG_READ ((uint64_t)(1 << 0))
+#define MAGMA_MAP_FLAG_WRITE ((uint64_t)(1 << 1))
+#define MAGMA_MAP_FLAG_EXECUTE ((uint64_t)(1 << 2))
+#define MAGMA_MAP_FLAG_GROWABLE ((uint64_t)(1 << 3))
+#define MAGMA_MAP_FLAG_VENDOR_0 ((uint64_t)(1 << MAGMA_MAP_FLAG_VENDOR_SHIFT))
+
+typedef struct magma_buffer_info {
+  uint64_t committed_byte_count;
+  uint64_t size;
+} magma_buffer_info_t;
+
+#define MAGMA_IMAGE_CREATE_FLAGS_PRESENTABLE ((uint32_t)1)
+#define MAGMA_IMAGE_CREATE_FLAGS_VULKAN_USAGE ((uint32_t)(1 << 1))
+
+typedef struct magma_image_create_info {
+  // A format specified by DRM (Linux Direct Rendering Manager)
+  uint64_t drm_format;
+  // The last modifier must be DRM_FORMAT_MOD_INVALID
+  uint64_t drm_format_modifiers[MAGMA_MAX_DRM_FORMAT_MODIFIERS];
+  uint32_t width;
+  uint32_t height;
+  // If MAGMA_IMAGE_CREATE_FLAGS_VULKAN_USAGE is provided, Vulkan usage flags
+  // should be provided in the upper 32 bits.
+  uint64_t flags;
+} magma_image_create_info_t;
+
+typedef struct magma_image_info {
+  uint64_t plane_strides[MAGMA_MAX_IMAGE_PLANES];
+  uint32_t plane_offsets[MAGMA_MAX_IMAGE_PLANES];
+  uint64_t drm_format_modifier;
+  uint32_t coherency_domain;
+  uint32_t unused;
+} magma_image_info_t;
+
+// LINT.ThenChange(version)
+// NOLINTEND(modernize-use-using)
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif  // SRC_GRAPHICS_LIB_MAGMA_INCLUDE_MAGMA_MAGMA_COMMON_DEFS_H_
diff --git a/third-party/fuchsia/meson.build b/third-party/fuchsia/meson.build
new file mode 100644
index 0000000..2305a4f
--- /dev/null
+++ b/third-party/fuchsia/meson.build
@@ -0,0 +1,8 @@
+# Copyright 2023 Android Open Source Project
+# SPDX-License-Identifier: MIT
+
+inc_fuchsia_magma = include_directories('magma/include')
+
+fuchsia_magma_dep = declare_dependency(
+   include_directories: [inc_fuchsia_magma],
+)
diff --git a/third-party/meson.build b/third-party/meson.build
new file mode 100644
index 0000000..8c359ec
--- /dev/null
+++ b/third-party/meson.build
@@ -0,0 +1,8 @@
+# Copyright 2023 Android Open Source Project
+# SPDX-License-Identifier: MIT
+
+#================#
+# Subdirectories #
+#================#
+
+subdir('fuchsia')
