[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