Add rcGetHostExtensions()

... to eventually prevent calling rcGetGlString() in non-GL
specific contexts (which guest HostConnection calls by default).
For now, this just defaults to rcGetGlString(GL_EXTENSIONS).
Upcoming refactoring for b/233939967 will update this.

Bug: b/233939967
Test: cvd start --gpu_mode=gfxstream
Change-Id: Icbdfafe9f201dddd2dac5a05b9cb30a893c16690
diff --git a/protocols/renderControl/renderControl.attrib b/protocols/renderControl/renderControl.attrib
index 16f2f12..8d0e851 100644
--- a/protocols/renderControl/renderControl.attrib
+++ b/protocols/renderControl/renderControl.attrib
@@ -120,3 +120,7 @@
 rcSetProcessMetadata
     len key (strlen(key) + 1)
     len valuePtr valueSize
+
+rcGetHostExtensionsString
+    dir buffer out
+    len buffer bufferSize
\ No newline at end of file
diff --git a/protocols/renderControl/renderControl.in b/protocols/renderControl/renderControl.in
index 7a2a88e..696a0cf 100644
--- a/protocols/renderControl/renderControl.in
+++ b/protocols/renderControl/renderControl.in
@@ -67,3 +67,4 @@
 GL_ENTRY(int, rcGetFBDisplayConfigsParam, int configId, EGLint param);
 GL_ENTRY(int, rcGetFBDisplayActiveConfig);
 GL_ENTRY(void, rcSetProcessMetadata, char* key, RenderControlByte* valuePtr, uint32_t valueSize);
+GL_ENTRY(int, rcGetHostExtensionsString, uint32_t bufferSize, void *buffer);
diff --git a/stream-servers/RenderControl.cpp b/stream-servers/RenderControl.cpp
index fe10e8f..ddb492a 100644
--- a/stream-servers/RenderControl.cpp
+++ b/stream-servers/RenderControl.cpp
@@ -1560,6 +1560,11 @@
     }
 }
 
+static int rcGetHostExtensionsString(uint32_t bufferSize, void* buffer) {
+    // TODO(b/233939967): split off host extensions from GL extensions.
+    return rcGetGLString(GL_EXTENSIONS, buffer, bufferSize);
+}
+
 void initRenderControlContext(renderControl_decoder_context_t *dec)
 {
     dec->rcGetRendererVersion = rcGetRendererVersion;
@@ -1628,4 +1633,5 @@
     dec->rcSetDisplayPoseDpi = rcSetDisplayPoseDpi;
     dec->rcReadColorBufferDMA = rcReadColorBufferDMA;
     dec->rcSetProcessMetadata = rcSetProcessMetadata;
+    dec->rcGetHostExtensionsString = rcGetHostExtensionsString;
 }
diff --git a/stream-servers/renderControl_dec/renderControl_dec.cpp b/stream-servers/renderControl_dec/renderControl_dec.cpp
index 36b3c7a..7a3a902 100644
--- a/stream-servers/renderControl_dec/renderControl_dec.cpp
+++ b/stream-servers/renderControl_dec/renderControl_dec.cpp
@@ -1438,6 +1438,30 @@
 			android::base::endTrace();
 			break;
 		}
