summaryrefslogtreecommitdiff
path: root/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c')
-rw-r--r--src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c129
1 files changed, 84 insertions, 45 deletions
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c b/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c
index d22af98f..6d46faf8 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c
@@ -9,6 +9,7 @@
#include "cr_error.h"
#include "cr_string.h"
#include "cr_url.h"
+#include "cr_environment.h"
#include "renderspu.h"
#include <stdio.h>
@@ -94,16 +95,17 @@ static DWORD WINAPI renderSPUWindowThreadProc(void* unused)
if (msg.message == WM_VBOX_RENDERSPU_CREATE_WINDOW)
{
LPCREATESTRUCT pCS = (LPCREATESTRUCT) msg.lParam;
- HWND *phWnd;
+ HWND hWnd;
+ WindowInfo *pWindow = (WindowInfo *)pCS->lpCreateParams;
CRASSERT(msg.lParam && !msg.wParam && pCS->lpCreateParams);
- phWnd = pCS->lpCreateParams;
-
- *phWnd = CreateWindowEx(pCS->dwExStyle, pCS->lpszName, pCS->lpszClass, pCS->style,
+ hWnd = CreateWindowEx(pCS->dwExStyle, pCS->lpszName, pCS->lpszClass, pCS->style,
pCS->x, pCS->y, pCS->cx, pCS->cy,
pCS->hwndParent, pCS->hMenu, pCS->hInstance, &render_spu);
+ pWindow->hWnd = hWnd;
+
SetEvent(render_spu.hWinThreadReadyEvent);
}
else if (msg.message == WM_VBOX_RENDERSPU_DESTROY_WINDOW)
@@ -138,6 +140,8 @@ renderSPUInit( int id, SPU *child, SPU *self,
int numFuncs, numSpecial;
GLint defaultWin, defaultCtx;
WindowInfo *windowInfo;
+ const char * pcpwSetting;
+ int rc;
(void) child;
(void) context_id;
@@ -188,20 +192,39 @@ renderSPUInit( int id, SPU *child, SPU *self,
numFuncs += numSpecial;
-#ifdef GLX
- if (!render_spu.use_glxchoosevisual) {
- /* sometimes want to set this option with ATI drivers */
- render_spu.ws.glXChooseVisual = NULL;
+ render_spu.contextTable = crAllocHashtableEx(1, INT32_MAX);
+ render_spu.windowTable = crAllocHashtableEx(1, INT32_MAX);
+
+ render_spu.dummyWindowTable = crAllocHashtable();
+
+ pcpwSetting = crGetenv("CR_RENDER_ENABLE_SINGLE_PRESENT_CONTEXT");
+ if (pcpwSetting)
+ {
+ if (pcpwSetting[0] == '0')
+ pcpwSetting = NULL;
}
-#endif
- render_spu.window_id = 0;
- render_spu.context_id = 0;
- render_spu.contextTable = crAllocHashtable();
- render_spu.windowTable = crAllocHashtable();
+ if (pcpwSetting)
+ {
+ /* TODO: need proper blitter synchronization, do not use so far!
+ * the problem is that rendering can be done in multiple thread: the main command (hgcm) thread and the redraw thread
+ * we currently use per-window synchronization, while we'll need a per-blitter synchronization if one blitter is used for multiple windows
+ * this is not done currently */
+ crWarning("TODO: need proper blitter synchronization, do not use so far!");
+ render_spu.blitterTable = crAllocHashtable();
+ CRASSERT(render_spu.blitterTable);
+ }
+ else
+ render_spu.blitterTable = NULL;
CRASSERT(render_spu.default_visual & CR_RGB_BIT);
-
+
+ rc = renderspu_SystemInit();
+ if (!RT_SUCCESS(rc))
+ {
+ crError("renderspu_SystemInit failed rc %d", rc);
+ return NULL;
+ }
#ifdef USE_OSMESA
if (render_spu.use_osmesa) {
if (!crLoadOSMesa(&render_spu.OSMesaCreateContext,
@@ -249,8 +272,8 @@ renderSPUInit( int id, SPU *child, SPU *self,
*/
crDebug("Render SPU: Creating default window (visBits=0x%x, id=0)",
render_spu.default_visual);
- defaultWin = renderspuWindowCreate( NULL, render_spu.default_visual );
- if (defaultWin != 0) {
+ defaultWin = renderspuWindowCreateEx( NULL, render_spu.default_visual, CR_RENDER_DEFAULT_WINDOW_ID );
+ if (defaultWin != CR_RENDER_DEFAULT_WINDOW_ID) {
crError("Render SPU: Couldn't get a double-buffered, RGB visual with Z!");
return NULL;
}
@@ -258,13 +281,16 @@ renderSPUInit( int id, SPU *child, SPU *self,
crDebug("Render SPU: Creating default context, visBits=0x%x",
render_spu.default_visual );
- defaultCtx = renderspuCreateContext( NULL, render_spu.default_visual, 0 );
- CRASSERT(defaultCtx == 0);
+ defaultCtx = renderspuCreateContextEx( NULL, render_spu.default_visual, CR_RENDER_DEFAULT_CONTEXT_ID, 0 );
+ if (defaultCtx != CR_RENDER_DEFAULT_CONTEXT_ID) {
+ crError("Render SPU: failed to create default context!");
+ return NULL;
+ }
renderspuMakeCurrent( defaultWin, 0, defaultCtx );
/* Get windowInfo for the default window */
- windowInfo = (WindowInfo *) crHashtableSearch(render_spu.windowTable, 0);
+ windowInfo = (WindowInfo *) crHashtableSearch(render_spu.windowTable, CR_RENDER_DEFAULT_WINDOW_ID);
CRASSERT(windowInfo);
windowInfo->mapPending = GL_TRUE;
@@ -347,17 +373,21 @@ renderSPUInit( int id, SPU *child, SPU *self,
render_spu.gather_conns = NULL;
+ numFuncs = renderspu_SystemPostprocessFunctions(_cr_render_table, numFuncs, RT_ELEMENTS(_cr_render_table));
+
crDebug("Render SPU: ---------- End of Init -------------");
return &render_functions;
}
-
static void renderSPUSelfDispatch(SPUDispatchTable *self)
{
crSPUInitDispatchTable( &(render_spu.self) );
crSPUCopyDispatchTable( &(render_spu.self), self );
+ crSPUInitDispatchTable( &(render_spu.blitterDispatch) );
+ crSPUCopyDispatchTable( &(render_spu.blitterDispatch), self );
+
render_spu.server = (CRServer *)(self->server);
{
@@ -377,8 +407,7 @@ static void renderSPUSelfDispatch(SPUDispatchTable *self)
static void DeleteContextCallback( void *data )
{
ContextInfo *context = (ContextInfo *) data;
- renderspu_SystemDestroyContext(context);
- crFree(context);
+ renderspuContextMarkDeletedAndRelease(context);
}
static void DeleteWindowCallback( void *data )
@@ -388,12 +417,45 @@ static void DeleteWindowCallback( void *data )
crFree(window);
}
+static void DeleteBlitterCallback( void *data )
+{
+ PCR_BLITTER pBlitter = (PCR_BLITTER) data;
+ CrBltTerm(pBlitter);
+ crFree(pBlitter);
+}
+
+static void renderspuBlitterCleanupCB(unsigned long key, void *data1, void *data2)
+{
+ WindowInfo *window = (WindowInfo *) data1;
+ CRASSERT(window);
+
+ renderspuVBoxPresentBlitterCleanup( window );
+}
+
static int renderSPUCleanup(void)
{
+ renderspuVBoxCompositorClearAll();
+
+ if (render_spu.blitterTable)
+ {
+ crFreeHashtable(render_spu.blitterTable, DeleteBlitterCallback);
+ render_spu.blitterTable = NULL;
+ }
+ else
+ {
+ crHashtableWalk(render_spu.windowTable, renderspuBlitterCleanupCB, NULL);
+
+ crHashtableWalk(render_spu.dummyWindowTable, renderspuBlitterCleanupCB, NULL);
+ }
+
+ renderspuSetDefaultSharedContext(NULL);
+
crFreeHashtable(render_spu.contextTable, DeleteContextCallback);
render_spu.contextTable = NULL;
crFreeHashtable(render_spu.windowTable, DeleteWindowCallback);
render_spu.windowTable = NULL;
+ crFreeHashtable(render_spu.dummyWindowTable, DeleteWindowCallback);
+ render_spu.dummyWindowTable = NULL;
crFreeHashtable(render_spu.barrierHash, crFree);
render_spu.barrierHash = NULL;
@@ -482,26 +544,3 @@ DECLEXPORT(void) renderspuSetWindowId(uint64_t winId)
{
render_spu_parent_window_id = winId;
}
-
-static void renderspuWindowVisibleRegionCB(unsigned long key, void *data1, void *data2)
-{
- WindowInfo *window = (WindowInfo *) data1;
- CRASSERT(window);
-
- renderspu_SystemWindowApplyVisibleRegion(window);
-}
-
-DECLEXPORT(void) renderspuSetRootVisibleRegion(GLint cRects, GLint *pRects)
-{
-#ifdef RT_OS_DARWIN
- renderspu_SystemSetRootVisibleRegion(cRects, pRects);
-
- crHashtableWalk(render_spu.windowTable, renderspuWindowVisibleRegionCB, NULL);
-#endif
-}
-
-#ifndef RT_OS_DARWIN
-void renderspu_SystemWindowApplyVisibleRegion(WindowInfo *window)
-{
-}
-#endif