e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <Carbon/Carbon.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <AGL/agl.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <OpenGL/OpenGL.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <iprt/time.h>
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#include <iprt/assert.h>
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync#include <iprt/semaphore.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <stdio.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_environment.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_error.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_string.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "renderspu.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync# define renderspuSetWindowContext(w, c) \
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync AssertFailed()
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync# define renderspuGetWindowContext(w) \
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync ( (ContextInfo *) GetWRefCon( ((w)->nativeWindow ? (w)->nativeWindow : (w)->window) ) )
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#else
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync# define renderspuSetWindowContext(w, c) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ( SetWRefCon( (w), (unsigned long) (c) ) )
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync# define renderspuGetWindowContext(w) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ( (ContextInfo *) GetWRefCon( ((w)->nativeWindow ? (w)->nativeWindow : (w)->window) ) )
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Debug macros */
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync#ifdef DEBUG_poetzsch
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync#define DEBUG_MSG_POETZSCH(text) \
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync printf text
553fe7e9c0f2700c19c346eec835ee7f29e2f89evboxsync#else
553fe7e9c0f2700c19c346eec835ee7f29e2f89evboxsync#define DEBUG_MSG_POETZSCH(text) \
553fe7e9c0f2700c19c346eec835ee7f29e2f89evboxsync do {} while (0)
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync#endif
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define DEBUG_MSG_RESULT(result, text) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug(text" (%d; %s:%d)", (int)(result), __FILE__, __LINE__)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CHECK_CARBON_RC(result, text) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if((result) != noErr) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DEBUG_MSG_RESULT(result, text);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CHECK_CARBON_RC_RETURN(result, text, ret) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if((result) != noErr) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DEBUG_MSG_RESULT(result, text); \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return ret; \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CHECK_CARBON_RC_RETURN_VOID(result, text) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CHECK_CARBON_RC_RETURN(result, text,)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CHECK_AGL_RC(result, text) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(!(result)) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum error = render_spu.ws.aglGetError(); \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DEBUG_MSG_RESULT(result, text); \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic void renderspu_SystemWindowApplyVisibleRegion(WindowInfo *window);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic void renderspu_SystemSetRootVisibleRegion(GLint cRects, GLint *pRects);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
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{
91d3c13d786ab55099e36be254f46bd98254b482vboxsync /* The window with id zero is the base window, which isn't displayed at
91d3c13d786ab55099e36be254f46bd98254b482vboxsync * all. So ignore it. */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync if (key > 0)
91d3c13d786ab55099e36be254f46bd98254b482vboxsync {
91d3c13d786ab55099e36be254f46bd98254b482vboxsync /* Fetch the actually window info & the user data */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync WindowInfo *pWin = (WindowInfo *) data1;
91d3c13d786ab55099e36be254f46bd98254b482vboxsync /* We need to assign the context with this window */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync ContextInfo *context = renderspuGetWindowContext(pWin);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync if (context &&
91d3c13d786ab55099e36be254f46bd98254b482vboxsync context->context)
91d3c13d786ab55099e36be254f46bd98254b482vboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRequest(render_spu.syncMutex);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync GLboolean result = render_spu.ws.aglSetCurrentContext(context->context);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_AGL_RC (result, "Render SPU (crClipRootHelper): SetCurrentContext Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync if (result)
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync result = render_spu.ws.aglUpdateContext(context->context);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_AGL_RC (result, "Render SPU (crClipRootHelper): UpdateContext Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* Update the clipping region */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync renderspu_SystemWindowApplyVisibleRegion(pWin);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync }
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRelease(render_spu.syncMutex);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync /* Make sure that the position is updated relative to the Qt main
91d3c13d786ab55099e36be254f46bd98254b482vboxsync * view */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync renderspu_SystemWindowPosition(pWin, pWin->x, pWin->y);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync }
91d3c13d786ab55099e36be254f46bd98254b482vboxsync }
91d3c13d786ab55099e36be254f46bd98254b482vboxsync}
91d3c13d786ab55099e36be254f46bd98254b482vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Window event handler */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsyncpascal OSStatus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncwindowEvtHndlr(EventHandlerCallRef myHandler, EventRef event, void* userData)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WindowRef window = NULL;
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync OSStatus eventResult = eventNotHandledErr;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync UInt32 class = GetEventClass (event);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync UInt32 kind = GetEventKind (event);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
52078ebe00d1c500f8d35e5b763c3282acd44acfvboxsync /* If we aren't initialized or even deinitialized already (as on VM
52078ebe00d1c500f8d35e5b763c3282acd44acfvboxsync * shutdown) do nothing. */
52078ebe00d1c500f8d35e5b763c3282acd44acfvboxsync if (!render_spu.fInit)
52078ebe00d1c500f8d35e5b763c3282acd44acfvboxsync return eventNotHandledErr;
52078ebe00d1c500f8d35e5b763c3282acd44acfvboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* Fetch the sender of the event */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GetEventParameter(event, kEventParamDirectObject, typeWindowRef,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync NULL, sizeof(WindowRef), NULL, &window);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync switch (class)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync case kEventClassVBox:
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
91d3c13d786ab55099e36be254f46bd98254b482vboxsync switch (kind)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync case kEventVBoxUpdateContext:
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync#ifndef __LP64__ /** @todo port to 64-bit darwin! Need to check if this event is generated or not (it probably isn't). */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync WindowInfo *wi1;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync GetEventParameter(event, kEventParamUserData, typeVoidPtr,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync NULL, sizeof(wi1), NULL, &wi1);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync ContextInfo *context = renderspuGetWindowContext(wi1);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (context &&
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync context->context)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync AGLContext tmpContext = render_spu.ws.aglGetCurrentContext();
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync DEBUG_MSG_POETZSCH (("kEventVBoxUpdateContext %x %x\n", wi1, context->context));
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRequest(render_spu.syncMutex);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync GLboolean result = render_spu.ws.aglSetCurrentContext(context->context);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync if (result)
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync result = render_spu.ws.aglUpdateContext(context->context);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_AGL_RC (result, "Render SPU (windowEvtHndlr): UpdateContext Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync renderspu_SystemWindowApplyVisibleRegion(wi1);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* Reapply the last active context */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync if (tmpContext)
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync result = render_spu.ws.aglSetCurrentContext(tmpContext);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_AGL_RC (result, "Render SPU (windowEvtHndlr): SetCurrentContext Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync if (result)
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync result = render_spu.ws.aglUpdateContext(tmpContext);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_AGL_RC (result, "Render SPU (windowEvtHndlr): UpdateContext Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync }
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync }
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync }
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRelease(render_spu.syncMutex);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync eventResult = noErr;
91d3c13d786ab55099e36be254f46bd98254b482vboxsync#endif
91d3c13d786ab55099e36be254f46bd98254b482vboxsync break;
91d3c13d786ab55099e36be254f46bd98254b482vboxsync }
91d3c13d786ab55099e36be254f46bd98254b482vboxsync case kEventVBoxBoundsChanged:
91d3c13d786ab55099e36be254f46bd98254b482vboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync#ifndef __LP64__ /** @todo port to 64-bit darwin! Need to check if this event is generated or not (it probably isn't). */
91d3c13d786ab55099e36be254f46bd98254b482vboxsync HIPoint p;
91d3c13d786ab55099e36be254f46bd98254b482vboxsync GetEventParameter(event, kEventParamOrigin, typeHIPoint,
91d3c13d786ab55099e36be254f46bd98254b482vboxsync NULL, sizeof(p), NULL, &p);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync HISize s;
91d3c13d786ab55099e36be254f46bd98254b482vboxsync GetEventParameter(event, kEventParamDimensions, typeHISize,
91d3c13d786ab55099e36be254f46bd98254b482vboxsync NULL, sizeof(s), NULL, &s);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync HIRect r = CGRectMake (0, 0, s.width, s.height);
91d3c13d786ab55099e36be254f46bd98254b482vboxsync DEBUG_MSG_POETZSCH (("kEventVBoxBoundsChanged %f %f %f %f\n", p.x, p.y, s.width, s.height));
91d3c13d786ab55099e36be254f46bd98254b482vboxsync GLint l[4] = { 0,
91d3c13d786ab55099e36be254f46bd98254b482vboxsync 0,
91d3c13d786ab55099e36be254f46bd98254b482vboxsync r.size.width,
91d3c13d786ab55099e36be254f46bd98254b482vboxsync r.size.height };
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* Update the root window clip region */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync renderspu_SystemSetRootVisibleRegion(1, l);
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 if (tmpContext)
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRequest(render_spu.syncMutex);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync GLboolean result = render_spu.ws.aglSetCurrentContext(tmpContext);
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync CHECK_AGL_RC (result, "Render SPU (windowEvtHndlr): SetCurrentContext Failed");
66340d1826859ccf3b7903e91ef0455efba9eacdvboxsync /* Doesn't work with DirectX; Anyway doesn't */
66340d1826859ccf3b7903e91ef0455efba9eacdvboxsync/* if (result)*/
66340d1826859ccf3b7903e91ef0455efba9eacdvboxsync/* {*/
66340d1826859ccf3b7903e91ef0455efba9eacdvboxsync/* result = render_spu.ws.aglUpdateContext(tmpContext);*/
66340d1826859ccf3b7903e91ef0455efba9eacdvboxsync/* CHECK_AGL_RC (result, "Render SPU (windowEvtHndlr): UpdateContext Failed");*/
66340d1826859ccf3b7903e91ef0455efba9eacdvboxsync/* }*/
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRelease(render_spu.syncMutex);
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync }
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync eventResult = noErr;
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#endif
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync break;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync };
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync };
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync return eventResult;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLboolean
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemInitVisual(VisualInfo *visual)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(visual->visAttribs & CR_PBUFFER_BIT)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crWarning("Render SPU (renderspu_SystemInitVisual): PBuffers not support on Darwin/AGL yet.");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLboolean
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspuChoosePixelFormat(ContextInfo *context, AGLPixelFormat *pix)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLbitfield visAttribs = context->visual->visAttribs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint attribs[32];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint ind = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define ATTR_ADD(s) ( attribs[ind++] = (s) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define ATTR_ADDV(s,v) ( ATTR_ADD((s)), ATTR_ADD((v)) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(render_spu.ws.aglChoosePixelFormat);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADD(AGL_RGBA);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* ATTR_ADDV(AGL_RED_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_GREEN_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_BLUE_SIZE, 1); */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* if( render_spu.fullscreen )*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* ATTR_ADD(AGL_FULLSCREEN);*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( visAttribs & CR_ALPHA_BIT )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_ALPHA_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( visAttribs & CR_DOUBLE_BIT )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADD(AGL_DOUBLEBUFFER);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( visAttribs & CR_STEREO_BIT )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADD(AGL_STEREO);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( visAttribs & CR_DEPTH_BIT )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_DEPTH_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( visAttribs & CR_STENCIL_BIT )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_STENCIL_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( visAttribs & CR_ACCUM_BIT ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_ACCUM_RED_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_ACCUM_GREEN_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_ACCUM_BLUE_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( visAttribs & CR_ALPHA_BIT )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_ACCUM_ALPHA_SIZE, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( visAttribs & CR_MULTISAMPLE_BIT ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_SAMPLE_BUFFERS_ARB, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_SAMPLES_ARB, 4);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( visAttribs & CR_OVERLAY_BIT )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADDV(AGL_LEVEL, 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ATTR_ADD(AGL_NONE);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pix = render_spu.ws.aglChoosePixelFormat( NULL, 0, attribs );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return (*pix != NULL);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspuDestroyPixelFormat(ContextInfo *context, AGLPixelFormat *pix)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglDestroyPixelFormat( *pix );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pix = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLboolean
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemCreateContext(VisualInfo *visual, ContextInfo *context, ContextInfo *sharedContext)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AGLPixelFormat pix;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) sharedContext;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(visual);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(context);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync context->visual = visual;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( !renderspuChoosePixelFormat(context, &pix) ) {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError( "Render SPU (renderspu_SystemCreateContext): Unable to create pixel format" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync context->context = render_spu.ws.aglCreateContext( pix, NULL );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync renderspuDestroyPixelFormat( context, &pix );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( !context->context ) {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError( "Render SPU (renderspu_SystemCreateContext): Could not create rendering context" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemDestroyContext(ContextInfo *context)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(!context)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglSetDrawable(context->context, NULL);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglSetCurrentContext(NULL);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(context->context)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglDestroyContext(context->context);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync context->context = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync context->visual = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspuFullscreen(WindowInfo *window, GLboolean fullscreen)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Real fullscreen isn't supported by VirtualBox */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLboolean
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspuWindowAttachContext(WindowInfo *wi, WindowRef window,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ContextInfo *context)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean result;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(!context || !wi)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return render_spu.ws.aglSetCurrentContext( NULL );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync/* DEBUG_MSG_POETZSCH (("WindowAttachContext %d\n", wi->BltInfo.Base.id));*/
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Flush old context first */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (context->currentWindow->window != window)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.self.Flush();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* If the window buffer name is uninitialized we have to create a new
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * dummy context. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (wi->bufferName == -1)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync DEBUG_MSG_POETZSCH (("WindowAttachContext: create context %d\n", wi->BltInfo.Base.id));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Use the same visual bits as those in the context structure */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AGLPixelFormat pix;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( !renderspuChoosePixelFormat(context, &pix) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError( "Render SPU (renderspuWindowAttachContext): Unable to create pixel format" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Create the dummy context */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync wi->dummyContext = render_spu.ws.aglCreateContext( pix, NULL );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync renderspuDestroyPixelFormat( context, &pix );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if( !wi->dummyContext )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError( "Render SPU (renderspuWindowAttachContext): Could not create rendering context" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AGLDrawable drawable;
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync drawable = NULL;
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync drawable = (AGLDrawable) GetWindowPort(window);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* New global buffer name */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync wi->bufferName = render_spu.currentBufferName++;
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 }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AGLDrawable oldDrawable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AGLDrawable newDrawable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync oldDrawable = render_spu.ws.aglGetDrawable(context->context);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync newDrawable = oldDrawable;
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync newDrawable = (AGLDrawable) GetWindowPort(window);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#endif
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRequest(render_spu.syncMutex);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Only switch the context if the drawable has changed */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (oldDrawable != newDrawable)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
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 */
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync result = -1;
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result = render_spu.ws.aglSetDrawable(context->context, newDrawable);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#endif
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetDrawable Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync renderspuSetWindowContext(window, context);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
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");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRelease(render_spu.syncMutex);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return result;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLboolean
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemCreateWindow(VisualInfo *visual, GLboolean showIt,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WindowInfo *window)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsyncvoid renderspu_SystemReparentWindow(WindowInfo *)
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync{
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync /* stub only */
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync}
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemDestroyWindow(WindowInfo *window)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window->visual);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(!window->nativeWindow)
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync {
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync EventRef evt;
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");
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Delete the dummy context */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(window->dummyContext)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglSetDrawable(window->dummyContext, NULL);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.ws.aglDestroyContext(window->dummyContext);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync window->dummyContext = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Reset some values */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync window->bufferName = -1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync window->visual = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync window->window = NULL;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync if (window->hVisibleRegion)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync {
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync DisposeRgn(window->hVisibleRegion);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync window->hVisibleRegion = 0;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsyncvoid
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsyncrenderspu_SystemWindowPosition(WindowInfo *window,
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync GLint x, GLint y)
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync{
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CRASSERT(window);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CRASSERT(window->window);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync OSStatus status = noErr;
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* Send a event to the main thread, cause some function of Carbon aren't
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync * thread safe */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync EventRef evt;
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxMoveWindow, 0, kEventAttributeNone, &evt);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): CreateEvent Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof(window->window), &window->window);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): SetEventParameter Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync HIPoint p = CGPointMake (x, y);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync status = SetEventParameter(evt, kEventParamOrigin, typeHIPoint, sizeof (p), &p);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): SetEventParameter Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync status = SetEventParameter(evt, kEventParamUserData, typeVoidPtr, sizeof (window), &window);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): SetEventParameter Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): PostEventToQueue Failed");
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* save the new pos */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync window->x = x;
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync window->y = y;
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync}
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemWindowSize(WindowInfo *window, GLint w, GLint h)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window->window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync OSStatus status = noErr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Send a event to the main thread, cause some function of Carbon aren't
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * thread safe */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync EventRef evt;
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 HISize s = CGSizeMake (w, h);
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
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync DEBUG_MSG_POETZSCH (("Size %d visible %d\n", window->BltInfo.Base.id, IsWindowVisible (window->window)));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* save the new size */
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync window->BltInfo.width = w;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync window->BltInfo.height = h;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemGetWindowGeometry(WindowInfo *window,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint *x, GLint *y,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint *w, GLint *h)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window->window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync OSStatus status = noErr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync Rect r;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = GetWindowBounds(window->window, kWindowStructureRgn, &r);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemGetWindowGeometry): GetWindowBounds Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *x = (int) r.left;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *y = (int) r.top;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *w = (int) (r.right - r.left);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *h = (int) (r.bottom - r.top);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemGetMaxWindowSize(WindowInfo *window,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint *w, GLint *h)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window->window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync OSStatus status = noErr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync HISize s;
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync status = -1;
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = GetWindowResizeLimits (window->window, NULL, &s);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#endif
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemGetMaxWindowSize): GetWindowResizeLimits Failed");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *w = s.width;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *h = s.height;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Either show or hide the render SPU's window. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemShowWindow(WindowInfo *window, GLboolean showIt)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window->window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!IsValidWindowPtr(window->window))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(showIt)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Force moving the win to the right position before we show it */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync renderspu_SystemWindowPosition (window, window->x, window->y);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync OSStatus status = noErr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Send a event to the main thread, cause some function of Carbon
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * aren't thread safe */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync EventRef evt;
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");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync {
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync EventRef evt;
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");
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid renderspu_SystemVBoxPresentComposition( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor, const struct VBOXVR_SCR_COMPOSITOR_ENTRY *pChangedEntry )
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
47b6f2e161ff99e6ab1b4f6090798276954b4a78vboxsync renderspuVBoxPresentCompositionGeneric(window, pCompositor, pChangedEntry, 0, false);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemMakeCurrent(WindowInfo *window, GLint nativeWindow,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ContextInfo *context)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync Boolean result;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync/* DEBUG_MSG_POETZSCH (("makecurrent %d: \n", window->BltInfo.Base.id));*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(render_spu.ws.aglSetCurrentContext);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync //crDebug( "renderspu_SystemMakeCurrent( %x, %i, %x )", window, nativeWindow, context );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
1eb84e3fba012c8764e32737ab18b4973b70b301vboxsync nativeWindow = 0;
1eb84e3fba012c8764e32737ab18b4973b70b301vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(window && context)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window->window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(context->context);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(window->visual != context->visual)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
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 /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * XXX have to revisit this issue!!!
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * But for now we destroy the current window
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * and re-create it with the context's visual abilities
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync renderspu_SystemDestroyWindow(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync renderspu_SystemCreateWindow(context->visual, window->visible,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This is the normal case: rendering to the render SPU's own window */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result = renderspuWindowAttachContext(window, window->window,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync context);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX this is a total hack to work around an NVIDIA driver bug */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(render_spu.self.GetFloatv && context->haveWindowPosARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat f[4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.self.GetFloatv(GL_CURRENT_RASTER_POSITION, f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!window->everCurrent || f[1] < 0.0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crDebug("Render SPU (renderspu_SystemMakeCurrent): Resetting raster pos");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync render_spu.self.WindowPos2iARB(0, 0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* Reapply the visible regions */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync renderspu_SystemWindowApplyVisibleRegion(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync renderspuWindowAttachContext (0, 0, 0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemSwapBuffers(WindowInfo *window, GLint flags)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window->window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ContextInfo *context = renderspuGetWindowContext(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(!context)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crError("Render SPU (renderspu_SystemSwapBuffers): SwapBuffers got a null context from the window");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRequest(render_spu.syncMutex);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync// DEBUG_MSG_POETZSCH (("Swapped %d context %x visible: %d\n", window->BltInfo.Base.id, context->context, IsWindowVisible (window->window)));
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync if (context->visual &&
6f8f14dbd0538e9ebd625851ff10b48dc39440bbvboxsync context->visual->visAttribs & CR_DOUBLE_BIT)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync render_spu.ws.aglSwapBuffers(context->context);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync else
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync glFlush();
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync RTSemFastMutexRelease(render_spu.syncMutex);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
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 uint64_t curTS = RTTimeMilliTS();
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync if ((curTS - render_spu.uiDockUpdateTS) > 500)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync OSStatus status = noErr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Send a event to the main thread, cause some function of Carbon aren't
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * thread safe */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync EventRef evt;
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");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync render_spu.uiDockUpdateTS = curTS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsyncGLboolean renderspu_SystemWindowNeedEmptyPresent(WindowInfo *window)
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync{
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync return GL_FALSE;
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync}
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncvoid renderspu_SystemWindowVisibleRegion(WindowInfo *window, GLint cRects, const GLint* pRects)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window->window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* Remember any additional clipping stuff e.g. seamless regions */
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync if (window->hVisibleRegion)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync {
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync DisposeRgn(window->hVisibleRegion);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync window->hVisibleRegion = 0;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync }
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync if (cRects>0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Create some temporary regions */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RgnHandle rgn = NewRgn();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SetEmptyRgn (rgn);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RgnHandle tmpRgn = NewRgn();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<cRects; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SetRectRgn (tmpRgn,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pRects[4*i] , pRects[4*i+1],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pRects[4*i+2], pRects[4*i+3]);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync //DEBUG_MSG_POETZSCH (("visible rect %d %d %d %d\n", pRects[4*i] , pRects[4*i+1],
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync // pRects[4*i+2], pRects[4*i+3]));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync UnionRgn (rgn, tmpRgn, rgn);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DisposeRgn (tmpRgn);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync window->hVisibleRegion = rgn;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync renderspu_SystemWindowApplyVisibleRegion(window);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync}
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic void renderspu_SystemSetRootVisibleRegion(GLint cRects, GLint *pRects)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync{
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* Remember the visible region of the root window if there is one */
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync if (render_spu.hRootVisibleRegion)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync {
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync DisposeRgn(render_spu.hRootVisibleRegion);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync render_spu.hRootVisibleRegion = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync if (cRects>0)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync {
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync int i;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync render_spu.hRootVisibleRegion = NewRgn();
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync SetEmptyRgn (render_spu.hRootVisibleRegion);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync RgnHandle tmpRgn = NewRgn();
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync for (i=0; i<cRects; ++i)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync {
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync SetRectRgn (tmpRgn,
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync pRects[4*i] , pRects[4*i+1],
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync pRects[4*i+2], pRects[4*i+3]);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync UnionRgn (render_spu.hRootVisibleRegion, tmpRgn, render_spu.hRootVisibleRegion);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync }
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync DisposeRgn (tmpRgn);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync }
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync}
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync/*Assumes that all regions are in the guest coordinates system*/
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncstatic void renderspu_SystemWindowApplyVisibleRegion(WindowInfo *window)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync{
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync ContextInfo *c = renderspuGetWindowContext(window);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync RgnHandle rgn;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync GLboolean result = true;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync DEBUG_MSG_POETZSCH (("ApplyVisibleRegion %x\n", window));
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync if (!c || !c->context) return;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync rgn = NewRgn();
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync SetEmptyRgn(rgn);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync if (render_spu.hRootVisibleRegion)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* The render_spu.hRootVisibleRegion has coordinates from the root
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync * window. We intersect it with the rect of the OpenGL window we
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync * currently process. */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync SetRectRgn(rgn,
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync window->x, window->y,
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync window->x + window->BltInfo.width,
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync window->y + window->BltInfo.height);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync SectRgn(render_spu.hRootVisibleRegion, rgn, rgn);
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* Because the clipping is done in the coordinate space of the OpenGL
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync * window we have to remove the x/y position from the newly created
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync * region. */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync OffsetRgn (rgn, -window->x, -window->y);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync }
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync else
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync {
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* If there is not root clipping region is available, create a base
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync * region with the size of the target window. This covers all
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync * needed/possible space. */
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync SetRectRgn(rgn, 0, 0, window->BltInfo.width, window->BltInfo.height);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync }
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync /* Now intersect the window clipping region with a additional region e.g.
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync * for the seamless mode. */
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync if (window->hVisibleRegion)
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync SectRgn(rgn, window->hVisibleRegion, rgn);
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync
4e74688ef154b1325c846d4235bc192062541ce1vboxsync if (rgn && !EmptyRgn(rgn))
4e74688ef154b1325c846d4235bc192062541ce1vboxsync {
4e74688ef154b1325c846d4235bc192062541ce1vboxsync /* Set the clip region to the context */
4e74688ef154b1325c846d4235bc192062541ce1vboxsync result = render_spu.ws.aglSetInteger(c->context, AGL_CLIP_REGION, (const GLint*)rgn);
4e74688ef154b1325c846d4235bc192062541ce1vboxsync CHECK_AGL_RC (result, "Render SPU (renderspu_SystemWindowVisibleRegion): SetInteger Failed");
4e74688ef154b1325c846d4235bc192062541ce1vboxsync result = render_spu.ws.aglEnable(c->context, AGL_CLIP_REGION);
4e74688ef154b1325c846d4235bc192062541ce1vboxsync CHECK_AGL_RC (result, "Render SPU (renderspu_SystemWindowVisibleRegion): Enable Failed");
4e74688ef154b1325c846d4235bc192062541ce1vboxsync }
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync /* Clear the region structure */
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync DisposeRgn (rgn);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLboolean
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncrenderspu_SystemVBoxCreateWindow(VisualInfo *visual, GLboolean showIt,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WindowInfo *window)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(visual);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(window);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WindowAttributes winAttr = kWindowNoShadowAttribute | kWindowCompositingAttribute | kWindowIgnoreClicksAttribute | kWindowStandardHandlerAttribute | kWindowLiveResizeAttribute;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WindowClass winClass = kOverlayWindowClass;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync Rect windowRect;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync OSStatus status = noErr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync window->visual = visual;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync window->nativeWindow = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(window->window && IsValidWindowPtr(window->window))
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync {
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync EventRef evt;
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);
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync windowRect.left = window->x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync windowRect.top = window->y;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync windowRect.right = window->x + window->BltInfo.width;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync windowRect.bottom = window->y + window->BltInfo.height;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync status = CreateNewWindow(winClass, winAttr, &windowRect, &window->window);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): CreateNewWindow Failed", GL_FALSE);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* We set a title for debugging purposes */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CFStringRef title_string;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync title_string = CFStringCreateWithCStringNoCopy(NULL, window->title,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync kCFStringEncodingMacRoman, NULL);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync SetWindowTitleWithCFString(window->BltInfo.window, title_string);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CFRelease(title_string);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* The parent has to be in its own group */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WindowRef parent = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (render_spu_parent_window_id)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync parent = HIViewGetWindow ((HIViewRef)render_spu_parent_window_id);
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync SetWindowGroup (parent, render_spu.pParentGroup);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Add the new window to the master group */
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync SetWindowGroup(window->window, render_spu.pMasterGroup);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This will be initialized on the first attempt to attach the global
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * context to this new window */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync window->bufferName = -1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync window->dummyContext = NULL;
59f459912dabfba3a0c70b3ca312c9fd6bc8c911vboxsync window->hVisibleRegion = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if(showIt)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync renderspu_SystemShowWindow(window, GL_TRUE);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync crDebug("Render SPU (renderspu_SystemVBoxCreateWindow): actual window (x, y, width, height): %d, %d, %d, %d",
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync window->x, window->y, window->BltInfo.width, window->BltInfo.height);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsyncint renderspu_SystemInit()
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync{
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync return VINF_SUCCESS;
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync}
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsyncint renderspu_SystemTerm()
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync{
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync return VINF_SUCCESS;
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync}
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsyncvoid renderspu_SystemDefaultSharedContextChanged(ContextInfo *fromContext, ContextInfo *toContext)
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync{
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync
d171c6e83ee2cdae7d630182ee101efbf0f8c0e8vboxsync}