renderspu_agl.c revision 6f8f14dbd0538e9ebd625851ff10b48dc39440bb
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Some necessary global defines */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Event classes */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Event kinds */
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync ( (ContextInfo *) GetWRefCon( ((w)->nativeWindow ? (w)->nativeWindow : (w)->window) ) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ( SetWRefCon( (w), (unsigned long) (c) ) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ( (ContextInfo *) GetWRefCon( ((w)->nativeWindow ? (w)->nativeWindow : (w)->window) ) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Debug macros */
553fe7e9c0f2700c19c346eec835ee7f29e2f89evboxsync do {} while (0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug(text" (%d; %s:%d)", (int)(result), __FILE__, __LINE__)
91d3c13d786ab55099e36be254f46bd98254b482vboxsync/* In some case (like compiz which doesn't provide us with clipping regions) we
91d3c13d786ab55099e36be254f46bd98254b482vboxsync * have to make sure that *all* open OpenGL windows are clipped to the main
91d3c13d786ab55099e36be254f46bd98254b482vboxsync * application window. This is done here when called from the event handler
91d3c13d786ab55099e36be254f46bd98254b482vboxsync * which monitor bounding changes of the main window. */
91d3c13d786ab55099e36be254f46bd98254b482vboxsyncstatic void crClipRootHelper(unsigned long key, void *data1, void *data2)
91d3c13d786ab55099e36be254f46bd98254b482vboxsync /* The window with id zero is the base window, which isn't displayed at
91d3c13d786ab55099e36be254f46bd98254b482vboxsync * all. So ignore it. */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync /* Fetch the actually window info & the user data */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync /* We need to assign the context with this window */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync ContextInfo *context = renderspuGetWindowContext(pWin);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync OSStatus result = render_spu.ws.aglSetCurrentContext(context->context);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetCurrentContext Failed");
91d3c13d786ab55099e36be254f46bd98254b482vboxsync result = render_spu.ws.aglUpdateContext(context->context);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): UpdateContext Failed");
91d3c13d786ab55099e36be254f46bd98254b482vboxsync /* Update the clipping region */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync /* Make sure that the position is updated relative to the Qt main
91d3c13d786ab55099e36be254f46bd98254b482vboxsync renderspu_SystemWindowPosition(pWin, pWin->x, pWin->y);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Window event handler */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncwindowEvtHndlr(EventHandlerCallRef myHandler, EventRef event, void* userData)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GetEventParameter(event, kEventParamDirectObject, typeWindowRef,
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#ifndef __LP64__ /** @todo port to 64-bit darwin! Need to cehck if this event is generated or not (it probably isn't). */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync GetEventParameter(event, kEventParamUserData, typeVoidPtr,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync ContextInfo *context = renderspuGetWindowContext(wi1);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync DEBUG_MSG_POETZSCH (("kEventVBoxUpdateContext %x %x\n", window, context->context));
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync result1 = render_spu.ws.aglSetCurrentContext(context->context);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync result1 = render_spu.ws.aglUpdateContext(context->context);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_AGL_RC (result, "Render SPU (windowEvtHndlr): UpdateContext Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync //glFlush();
91d3c13d786ab55099e36be254f46bd98254b482vboxsync#ifndef __LP64__ /** @todo port to 64-bit darwin! Need to cehck if this event is generated or not (it probably isn't). */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync GetEventParameter(event, kEventParamOrigin, typeHIPoint,
91d3c13d786ab55099e36be254f46bd98254b482vboxsync GetEventParameter(event, kEventParamDimensions, typeHISize,
91d3c13d786ab55099e36be254f46bd98254b482vboxsync DEBUG_MSG_POETZSCH (("kEventVBoxBoundsChanged %f %f %f %f\n", p.x, p.y, s.width, s.height));
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync /* Temporary save the current active context */
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync AGLContext tmpContext = render_spu.ws.aglGetCurrentContext();
91d3c13d786ab55099e36be254f46bd98254b482vboxsync crHashtableWalk(render_spu.windowTable, crClipRootHelper, NULL);
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync /* Reapply the last active context */
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync OSStatus result = render_spu.ws.aglSetCurrentContext(tmpContext);
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync CHECK_AGL_RC (result, "Render SPU (windowEvtHndlr): SetCurrentContext Failed");
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync result = render_spu.ws.aglUpdateContext(tmpContext);
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync CHECK_AGL_RC (result, "Render SPU (windowEvtHndlr): UpdateContext Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crWarning("Render SPU (renderspu_SystemInitVisual): PBuffers not support on Darwin/AGL yet.");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspuChoosePixelFormat(ContextInfo *context, AGLPixelFormat *pix)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLbitfield visAttribs = context->visual->visAttribs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define ATTR_ADDV(s,v) ( ATTR_ADD((s)), ATTR_ADD((v)) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* ATTR_ADDV(AGL_RED_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_GREEN_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_BLUE_SIZE, 1); */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* if( render_spu.fullscreen )*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* ATTR_ADD(AGL_FULLSCREEN);*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pix = render_spu.ws.aglChoosePixelFormat( NULL, 0, attribs );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspuDestroyPixelFormat(ContextInfo *context, AGLPixelFormat *pix)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemCreateContext(VisualInfo *visual, ContextInfo *context, ContextInfo *sharedContext)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError( "Render SPU (renderspu_SystemCreateContext): Unable to create pixel format" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync context->context = render_spu.ws.aglCreateContext( pix, NULL );
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError( "Render SPU (renderspu_SystemCreateContext): Could not create rendering context" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemDestroyContext(ContextInfo *context)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglSetDrawable(context->context, NULL);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspuFullscreen(WindowInfo *window, GLboolean fullscreen)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Real fullscreen isn't supported by VirtualBox */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspuWindowAttachContext(WindowInfo *wi, WindowRef window,
91d3c13d786ab55099e36be254f46bd98254b482vboxsync/* DEBUG_MSG_POETZSCH (("WindowAttachContext %d\n", wi->id));*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Flush old context first */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* If the window buffer name is uninitialized we have to create a new
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * dummy context. */
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync DEBUG_MSG_POETZSCH (("WindowAttachContext: create context %d\n", wi->id));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Use the same visual bits as those in the context structure */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError( "Render SPU (renderspuWindowAttachContext): Unable to create pixel format" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Create the dummy context */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync wi->dummyContext = render_spu.ws.aglCreateContext( pix, NULL );
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError( "Render SPU (renderspuWindowAttachContext): Could not create rendering context" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* New global buffer name */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set the new buffer name to the dummy context. This enable the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * sharing of the same hardware buffer afterwards. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result = render_spu.ws.aglSetInteger(wi->dummyContext, AGL_BUFFER_NAME, &wi->bufferName);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetInteger Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Assign the dummy context to the window */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result = render_spu.ws.aglSetDrawable(wi->dummyContext, drawable);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetDrawable Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync oldDrawable = render_spu.ws.aglGetDrawable(context->context);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Only switch the context if the drawable has changed */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Reset the current context */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result = render_spu.ws.aglSetDrawable(context->context, NULL);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetDrawable Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set the buffer name of the dummy context to the current context
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * also. After that both share the same hardware buffer. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglSetInteger (context->context, AGL_BUFFER_NAME, &wi->bufferName);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetInteger Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set the new drawable */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result = render_spu.ws.aglSetDrawable(context->context, newDrawable);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetDrawable Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result = render_spu.ws.aglSetCurrentContext(context->context);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetCurrentContext Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result = render_spu.ws.aglUpdateContext(context->context);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): UpdateContext Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemCreateWindow(VisualInfo *visual, GLboolean showIt,
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync OSStatus status = CreateEvent(NULL, kEventClassVBox, kEventVBoxDisposeWindow, 0, kEventAttributeNone, &evt);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemDestroyWindow): CreateEvent Failed");
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof (window->window), &window->window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemDestroyWindow): SetEventParameter Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemDestroyWindow): PostEventToQueue Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Delete the dummy context */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglSetDrawable(window->dummyContext, NULL);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglDestroyContext(window->dummyContext);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Reset some values */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemWindowSize(WindowInfo *window, GLint w, GLint h)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Send a event to the main thread, cause some function of Carbon aren't
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * thread safe */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxResizeWindow, 0, kEventAttributeNone, &evt);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): CreateEvent Failed ");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof(window->window), &window->window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): SetEventParameter Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = SetEventParameter(evt, kEventParamDimensions, typeHISize, sizeof (s), &s);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): SetEventParameter Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync status = SetEventParameter(evt, kEventParamUserData, typeVoidPtr, sizeof (window), &window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): SetEventParameter Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): SendEventToEventTarget Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync DEBUG_MSG_POETZSCH (("Size %d visible %d\n", window->id, IsWindowVisible (window->window)));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* save the new size */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemGetWindowGeometry(WindowInfo *window,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = GetWindowBounds(window->window, kWindowStructureRgn, &r);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemGetWindowGeometry): GetWindowBounds Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *x = (int) r.left;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *y = (int) r.top;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemGetMaxWindowSize(WindowInfo *window,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = GetWindowResizeLimits (window->window, NULL, &s);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemGetMaxWindowSize): GetWindowResizeLimits Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Send a event to the main thread, cause some function of Carbon aren't
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * thread safe */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxMoveWindow, 0, kEventAttributeNone, &evt);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): CreateEvent Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof(window->window), &window->window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): SetEventParameter Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = SetEventParameter(evt, kEventParamOrigin, typeHIPoint, sizeof (p), &p);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): SetEventParameter Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync status = SetEventParameter(evt, kEventParamUserData, typeVoidPtr, sizeof (window), &window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): SetEventParameter Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): PostEventToQueue Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* save the new pos */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Either show or hide the render SPU's window. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemShowWindow(WindowInfo *window, GLboolean showIt)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Force moving the win to the right position before we show it */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync renderspu_SystemWindowPosition (window, window->x, window->y);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Send a event to the main thread, cause some function of Carbon
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * aren't thread safe */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxShowWindow, 0, kEventAttributeNone, &evt);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): CreateEvent Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof (window->window), &window->window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): SetEventParameter Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync status = SetEventParameter(evt, kEventParamUserData, typeVoidPtr, sizeof (window), &window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowShow): SetEventParameter Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync //status = SendEventToEventTarget (evt, GetWindowEventTarget (HIViewGetWindow ((HIViewRef)render_spu_parent_window_id)));
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): PostEventToQueue Failed");
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync OSStatus status = CreateEvent(NULL, kEventClassVBox, kEventVBoxHideWindow, 0, kEventAttributeNone, &evt);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): CreateEvent Failed");
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof (window->window), &window->window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): SetEventParameter Failed");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): PostEventToQueue Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemMakeCurrent(WindowInfo *window, GLint nativeWindow,
91d3c13d786ab55099e36be254f46bd98254b482vboxsync/* DEBUG_MSG_POETZSCH (("makecurrent %d: \n", window->id));*/
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync //crDebug( "renderspu_SystemMakeCurrent( %x, %i, %x )", window, nativeWindow, context );
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crDebug("Render SPU (renderspu_SystemMakeCurrent): MakeCurrent visual mismatch (0x%x != 0x%x); remaking window.",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (uint)window->visual->visAttribs, (uint)context->visual->visAttribs);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * XXX have to revisit this issue!!!
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * But for now we destroy the current window
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * and re-create it with the context's visual abilities
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync renderspu_SystemCreateWindow(context->visual, window->visible,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This is the normal case: rendering to the render SPU's own window */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result = renderspuWindowAttachContext(window, window->window,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX this is a total hack to work around an NVIDIA driver bug */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(render_spu.self.GetFloatv && context->haveWindowPosARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.self.GetFloatv(GL_CURRENT_RASTER_POSITION, f);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crDebug("Render SPU (renderspu_SystemMakeCurrent): Resetting raster pos");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemSwapBuffers(WindowInfo *window, GLint flags)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ContextInfo *context = renderspuGetWindowContext(window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError("Render SPU (renderspu_SystemSwapBuffers): SwapBuffers got a null context from the window");
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync// DEBUG_MSG_POETZSCH (("Swapped %d context %x visible: %d\n", window->id, context->context, IsWindowVisible (window->window)));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This method seems called very often. To prevent the dock using all free
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * resources we update the dock only two times per second. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Send a event to the main thread, cause some function of Carbon aren't
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * thread safe */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxUpdateDock, 0, kEventAttributeNone, &evt);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemSwapBuffers): CreateEvent Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemSwapBuffers): PostEventToQueue Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid renderspu_SystemWindowVisibleRegion(WindowInfo *window, GLint cRects, GLint* pRects)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Create some temporary regions */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<cRects; ++i)
91d3c13d786ab55099e36be254f46bd98254b482vboxsync DEBUG_MSG_POETZSCH (("visible rect %d %d %d %d\n", pRects[4*i] , pRects[4*i+1],
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsyncvoid renderspu_SystemSetRootVisibleRegion(GLint cRects, GLint *pRects)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync for (i=0; i<cRects; ++i)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync UnionRgn (render_spu.hRootVisibleRegion, tmpRgn, render_spu.hRootVisibleRegion);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync/*Assumes that all regions are in the guest coordinates system*/
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsyncvoid renderspu_SystemWindowApplyVisibleRegion(WindowInfo *window)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync ContextInfo *c = renderspuGetWindowContext(window);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync if (!c || !c->context) return;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync else /*@todo create tmp region rect with size of underlying framebuffer */
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync /* SetRectRgn(0,0,fb->width,fb->height); */
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync /* If we'd need to set clip region in host screen coordinates, than shift it*/
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync /* OffsetRgn(rgn, fb->hostleft, fb->hosttop); */
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync /* Set the clip region to the context */
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync result = render_spu.ws.aglSetInteger(c->context, AGL_CLIP_REGION, (const GLint*)rgn);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync CHECK_AGL_RC (result, "Render SPU (renderspu_SystemWindowVisibleRegion): SetInteger Failed");
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync result = render_spu.ws.aglEnable(c->context, AGL_CLIP_REGION);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync CHECK_AGL_RC (result, "Render SPU (renderspu_SystemWindowVisibleRegion): Enable Failed");
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync /* Clear the region structure */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemVBoxCreateWindow(VisualInfo *visual, GLboolean showIt,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WindowAttributes winAttr = kWindowNoShadowAttribute | kWindowCompositingAttribute | kWindowIgnoreClicksAttribute | kWindowStandardHandlerAttribute | kWindowLiveResizeAttribute;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(window->window && IsValidWindowPtr(window->window))
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxDisposeWindow, 0, kEventAttributeNone, &evt);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): CreateEvent Failed", false);
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof (window->window), &window->window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): SetEventParameter Failed", false);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): PostEventToQueue Failed", false);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = CreateNewWindow(winClass, winAttr, &windowRect, &window->window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): CreateNewWindow Failed", GL_FALSE);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* We set a title for debugging purposes */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync title_string = CFStringCreateWithCStringNoCopy(NULL, window->title,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SetWindowTitleWithCFString(window->window, title_string);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* We need grouping so create a master group for this & all following
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * windows & one group for the parent. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = CreateWindowGroup(kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrSharedActivation | kWindowGroupAttrHideOnCollapse | kWindowGroupAttrFixedLevel, &gMasterGroup);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): CreateWindowGroup Failed", GL_FALSE);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = CreateWindowGroup(kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrSharedActivation | kWindowGroupAttrHideOnCollapse | kWindowGroupAttrFixedLevel, &gParentGroup);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): CreateWindowGroup Failed", GL_FALSE);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Make the correct z-layering */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SendWindowGroupBehind (gParentGroup, gMasterGroup);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* and set the gParentGroup as parent for gMasterGroup. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* The parent has to be in its own group */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync parent = HIViewGetWindow ((HIViewRef)render_spu_parent_window_id);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* We need to process events from our main window */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* Install the event handlers */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync {kEventClassVBox, kEventVBoxUpdateContext}, /* Update the context after show/size/move events */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync {kEventClassVBox, kEventVBoxBoundsChanged} /* Clip/Pos the OpenGL windows when the main window is changed in pos/size */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync gParentEventHandler = NewEventHandlerUPP(windowEvtHndlr);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync InstallApplicationEventHandler (gParentEventHandler,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Add the new window to the master group */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This will be initialized on the first attempt to attach the global
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * context to this new window */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crDebug("Render SPU (renderspu_SystemVBoxCreateWindow): actual window (x, y, width, height): %d, %d, %d, %d",