[magma] Distinguish verbatim vs. modified methods

This change clarifies the distinction between magma methods that are
proxied verbatim vs. those that have modified signatures. Initially,
only a few methods need this treatment due to their use of nested
pointers, which cannot be serialized by emugen.

This change also adds no-op implementations for magma decoder methods.

Test: m libgfxstream_backend
Change-Id: I7ca8f500d58942642096374565ae73df960b5f69
diff --git a/protocols/magma/README b/protocols/magma/README
index f3e03f3..527041d 100644
--- a/protocols/magma/README
+++ b/protocols/magma/README
@@ -2,4 +2,5 @@
 third-party/fuchsia/magma/regen.py and reflect the standard magma protocol.
 However, as emugen does not have the ability to generate binding code for nested
 pointers, some method signatures must be modified to use a packed format. For
-clarity, these are defined alongside the original (disabled) signatures.
+clarity, these are defined alongside the original (disabled) signatures and
+labeled "fudge" methods.
diff --git a/protocols/magma/magma.attrib b/protocols/magma/magma.attrib
index 288b6f2..edbda0c 100644
--- a/protocols/magma/magma.attrib
+++ b/protocols/magma/magma.attrib
@@ -64,8 +64,8 @@
 	len cache_policy_out sizeof(magma_cache_policy_t)
 
 magma_buffer_get_info
-	dir parameters inout
-	len parameters parameter_count * sizeof(uint64_t)
+	dir info_out out
+	len info_out sizeof(magma_buffer_info)
 
 magma_buffer_get_handle
 	dir handle_out out
@@ -98,33 +98,35 @@
 	len result_flags_out sizeof(uint32_t)
 
 magma_connection_execute_command
-	dir parameters inout
-	len parameters parameter_count * sizeof(uint64_t)
+	dir descriptor in
+	len descriptor sizeof(magma_command_descriptor_t)
+
+magma_connection_execute_command_fudge
+	dir descriptor in
+	len descriptor descriptor_size
 
 magma_connection_execute_immediate_commands
-	dir parameters inout
-	len parameters parameter_count * sizeof(uint64_t)
+	dir command_buffers in
+	len command_buffers command_count * sizeof(magma_inline_command_buffer_t)
+
+magma_connection_execute_immediate_commands_fudge
+	dir command_buffers in
+	len command_buffers command_buffers_size
+	dir command_buffer_offsets in
+	len command_buffer_offsets command_count * sizeof(uint64_t)
 
 magma_buffer_set_name
 	dir name in
+	len name 1
+
+magma_buffer_set_name_fudge
+	dir name in
 	len name name_size
 
-magma_virt_connection_create_image
-	dir parameters inout
-	len parameters parameter_count * sizeof(uint64_t)
-
-magma_virt_connection_get_image_info
-	dir parameters inout
-	len parameters parameter_count * sizeof(uint64_t)
-
 magma_poll
 	dir items inout
 	len items count * sizeof(magma_poll_item_t)
 
-magma_connection_add_performance_counter_buffer_offsets_to_pool
-	dir parameters inout
-	len parameters parameter_count * sizeof(uint64_t)
-
 magma_connection_enable_performance_counters
 	dir counters in
 	len counters counters_count * sizeof(uint64_t)
@@ -132,3 +134,21 @@
 magma_connection_clear_performance_counters
 	dir counters in
 	len counters counters_count * sizeof(uint64_t)
+
+magma_connection_add_performance_counter_buffer_offsets_to_pool
+	dir offsets in
+	len offsets offsets_count * sizeof(magma_buffer_offset_t)
+
+magma_virt_connection_create_image
+	dir create_info in
+	len create_info sizeof(magma_image_create_info_t)
+	dir size_out out
+	len size_out sizeof(uint64_t)
+	dir image_out out
+	len image_out sizeof(magma_buffer_t)
+	dir buffer_id_out out
+	len buffer_id_out sizeof(magma_buffer_id_t)
+
+magma_virt_connection_get_image_info
+	dir image_info_out out
+	len image_info_out sizeof(magma_image_info_t)
diff --git a/protocols/magma/magma.in b/protocols/magma/magma.in
index 404b767..b76a669 100644
--- a/protocols/magma/magma.in
+++ b/protocols/magma/magma.in
@@ -15,20 +15,19 @@
 MAGMA(magma_status_t, magma_connection_perform_buffer_op, magma_connection_t connection, magma_buffer_t buffer, uint32_t options, uint64_t start_offset, uint64_t length)
 MAGMA(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)
 MAGMA(void, magma_connection_unmap_buffer, magma_connection_t connection, uint64_t hw_va, magma_buffer_t buffer)
-# MAGMA(magma_status_t, magma_connection_execute_command, magma_connection_t connection, uint32_t context_id, magma_command_descriptor_t* descriptor)
-MAGMA(magma_status_t, magma_connection_execute_command, uint64_t* parameters, uint64_t parameter_count)
-# MAGMA(magma_status_t, magma_connection_execute_immediate_commands, magma_connection_t connection, uint32_t context_id, uint64_t command_count, magma_inline_command_buffer_t* command_buffers)
-MAGMA(magma_status_t, magma_connection_execute_immediate_commands, uint64_t* parameters, uint64_t parameter_count)
+MAGMA(magma_status_t, magma_connection_execute_command, magma_connection_t connection, uint32_t context_id, magma_command_descriptor_t* descriptor)
+MAGMA(magma_status_t, magma_connection_execute_command_fudge, magma_connection_t connection, uint32_t context_id, void* descriptor, uint64_t descriptor_size)
+MAGMA(magma_status_t, magma_connection_execute_immediate_commands, magma_connection_t connection, uint32_t context_id, uint64_t command_count, magma_inline_command_buffer_t* command_buffers)
+MAGMA(magma_status_t, magma_connection_execute_immediate_commands_fudge, magma_connection_t connection, uint32_t context_id, uint64_t command_count, void* command_buffers, uint64_t command_buffers_size, uint64_t* command_buffer_offsets)
 MAGMA(magma_status_t, magma_connection_flush, magma_connection_t connection)
 MAGMA(magma_handle_t, magma_connection_get_notification_channel_handle, magma_connection_t connection)
 MAGMA(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)
 MAGMA(magma_status_t, magma_buffer_clean_cache, magma_buffer_t buffer, uint64_t offset, uint64_t size, magma_cache_operation_t operation)
 MAGMA(magma_status_t, magma_buffer_set_cache_policy, magma_buffer_t buffer, magma_cache_policy_t policy)
 MAGMA(magma_status_t, magma_buffer_get_cache_policy, magma_buffer_t buffer, magma_cache_policy_t* cache_policy_out)
-# MAGMA(magma_status_t, magma_buffer_set_name, magma_buffer_t buffer, const char* name)
-MAGMA(magma_status_t, magma_buffer_set_name, magma_buffer_t buffer, void* name, uint64_t name_size)
-# MAGMA(magma_status_t, magma_buffer_get_info, magma_buffer_t buffer, magma_buffer_info_t* info_out)
-MAGMA(magma_status_t, magma_buffer_get_info, uint64_t* parameters, uint64_t parameter_count)
+MAGMA(magma_status_t, magma_buffer_set_name, magma_buffer_t buffer, const char* name)
+MAGMA(magma_status_t, magma_buffer_set_name_fudge, magma_buffer_t buffer, void* name, uint64_t name_size)
+MAGMA(magma_status_t, magma_buffer_get_info, magma_buffer_t buffer, magma_buffer_info_t* info_out)
 MAGMA(magma_status_t, magma_buffer_get_handle, magma_buffer_t buffer, magma_handle_t* handle_out)
 MAGMA(magma_status_t, magma_buffer_export, magma_buffer_t buffer, magma_handle_t* buffer_handle_out)
 MAGMA(void, magma_semaphore_signal, magma_semaphore_t semaphore)
