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