summaryrefslogtreecommitdiff
path: root/src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c')
-rw-r--r--src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c129
1 files changed, 123 insertions, 6 deletions
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c
index 1621dcfc..c4b0ab93 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c
@@ -50,14 +50,67 @@ setDefaults(void)
cr_server.uniqueWindows = 0;
- cr_server.idsPool.freeWindowID = 1;
- cr_server.idsPool.freeContextID = 1;
- cr_server.idsPool.freeClientID = 1;
-
cr_server.screenCount = 0;
- cr_server.bForceOffscreenRendering = GL_FALSE;
cr_server.bUsePBOForReadback = GL_FALSE;
- cr_server.bUseOutputRedirect = GL_FALSE;
+ cr_server.bWindowsInitiallyHidden = GL_FALSE;
+
+ cr_server.pfnNotifyEventCB = NULL;
+}
+
+int crServerVBoxParseNumerics(const char *pszStr, const int defaultVal)
+{
+ int result = 0;
+ bool neg = false;
+ unsigned char iDigit = 0;
+ if (!pszStr || pszStr[0] == '\0')
+ return defaultVal;
+
+ for (;;)
+ {
+ if (pszStr[0] == '\0')
+ return defaultVal;
+
+ if (pszStr[0] == ' ' || pszStr[0] == '\t' || pszStr[0] == '\n')
+ {
+ ++pszStr;
+ continue;
+ }
+
+ if (pszStr[0] == '-')
+ {
+ if (neg)
+ return defaultVal;
+
+ neg = true;
+ ++pszStr;
+ continue;
+ }
+
+ break;
+ }
+
+ for (;;)
+ {
+ unsigned char digit;
+ if (pszStr[0] == '\0')
+ {
+ if (!iDigit)
+ return defaultVal;
+ break;
+ }
+
+ digit = pszStr[0] - '0';
+ if (digit > 9)
+ return defaultVal;
+
+ result *= 10;
+ result += digit;
+ ++iDigit;
+
+ ++pszStr;
+ }
+
+ return !neg ? result : -result;
}
void crServerSetVBoxConfiguration()
@@ -79,6 +132,7 @@ void crServerSetVBoxConfiguration()
char hostname[1024];
char **clientchain, **clientlist;
GLint dims[4];
+ const char * env;
defaultMural = (CRMuralInfo *) crHashtableSearch(cr_server.muralTable, 0);
CRASSERT(defaultMural);
@@ -155,6 +209,37 @@ void crServerSetVBoxConfiguration()
cr_server.head_spu =
crSPULoadChain(num_spus, spu_ids, spu_names, spu_dir, &cr_server);
+ env = crGetenv( "CR_SERVER_DEFAULT_VISUAL_BITS" );
+ if (env != NULL && env[0] != '\0')
+ {
+ unsigned int bits = (unsigned int)crServerVBoxParseNumerics(env, 0);
+ if (bits <= CR_ALL_BITS)
+ cr_server.fVisualBitsDefault = bits;
+ else
+ crWarning("invalid bits option %c", bits);
+ }
+ else
+ cr_server.fVisualBitsDefault = CR_RGB_BIT | CR_ALPHA_BIT | CR_DOUBLE_BIT;
+
+ env = crGetenv("CR_SERVER_CAPS");
+ if (env && env[0] != '\0')
+ {
+ cr_server.u32Caps = crServerVBoxParseNumerics(env, 0);
+ cr_server.u32Caps &= ~(CR_VBOX_CAP_TEX_PRESENT | CR_VBOX_CAP_CMDVBVA);
+ }
+ else
+ {
+ cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT/* | CR_VBOX_CAP_CMDVBVA*/;
+#ifdef DEBUG_misha
+ cr_server.u32Caps |= CR_VBOX_CAP_CMDVBVA;
+#endif
+
+ }
+
+ crInfo("Cfg: u32Caps(%#x), fVisualBitsDefault(%#x)",
+ cr_server.u32Caps,
+ cr_server.fVisualBitsDefault);
+
/* Need to do this as early as possible */
cr_server.head_spu->dispatch_table.GetChromiumParametervCR(GL_WINDOW_POSITION_CR, 0, GL_INT, 2, &dims[0]);
@@ -258,6 +343,7 @@ void crServerSetVBoxConfigurationHGCM()
char *spu_dir = NULL;
int i;
GLint dims[4];
+ const char * env;
defaultMural = (CRMuralInfo *) crHashtableSearch(cr_server.muralTable, 0);
CRASSERT(defaultMural);
@@ -272,6 +358,37 @@ void crServerSetVBoxConfigurationHGCM()
if (!cr_server.head_spu)
return;
+
+ env = crGetenv( "CR_SERVER_DEFAULT_VISUAL_BITS" );
+ if (env != NULL && env[0] != '\0')
+ {
+ unsigned int bits = (unsigned int)crServerVBoxParseNumerics(env, 0);
+ if (bits <= CR_ALL_BITS)
+ cr_server.fVisualBitsDefault = bits;
+ else
+ crWarning("invalid bits option %c", bits);
+ }
+ else
+ cr_server.fVisualBitsDefault = CR_RGB_BIT | CR_ALPHA_BIT | CR_DOUBLE_BIT;
+
+ env = crGetenv("CR_SERVER_CAPS");
+ if (env && env[0] != '\0')
+ {
+ cr_server.u32Caps = crServerVBoxParseNumerics(env, 0);
+ cr_server.u32Caps &= ~(CR_VBOX_CAP_TEX_PRESENT | CR_VBOX_CAP_CMDVBVA);
+ }
+ else
+ {
+ cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT/* | CR_VBOX_CAP_CMDVBVA*/;
+#ifdef DEBUG_misha
+ cr_server.u32Caps |= CR_VBOX_CAP_CMDVBVA;
+#endif
+ }
+
+ crInfo("Cfg: u32Caps(%#x), fVisualBitsDefault(%#x)",
+ cr_server.u32Caps,
+ cr_server.fVisualBitsDefault);
+
cr_server.head_spu->dispatch_table.GetChromiumParametervCR(GL_WINDOW_POSITION_CR, 0, GL_INT, 2, &dims[0]);
cr_server.head_spu->dispatch_table.GetChromiumParametervCR(GL_WINDOW_SIZE_CR, 0, GL_INT, 2, &dims[2]);