@@ -41,13 +40,10 @@
 MAGMA(magma_status_t, magma_connection_enable_performance_counters, magma_connection_t connection, uint64_t* counters, uint64_t counters_count)
 MAGMA(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(magma_status_t, magma_connection_release_performance_counter_buffer_pool, magma_connection_t connection, magma_perf_count_pool_t pool_id)
-# MAGMA(magma_status_t, magma_connection_add_performance_counter_buffer_offsets_to_pool, magma_connection_t connection, magma_perf_count_pool_t pool_id, const magma_buffer_offset_t* offsets, uint64_t offsets_count)
-MAGMA(magma_status_t, magma_connection_add_performance_counter_buffer_offsets_to_pool, uint64_t* parameters, uint64_t parameter_count)
+MAGMA(magma_status_t, magma_connection_add_performance_counter_buffer_offsets_to_pool, magma_connection_t connection, magma_perf_count_pool_t pool_id, const magma_buffer_offset_t* offsets, uint64_t offsets_count)
 MAGMA(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(magma_status_t, magma_connection_dump_performance_counters, magma_connection_t connection, magma_perf_count_pool_t pool_id, uint32_t trigger_id)
 MAGMA(magma_status_t, magma_connection_clear_performance_counters, magma_connection_t connection, uint64_t* counters, uint64_t counters_count)
 MAGMA(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(magma_status_t, magma_virt_connection_create_image, magma_connection_t connection, magma_image_create_info_t* create_info, uint64_t* size_out, magma_buffer_t* image_out, magma_buffer_id_t* buffer_id_out)
-MAGMA(magma_status_t, magma_virt_connection_create_image, uint64_t* parameters, uint64_t parameter_count)
-# MAGMA(magma_status_t, magma_virt_connection_get_image_info, magma_connection_t connection, magma_buffer_t image, magma_image_info_t* image_info_out)
-MAGMA(magma_status_t, magma_virt_connection_get_image_info, uint64_t* parameters, uint64_t parameter_count)
+MAGMA(magma_status_t, magma_virt_connection_create_image, magma_connection_t connection, magma_image_create_info_t* create_info, uint64_t* size_out, magma_buffer_t* image_out, magma_buffer_id_t* buffer_id_out)
+MAGMA(magma_status_t, magma_virt_connection_get_image_info, magma_connection_t connection, magma_buffer_t image, magma_image_info_t* image_info_out)
diff --git a/protocols/magma/magma.types b/protocols/magma/magma.types
index 3267aaf..6ed6193 100644
--- a/protocols/magma/magma.types
+++ b/protocols/magma/magma.types
@@ -1,50 +1,39 @@
-# Derived from magma_common_defs.h
-
-void* 64 %p true
-uint32_t 32 %u false
-uint32_t* 64 %p true
-uint64_t 64 %lu false
-uint64_t* 64 %p true
-magma_query_t 64 %lu false
-magma_query_t* 64 %p true
-magma_status_t 32 %d false
-magma_cache_operation_t 32 %d false
-magma_cache_policy_t 32 %d false
-magma_cache_policy_t* 64 %p true
-magma_format_t 32 %d false
-magma_format_modifier_t 64 %lu false
-magma_colorspace_t 32 %d false
-magma_coherency_domain_t 32 %d false
-magma_buffer_range_op_t 32 %d false
-magma_bool_t 8 %d false
-magma_bool_t* 64 %p true
-magma_device_t 64 %lu false
-magma_device_t* 64 %p true
+# Magma types.
 magma_buffer_t 64 %lu false
-magma_buffer_t* 64 %p true
-magma_semaphore_t 64 %lu false
-magma_semaphore_t* 64 %p true
-magma_perf_count_pool_t 64 %lu false
-magma_perf_count_pool_t* 64 %p true
+magma_cache_operation_t 32 %u false
+magma_cache_policy_t 32 %u false
 magma_connection_t 64 %lu false
-magma_connection_t* 64 %p true
-magma_sysmem_connection_t 64 %lu false
-magma_sysmem_connection_t* 64 %p true
-magma_handle_t 32 0x%x false
-magma_handle_t* 64 %p true
-magma_poll_item_t* 64 %p true
-magma_buffer_id_t 64 %lu false
-magma_buffer_id_t* 64 %p true
-magma_semaphore_id_t 64 %lu false
-magma_semaphore_id_t* 64 %p true
+magma_device_t 64 %lu false
+magma_handle_t 32 %u false
+magma_perf_count_pool_t 64 %lu false
+magma_semaphore_t 64 %lu false
+magma_status_t 32 %d false
+uint32_t 32 %u false
+uint64_t 64 %lu false
 
-# complex types are manually serialized:
-# magma_exec_resource_t
-# magma_exec_command_buffer_t
-# magma_command_descriptor_t
-# magma_inline_command_buffer_t
-# magma_total_time_query_result_t
-# magma_buffer_offset_t
-# magma_buffer_info_t
-# magma_image_create_info_t
-# magma_image_info_t
+# Pointer types.
+magma_bool_t* 64 %p true
+magma_buffer_id_t* 64 %p true
+magma_buffer_info_t* 64 %p true
+magma_buffer_offset_t* 64 %p true
+magma_buffer_t* 64 %p true
+magma_cache_policy_t* 64 %p true
+magma_connection_t* 64 %p true
+magma_device_t* 64 %p true
+magma_handle_t* 64 %p true
+magma_image_create_info_t* 64 %p true
+magma_image_info_t* 64 %p true
+magma_perf_count_pool_t* 64 %p true
+magma_poll_item_t* 64 %p true
+magma_semaphore_id_t* 64 %p true
+magma_semaphore_t* 64 %p true
+uint32_t* 64 %p true
+uint64_t* 64 %p true
+void* 64 %p true
+
+# Do not use these non-trivial types. They must be manually serialized using
+# fudged methods. Placeholder serialization info is used to simplify fallback
+# implementation.
+char* 64 %p true
+magma_command_descriptor_t* 64 %p true
+magma_inline_command_buffer_t* 64 %p true
diff --git a/stream-servers/magma/Decoder.cpp b/stream-servers/magma/Decoder.cpp
index ae03116..6821c1d 100644
--- a/stream-servers/magma/Decoder.cpp
+++ b/stream-servers/magma/Decoder.cpp
@@ -14,6 +14,8 @@
 
 #include "stream-servers/magma/Decoder.h"
 
+#include "RenderThreadInfoMagma.h"
+
 #if GFXSTREAM_MAGMA_USE_INTEL_DRM
 #include "stream-servers/magma/IntelDrmDecoder.h"
 #endif
@@ -28,5 +30,364 @@
     return nullptr;
 }
 
-} // namespace magma
-} // namespace gfxstream
+#define MAGMA_DECODER_BIND_METHOD(method)                                \
+    magma_server_context_t::method = [](auto... args) {                  \
+        auto decoder = RenderThreadInfoMagma::get() -> m_magmaDec.get(); \
+        return static_cast<decltype(this)>(decoder)->method(args...);    \
+    }
+
+Decoder::Decoder() {
+    // Bind standard methods.
+    MAGMA_DECODER_BIND_METHOD(magma_device_import);
+    MAGMA_DECODER_BIND_METHOD(magma_device_release);
+    MAGMA_DECODER_BIND_METHOD(magma_device_query);
+    MAGMA_DECODER_BIND_METHOD(magma_device_create_connection);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_release);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_get_error);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_create_context);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_release_context);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_create_buffer);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_release_buffer);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_import_buffer);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_create_semaphore);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_release_semaphore);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_import_semaphore);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_perform_buffer_op);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_map_buffer);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_unmap_buffer);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_execute_command);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_execute_immediate_commands);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_flush);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_get_notification_channel_handle);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_read_notification_channel);
+    MAGMA_DECODER_BIND_METHOD(magma_buffer_clean_cache);
+    MAGMA_DECODER_BIND_METHOD(magma_buffer_set_cache_policy);
+    MAGMA_DECODER_BIND_METHOD(magma_buffer_get_cache_policy);
+    MAGMA_DECODER_BIND_METHOD(magma_buffer_set_name);
+    MAGMA_DECODER_BIND_METHOD(magma_buffer_get_info);
+    MAGMA_DECODER_BIND_METHOD(magma_buffer_get_handle);
+    MAGMA_DECODER_BIND_METHOD(magma_buffer_export);
+    MAGMA_DECODER_BIND_METHOD(magma_semaphore_signal);
+    MAGMA_DECODER_BIND_METHOD(magma_semaphore_reset);
+    MAGMA_DECODER_BIND_METHOD(magma_semaphore_export);
+    MAGMA_DECODER_BIND_METHOD(magma_poll);
+    MAGMA_DECODER_BIND_METHOD(magma_initialize_tracing);
+    MAGMA_DECODER_BIND_METHOD(magma_initialize_logging);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_enable_performance_counter_access);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_enable_performance_counters);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_create_performance_counter_buffer_pool);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_release_performance_counter_buffer_pool);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_add_performance_counter_buffer_offsets_to_pool);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_remove_performance_counter_buffer_from_pool);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_dump_performance_counters);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_clear_performance_counters);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_read_performance_counter_completion);
+    MAGMA_DECODER_BIND_METHOD(magma_virt_connection_create_image);
+    MAGMA_DECODER_BIND_METHOD(magma_virt_connection_get_image_info);
+
+    // Bind fudged methods.
+    MAGMA_DECODER_BIND_METHOD(magma_connection_execute_command_fudge);
+    MAGMA_DECODER_BIND_METHOD(magma_connection_execute_immediate_commands_fudge);
+    MAGMA_DECODER_BIND_METHOD(magma_buffer_set_name_fudge);
+}
+
+#define MAGMA_NOTIMPL() WARN("magma::Decoder method not implemented: %s", __FUNCTION__)
+
+magma_status_t Decoder::magma_device_import(magma_handle_t device_channel,
+                                            magma_device_t* device_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+void Decoder::magma_device_release(magma_device_t device) { MAGMA_NOTIMPL(); }
+
+magma_status_t Decoder::magma_device_query(magma_device_t device, uint64_t id,
+                                           magma_handle_t* result_buffer_out,
+                                           uint64_t* result_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_device_create_connection(magma_device_t device,
+                                                       magma_connection_t* connection_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+void Decoder::magma_connection_release(magma_connection_t connection) { MAGMA_NOTIMPL(); }
+
+magma_status_t Decoder::magma_connection_get_error(magma_connection_t connection) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_create_context(magma_connection_t connection,
+                                                        uint32_t* context_id_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+void Decoder::magma_connection_release_context(magma_connection_t connection, uint32_t context_id) {
+    MAGMA_NOTIMPL();
+}
+
+magma_status_t Decoder::magma_connection_create_buffer(magma_connection_t connection, uint64_t size,
+                                                       uint64_t* size_out,
+                                                       magma_buffer_t* buffer_out,
+                                                       magma_buffer_id_t* id_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+void Decoder::magma_connection_release_buffer(magma_connection_t connection,
+                                              magma_buffer_t buffer) {
+    MAGMA_NOTIMPL();
+}
+
+magma_status_t Decoder::magma_connection_import_buffer(magma_connection_t connection,
+                                                       magma_handle_t buffer_handle,
+                                                       uint64_t* size_out,
+                                                       magma_buffer_t* buffer_out,
+                                                       magma_buffer_id_t* id_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_create_semaphore(magma_connection_t magma_connection,
+                                                          magma_semaphore_t* semaphore_out,
+                                                          magma_semaphore_id_t* id_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+void Decoder::magma_connection_release_semaphore(magma_connection_t connection,
+                                                 magma_semaphore_t semaphore) {
+    MAGMA_NOTIMPL();
+}
+
+magma_status_t Decoder::magma_connection_import_semaphore(magma_connection_t connection,
+                                                          magma_handle_t semaphore_handle,
+                                                          magma_semaphore_t* semaphore_out,
+                                                          magma_semaphore_id_t* id_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_perform_buffer_op(magma_connection_t connection,
+                                                           magma_buffer_t buffer, uint32_t options,
+                                                           uint64_t start_offset, uint64_t length) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::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) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+void Decoder::magma_connection_unmap_buffer(magma_connection_t connection, uint64_t hw_va,
+                                            magma_buffer_t buffer) {
+    MAGMA_NOTIMPL();
+}
+
+magma_status_t Decoder::magma_connection_execute_command(magma_connection_t connection,
+                                                         uint32_t context_id,
+                                                         magma_command_descriptor_t* descriptor) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_execute_immediate_commands(
+    magma_connection_t connection, uint32_t context_id, uint64_t command_count,
+    magma_inline_command_buffer_t* command_buffers) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_flush(magma_connection_t connection) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_handle_t Decoder::magma_connection_get_notification_channel_handle(
+    magma_connection_t connection) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::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) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_buffer_clean_cache(magma_buffer_t buffer, uint64_t offset,
+                                                 uint64_t size, magma_cache_operation_t operation) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_buffer_set_cache_policy(magma_buffer_t buffer,
+                                                      magma_cache_policy_t policy) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_buffer_get_cache_policy(magma_buffer_t buffer,
+                                                      magma_cache_policy_t* cache_policy_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_buffer_set_name(magma_buffer_t buffer, const char* name) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_buffer_get_info(magma_buffer_t buffer,
+                                              magma_buffer_info_t* info_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_buffer_get_handle(magma_buffer_t buffer, magma_handle_t* handle_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_buffer_export(magma_buffer_t buffer,
+                                            magma_handle_t* buffer_handle_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+void Decoder::magma_semaphore_signal(magma_semaphore_t semaphore) { MAGMA_NOTIMPL(); }
+
+void Decoder::magma_semaphore_reset(magma_semaphore_t semaphore) { MAGMA_NOTIMPL(); }
+
+magma_status_t Decoder::magma_semaphore_export(magma_semaphore_t semaphore,
+                                               magma_handle_t* semaphore_handle_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_poll(magma_poll_item_t* items, uint32_t count, uint64_t timeout_ns) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_initialize_tracing(magma_handle_t channel) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_initialize_logging(magma_handle_t channel) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_enable_performance_counter_access(
+    magma_connection_t connection, magma_handle_t channel) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_enable_performance_counters(magma_connection_t connection,
+                                                                     uint64_t* counters,
+                                                                     uint64_t counters_count) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::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_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_release_performance_counter_buffer_pool(
+    magma_connection_t connection, magma_perf_count_pool_t pool_id) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_add_performance_counter_buffer_offsets_to_pool(
+    magma_connection_t connection, magma_perf_count_pool_t pool_id,
+    const magma_buffer_offset_t* offsets, uint64_t offsets_count) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_remove_performance_counter_buffer_from_pool(
+    magma_connection_t connection, magma_perf_count_pool_t pool_id, magma_buffer_t buffer) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_dump_performance_counters(magma_connection_t connection,
+                                                                   magma_perf_count_pool_t pool_id,
+                                                                   uint32_t trigger_id) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_clear_performance_counters(magma_connection_t connection,
+                                                                    uint64_t* counters,
+                                                                    uint64_t counters_count) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::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_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_virt_connection_create_image(magma_connection_t connection,
+                                                           magma_image_create_info_t* create_info,
+                                                           uint64_t* size_out,
+                                                           magma_buffer_t* image_out,
+                                                           magma_buffer_id_t* buffer_id_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_virt_connection_get_image_info(magma_connection_t connection,
+                                                             magma_buffer_t image,
+                                                             magma_image_info_t* image_info_out) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_execute_command_fudge(magma_connection_t connection,
+                                                               uint32_t context_id,
+                                                               void* descriptor,
+                                                               uint64_t descriptor_size) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_connection_execute_immediate_commands_fudge(
+    magma_connection_t connection, uint32_t context_id, uint64_t command_count,
+    void* command_buffers, uint64_t command_buffers_size, uint64_t* command_buffer_offsets) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+magma_status_t Decoder::magma_buffer_set_name_fudge(magma_buffer_t buffer, void* name,
+                                                    uint64_t name_size) {
+    MAGMA_NOTIMPL();
+    return MAGMA_STATUS_UNIMPLEMENTED;
+}
+
+}  // namespace magma
+}  // namespace gfxstream
diff --git a/stream-servers/magma/Decoder.h b/stream-servers/magma/Decoder.h
index be7cb1d..67eb316 100644
--- a/stream-servers/magma/Decoder.h
+++ b/stream-servers/magma/Decoder.h
@@ -1,6 +1,6 @@
 // Copyright (C) 2023 The Android Open Source Project
 //
-// Licensed under the Apache License, Version 2.0 (the "License") = 0;
+// 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
 //
@@ -14,38 +14,94 @@
 
 #pragma once
 
-#include "magma_dec.h"
-
 #include <memory>
 
+#include "magma_dec.h"
+
 namespace gfxstream {
 namespace magma {
 
 // Generic magma decoder.
 class Decoder : public magma_decoder_context_t {
-  public:
+   public:
     static std::unique_ptr<Decoder> Create();
 
-  private:
-    virtual magma_status_t magma_device_import(magma_handle_t device_channel, magma_device_t* device_out) = 0;
-    virtual void magma_device_release(magma_device_t device) = 0;
-    virtual magma_status_t magma_device_query(magma_device_t device, uint64_t id, magma_handle_t* result_buffer_out, uint64_t* result_out) = 0;
-    virtual magma_status_t magma_device_create_connection(magma_device_t device, magma_connection_t* connection_out) = 0;
-    virtual void magma_connection_release(magma_connection_t connection) = 0;
-    virtual magma_status_t magma_connection_create_buffer(magma_connection_t connection, uint64_t size, uint64_t* size_out, magma_buffer_t* buffer_out, magma_buffer_id_t* id_out) = 0;
-    virtual void magma_connection_release_buffer(magma_connection_t connection, magma_buffer_t buffer) = 0;
-    virtual magma_status_t magma_connection_create_semaphore(magma_connection_t magma_connection, magma_semaphore_t* semaphore_out, magma_semaphore_id_t* id_out) = 0;
-    virtual void magma_connection_release_semaphore(magma_connection_t connection, magma_semaphore_t semaphore) = 0;
-    virtual magma_status_t magma_buffer_export(magma_buffer_t buffer, magma_handle_t* buffer_handle_out) = 0;
-    virtual void magma_semaphore_signal(magma_semaphore_t semaphore) = 0;
-    virtual void magma_semaphore_reset(magma_semaphore_t semaphore) = 0;
-    virtual magma_status_t magma_poll(magma_poll_item_t* items, uint32_t count, uint64_t timeout_ns) = 0;
-    virtual magma_status_t magma_connection_get_error(magma_connection_t connection) = 0;
-    virtual magma_status_t magma_connection_create_context(magma_connection_t connection, uint32_t* context_id_out) = 0;
-    virtual void magma_connection_release_context(magma_connection_t connection, uint32_t context_id) = 0;
-    virtual 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) = 0;
-    virtual void magma_connection_unmap_buffer(magma_connection_t connection, uint64_t hw_va, magma_buffer_t buffer) = 0;
+   protected:
+    Decoder();
+
+   private:
+    // These methods map directly to the magma client API.
+    // clang-format off
+    virtual magma_status_t magma_device_import(magma_handle_t device_channel, magma_device_t* device_out);
+    virtual void magma_device_release(magma_device_t device);
+    virtual magma_status_t magma_device_query(magma_device_t device, uint64_t id, magma_handle_t* result_buffer_out, uint64_t* result_out);
+    virtual magma_status_t magma_device_create_connection(magma_device_t device, magma_connection_t* connection_out);
+    virtual void magma_connection_release(magma_connection_t connection);
+    virtual magma_status_t magma_connection_get_error(magma_connection_t connection);
+    virtual magma_status_t magma_connection_create_context(magma_connection_t connection, uint32_t* context_id_out);
+    virtual void magma_connection_release_context(magma_connection_t connection, uint32_t context_id);
+    virtual magma_status_t magma_connection_create_buffer(magma_connection_t connection, uint64_t size, uint64_t* size_out, magma_buffer_t* buffer_out, magma_buffer_id_t* id_out);
+    virtual void magma_connection_release_buffer(magma_connection_t connection, magma_buffer_t buffer);
+    virtual magma_status_t magma_connection_import_buffer(magma_connection_t connection, magma_handle_t buffer_handle, uint64_t* size_out, magma_buffer_t* buffer_out, magma_buffer_id_t* id_out);
+    virtual magma_status_t magma_connection_create_semaphore(magma_connection_t magma_connection, magma_semaphore_t* semaphore_out, magma_semaphore_id_t* id_out);
+    virtual void magma_connection_release_semaphore(magma_connection_t connection, magma_semaphore_t semaphore);
+    virtual magma_status_t magma_connection_import_semaphore(magma_connection_t connection, magma_handle_t semaphore_handle, magma_semaphore_t* semaphore_out, magma_semaphore_id_t* id_out);
+    virtual magma_status_t magma_connection_perform_buffer_op(magma_connection_t connection, magma_buffer_t buffer, uint32_t options, uint64_t start_offset, uint64_t length);
+    virtual 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);
+    virtual void magma_connection_unmap_buffer(magma_connection_t connection, uint64_t hw_va, magma_buffer_t buffer);
+    virtual magma_status_t magma_connection_execute_command(magma_connection_t connection, uint32_t context_id, magma_command_descriptor_t* descriptor);
+    virtual magma_status_t magma_connection_execute_immediate_commands(magma_connection_t connection, uint32_t context_id, uint64_t command_count, magma_inline_command_buffer_t* command_buffers);
+    virtual magma_status_t magma_connection_flush(magma_connection_t connection);
+    virtual magma_handle_t magma_connection_get_notification_channel_handle(magma_connection_t connection);
+    virtual 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);
+    virtual magma_status_t magma_buffer_clean_cache(magma_buffer_t buffer, uint64_t offset, uint64_t size, magma_cache_operation_t operation);
+    virtual magma_status_t magma_buffer_set_cache_policy(magma_buffer_t buffer, magma_cache_policy_t policy);
+    virtual magma_status_t magma_buffer_get_cache_policy(magma_buffer_t buffer, magma_cache_policy_t* cache_policy_out);
+    virtual magma_status_t magma_buffer_set_name(magma_buffer_t buffer, const char* name);
+    virtual magma_status_t magma_buffer_get_info(magma_buffer_t buffer, magma_buffer_info_t* info_out);
+    virtual magma_status_t magma_buffer_get_handle(magma_buffer_t buffer, magma_handle_t* handle_out);
+    virtual magma_status_t magma_buffer_export(magma_buffer_t buffer, magma_handle_t* buffer_handle_out);
+    virtual void magma_semaphore_signal(magma_semaphore_t semaphore);
+    virtual void magma_semaphore_reset(magma_semaphore_t semaphore);
+    virtual magma_status_t magma_semaphore_export(magma_semaphore_t semaphore, magma_handle_t* semaphore_handle_out);
+    virtual magma_status_t magma_poll(magma_poll_item_t* items, uint32_t count, uint64_t timeout_ns);
+    virtual magma_status_t magma_initialize_tracing(magma_handle_t channel);
+    virtual magma_status_t magma_initialize_logging(magma_handle_t channel);
+    virtual magma_status_t magma_connection_enable_performance_counter_access(magma_connection_t connection, magma_handle_t channel);
+    virtual magma_status_t magma_connection_enable_performance_counters(magma_connection_t connection, uint64_t* counters, uint64_t counters_count);
+    virtual 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);
+    virtual magma_status_t magma_connection_release_performance_counter_buffer_pool(magma_connection_t connection, magma_perf_count_pool_t pool_id);
+    virtual magma_status_t magma_connection_add_performance_counter_buffer_offsets_to_pool(magma_connection_t connection, magma_perf_count_pool_t pool_id, const magma_buffer_offset_t* offsets, uint64_t offsets_count);
+    virtual 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);
+    virtual magma_status_t magma_connection_dump_performance_counters(magma_connection_t connection, magma_perf_count_pool_t pool_id, uint32_t trigger_id);
+    virtual magma_status_t magma_connection_clear_performance_counters(magma_connection_t connection, uint64_t* counters, uint64_t counters_count);
+    virtual 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);
+    virtual magma_status_t magma_virt_connection_create_image(magma_connection_t connection, magma_image_create_info_t* create_info, uint64_t* size_out, magma_buffer_t* image_out, magma_buffer_id_t* buffer_id_out);
+    virtual magma_status_t magma_virt_connection_get_image_info(magma_connection_t connection, magma_buffer_t image, magma_image_info_t* image_info_out);
+    // clang-format on
+
+    // These are "fudged" methods that alter the signature of a standard magma API, either to
+    // provide additional information necessary for efficient proxying, or to work around
+    // limitations in emugen.
+
+    // `descriptor` contains the flattened descriptor.
+    virtual magma_status_t magma_connection_execute_command_fudge(magma_connection_t connection,
+                                                                  uint32_t context_id,
+                                                                  void* descriptor,
+                                                                  uint64_t descriptor_size);
+
+    // `command_buffers` contains the flattened list of command buffers, with
+    // `command_buffer_offsets` containing a list of offsets into `command_buffers` that define the
+    // start of each flattened command buffer.
+    virtual magma_status_t magma_connection_execute_immediate_commands_fudge(
+        magma_connection_t connection, uint32_t context_id, uint64_t command_count,
+        void* command_buffers, uint64_t command_buffers_size, uint64_t* command_buffer_offsets);
+
+    // `name` contains a null-terminated string. `name_size` is the size of the string including its
+    // null terminator.
+    virtual magma_status_t magma_buffer_set_name_fudge(magma_buffer_t buffer, void* name,
+                                                       uint64_t name_size);
 };
 
-} // namespace magma
-} // namespace gfxstream
+}  // namespace magma
+}  // namespace gfxstream
diff --git a/stream-servers/magma/magma_dec/magma_dec.cpp b/stream-servers/magma/magma_dec/magma_dec.cpp
index 357b9a8..7ea0f54 100644
--- a/stream-servers/magma/magma_dec/magma_dec.cpp
+++ b/stream-servers/magma/magma_dec/magma_dec.cpp
@@ -52,7 +52,7 @@
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
 			OutputBuffer outptr_device_out(&tmpBuf[0], size_device_out);
-			DECODER_DEBUG_LOG("magma(%p): magma_device_import(device_channel:0x%x device_out:%p(%u) )", stream, var_device_channel, (magma_device_t*)(outptr_device_out.get()), size_device_out);
+			DECODER_DEBUG_LOG("magma(%p): magma_device_import(device_channel:%u device_out:%p(%u) )", stream, var_device_channel, (magma_device_t*)(outptr_device_out.get()), size_device_out);
 			*(magma_status_t *)(&tmpBuf[0 + size_device_out]) = 			this->magma_device_import(var_device_channel, (magma_device_t*)(outptr_device_out.get()));
 			outptr_device_out.flush();
 			if (useChecksum) {
@@ -267,7 +267,7 @@
 			OutputBuffer outptr_size_out(&tmpBuf[0], size_size_out);
 			OutputBuffer outptr_buffer_out(&tmpBuf[0 + size_size_out], size_buffer_out);
 			OutputBuffer outptr_id_out(&tmpBuf[0 + size_size_out + size_buffer_out], size_id_out);
-			DECODER_DEBUG_LOG("magma(%p): magma_connection_import_buffer(connection:%lu buffer_handle:0x%x size_out:%p(%u) buffer_out:%p(%u) id_out:%p(%u) )", stream, var_connection, var_buffer_handle, (uint64_t*)(outptr_size_out.get()), size_size_out, (magma_buffer_t*)(outptr_buffer_out.get()), size_buffer_out, (magma_buffer_id_t*)(outptr_id_out.get()), size_id_out);
+			DECODER_DEBUG_LOG("magma(%p): magma_connection_import_buffer(connection:%lu buffer_handle:%u size_out:%p(%u) buffer_out:%p(%u) id_out:%p(%u) )", stream, var_connection, var_buffer_handle, (uint64_t*)(outptr_size_out.get()), size_size_out, (magma_buffer_t*)(outptr_buffer_out.get()), size_buffer_out, (magma_buffer_id_t*)(outptr_id_out.get()), size_id_out);
 			*(magma_status_t *)(&tmpBuf[0 + size_size_out + size_buffer_out + size_id_out]) = 			this->magma_connection_import_buffer(var_connection, var_buffer_handle, (uint64_t*)(outptr_size_out.get()), (magma_buffer_t*)(outptr_buffer_out.get()), (magma_buffer_id_t*)(outptr_id_out.get()));
 			outptr_size_out.flush();
 			outptr_buffer_out.flush();
@@ -339,7 +339,7 @@
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
 			OutputBuffer outptr_semaphore_out(&tmpBuf[0], size_semaphore_out);
 			OutputBuffer outptr_id_out(&tmpBuf[0 + size_semaphore_out], size_id_out);
-			DECODER_DEBUG_LOG("magma(%p): magma_connection_import_semaphore(connection:%lu semaphore_handle:0x%x semaphore_out:%p(%u) id_out:%p(%u) )", stream, var_connection, var_semaphore_handle, (magma_semaphore_t*)(outptr_semaphore_out.get()), size_semaphore_out, (magma_semaphore_id_t*)(outptr_id_out.get()), size_id_out);
+			DECODER_DEBUG_LOG("magma(%p): magma_connection_import_semaphore(connection:%lu semaphore_handle:%u semaphore_out:%p(%u) id_out:%p(%u) )", stream, var_connection, var_semaphore_handle, (magma_semaphore_t*)(outptr_semaphore_out.get()), size_semaphore_out, (magma_semaphore_id_t*)(outptr_id_out.get()), size_id_out);
 			*(magma_status_t *)(&tmpBuf[0 + size_semaphore_out + size_id_out]) = 			this->magma_connection_import_semaphore(var_connection, var_semaphore_handle, (magma_semaphore_t*)(outptr_semaphore_out.get()), (magma_semaphore_id_t*)(outptr_id_out.get()));
 			outptr_semaphore_out.flush();
 			outptr_id_out.flush();
@@ -417,22 +417,19 @@
 		}
 		case OP_magma_connection_execute_command: {
 			android::base::beginTrace("magma_connection_execute_command decode");
-			uint32_t size_parameters __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8);
-			InputBuffer inptr_parameters(ptr + 8 + 4, size_parameters);
-			uint64_t var_parameter_count = Unpack<uint64_t,uint64_t>(ptr + 8 + 4 + size_parameters);
+			magma_connection_t var_connection = Unpack<magma_connection_t,uint64_t>(ptr + 8);
+			uint32_t var_context_id = Unpack<uint32_t,uint32_t>(ptr + 8 + 8);
+			uint32_t size_descriptor __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 4);
+			InputBuffer inptr_descriptor(ptr + 8 + 8 + 4 + 4, size_descriptor);
 			if (useChecksum) {
-				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + size_parameters + 8, ptr + 8 + 4 + size_parameters + 8, checksumSize,
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 4 + 4 + size_descriptor, ptr + 8 + 8 + 4 + 4 + size_descriptor, checksumSize,
 					"magma_decoder_context_t::decode, OP_magma_connection_execute_command: GL checksumCalculator failure\n");
 			}
