renderspu_agl.c revision 91d3c13d786ab55099e36be254f46bd98254b482
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* Copyright (c) 2001, Stanford University
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * All rights reserved
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * See the file LICENSE.txt for information on redistributing this software.
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include <Carbon/Carbon.h>
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include <AGL/agl.h>
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include <OpenGL/OpenGL.h>
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include <iprt/time.h>
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include <iprt/assert.h>
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include <stdio.h>
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include "cr_environment.h"
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include "cr_error.h"
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include "cr_string.h"
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include "cr_mem.h"
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#include "renderspu.h"
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* Some necessary global defines */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncWindowGroupRef gParentGroup = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncWindowGroupRef gMasterGroup = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncGLint gCurrentBufferName = 1;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncuint64_t gDockUpdateTS = 0;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncstatic EventHandlerUPP gParentEventHandler = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncenum
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Event classes */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kEventClassVBox = 'vbox',
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Event kinds */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kEventVBoxShowWindow = 'swin',
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kEventVBoxHideWindow = 'hwin',
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kEventVBoxMoveWindow = 'mwin',
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kEventVBoxResizeWindow = 'rwin',
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kEventVBoxDisposeWindow = 'dwin',
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kEventVBoxUpdateDock = 'udck',
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kEventVBoxUpdateContext = 'uctx',
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kEventVBoxBoundsChanged = 'bchg'
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync};
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync# define renderspuSetWindowContext(w, c) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync AssertFailed()
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync# define renderspuGetWindowContext(w) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ( (ContextInfo *) GetWRefCon( ((w)->nativeWindow ? (w)->nativeWindow : (w)->window) ) )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync# define renderspuSetWindowContext(w, c) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ( SetWRefCon( (w), (unsigned long) (c) ) )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync# define renderspuGetWindowContext(w) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ( (ContextInfo *) GetWRefCon( ((w)->nativeWindow ? (w)->nativeWindow : (w)->window) ) )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#endif
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* Debug macros */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#ifdef DEBUG_poetzsch
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#define DEBUG_MSG_POETZSCH(text) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync printf text
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#define DEBUG_MSG_POETZSCH(text) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync do {} while (0)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#endif
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#define DEBUG_MSG_RESULT(result, text) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crDebug(text" (%d; %s:%d)", (int)(result), __FILE__, __LINE__)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#define CHECK_CARBON_RC(result, text) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if((result) != noErr) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DEBUG_MSG_RESULT(result, text);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#define CHECK_CARBON_RC_RETURN(result, text, ret) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if((result) != noErr) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync { \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DEBUG_MSG_RESULT(result, text); \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return ret; \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#define CHECK_CARBON_RC_RETURN_VOID(result, text) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN(result, text,)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#define CHECK_AGL_RC(result, text) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(!(result)) \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync { \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLenum error = render_spu.ws.aglGetError(); \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DEBUG_MSG_RESULT(result, text); \
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* In some case (like compiz which doesn't provide us with clipping regions) we
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * have to make sure that *all* open OpenGL windows are clipped to the main
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * application window. This is done here when called from the event handler
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * which monitor bounding changes of the main window. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncstatic void crClipRootHelper(unsigned long key, void *data1, void *data2)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* The window with id zero is the base window, which isn't displayed at
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * all. So ignore it. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (key > 0)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Fetch the actually window info & the user data */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync WindowInfo *pWin = (WindowInfo *) data1;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* We need to assign the context with this window */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ContextInfo *context = renderspuGetWindowContext(pWin);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (context &&
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync context->context)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus result = render_spu.ws.aglSetCurrentContext(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetCurrentContext Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = render_spu.ws.aglUpdateContext(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): UpdateContext Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Update the clipping region */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspu_SystemWindowApplyVisibleRegion(pWin);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Make sure that the position is updated relative to the Qt main
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * view */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspu_SystemWindowPosition(pWin, pWin->x, pWin->y);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* Window event handler */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncstatic pascal OSStatus
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncwindowEvtHndlr(EventHandlerCallRef myHandler, EventRef event, void* userData)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync WindowRef window = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus result = eventNotHandledErr;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync UInt32 class = GetEventClass (event);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync UInt32 kind = GetEventKind (event);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GetEventParameter(event, kEventParamDirectObject, typeWindowRef,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync NULL, sizeof(WindowRef), NULL, &window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync switch (class)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync case kEventClassVBox:
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync switch (kind)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync case kEventVBoxUpdateContext:
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#ifndef __LP64__ /** @todo port to 64-bit darwin! Need to cehck if this event is generated or not (it probably isn't). */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync WindowInfo *wi1;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GetEventParameter(event, kEventParamUserData, typeVoidPtr,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync NULL, sizeof(wi1), NULL, &wi1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ContextInfo *context = renderspuGetWindowContext(wi1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLboolean result1 = true;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (context &&
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync context->context)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DEBUG_MSG_POETZSCH (("kEventVBoxUpdateContext %x %x\n", window, context->context));
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result1 = render_spu.ws.aglSetCurrentContext(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result1 = render_spu.ws.aglUpdateContext(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (windowEvtHndlr): UpdateContext Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync //glFlush();
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = noErr;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#endif
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync break;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync case kEventVBoxBoundsChanged:
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#ifndef __LP64__ /** @todo port to 64-bit darwin! Need to cehck if this event is generated or not (it probably isn't). */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync HIPoint p;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GetEventParameter(event, kEventParamOrigin, typeHIPoint,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync NULL, sizeof(p), NULL, &p);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync HISize s;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GetEventParameter(event, kEventParamDimensions, typeHISize,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync NULL, sizeof(s), NULL, &s);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync HIRect r = CGRectMake (0, 0, s.width, s.height);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DEBUG_MSG_POETZSCH (("kEventVBoxBoundsChanged %f %f %f %f\n", p.x, p.y, s.width, s.height));
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLint l[4] = { 0,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync 0,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync r.size.width,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync r.size.height };
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspu_SystemSetRootVisibleRegion(1, &l);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crHashtableWalk(render_spu.windowTable, crClipRootHelper, NULL);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#endif
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync break;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync };
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync break;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync break;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync };
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return result;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncGLboolean
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemInitVisual(VisualInfo *visual)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(visual->visAttribs & CR_PBUFFER_BIT)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crWarning("Render SPU (renderspu_SystemInitVisual): PBuffers not support on Darwin/AGL yet.");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return GL_TRUE;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncGLboolean
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspuChoosePixelFormat(ContextInfo *context, AGLPixelFormat *pix)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLbitfield visAttribs = context->visual->visAttribs;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLint attribs[32];
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLint ind = 0;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#define ATTR_ADD(s) ( attribs[ind++] = (s) )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#define ATTR_ADDV(s,v) ( ATTR_ADD((s)), ATTR_ADD((v)) )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(render_spu.ws.aglChoosePixelFormat);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADD(AGL_RGBA);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* ATTR_ADDV(AGL_RED_SIZE, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_GREEN_SIZE, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_BLUE_SIZE, 1); */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* if( render_spu.fullscreen )*/
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* ATTR_ADD(AGL_FULLSCREEN);*/
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( visAttribs & CR_ALPHA_BIT )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_ALPHA_SIZE, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( visAttribs & CR_DOUBLE_BIT )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADD(AGL_DOUBLEBUFFER);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( visAttribs & CR_STEREO_BIT )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADD(AGL_STEREO);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( visAttribs & CR_DEPTH_BIT )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_DEPTH_SIZE, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( visAttribs & CR_STENCIL_BIT )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_STENCIL_SIZE, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( visAttribs & CR_ACCUM_BIT ) {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_ACCUM_RED_SIZE, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_ACCUM_GREEN_SIZE, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_ACCUM_BLUE_SIZE, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( visAttribs & CR_ALPHA_BIT )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_ACCUM_ALPHA_SIZE, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( visAttribs & CR_MULTISAMPLE_BIT ) {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_SAMPLE_BUFFERS_ARB, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_SAMPLES_ARB, 4);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( visAttribs & CR_OVERLAY_BIT )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADDV(AGL_LEVEL, 1);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ATTR_ADD(AGL_NONE);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *pix = render_spu.ws.aglChoosePixelFormat( NULL, 0, attribs );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return (*pix != NULL);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspuDestroyPixelFormat(ContextInfo *context, AGLPixelFormat *pix)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.ws.aglDestroyPixelFormat( *pix );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *pix = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncGLboolean
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemCreateContext(VisualInfo *visual, ContextInfo *context, ContextInfo *sharedContext)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync AGLPixelFormat pix;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync (void) sharedContext;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(visual);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync context->visual = visual;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( !renderspuChoosePixelFormat(context, &pix) ) {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crError( "Render SPU (renderspu_SystemCreateContext): Unable to create pixel format" );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return GL_FALSE;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync context->context = render_spu.ws.aglCreateContext( pix, NULL );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspuDestroyPixelFormat( context, &pix );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( !context->context ) {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crError( "Render SPU (renderspu_SystemCreateContext): Could not create rendering context" );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return GL_FALSE;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return GL_TRUE;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemDestroyContext(ContextInfo *context)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(!context)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.ws.aglSetDrawable(context->context, NULL);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.ws.aglSetCurrentContext(NULL);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(context->context)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.ws.aglDestroyContext(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync context->context = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync context->visual = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspuFullscreen(WindowInfo *window, GLboolean fullscreen)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Real fullscreen isn't supported by VirtualBox */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncGLboolean
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspuWindowAttachContext(WindowInfo *wi, WindowRef window,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ContextInfo *context)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLboolean result;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(!context || !wi)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return render_spu.ws.aglSetCurrentContext( NULL );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* DEBUG_MSG_POETZSCH (("WindowAttachContext %d\n", wi->id));*/
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Flush old context first */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (context->currentWindow->window != window)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.self.Flush();
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* If the window buffer name is uninitialized we have to create a new
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * dummy context. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (wi->bufferName == -1)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DEBUG_MSG_POETZSCH (("WindowAttachContext: create context %d\n", wi->id));
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Use the same visual bits as those in the context structure */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync AGLPixelFormat pix;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( !renderspuChoosePixelFormat(context, &pix) )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crError( "Render SPU (renderspuWindowAttachContext): Unable to create pixel format" );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return GL_FALSE;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Create the dummy context */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync wi->dummyContext = render_spu.ws.aglCreateContext( pix, NULL );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspuDestroyPixelFormat( context, &pix );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if( !wi->dummyContext )
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crError( "Render SPU (renderspuWindowAttachContext): Could not create rendering context" );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return GL_FALSE;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync AGLDrawable drawable;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync drawable = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync drawable = (AGLDrawable) GetWindowPort(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#endif
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* New global buffer name */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync wi->bufferName = gCurrentBufferName++;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Set the new buffer name to the dummy context. This enable the
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * sharing of the same hardware buffer afterwards. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = render_spu.ws.aglSetInteger(wi->dummyContext, AGL_BUFFER_NAME, &wi->bufferName);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetInteger Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Assign the dummy context to the window */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = render_spu.ws.aglSetDrawable(wi->dummyContext, drawable);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetDrawable Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync AGLDrawable oldDrawable;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync AGLDrawable newDrawable;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync oldDrawable = render_spu.ws.aglGetDrawable(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync newDrawable = oldDrawable;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync newDrawable = (AGLDrawable) GetWindowPort(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#endif
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Only switch the context if the drawable has changed */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (oldDrawable != newDrawable)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Reset the current context */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = render_spu.ws.aglSetDrawable(context->context, NULL);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetDrawable Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Set the buffer name of the dummy context to the current context
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * also. After that both share the same hardware buffer. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.ws.aglSetInteger (context->context, AGL_BUFFER_NAME, &wi->bufferName);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetInteger Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Set the new drawable */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = -1;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = render_spu.ws.aglSetDrawable(context->context, newDrawable);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#endif
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetDrawable Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspuSetWindowContext( window, context );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = render_spu.ws.aglSetCurrentContext(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): SetCurrentContext Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = render_spu.ws.aglUpdateContext(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspuWindowAttachContext): UpdateContext Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return result;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncGLboolean
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemCreateWindow(VisualInfo *visual, GLboolean showIt,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync WindowInfo *window)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return GL_TRUE;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemDestroyWindow(WindowInfo *window)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window->visual);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(!window->nativeWindow)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync EventRef evt;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus status = CreateEvent(NULL, kEventClassVBox, kEventVBoxDisposeWindow, 0, kEventAttributeNone, &evt);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemDestroyWindow): CreateEvent Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof (window->window), &window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemDestroyWindow): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemDestroyWindow): PostEventToQueue Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Delete the dummy context */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(window->dummyContext)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.ws.aglSetDrawable(window->dummyContext, NULL);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.ws.aglDestroyContext(window->dummyContext);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->dummyContext = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Reset some values */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->bufferName = -1;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->visual = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->window = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (window->hVisibleRegion)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DisposeRgn(window->hVisibleRegion);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->hVisibleRegion = 0;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemWindowSize(WindowInfo *window, GLint w, GLint h)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus status = noErr;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Send a event to the main thread, cause some function of Carbon aren't
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * thread safe */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync EventRef evt;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxResizeWindow, 0, kEventAttributeNone, &evt);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): CreateEvent Failed ");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof(window->window), &window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync HISize s = CGSizeMake (w, h);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamDimensions, typeHISize, sizeof (s), &s);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamUserData, typeVoidPtr, sizeof (window), &window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowSize): SendEventToEventTarget Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DEBUG_MSG_POETZSCH (("Size %d visible %d\n", window->id, IsWindowVisible (window->window)));
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* save the new size */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->width = w;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->height = h;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemGetWindowGeometry(WindowInfo *window,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLint *x, GLint *y,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLint *w, GLint *h)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus status = noErr;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync Rect r;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = GetWindowBounds(window->window, kWindowStructureRgn, &r);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemGetWindowGeometry): GetWindowBounds Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *x = (int) r.left;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *y = (int) r.top;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *w = (int) (r.right - r.left);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *h = (int) (r.bottom - r.top);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemGetMaxWindowSize(WindowInfo *window,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLint *w, GLint *h)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus status = noErr;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync HISize s;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = -1;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = GetWindowResizeLimits (window->window, NULL, &s);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#endif
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemGetMaxWindowSize): GetWindowResizeLimits Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *w = s.width;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *h = s.height;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemWindowPosition(WindowInfo *window,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLint x, GLint y)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus status = noErr;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Send a event to the main thread, cause some function of Carbon aren't
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * thread safe */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync EventRef evt;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxMoveWindow, 0, kEventAttributeNone, &evt);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): CreateEvent Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof(window->window), &window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync HIPoint p = CGPointMake (x, y);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamOrigin, typeHIPoint, sizeof (p), &p);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamUserData, typeVoidPtr, sizeof (window), &window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowPosition): PostEventToQueue Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* save the new pos */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->x = x;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->y = y;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* Either show or hide the render SPU's window. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemShowWindow(WindowInfo *window, GLboolean showIt)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (!IsValidWindowPtr(window->window))
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(showIt)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Force moving the win to the right position before we show it */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspu_SystemWindowPosition (window, window->x, window->y);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus status = noErr;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Send a event to the main thread, cause some function of Carbon
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * aren't thread safe */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync EventRef evt;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxShowWindow, 0, kEventAttributeNone, &evt);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): CreateEvent Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof (window->window), &window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamUserData, typeVoidPtr, sizeof (window), &window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemWindowShow): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync //status = SendEventToEventTarget (evt, GetWindowEventTarget (HIViewGetWindow ((HIViewRef)render_spu_parent_window_id)));
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): PostEventToQueue Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync EventRef evt;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus status = CreateEvent(NULL, kEventClassVBox, kEventVBoxHideWindow, 0, kEventAttributeNone, &evt);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): CreateEvent Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof (window->window), &window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): SetEventParameter Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemShowWindow): PostEventToQueue Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->visible = showIt;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemMakeCurrent(WindowInfo *window, GLint nativeWindow,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ContextInfo *context)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync Boolean result;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/* DEBUG_MSG_POETZSCH (("makecurrent %d: \n", window->id));*/
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(render_spu.ws.aglSetCurrentContext);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync //crDebug( "renderspu_SystemMakeCurrent( %x, %i, %x )", window, nativeWindow, context );
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(window && context)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(window->visual != context->visual)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crDebug("Render SPU (renderspu_SystemMakeCurrent): MakeCurrent visual mismatch (0x%x != 0x%x); remaking window.",
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync (uint)window->visual->visAttribs, (uint)context->visual->visAttribs);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /*
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * XXX have to revisit this issue!!!
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync *
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * But for now we destroy the current window
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * and re-create it with the context's visual abilities
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspu_SystemDestroyWindow(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspu_SystemCreateWindow(context->visual, window->visible,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* This is the normal case: rendering to the render SPU's own window */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = renderspuWindowAttachContext(window, window->window,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* XXX this is a total hack to work around an NVIDIA driver bug */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(render_spu.self.GetFloatv && context->haveWindowPosARB)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLfloat f[4];
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.self.GetFloatv(GL_CURRENT_RASTER_POSITION, f);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (!window->everCurrent || f[1] < 0.0)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crDebug("Render SPU (renderspu_SystemMakeCurrent): Resetting raster pos");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.self.WindowPos2iARB(0, 0);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspuWindowAttachContext (0, 0, 0);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemSwapBuffers(WindowInfo *window, GLint flags)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ContextInfo *context = renderspuGetWindowContext(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(!context)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crError("Render SPU (renderspu_SystemSwapBuffers): SwapBuffers got a null context from the window");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync// DEBUG_MSG_POETZSCH (("Swapped %d context %x visible: %d\n", window->id, context->context, IsWindowVisible (window->window)));
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (context->visual->visAttribs & CR_DOUBLE_BIT)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.ws.aglSwapBuffers(context->context);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync glFlush();
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* This method seems called very often. To prevent the dock using all free
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * resources we update the dock only two times per second. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync uint64_t curTS = RTTimeMilliTS();
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if ((curTS - gDockUpdateTS) > 500)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus status = noErr;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Send a event to the main thread, cause some function of Carbon aren't
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * thread safe */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync EventRef evt;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxUpdateDock, 0, kEventAttributeNone, &evt);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemSwapBuffers): CreateEvent Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN_VOID (status, "Render SPU (renderspu_SystemSwapBuffers): PostEventToQueue Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync gDockUpdateTS = curTS;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid renderspu_SystemWindowVisibleRegion(WindowInfo *window, GLint cRects, GLint* pRects)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DEBUG_MSG_POETZSCH (("Visible region \n"));
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (window->hVisibleRegion)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DisposeRgn(window->hVisibleRegion);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->hVisibleRegion = 0;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (cRects>0)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync int i;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Create some temporary regions */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync RgnHandle rgn = NewRgn();
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetEmptyRgn (rgn);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync RgnHandle tmpRgn = NewRgn();
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync for (i=0; i<cRects; ++i)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetRectRgn (tmpRgn,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync pRects[4*i] , pRects[4*i+1],
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync pRects[4*i+2], pRects[4*i+3]);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DEBUG_MSG_POETZSCH (("visible rect %d %d %d %d\n", pRects[4*i] , pRects[4*i+1],
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync pRects[4*i+2], pRects[4*i+3]));
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync UnionRgn (rgn, tmpRgn, rgn);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DisposeRgn (tmpRgn);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->hVisibleRegion = rgn;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspu_SystemWindowApplyVisibleRegion(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid renderspu_SystemSetRootVisibleRegion(GLint cRects, GLint *pRects)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (render_spu.hRootVisibleRegion)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DisposeRgn(render_spu.hRootVisibleRegion);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.hRootVisibleRegion = 0;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (cRects>0)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync int i;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync render_spu.hRootVisibleRegion = NewRgn();
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetEmptyRgn (render_spu.hRootVisibleRegion);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync RgnHandle tmpRgn = NewRgn();
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync for (i=0; i<cRects; ++i)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetRectRgn (tmpRgn,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync pRects[4*i] , pRects[4*i+1],
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync pRects[4*i+2], pRects[4*i+3]);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync UnionRgn (render_spu.hRootVisibleRegion, tmpRgn, render_spu.hRootVisibleRegion);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DisposeRgn (tmpRgn);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync/*Assumes that all regions are in the guest coordinates system*/
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncvoid renderspu_SystemWindowApplyVisibleRegion(WindowInfo *window)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync ContextInfo *c = renderspuGetWindowContext(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync RgnHandle rgn;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GLboolean result = true;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (!c || !c->context) return;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync rgn = NewRgn();
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetEmptyRgn (rgn);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (render_spu.hRootVisibleRegion)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CopyRgn(render_spu.hRootVisibleRegion, rgn);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync else /*@todo create tmp region rect with size of underlying framebuffer */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* SetRectRgn(0,0,fb->width,fb->height); */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetRectRgn(rgn,0,0,4000,4000);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (window->hVisibleRegion)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SectRgn(rgn, window->hVisibleRegion, rgn);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* If we'd need to set clip region in host screen coordinates, than shift it*/
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* OffsetRgn(rgn, fb->hostleft, fb->hosttop); */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Set the clip region to the context */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = render_spu.ws.aglSetInteger(c->context, AGL_CLIP_REGION, (const GLint*)rgn);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspu_SystemWindowVisibleRegion): SetInteger Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync result = render_spu.ws.aglEnable(c->context, AGL_CLIP_REGION);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_AGL_RC (result, "Render SPU (renderspu_SystemWindowVisibleRegion): Enable Failed");
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Clear the region structure */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync DisposeRgn (rgn);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncGLboolean
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsyncrenderspu_SystemVBoxCreateWindow(VisualInfo *visual, GLboolean showIt,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync WindowInfo *window)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync{
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(visual);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CRASSERT(window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync WindowAttributes winAttr = kWindowNoShadowAttribute | kWindowCompositingAttribute | kWindowIgnoreClicksAttribute | kWindowStandardHandlerAttribute | kWindowLiveResizeAttribute;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync WindowClass winClass = kOverlayWindowClass;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync Rect windowRect;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync OSStatus status = noErr;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->visual = visual;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->nativeWindow = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(window->window && IsValidWindowPtr(window->window))
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync EventRef evt;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = CreateEvent(NULL, kEventClassVBox, kEventVBoxDisposeWindow, 0, kEventAttributeNone, &evt);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): CreateEvent Failed", false);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = SetEventParameter(evt, kEventParamWindowRef, typeWindowRef, sizeof (window->window), &window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): SetEventParameter Failed", false);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = PostEventToQueue(GetMainEventQueue(), evt, kEventPriorityStandard);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): PostEventToQueue Failed", false);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync windowRect.left = window->x;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync windowRect.top = window->y;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync windowRect.right = window->x + window->width;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync windowRect.bottom = window->y + window->height;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = CreateNewWindow(winClass, winAttr, &windowRect, &window->window);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): CreateNewWindow Failed", GL_FALSE);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* We set a title for debugging purposes */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CFStringRef title_string;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync title_string = CFStringCreateWithCStringNoCopy(NULL, window->title,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync kCFStringEncodingMacRoman, NULL);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetWindowTitleWithCFString(window->window, title_string);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CFRelease(title_string);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* We need grouping so create a master group for this & all following
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * windows & one group for the parent. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(!gMasterGroup || !gParentGroup)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = CreateWindowGroup(kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrSharedActivation | kWindowGroupAttrHideOnCollapse | kWindowGroupAttrFixedLevel, &gMasterGroup);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): CreateWindowGroup Failed", GL_FALSE);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync status = CreateWindowGroup(kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrSharedActivation | kWindowGroupAttrHideOnCollapse | kWindowGroupAttrFixedLevel, &gParentGroup);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync CHECK_CARBON_RC_RETURN (status, "Render SPU (renderspu_SystemVBoxCreateWindow): CreateWindowGroup Failed", GL_FALSE);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Make the correct z-layering */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SendWindowGroupBehind (gParentGroup, gMasterGroup);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* and set the gParentGroup as parent for gMasterGroup. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#ifdef __LP64__ /** @todo port to 64-bit darwin. */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#else
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetWindowGroupParent (gMasterGroup, gParentGroup);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync#endif
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* The parent has to be in its own group */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync WindowRef parent = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if (render_spu_parent_window_id)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync parent = HIViewGetWindow ((HIViewRef)render_spu_parent_window_id);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetWindowGroup (parent, gParentGroup);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* We need to process events from our main window */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(!gParentEventHandler)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Install the event handlers */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync EventTypeSpec eventList[] =
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {kEventClassVBox, kEventVBoxUpdateContext}, /* Update the context after show/size/move events */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync {kEventClassVBox, kEventVBoxBoundsChanged} /* Clip/Pos the OpenGL windows when the main window is changed in pos/size */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync };
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync gParentEventHandler = NewEventHandlerUPP(windowEvtHndlr);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync InstallApplicationEventHandler (gParentEventHandler,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync GetEventTypeCount(eventList), eventList,
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync NULL, NULL);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync }
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* Add the new window to the master group */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync SetWindowGroup(window->window, gMasterGroup);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync /* This will be initialized on the first attempt to attach the global
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync * context to this new window */
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->bufferName = -1;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->dummyContext = NULL;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync if(showIt)
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync renderspu_SystemShowWindow(window, GL_TRUE);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync crDebug("Render SPU (renderspu_SystemVBoxCreateWindow): actual window (x, y, width, height): %d, %d, %d, %d",
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync window->x, window->y, window->width, window->height);
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync return GL_TRUE;
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync}
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync
9c9df2b728333cb734a7cc7856568e9ea9dc4600vboxsync