[magma] Add device query fudge method
This change adds a magma_device_query_fudge method to the magma
protocol, allowing direct use of mapping IDs. It also allows
use of guest-allocated buffers.
Bug: b/277219980
Bug: b/272307395
Test: meson build && ninja -C build system/magma/libmagma.a
Change-Id: Ide0b5287c3d7c4e36173a3be3a17758fb2771587
diff --git a/guest/magma/magma_enc/magma_client_context.cpp b/guest/magma/magma_enc/magma_client_context.cpp
index 298c11f..816bc02 100644
--- a/guest/magma/magma_enc/magma_client_context.cpp
+++ b/guest/magma/magma_enc/magma_client_context.cpp
@@ -13,6 +13,7 @@
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_query_fudge = (magma_device_query_fudge_client_proc_t) getProc("magma_device_query_fudge", 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);
diff --git a/guest/magma/magma_enc/magma_client_context.h b/guest/magma/magma_enc/magma_client_context.h
index 7502894..e5c77b7 100644
--- a/guest/magma/magma_enc/magma_client_context.h
+++ b/guest/magma/magma_enc/magma_client_context.h
@@ -13,6 +13,7 @@
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_query_fudge_client_proc_t magma_device_query_fudge;
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;
diff --git a/guest/magma/magma_enc/magma_client_proc.h b/guest/magma/magma_enc/magma_client_proc.h
index 8d68f36..c7d7ff7 100644
--- a/guest/magma/magma_enc/magma_client_proc.h
+++ b/guest/magma/magma_enc/magma_client_proc.h
@@ -15,6 +15,7 @@
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_query_fudge_client_proc_t) (void * ctx, magma_device_t, uint64_t, magma_bool_t, uint64_t*, uint64_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);
diff --git a/guest/magma/magma_enc/magma_enc.cpp b/guest/magma/magma_enc/magma_enc.cpp
index 4b41c12..819f9bc 100644
--- a/guest/magma/magma_enc/magma_enc.cpp
+++ b/guest/magma/magma_enc/magma_enc.cpp
@@ -151,6 +151,64 @@
return retval;
}
+magma_status_t magma_device_query_fudge_enc(void *self , magma_device_t device, uint64_t id, magma_bool_t host_allocate, uint64_t* result_buffer_mapping_id_inout, uint64_t* result_buffer_size_inout, uint64_t* result_out)
+{
+ ENCODER_DEBUG_LOG("magma_device_query_fudge(device:%lu, id:%lu, host_allocate:%hhu, result_buffer_mapping_id_inout:%p, result_buffer_size_inout:%p, result_out:%p)", device, id, host_allocate, result_buffer_mapping_id_inout, result_buffer_size_inout, result_out);
+ AEMU_SCOPED_TRACE("magma_device_query_fudge 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_mapping_id_inout = sizeof(uint64_t);
+ const unsigned int __size_result_buffer_size_inout = sizeof(uint64_t);
+ const unsigned int __size_result_out = sizeof(uint64_t);
+ unsigned char *ptr;
+ unsigned char *buf;
+ const size_t sizeWithoutChecksum = 8 + 8 + 8 + 1 + __size_result_buffer_mapping_id_inout + __size_result_buffer_size_inout + 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_device_query_fudge;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, &host_allocate, 1); ptr += 1;
+ memcpy(ptr, &__size_result_buffer_mapping_id_inout, 4); ptr += 4;
+ memcpy(ptr, result_buffer_mapping_id_inout, __size_result_buffer_mapping_id_inout);ptr += __size_result_buffer_mapping_id_inout;
+ memcpy(ptr, &__size_result_buffer_size_inout, 4); ptr += 4;
+ memcpy(ptr, result_buffer_size_inout, __size_result_buffer_size_inout);ptr += __size_result_buffer_size_inout;
+ 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_mapping_id_inout, __size_result_buffer_mapping_id_inout);
+ if (useChecksum) checksumCalculator->addBuffer(result_buffer_mapping_id_inout, __size_result_buffer_mapping_id_inout);
+ stream->readback(result_buffer_size_inout, __size_result_buffer_size_inout);
+ if (useChecksum) checksumCalculator->addBuffer(result_buffer_size_inout, __size_result_buffer_size_inout);
+ 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_fudge: 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);
@@ -2194,6 +2252,7 @@
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_query_fudge = &magma_device_query_fudge_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;
diff --git a/guest/magma/magma_enc/magma_entry.cpp b/guest/magma/magma_enc/magma_entry.cpp
index f34c10e..3065cfa 100644
--- a/guest/magma/magma_enc/magma_entry.cpp
+++ b/guest/magma/magma_enc/magma_entry.cpp
@@ -8,6 +8,7 @@
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_query_fudge(magma_device_t device, uint64_t id, magma_bool_t host_allocate, uint64_t* result_buffer_mapping_id_inout, uint64_t* result_buffer_size_inout, 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);
@@ -80,6 +81,12 @@
return ctx->magma_device_query(ctx, device, id, result_buffer_out, result_out);
}
+magma_status_t magma_device_query_fudge(magma_device_t device, uint64_t id, magma_bool_t host_allocate, uint64_t* result_buffer_mapping_id_inout, uint64_t* result_buffer_size_inout, uint64_t* result_out)
+{
+ GET_CONTEXT;
+ return ctx->magma_device_query_fudge(ctx, device, id, host_allocate, result_buffer_mapping_id_inout, result_buffer_size_inout, result_out);
+}
+
magma_status_t magma_device_create_connection(magma_device_t device, magma_connection_t* connection_out)
{
GET_CONTEXT;
diff --git a/guest/magma/magma_enc/magma_ftable.h b/guest/magma/magma_enc/magma_ftable.h
index 03bc1b5..d5257d8 100644
--- a/guest/magma/magma_enc/magma_ftable.h
+++ b/guest/magma/magma_enc/magma_ftable.h
@@ -11,6 +11,7 @@
{"magma_device_import", (void*)magma_device_import},
{"magma_device_release", (void*)magma_device_release},
{"magma_device_query", (void*)magma_device_query},
+ {"magma_device_query_fudge", (void*)magma_device_query_fudge},
{"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},
diff --git a/guest/magma/magma_enc/magma_opcodes.h b/guest/magma/magma_enc/magma_opcodes.h
index f1b6a10..955944f 100644
--- a/guest/magma/magma_enc/magma_opcodes.h
+++ b/guest/magma/magma_enc/magma_opcodes.h
@@ -6,53 +6,54 @@
#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_import_buffer 100010
-#define OP_magma_connection_create_semaphore 100011
-#define OP_magma_connection_release_semaphore 100012
-#define OP_magma_connection_import_semaphore 100013
-#define OP_magma_connection_perform_buffer_op 100014
-#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_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
+#define OP_magma_device_query_fudge 100003
+#define OP_magma_device_create_connection 100004
+#define OP_magma_connection_release 100005
+#define OP_magma_connection_get_error 100006
+#define OP_magma_connection_create_context 100007
+#define OP_magma_connection_release_context 100008
+#define OP_magma_connection_create_buffer 100009
+#define OP_magma_connection_release_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_import_semaphore 100014
+#define OP_magma_connection_perform_buffer_op 100015
+#define OP_magma_connection_map_buffer 100016
+#define OP_magma_connection_unmap_buffer 100017
+#define OP_magma_connection_execute_command 100018
+#define OP_magma_connection_execute_command_fudge 100019
+#define OP_magma_connection_execute_immediate_commands 100020
+#define OP_magma_connection_execute_immediate_commands_fudge 100021
+#define OP_magma_connection_flush 100022
+#define OP_magma_connection_get_notification_channel_handle 100023
+#define OP_magma_connection_read_notification_channel 100024
+#define OP_magma_buffer_clean_cache 100025
+#define OP_magma_buffer_set_cache_policy 100026
+#define OP_magma_buffer_get_cache_policy 100027
+#define OP_magma_buffer_set_name 100028
+#define OP_magma_buffer_set_name_fudge 100029
+#define OP_magma_buffer_get_info 100030
+#define OP_magma_buffer_get_handle 100031
+#define OP_magma_buffer_export 100032
+#define OP_magma_semaphore_signal 100033
+#define OP_magma_semaphore_reset 100034
+#define OP_magma_semaphore_export 100035
+#define OP_magma_poll 100036
+#define OP_magma_initialize_tracing 100037
+#define OP_magma_initialize_logging 100038
+#define OP_magma_connection_enable_performance_counter_access 100039
+#define OP_magma_connection_enable_performance_counters 100040
+#define OP_magma_connection_create_performance_counter_buffer_pool 100041
+#define OP_magma_connection_release_performance_counter_buffer_pool 100042
+#define OP_magma_connection_add_performance_counter_buffer_offsets_to_pool 100043
+#define OP_magma_connection_remove_performance_counter_buffer_from_pool 100044
+#define OP_magma_connection_dump_performance_counters 100045
+#define OP_magma_connection_clear_performance_counters 100046
+#define OP_magma_connection_read_performance_counter_completion 100047
+#define OP_magma_virt_connection_create_image 100048
+#define OP_magma_virt_connection_get_image_info 100049
+#define OP_last 100050
#endif