-			size_t totalTmpSize = size_parameters;
-			totalTmpSize += sizeof(magma_status_t);
+			size_t totalTmpSize = sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			OutputBuffer outptr_parameters(&tmpBuf[0], size_parameters);
-			memcpy(outptr_parameters.get(), inptr_parameters.get(), size_parameters);
-			DECODER_DEBUG_LOG("magma(%p): magma_connection_execute_command(parameters:%p(%u) parameter_count:%lu )", stream, (uint64_t*)(outptr_parameters.get()), size_parameters, var_parameter_count);
-			*(magma_status_t *)(&tmpBuf[0 + size_parameters]) = 			this->magma_connection_execute_command((uint64_t*)(outptr_parameters.get()), var_parameter_count);
-			outptr_parameters.flush();
+			DECODER_DEBUG_LOG("magma(%p): magma_connection_execute_command(connection:%lu context_id:%u descriptor:%p(%u) )", stream, var_connection, var_context_id, (magma_command_descriptor_t*)(inptr_descriptor.get()), size_descriptor);
+			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_connection_execute_command(var_connection, var_context_id, (magma_command_descriptor_t*)(inptr_descriptor.get()));
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
 			}
@@ -441,24 +438,46 @@
 			android::base::endTrace();
 			break;
 		}
-		case OP_magma_connection_execute_immediate_commands: {
-			android::base::beginTrace("magma_connection_execute_immediate_commands decode");
-			uint32_t size_parameters __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8);
-			InputBuffer inptr_parameters(ptr + 8 + 4, size_parameters);
-			uint64_t var_parameter_count = Unpack<uint64_t,uint64_t>(ptr + 8 + 4 + size_parameters);
+		case OP_magma_connection_execute_command_fudge: {
+			android::base::beginTrace("magma_connection_execute_command_fudge decode");
+			magma_connection_t var_connection = Unpack<magma_connection_t,uint64_t>(ptr + 8);
+			uint32_t var_context_id = Unpack<uint32_t,uint32_t>(ptr + 8 + 8);
+			uint32_t size_descriptor __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 4);
+			InputBuffer inptr_descriptor(ptr + 8 + 8 + 4 + 4, size_descriptor);
+			uint64_t var_descriptor_size = Unpack<uint64_t,uint64_t>(ptr + 8 + 8 + 4 + 4 + size_descriptor);
 			if (useChecksum) {
-				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + size_parameters + 8, ptr + 8 + 4 + size_parameters + 8, checksumSize,
-					"magma_decoder_context_t::decode, OP_magma_connection_execute_immediate_commands: GL checksumCalculator failure\n");
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 4 + 4 + size_descriptor + 8, ptr + 8 + 8 + 4 + 4 + size_descriptor + 8, checksumSize,
+					"magma_decoder_context_t::decode, OP_magma_connection_execute_command_fudge: GL checksumCalculator failure\n");
 			}
