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