Add rcGetHostExtensions()

... to eventually prevent calling rcGetGlString() in non-GL
specific contexts (which guest HostConnection calls by default).

Bug: b/233939967
Test: cvd start --gpu_mode=gfxstream
Change-Id: I864c29707d963991455fa5b505f0c0e70a8d7b28
diff --git a/system/renderControl_enc/renderControl_client_context.cpp b/system/renderControl_enc/renderControl_client_context.cpp
index 1659873..ae73135 100644
--- a/system/renderControl_enc/renderControl_client_context.cpp
+++ b/system/renderControl_enc/renderControl_client_context.cpp
@@ -79,6 +79,7 @@
 	rcGetFBDisplayConfigsParam = (rcGetFBDisplayConfigsParam_client_proc_t) getProc("rcGetFBDisplayConfigsParam", userData);
 	rcGetFBDisplayActiveConfig = (rcGetFBDisplayActiveConfig_client_proc_t) getProc("rcGetFBDisplayActiveConfig", userData);
 	rcSetProcessMetadata = (rcSetProcessMetadata_client_proc_t) getProc("rcSetProcessMetadata", userData);
+	rcGetHostExtensionsString = (rcGetHostExtensionsString_client_proc_t) getProc("rcGetHostExtensionsString", userData);
 	return 0;
 }
 
diff --git a/system/renderControl_enc/renderControl_client_context.h b/system/renderControl_enc/renderControl_client_context.h
index 3248cdf..e85bd01 100644
--- a/system/renderControl_enc/renderControl_client_context.h
+++ b/system/renderControl_enc/renderControl_client_context.h
@@ -79,6 +79,7 @@
 	rcGetFBDisplayConfigsParam_client_proc_t rcGetFBDisplayConfigsParam;
 	rcGetFBDisplayActiveConfig_client_proc_t rcGetFBDisplayActiveConfig;
 	rcSetProcessMetadata_client_proc_t rcSetProcessMetadata;
+	rcGetHostExtensionsString_client_proc_t rcGetHostExtensionsString;
 	virtual ~renderControl_client_context_t() {}
 
 	typedef renderControl_client_context_t *CONTEXT_ACCESSOR_TYPE(void);
diff --git a/system/renderControl_enc/renderControl_client_proc.h b/system/renderControl_enc/renderControl_client_proc.h
index dfe37dc..c6a03ae 100644
--- a/system/renderControl_enc/renderControl_client_proc.h
+++ b/system/renderControl_enc/renderControl_client_proc.h
@@ -81,6 +81,7 @@
 typedef int (renderControl_APIENTRY *rcGetFBDisplayConfigsParam_client_proc_t) (void * ctx, int, EGLint);
 typedef int (renderControl_APIENTRY *rcGetFBDisplayActiveConfig_client_proc_t) (void * ctx);
 typedef void (renderControl_APIENTRY *rcSetProcessMetadata_client_proc_t) (void * ctx, char*, RenderControlByte*, uint32_t);
+typedef int (renderControl_APIENTRY *rcGetHostExtensionsString_client_proc_t) (void * ctx, uint32_t, void*);
 
 
 #endif
diff --git a/system/renderControl_enc/renderControl_enc.cpp b/system/renderControl_enc/renderControl_enc.cpp
index 4ddbdbd..3d3dc7e 100644
--- a/system/renderControl_enc/renderControl_enc.cpp
+++ b/system/renderControl_enc/renderControl_enc.cpp
@@ -2768,6 +2768,52 @@
 
 }
 
+int rcGetHostExtensionsString_enc(void *self , uint32_t bufferSize, void* buffer)
+{
+	ENCODER_DEBUG_LOG("rcGetHostExtensionsString(bufferSize:0x%08x, buffer:0x%08x)", bufferSize, buffer);
+	AEMU_SCOPED_TRACE("rcGetHostExtensionsString encode");
+
+	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_buffer =  bufferSize;
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 4 + 0 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_rcGetHostExtensionsString;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &bufferSize, 4); ptr += 4;
+	memcpy(ptr, &__size_buffer, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	stream->readback(buffer, __size_buffer);
+	if (useChecksum) checksumCalculator->addBuffer(buffer, __size_buffer);
+
+	int 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("rcGetHostExtensionsString: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
 }  // namespace
 
 renderControl_encoder_context_t::renderControl_encoder_context_t(IOStream *stream, ChecksumCalculator *checksumCalculator)
@@ -2844,5 +2890,6 @@
 	this->rcGetFBDisplayConfigsParam = &rcGetFBDisplayConfigsParam_enc;
 	this->rcGetFBDisplayActiveConfig = &rcGetFBDisplayActiveConfig_enc;
 	this->rcSetProcessMetadata = &rcSetProcessMetadata_enc;
+	this->rcGetHostExtensionsString = &rcGetHostExtensionsString_enc;
 }
 
diff --git a/system/renderControl_enc/renderControl_entry.cpp b/system/renderControl_enc/renderControl_entry.cpp
index e05e6de..859b004 100644
--- a/system/renderControl_enc/renderControl_entry.cpp
+++ b/system/renderControl_enc/renderControl_entry.cpp
@@ -74,6 +74,7 @@
 	int rcGetFBDisplayConfigsParam(int configId, EGLint param);
 	int rcGetFBDisplayActiveConfig();
 	void rcSetProcessMetadata(char* key, RenderControlByte* valuePtr, uint32_t valueSize);
+	int rcGetHostExtensionsString(uint32_t bufferSize, void* buffer);
 };
 
 #ifndef GET_CONTEXT
@@ -496,3 +497,9 @@
 	ctx->rcSetProcessMetadata(ctx, key, valuePtr, valueSize);
 }
 
+int rcGetHostExtensionsString(uint32_t bufferSize, void* buffer)
+{
+	GET_CONTEXT;
+	return ctx->rcGetHostExtensionsString(ctx, bufferSize, buffer);
+}
+
diff --git a/system/renderControl_enc/renderControl_ftable.h b/system/renderControl_enc/renderControl_ftable.h
index b691a54..368cc79 100644
--- a/system/renderControl_enc/renderControl_ftable.h
+++ b/system/renderControl_enc/renderControl_ftable.h
@@ -77,6 +77,7 @@
 	{"rcGetFBDisplayConfigsParam", (void*)rcGetFBDisplayConfigsParam},
 	{"rcGetFBDisplayActiveConfig", (void*)rcGetFBDisplayActiveConfig},
 	{"rcSetProcessMetadata", (void*)rcSetProcessMetadata},
+	{"rcGetHostExtensionsString", (void*)rcGetHostExtensionsString},
 };
 static const int renderControl_num_funcs = sizeof(renderControl_funcs_by_name) / sizeof(struct _renderControl_funcs_by_name);
 
diff --git a/system/renderControl_enc/renderControl_opcodes.h b/system/renderControl_enc/renderControl_opcodes.h
index ddb1f73..25cb345 100644
--- a/system/renderControl_enc/renderControl_opcodes.h
+++ b/system/renderControl_enc/renderControl_opcodes.h
@@ -72,7 +72,8 @@
 #define OP_rcGetFBDisplayConfigsParam 					10066
 #define OP_rcGetFBDisplayActiveConfig 					10067
 #define OP_rcSetProcessMetadata 					10068
-#define OP_last 					10069
+#define OP_rcGetHostExtensionsString 					10069
+#define OP_last 					10070
 
 
 #endif