-			size_t totalTmpSize = size_parameters;
-			totalTmpSize += sizeof(magma_status_t);
+			size_t totalTmpSize = sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			OutputBuffer outptr_parameters(&tmpBuf[0], size_parameters);
-			memcpy(outptr_parameters.get(), inptr_parameters.get(), size_parameters);
-			DECODER_DEBUG_LOG("magma(%p): magma_connection_execute_immediate_commands(parameters:%p(%u) parameter_count:%lu )", stream, (uint64_t*)(outptr_parameters.get()), size_parameters, var_parameter_count);
-			*(magma_status_t *)(&tmpBuf[0 + size_parameters]) = 			this->magma_connection_execute_immediate_commands((uint64_t*)(outptr_parameters.get()), var_parameter_count);
-			outptr_parameters.flush();
+			DECODER_DEBUG_LOG("magma(%p): magma_connection_execute_command_fudge(connection:%lu context_id:%u descriptor:%p(%u) descriptor_size:%lu )", stream, var_connection, var_context_id, (void*)(inptr_descriptor.get()), size_descriptor, var_descriptor_size);
+			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_connection_execute_command_fudge(var_connection, var_context_id, (void*)(inptr_descriptor.get()), var_descriptor_size);
+			if (useChecksum) {
+				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
+			}
+			stream->flush();
+			SET_LASTCALL("magma_connection_execute_command_fudge");
+			android::base::endTrace();
+			break;
+		}
+		case OP_magma_connection_execute_immediate_commands: {
+			android::base::beginTrace("magma_connection_execute_immediate_commands decode");
+			magma_connection_t var_connection = Unpack<magma_connection_t,uint64_t>(ptr + 8);
+			uint32_t var_context_id = Unpack<uint32_t,uint32_t>(ptr + 8 + 8);
+			uint64_t var_command_count = Unpack<uint64_t,uint64_t>(ptr + 8 + 8 + 4);
+			uint32_t size_command_buffers __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 4 + 8);
+			InputBuffer inptr_command_buffers(ptr + 8 + 8 + 4 + 8 + 4, size_command_buffers);
+			if (useChecksum) {
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 4 + 8 + 4 + size_command_buffers, ptr + 8 + 8 + 4 + 8 + 4 + size_command_buffers, checksumSize,
+					"magma_decoder_context_t::decode, OP_magma_connection_execute_immediate_commands: GL checksumCalculator failure\n");
+			}
+			size_t totalTmpSize = sizeof(magma_status_t);
+			totalTmpSize += checksumSize;
+			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
+			DECODER_DEBUG_LOG("magma(%p): magma_connection_execute_immediate_commands(connection:%lu context_id:%u command_count:%lu command_buffers:%p(%u) )", stream, var_connection, var_context_id, var_command_count, (magma_inline_command_buffer_t*)(inptr_command_buffers.get()), size_command_buffers);
+			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_connection_execute_immediate_commands(var_connection, var_context_id, var_command_count, (magma_inline_command_buffer_t*)(inptr_command_buffers.get()));
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
 			}