+		case OP_rcGetHostExtensionsString: {
+			android::base::beginTrace("rcGetHostExtensionsString decode");
+			uint32_t var_bufferSize = Unpack<uint32_t,uint32_t>(ptr + 8);
+			uint32_t size_buffer __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 4);
+			if (useChecksum) {
+				ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + 4, ptr + 8 + 4 + 4, checksumSize,
+					"renderControl_decoder_context_t::decode, OP_rcGetHostExtensionsString: GL checksumCalculator failure\n");
+			}
+			size_t totalTmpSize = size_buffer;
+			totalTmpSize += sizeof(int);
+			totalTmpSize += checksumSize;
+			unsigned char *tmpBuf = stream->alloc(totalTmpSize);
+			OutputBuffer outptr_buffer(&tmpBuf[0], size_buffer);
+			DECODER_DEBUG_LOG("renderControl(%p): rcGetHostExtensionsString(bufferSize:0x%08x buffer:%p(%u) )", stream, var_bufferSize, (void*)(outptr_buffer.get()), size_buffer);
+			*(int *)(&tmpBuf[0 + size_buffer]) = 			this->rcGetHostExtensionsString(var_bufferSize, (void*)(outptr_buffer.get()));
+			outptr_buffer.flush();
+			if (useChecksum) {
+				ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize);
+			}
+			stream->flush();
+			SET_LASTCALL("rcGetHostExtensionsString");
+			android::base::endTrace();
+			break;
+		}
 		default:
 			return ptr - (unsigned char*)buf;
 		} //switch
diff --git a/stream-servers/renderControl_dec/renderControl_opcodes.h b/stream-servers/renderControl_dec/renderControl_opcodes.h
index ddb1f73..25cb345 100644
--- a/stream-servers/renderControl_dec/renderControl_opcodes.h
+++ b/stream-servers/renderControl_dec/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
diff --git a/stream-servers/renderControl_dec/renderControl_server_context.cpp b/stream-servers/renderControl_dec/renderControl_server_context.cpp
index ec30cea..a3427b1 100644
--- a/stream-servers/renderControl_dec/renderControl_server_context.cpp
+++ b/stream-servers/renderControl_dec/renderControl_server_context.cpp
@@ -79,6 +79,7 @@
 	rcGetFBDisplayConfigsParam = (rcGetFBDisplayConfigsParam_server_proc_t) getProc("rcGetFBDisplayConfigsParam", userData);
 	rcGetFBDisplayActiveConfig = (rcGetFBDisplayActiveConfig_server_proc_t) getProc("rcGetFBDisplayActiveConfig", userData);
 	rcSetProcessMetadata = (rcSetProcessMetadata_server_proc_t) getProc("rcSetProcessMetadata", userData);
+	rcGetHostExtensionsString = (rcGetHostExtensionsString_server_proc_t) getProc("rcGetHostExtensionsString", userData);
 	return 0;
 }
 
diff --git a/stream-servers/renderControl_dec/renderControl_server_context.h b/stream-servers/renderControl_dec/renderControl_server_context.h
index b583fe5..0a54a98 100644
--- a/stream-servers/renderControl_dec/renderControl_server_context.h
+++ b/stream-servers/renderControl_dec/renderControl_server_context.h
@@ -79,6 +79,7 @@
 	rcGetFBDisplayConfigsParam_server_proc_t rcGetFBDisplayConfigsParam;
 	rcGetFBDisplayActiveConfig_server_proc_t rcGetFBDisplayActiveConfig;
 	rcSetProcessMetadata_server_proc_t rcSetProcessMetadata;
+	rcGetHostExtensionsString_server_proc_t rcGetHostExtensionsString;
 	virtual ~renderControl_server_context_t() {}
 	int initDispatchByName( void *(*getProc)(const char *name, void *userData), void *userData);
 };
diff --git a/stream-servers/renderControl_dec/renderControl_server_proc.h b/stream-servers/renderControl_dec/renderControl_server_proc.h
index 413a993..485cd3b 100644
--- a/stream-servers/renderControl_dec/renderControl_server_proc.h
+++ b/stream-servers/renderControl_dec/renderControl_server_proc.h
@@ -81,6 +81,7 @@
 typedef int (renderControl_APIENTRY *rcGetFBDisplayConfigsParam_server_proc_t) (int, EGLint);
 typedef int (renderControl_APIENTRY *rcGetFBDisplayActiveConfig_server_proc_t) ();
 typedef void (renderControl_APIENTRY *rcSetProcessMetadata_server_proc_t) (char*, RenderControlByte*, uint32_t);
+typedef int (renderControl_APIENTRY *rcGetHostExtensionsString_server_proc_t) (uint32_t, void*);
 
 
 #endif