@@ -467,6 +486,33 @@
 			android::base::endTrace();
 			break;
 		}
+		case OP_magma_connection_execute_immediate_commands_fudge: {
+			android::base::beginTrace("magma_connection_execute_immediate_commands_fudge decode");
+			magma_connection_t var_connection = Unpack<magma_connection_t,uint64_t>(ptr + 8);
+			uint32_t var_context_id = Unpack<uint32_t,uint32_t>(ptr + 8 + 8);
+			uint64_t var_command_count = Unpack<uint64_t,uint64_t>(ptr + 8 + 8 + 4);
+			uint32_t size_command_buffers __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 4 + 8);
+			InputBuffer inptr_command_buffers(ptr + 8 + 8 + 4 + 8 + 4, size_command_buffers);
+			uint64_t var_command_buffers_size = Unpack<uint64_t,uint64_t>(ptr + 8 + 8 + 4 + 8 + 4 + size_command_buffers);
+			uint32_t size_command_buffer_offsets __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 4 + 8 + 4 + size_command_buffers + 8);
+			InputBuffer inptr_command_buffer_offsets(ptr + 8 + 8 + 4 + 8 + 4 + size_command_buffers + 8 + 4, size_command_buffer_offsets);
+			if (useChecksum) {
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 4 + 8 + 4 + size_command_buffers + 8 + 4 + size_command_buffer_offsets, ptr + 8 + 8 + 4 + 8 + 4 + size_command_buffers + 8 + 4 + size_command_buffer_offsets, checksumSize,
+					"magma_decoder_context_t::decode, OP_magma_connection_execute_immediate_commands_fudge: GL checksumCalculator failure\n");
+			}
+			size_t totalTmpSize = sizeof(magma_status_t);
+			totalTmpSize += checksumSize;
+			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
+			DECODER_DEBUG_LOG("magma(%p): magma_connection_execute_immediate_commands_fudge(connection:%lu context_id:%u command_count:%lu command_buffers:%p(%u) command_buffers_size:%lu command_buffer_offsets:%p(%u) )", stream, var_connection, var_context_id, var_command_count, (void*)(inptr_command_buffers.get()), size_command_buffers, var_command_buffers_size, (uint64_t*)(inptr_command_buffer_offsets.get()), size_command_buffer_offsets);
+			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_connection_execute_immediate_commands_fudge(var_connection, var_context_id, var_command_count, (void*)(inptr_command_buffers.get()), var_command_buffers_size, (uint64_t*)(inptr_command_buffer_offsets.get()));
+			if (useChecksum) {
+				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
+			}
+			stream->flush();
+			SET_LASTCALL("magma_connection_execute_immediate_commands_fudge");
+			android::base::endTrace();
+			break;
+		}
 		case OP_magma_connection_flush: {
 			android::base::beginTrace("magma_connection_flush decode");
 			magma_connection_t var_connection = Unpack<magma_connection_t,uint64_t>(ptr + 8);
@@ -553,7 +599,7 @@
 			size_t totalTmpSize = sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			DECODER_DEBUG_LOG("magma(%p): magma_buffer_clean_cache(buffer:%lu offset:%lu size:%lu operation:%d )", stream, var_buffer, var_offset, var_size, var_operation);
+			DECODER_DEBUG_LOG("magma(%p): magma_buffer_clean_cache(buffer:%lu offset:%lu size:%lu operation:%u )", stream, var_buffer, var_offset, var_size, var_operation);
 			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_buffer_clean_cache(var_buffer, var_offset, var_size, var_operation);
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
@@ -574,7 +620,7 @@
 			size_t totalTmpSize = sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			DECODER_DEBUG_LOG("magma(%p): magma_buffer_set_cache_policy(buffer:%lu policy:%d )", stream, var_buffer, var_policy);
+			DECODER_DEBUG_LOG("magma(%p): magma_buffer_set_cache_policy(buffer:%lu policy:%u )", stream, var_buffer, var_policy);
 			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_buffer_set_cache_policy(var_buffer, var_policy);
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
@@ -613,16 +659,15 @@
 			magma_buffer_t var_buffer = Unpack<magma_buffer_t,uint64_t>(ptr + 8);
 			uint32_t size_name __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8);
 			InputBuffer inptr_name(ptr + 8 + 8 + 4, size_name);
-			uint64_t var_name_size = Unpack<uint64_t,uint64_t>(ptr + 8 + 8 + 4 + size_name);
 			if (useChecksum) {
-				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 4 + size_name + 8, ptr + 8 + 8 + 4 + size_name + 8, checksumSize,
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 4 + size_name, ptr + 8 + 8 + 4 + size_name, checksumSize,
 					"magma_decoder_context_t::decode, OP_magma_buffer_set_name: GL checksumCalculator failure\n");
 			}
 			size_t totalTmpSize = sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			DECODER_DEBUG_LOG("magma(%p): magma_buffer_set_name(buffer:%lu name:%p(%u) name_size:%lu )", stream, var_buffer, (void*)(inptr_name.get()), size_name, var_name_size);
-			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_buffer_set_name(var_buffer, (void*)(inptr_name.get()), var_name_size);
+			DECODER_DEBUG_LOG("magma(%p): magma_buffer_set_name(buffer:%lu name:%p(%u) )", stream, var_buffer, (const char*)(inptr_name.get()), size_name);
+			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_buffer_set_name(var_buffer, (const char*)(inptr_name.get()));
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
 			}
@@ -631,24 +676,45 @@
 			android::base::endTrace();
 			break;
 		}
+		case OP_magma_buffer_set_name_fudge: {
+			android::base::beginTrace("magma_buffer_set_name_fudge decode");
+			magma_buffer_t var_buffer = Unpack<magma_buffer_t,uint64_t>(ptr + 8);
+			uint32_t size_name __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8);
+			InputBuffer inptr_name(ptr + 8 + 8 + 4, size_name);
+			uint64_t var_name_size = Unpack<uint64_t,uint64_t>(ptr + 8 + 8 + 4 + size_name);
+			if (useChecksum) {
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 4 + size_name + 8, ptr + 8 + 8 + 4 + size_name + 8, checksumSize,
+					"magma_decoder_context_t::decode, OP_magma_buffer_set_name_fudge: GL checksumCalculator failure\n");
+			}
+			size_t totalTmpSize = sizeof(magma_status_t);
+			totalTmpSize += checksumSize;
+			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
+			DECODER_DEBUG_LOG("magma(%p): magma_buffer_set_name_fudge(buffer:%lu name:%p(%u) name_size:%lu )", stream, var_buffer, (void*)(inptr_name.get()), size_name, var_name_size);
+			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_buffer_set_name_fudge(var_buffer, (void*)(inptr_name.get()), var_name_size);
+			if (useChecksum) {
+				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
+			}
+			stream->flush();
+			SET_LASTCALL("magma_buffer_set_name_fudge");
+			android::base::endTrace();
+			break;
+		}
 		case OP_magma_buffer_get_info: {
 			android::base::beginTrace("magma_buffer_get_info decode");
-			uint32_t size_parameters __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8);
-			InputBuffer inptr_parameters(ptr + 8 + 4, size_parameters);
-			uint64_t var_parameter_count = Unpack<uint64_t,uint64_t>(ptr + 8 + 4 + size_parameters);
+			magma_buffer_t var_buffer = Unpack<magma_buffer_t,uint64_t>(ptr + 8);
+			uint32_t size_info_out __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8);
 			if (useChecksum) {
-				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + size_parameters + 8, ptr + 8 + 4 + size_parameters + 8, checksumSize,
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 4, ptr + 8 + 8 + 4, checksumSize,
 					"magma_decoder_context_t::decode, OP_magma_buffer_get_info: GL checksumCalculator failure\n");
 			}
-			size_t totalTmpSize = size_parameters;
+			size_t totalTmpSize = size_info_out;
 			totalTmpSize += sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			OutputBuffer outptr_parameters(&tmpBuf[0], size_parameters);
-			memcpy(outptr_parameters.get(), inptr_parameters.get(), size_parameters);
-			DECODER_DEBUG_LOG("magma(%p): magma_buffer_get_info(parameters:%p(%u) parameter_count:%lu )", stream, (uint64_t*)(outptr_parameters.get()), size_parameters, var_parameter_count);
-			*(magma_status_t *)(&tmpBuf[0 + size_parameters]) = 			this->magma_buffer_get_info((uint64_t*)(outptr_parameters.get()), var_parameter_count);
-			outptr_parameters.flush();
+			OutputBuffer outptr_info_out(&tmpBuf[0], size_info_out);
+			DECODER_DEBUG_LOG("magma(%p): magma_buffer_get_info(buffer:%lu info_out:%p(%u) )", stream, var_buffer, (magma_buffer_info_t*)(outptr_info_out.get()), size_info_out);
+			*(magma_status_t *)(&tmpBuf[0 + size_info_out]) = 			this->magma_buffer_get_info(var_buffer, (magma_buffer_info_t*)(outptr_info_out.get()));
+			outptr_info_out.flush();
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
 			}
@@ -792,7 +858,7 @@
 			size_t totalTmpSize = sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			DECODER_DEBUG_LOG("magma(%p): magma_initialize_tracing(channel:0x%x )", stream, var_channel);
+			DECODER_DEBUG_LOG("magma(%p): magma_initialize_tracing(channel:%u )", stream, var_channel);
 			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_initialize_tracing(var_channel);
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
@@ -812,7 +878,7 @@
 			size_t totalTmpSize = sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			DECODER_DEBUG_LOG("magma(%p): magma_initialize_logging(channel:0x%x )", stream, var_channel);
+			DECODER_DEBUG_LOG("magma(%p): magma_initialize_logging(channel:%u )", stream, var_channel);
 			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_initialize_logging(var_channel);
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
@@ -833,7 +899,7 @@
 			size_t totalTmpSize = sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			DECODER_DEBUG_LOG("magma(%p): magma_connection_enable_performance_counter_access(connection:%lu channel:0x%x )", stream, var_connection, var_channel);
+			DECODER_DEBUG_LOG("magma(%p): magma_connection_enable_performance_counter_access(connection:%lu channel:%u )", stream, var_connection, var_channel);
 			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_connection_enable_performance_counter_access(var_connection, var_channel);
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
@@ -917,22 +983,20 @@
 		}
 		case OP_magma_connection_add_performance_counter_buffer_offsets_to_pool: {
 			android::base::beginTrace("magma_connection_add_performance_counter_buffer_offsets_to_pool decode");
-			uint32_t size_parameters __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8);
-			InputBuffer inptr_parameters(ptr + 8 + 4, size_parameters);
-			uint64_t var_parameter_count = Unpack<uint64_t,uint64_t>(ptr + 8 + 4 + size_parameters);
+			magma_connection_t var_connection = Unpack<magma_connection_t,uint64_t>(ptr + 8);
+			magma_perf_count_pool_t var_pool_id = Unpack<magma_perf_count_pool_t,uint64_t>(ptr + 8 + 8);
+			uint32_t size_offsets __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 8);
+			InputBuffer inptr_offsets(ptr + 8 + 8 + 8 + 4, size_offsets);
+			uint64_t var_offsets_count = Unpack<uint64_t,uint64_t>(ptr + 8 + 8 + 8 + 4 + size_offsets);
 			if (useChecksum) {
-				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + size_parameters + 8, ptr + 8 + 4 + size_parameters + 8, checksumSize,
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 8 + 4 + size_offsets + 8, ptr + 8 + 8 + 8 + 4 + size_offsets + 8, checksumSize,
 					"magma_decoder_context_t::decode, OP_magma_connection_add_performance_counter_buffer_offsets_to_pool: GL checksumCalculator failure\n");
 			}
-			size_t totalTmpSize = size_parameters;
-			totalTmpSize += sizeof(magma_status_t);
+			size_t totalTmpSize = sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			OutputBuffer outptr_parameters(&tmpBuf[0], size_parameters);
-			memcpy(outptr_parameters.get(), inptr_parameters.get(), size_parameters);
-			DECODER_DEBUG_LOG("magma(%p): magma_connection_add_performance_counter_buffer_offsets_to_pool(parameters:%p(%u) parameter_count:%lu )", stream, (uint64_t*)(outptr_parameters.get()), size_parameters, var_parameter_count);
-			*(magma_status_t *)(&tmpBuf[0 + size_parameters]) = 			this->magma_connection_add_performance_counter_buffer_offsets_to_pool((uint64_t*)(outptr_parameters.get()), var_parameter_count);
-			outptr_parameters.flush();
+			DECODER_DEBUG_LOG("magma(%p): magma_connection_add_performance_counter_buffer_offsets_to_pool(connection:%lu pool_id:%lu offsets:%p(%u) offsets_count:%lu )", stream, var_connection, var_pool_id, (const magma_buffer_offset_t*)(inptr_offsets.get()), size_offsets, var_offsets_count);
+			*(magma_status_t *)(&tmpBuf[0]) = 			this->magma_connection_add_performance_counter_buffer_offsets_to_pool(var_connection, var_pool_id, (const magma_buffer_offset_t*)(inptr_offsets.get()), var_offsets_count);
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
 			}
@@ -1051,22 +1115,30 @@
 		}
 		case OP_magma_virt_connection_create_image: {
 			android::base::beginTrace("magma_virt_connection_create_image decode");
-			uint32_t size_parameters __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8);
-			InputBuffer inptr_parameters(ptr + 8 + 4, size_parameters);
-			uint64_t var_parameter_count = Unpack<uint64_t,uint64_t>(ptr + 8 + 4 + size_parameters);
+			magma_connection_t var_connection = Unpack<magma_connection_t,uint64_t>(ptr + 8);
+			uint32_t size_create_info __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8);
+			InputBuffer inptr_create_info(ptr + 8 + 8 + 4, size_create_info);
+			uint32_t size_size_out __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 4 + size_create_info);
+			uint32_t size_image_out __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 4 + size_create_info + 4);
+			uint32_t size_buffer_id_out __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 4 + size_create_info + 4 + 4);
 			if (useChecksum) {
-				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + size_parameters + 8, ptr + 8 + 4 + size_parameters + 8, checksumSize,
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 4 + size_create_info + 4 + 4 + 4, ptr + 8 + 8 + 4 + size_create_info + 4 + 4 + 4, checksumSize,
 					"magma_decoder_context_t::decode, OP_magma_virt_connection_create_image: GL checksumCalculator failure\n");
 			}
-			size_t totalTmpSize = size_parameters;
+			size_t totalTmpSize = size_size_out;
+			totalTmpSize += size_image_out;
+			totalTmpSize += size_buffer_id_out;
 			totalTmpSize += sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			OutputBuffer outptr_parameters(&tmpBuf[0], size_parameters);
-			memcpy(outptr_parameters.get(), inptr_parameters.get(), size_parameters);
-			DECODER_DEBUG_LOG("magma(%p): magma_virt_connection_create_image(parameters:%p(%u) parameter_count:%lu )", stream, (uint64_t*)(outptr_parameters.get()), size_parameters, var_parameter_count);
-			*(magma_status_t *)(&tmpBuf[0 + size_parameters]) = 			this->magma_virt_connection_create_image((uint64_t*)(outptr_parameters.get()), var_parameter_count);
-			outptr_parameters.flush();
+			OutputBuffer outptr_size_out(&tmpBuf[0], size_size_out);
+			OutputBuffer outptr_image_out(&tmpBuf[0 + size_size_out], size_image_out);
+			OutputBuffer outptr_buffer_id_out(&tmpBuf[0 + size_size_out + size_image_out], size_buffer_id_out);
+			DECODER_DEBUG_LOG("magma(%p): magma_virt_connection_create_image(connection:%lu create_info:%p(%u) size_out:%p(%u) image_out:%p(%u) buffer_id_out:%p(%u) )", stream, var_connection, (magma_image_create_info_t*)(inptr_create_info.get()), size_create_info, (uint64_t*)(outptr_size_out.get()), size_size_out, (magma_buffer_t*)(outptr_image_out.get()), size_image_out, (magma_buffer_id_t*)(outptr_buffer_id_out.get()), size_buffer_id_out);
+			*(magma_status_t *)(&tmpBuf[0 + size_size_out + size_image_out + size_buffer_id_out]) = 			this->magma_virt_connection_create_image(var_connection, (magma_image_create_info_t*)(inptr_create_info.get()), (uint64_t*)(outptr_size_out.get()), (magma_buffer_t*)(outptr_image_out.get()), (magma_buffer_id_t*)(outptr_buffer_id_out.get()));
+			outptr_size_out.flush();
+			outptr_image_out.flush();
+			outptr_buffer_id_out.flush();
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
 			}
@@ -1077,22 +1149,21 @@
 		}
 		case OP_magma_virt_connection_get_image_info: {
 			android::base::beginTrace("magma_virt_connection_get_image_info decode");
-			uint32_t size_parameters __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8);
-			InputBuffer inptr_parameters(ptr + 8 + 4, size_parameters);
-			uint64_t var_parameter_count = Unpack<uint64_t,uint64_t>(ptr + 8 + 4 + size_parameters);
+			magma_connection_t var_connection = Unpack<magma_connection_t,uint64_t>(ptr + 8);
+			magma_buffer_t var_image = Unpack<magma_buffer_t,uint64_t>(ptr + 8 + 8);
+			uint32_t size_image_info_out __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 8 + 8);
 			if (useChecksum) {
-				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + size_parameters + 8, ptr + 8 + 4 + size_parameters + 8, checksumSize,
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 8 + 8 + 4, ptr + 8 + 8 + 8 + 4, checksumSize,
 					"magma_decoder_context_t::decode, OP_magma_virt_connection_get_image_info: GL checksumCalculator failure\n");
 			}
-			size_t totalTmpSize = size_parameters;
+			size_t totalTmpSize = size_image_info_out;
 			totalTmpSize += sizeof(magma_status_t);
 			totalTmpSize += checksumSize;
 			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
-			OutputBuffer outptr_parameters(&tmpBuf[0], size_parameters);
-			memcpy(outptr_parameters.get(), inptr_parameters.get(), size_parameters);
-			DECODER_DEBUG_LOG("magma(%p): magma_virt_connection_get_image_info(parameters:%p(%u) parameter_count:%lu )", stream, (uint64_t*)(outptr_parameters.get()), size_parameters, var_parameter_count);
-			*(magma_status_t *)(&tmpBuf[0 + size_parameters]) = 			this->magma_virt_connection_get_image_info((uint64_t*)(outptr_parameters.get()), var_parameter_count);
-			outptr_parameters.flush();
+			OutputBuffer outptr_image_info_out(&tmpBuf[0], size_image_info_out);
+			DECODER_DEBUG_LOG("magma(%p): magma_virt_connection_get_image_info(connection:%lu image:%lu image_info_out:%p(%u) )", stream, var_connection, var_image, (magma_image_info_t*)(outptr_image_info_out.get()), size_image_info_out);
+			*(magma_status_t *)(&tmpBuf[0 + size_image_info_out]) = 			this->magma_virt_connection_get_image_info(var_connection, var_image, (magma_image_info_t*)(outptr_image_info_out.get()));
+			outptr_image_info_out.flush();
 			if (useChecksum) {
 				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
 			}
diff --git a/stream-servers/magma/magma_dec/magma_opcodes.h b/stream-servers/magma/magma_dec/magma_opcodes.h
index aaa3451..f1b6a10 100644
--- a/stream-servers/magma/magma_dec/magma_opcodes.h
+++ b/stream-servers/magma/magma_dec/magma_opcodes.h
@@ -21,35 +21,38 @@
 #define OP_magma_connection_map_buffer 					100015
 #define OP_magma_connection_unmap_buffer 					100016
 #define OP_magma_connection_execute_command 					100017
-#define OP_magma_connection_execute_immediate_commands 					100018
-#define OP_magma_connection_flush 					100019
-#define OP_magma_connection_get_notification_channel_handle 					100020
-#define OP_magma_connection_read_notification_channel 					100021
-#define OP_magma_buffer_clean_cache 					100022
-#define OP_magma_buffer_set_cache_policy 					100023
-#define OP_magma_buffer_get_cache_policy 					100024
-#define OP_magma_buffer_set_name 					100025
-#define OP_magma_buffer_get_info 					100026
-#define OP_magma_buffer_get_handle 					100027
-#define OP_magma_buffer_export 					100028
-#define OP_magma_semaphore_signal 					100029
-#define OP_magma_semaphore_reset 					100030
-#define OP_magma_semaphore_export 					100031
-#define OP_magma_poll 					100032
-#define OP_magma_initialize_tracing 					100033
-#define OP_magma_initialize_logging 					100034
-#define OP_magma_connection_enable_performance_counter_access 					100035
-#define OP_magma_connection_enable_performance_counters 					100036
-#define OP_magma_connection_create_performance_counter_buffer_pool 					100037
-#define OP_magma_connection_release_performance_counter_buffer_pool 					100038
-#define OP_magma_connection_add_performance_counter_buffer_offsets_to_pool 					100039
-#define OP_magma_connection_remove_performance_counter_buffer_from_pool 					100040
-#define OP_magma_connection_dump_performance_counters 					100041
-#define OP_magma_connection_clear_performance_counters 					100042
-#define OP_magma_connection_read_performance_counter_completion 					100043
-#define OP_magma_virt_connection_create_image 					100044
-#define OP_magma_virt_connection_get_image_info 					100045
-#define OP_last 					100046
+#define OP_magma_connection_execute_command_fudge 					100018
+#define OP_magma_connection_execute_immediate_commands 					100019
+#define OP_magma_connection_execute_immediate_commands_fudge 					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_clean_cache 					100024
+#define OP_magma_buffer_set_cache_policy 					100025
+#define OP_magma_buffer_get_cache_policy 					100026
+#define OP_magma_buffer_set_name 					100027
+#define OP_magma_buffer_set_name_fudge 					100028
+#define OP_magma_buffer_get_info 					100029
+#define OP_magma_buffer_get_handle 					100030
+#define OP_magma_buffer_export 					100031
+#define OP_magma_semaphore_signal 					100032
+#define OP_magma_semaphore_reset 					100033
+#define OP_magma_semaphore_export 					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/stream-servers/magma/magma_dec/magma_server_context.cpp b/stream-servers/magma/magma_dec/magma_server_context.cpp
index 33872cb..a9a30ff 100644
--- a/stream-servers/magma/magma_dec/magma_server_context.cpp
+++ b/stream-servers/magma/magma_dec/magma_server_context.cpp
@@ -28,7 +28,9 @@
 	magma_connection_map_buffer = (magma_connection_map_buffer_server_proc_t) getProc("magma_connection_map_buffer", userData);
 	magma_connection_unmap_buffer = (magma_connection_unmap_buffer_server_proc_t) getProc("magma_connection_unmap_buffer", userData);
 	magma_connection_execute_command = (magma_connection_execute_command_server_proc_t) getProc("magma_connection_execute_command", userData);
+	magma_connection_execute_command_fudge = (magma_connection_execute_command_fudge_server_proc_t) getProc("magma_connection_execute_command_fudge", userData);
 	magma_connection_execute_immediate_commands = (magma_connection_execute_immediate_commands_server_proc_t) getProc("magma_connection_execute_immediate_commands", userData);
+	magma_connection_execute_immediate_commands_fudge = (magma_connection_execute_immediate_commands_fudge_server_proc_t) getProc("magma_connection_execute_immediate_commands_fudge", userData);
 	magma_connection_flush = (magma_connection_flush_server_proc_t) getProc("magma_connection_flush", userData);
 	magma_connection_get_notification_channel_handle = (magma_connection_get_notification_channel_handle_server_proc_t) getProc("magma_connection_get_notification_channel_handle", userData);
 	magma_connection_read_notification_channel = (magma_connection_read_notification_channel_server_proc_t) getProc("magma_connection_read_notification_channel", userData);
@@ -36,6 +38,7 @@
 	magma_buffer_set_cache_policy = (magma_buffer_set_cache_policy_server_proc_t) getProc("magma_buffer_set_cache_policy", userData);
 	magma_buffer_get_cache_policy = (magma_buffer_get_cache_policy_server_proc_t) getProc("magma_buffer_get_cache_policy", userData);
 	magma_buffer_set_name = (magma_buffer_set_name_server_proc_t) getProc("magma_buffer_set_name", userData);
+	magma_buffer_set_name_fudge = (magma_buffer_set_name_fudge_server_proc_t) getProc("magma_buffer_set_name_fudge", userData);
 	magma_buffer_get_info = (magma_buffer_get_info_server_proc_t) getProc("magma_buffer_get_info", userData);
 	magma_buffer_get_handle = (magma_buffer_get_handle_server_proc_t) getProc("magma_buffer_get_handle", userData);
 	magma_buffer_export = (magma_buffer_export_server_proc_t) getProc("magma_buffer_export", userData);
diff --git a/stream-servers/magma/magma_dec/magma_server_context.h b/stream-servers/magma/magma_dec/magma_server_context.h
index e2ae50b..7ddfee0 100644
--- a/stream-servers/magma/magma_dec/magma_server_context.h
+++ b/stream-servers/magma/magma_dec/magma_server_context.h
@@ -28,7 +28,9 @@
 	magma_connection_map_buffer_server_proc_t magma_connection_map_buffer;
 	magma_connection_unmap_buffer_server_proc_t magma_connection_unmap_buffer;
 	magma_connection_execute_command_server_proc_t magma_connection_execute_command;
+	magma_connection_execute_command_fudge_server_proc_t magma_connection_execute_command_fudge;
 	magma_connection_execute_immediate_commands_server_proc_t magma_connection_execute_immediate_commands;
+	magma_connection_execute_immediate_commands_fudge_server_proc_t magma_connection_execute_immediate_commands_fudge;
 	magma_connection_flush_server_proc_t magma_connection_flush;
 	magma_connection_get_notification_channel_handle_server_proc_t magma_connection_get_notification_channel_handle;
 	magma_connection_read_notification_channel_server_proc_t magma_connection_read_notification_channel;
@@ -36,6 +38,7 @@
 	magma_buffer_set_cache_policy_server_proc_t magma_buffer_set_cache_policy;
 	magma_buffer_get_cache_policy_server_proc_t magma_buffer_get_cache_policy;
 	magma_buffer_set_name_server_proc_t magma_buffer_set_name;
+	magma_buffer_set_name_fudge_server_proc_t magma_buffer_set_name_fudge;
 	magma_buffer_get_info_server_proc_t magma_buffer_get_info;
 	magma_buffer_get_handle_server_proc_t magma_buffer_get_handle;
 	magma_buffer_export_server_proc_t magma_buffer_export;
diff --git a/stream-servers/magma/magma_dec/magma_server_proc.h b/stream-servers/magma/magma_dec/magma_server_proc.h
index 5206cc5..b7dec32 100644
--- a/stream-servers/magma/magma_dec/magma_server_proc.h
+++ b/stream-servers/magma/magma_dec/magma_server_proc.h
@@ -29,16 +29,19 @@
 typedef magma_status_t (magma_APIENTRY *magma_connection_perform_buffer_op_server_proc_t) (magma_connection_t, magma_buffer_t, uint32_t, uint64_t, uint64_t);
 typedef magma_status_t (magma_APIENTRY *magma_connection_map_buffer_server_proc_t) (magma_connection_t, uint64_t, magma_buffer_t, uint64_t, uint64_t, uint64_t);
 typedef void (magma_APIENTRY *magma_connection_unmap_buffer_server_proc_t) (magma_connection_t, uint64_t, magma_buffer_t);
-typedef magma_status_t (magma_APIENTRY *magma_connection_execute_command_server_proc_t) (uint64_t*, uint64_t);
-typedef magma_status_t (magma_APIENTRY *magma_connection_execute_immediate_commands_server_proc_t) (uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_execute_command_server_proc_t) (magma_connection_t, uint32_t, magma_command_descriptor_t*);
+typedef magma_status_t (magma_APIENTRY *magma_connection_execute_command_fudge_server_proc_t) (magma_connection_t, uint32_t, void*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_execute_immediate_commands_server_proc_t) (magma_connection_t, uint32_t, uint64_t, magma_inline_command_buffer_t*);
+typedef magma_status_t (magma_APIENTRY *magma_connection_execute_immediate_commands_fudge_server_proc_t) (magma_connection_t, uint32_t, uint64_t, void*, uint64_t, uint64_t*);
 typedef magma_status_t (magma_APIENTRY *magma_connection_flush_server_proc_t) (magma_connection_t);
 typedef magma_handle_t (magma_APIENTRY *magma_connection_get_notification_channel_handle_server_proc_t) (magma_connection_t);
 typedef magma_status_t (magma_APIENTRY *magma_connection_read_notification_channel_server_proc_t) (magma_connection_t, void*, uint64_t, uint64_t*, magma_bool_t*);
 typedef magma_status_t (magma_APIENTRY *magma_buffer_clean_cache_server_proc_t) (magma_buffer_t, uint64_t, uint64_t, magma_cache_operation_t);
 typedef magma_status_t (magma_APIENTRY *magma_buffer_set_cache_policy_server_proc_t) (magma_buffer_t, magma_cache_policy_t);
 typedef magma_status_t (magma_APIENTRY *magma_buffer_get_cache_policy_server_proc_t) (magma_buffer_t, magma_cache_policy_t*);
-typedef magma_status_t (magma_APIENTRY *magma_buffer_set_name_server_proc_t) (magma_buffer_t, void*, uint64_t);
-typedef magma_status_t (magma_APIENTRY *magma_buffer_get_info_server_proc_t) (uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_buffer_set_name_server_proc_t) (magma_buffer_t, const char*);
+typedef magma_status_t (magma_APIENTRY *magma_buffer_set_name_fudge_server_proc_t) (magma_buffer_t, void*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_buffer_get_info_server_proc_t) (magma_buffer_t, magma_buffer_info_t*);
 typedef magma_status_t (magma_APIENTRY *magma_buffer_get_handle_server_proc_t) (magma_buffer_t, magma_handle_t*);
 typedef magma_status_t (magma_APIENTRY *magma_buffer_export_server_proc_t) (magma_buffer_t, magma_handle_t*);
 typedef void (magma_APIENTRY *magma_semaphore_signal_server_proc_t) (magma_semaphore_t);
@@ -51,13 +54,13 @@
 typedef magma_status_t (magma_APIENTRY *magma_connection_enable_performance_counters_server_proc_t) (magma_connection_t, uint64_t*, uint64_t);
 typedef magma_status_t (magma_APIENTRY *magma_connection_create_performance_counter_buffer_pool_server_proc_t) (magma_connection_t, magma_perf_count_pool_t*, magma_handle_t*);
 typedef magma_status_t (magma_APIENTRY *magma_connection_release_performance_counter_buffer_pool_server_proc_t) (magma_connection_t, magma_perf_count_pool_t);
-typedef magma_status_t (magma_APIENTRY *magma_connection_add_performance_counter_buffer_offsets_to_pool_server_proc_t) (uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_connection_add_performance_counter_buffer_offsets_to_pool_server_proc_t) (magma_connection_t, magma_perf_count_pool_t, const magma_buffer_offset_t*, uint64_t);
 typedef magma_status_t (magma_APIENTRY *magma_connection_remove_performance_counter_buffer_from_pool_server_proc_t) (magma_connection_t, magma_perf_count_pool_t, magma_buffer_t);
 typedef magma_status_t (magma_APIENTRY *magma_connection_dump_performance_counters_server_proc_t) (magma_connection_t, magma_perf_count_pool_t, uint32_t);
 typedef magma_status_t (magma_APIENTRY *magma_connection_clear_performance_counters_server_proc_t) (magma_connection_t, uint64_t*, uint64_t);
 typedef magma_status_t (magma_APIENTRY *magma_connection_read_performance_counter_completion_server_proc_t) (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_server_proc_t) (uint64_t*, uint64_t);
-typedef magma_status_t (magma_APIENTRY *magma_virt_connection_get_image_info_server_proc_t) (uint64_t*, uint64_t);
+typedef magma_status_t (magma_APIENTRY *magma_virt_connection_create_image_server_proc_t) (magma_connection_t, magma_image_create_info_t*, uint64_t*, magma_buffer_t*, magma_buffer_id_t*);
+typedef magma_status_t (magma_APIENTRY *magma_virt_connection_get_image_info_server_proc_t) (magma_connection_t, magma_buffer_t, magma_image_info_t*);
 
 
 #endif