renderspu_cocoa_helper.m revision 416817daa142e9bb7eaf14a1b10577978a5e691b
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/** @file
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * VirtualBox OpenGL Cocoa Window System Helper implementation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * Copyright (C) 2009 Sun Microsystems, Inc.
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * available from http://www.virtualbox.org. This file is free software;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * you can redistribute it and/or modify it under the terms of the GNU
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * General Public License (GPL) as published by the Free Software
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * additional information or have any questions.
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#include "renderspu_cocoa_helper.h"
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#include "chromium.h" /* For the visual bits of chromium */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#include <iprt/thread.h>
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#include <iprt/string.h>
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/* Debug macros */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#define FBO 1 /* Disable this to see how the output is without the FBO in the middle of the processing chain. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync//#define SHOW_WINDOW_BACKGROUND 1 /* Define this to see the window background even if the window is clipped */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync//#define DEBUG_VERBOSE /* Define this could get some debug info about the messages flow. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef DEBUG_poetzsch
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#define DEBUG_MSG(text) \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync printf text
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#define DEBUG_MSG(text) \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync do {} while (0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef DEBUG_VERBOSE
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#define DEBUG_MSG_1(text) \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(text)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#define DEBUG_MSG_1(text) \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync do {} while (0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef DEBUG_poetzsch
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#define CHECK_GL_ERROR()\
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync do \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync { \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync checkGLError(__FILE__, __LINE__); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }while (0);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync static void checkGLError(char *file, int line)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLenum g = glGetError();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (g != GL_NO_ERROR)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync char *errStr;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync switch (g)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync case GL_INVALID_ENUM: errStr = RTStrDup("GL_INVALID_ENUM"); break;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync case GL_INVALID_VALUE: errStr = RTStrDup("GL_INVALID_VALUE"); break;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync case GL_INVALID_OPERATION: errStr = RTStrDup("GL_INVALID_OPERATION"); break;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync case GL_STACK_OVERFLOW: errStr = RTStrDup("GL_STACK_OVERFLOW"); break;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync case GL_STACK_UNDERFLOW: errStr = RTStrDup("GL_STACK_UNDERFLOW"); break;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync case GL_OUT_OF_MEMORY: errStr = RTStrDup("GL_OUT_OF_MEMORY"); break;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync case GL_TABLE_TOO_LARGE: errStr = RTStrDup("GL_TABLE_TOO_LARGE"); break;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync default: errStr = RTStrDup("UNKOWN"); break;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("%s:%d: glError %d (%s)\n", file, line, g, errStr));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync RTMemFree(errStr);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#define CHECK_GL_ERROR()\
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync do {} while (0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#define GL_SAVE_STATE \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncdo \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{ \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPushAttrib(GL_ALL_ATTRIB_BITS); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glMatrixMode(GL_PROJECTION); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPushMatrix(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glMatrixMode(GL_TEXTURE); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPushMatrix(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glMatrixMode(GL_COLOR); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPushMatrix(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glMatrixMode(GL_MODELVIEW); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPushMatrix(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync} \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncwhile(0);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#define GL_RESTORE_STATE \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncdo \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{ \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glMatrixMode(GL_MODELVIEW); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPopMatrix(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glMatrixMode(GL_COLOR); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPopMatrix(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glMatrixMode(GL_TEXTURE); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPopMatrix(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glMatrixMode(GL_PROJECTION); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPopMatrix(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPopClientAttrib(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glPopAttrib(); \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync} \
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncwhile(0);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/* Custom OpenGL context class. This implementation doesn't allow to set a view
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * to the context, but save the view for later use. Also it saves a copy of the
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * pixel format used to create that context for later use. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@interface OverlayOpenGLContext: NSOpenGLContext
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@private
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLPixelFormat *m_pPixelFormat;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSView *m_pView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSOpenGLPixelFormat*)openGLPixelFormat;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@class DockOverlayView;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/* The custom view class. This is the main class of the cocoa OpenGL
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * implementation. It manages an frame buffer object for the rendering of the
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * guest applications. The guest applications render in this frame buffer which
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * is bind to an OpenGL texture. To display the guest content, an secondary
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * shared OpenGL context of the main OpenGL context is created. The secondary
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * context is marked as non opaque & the texture is displayed on an object
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * which is composed out of the several visible region rectangles. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@interface OverlayView: NSView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@private
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSView *m_pParentView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLContext *m_pGLCtx;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLContext *m_pSharedGLCtx;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync RTTHREAD mThread;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* FBO handling */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLuint m_FBOId;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLuint m_FBOTexId;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSSize m_FBOTexSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLuint m_FBODepthStencilPackedId;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* The corresponding dock tile view of this OpenGL view & all helper
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * members. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync DockOverlayView *m_DockTileView;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLuint m_FBOThumbId;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLuint m_FBOThumbTexId;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLfloat m_FBOThumbScaleX;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLfloat m_FBOThumbScaleY;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* For clipping */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint m_cClipRects;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint *m_paClipRects;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Position/Size tracking */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSPoint m_Pos;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSSize m_Size;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* This is necessary for clipping on the root window */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSPoint m_RootShift;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView*)pParentView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)setGLCtx:(NSOpenGLContext*)pCtx;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSOpenGLContext*)glCtx;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)setPos:(NSPoint)pos;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSPoint)pos;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)setSize:(NSSize)size;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSSize)size;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)updateViewport;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)reshape;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)createFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)deleteFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)updateFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)makeCurrentFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)swapFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)flushFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)finishFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)bindFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)renderFBOToView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)clearVisibleRegions;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)setVisibleRegions:(GLint)cRects paRects:(GLint*)paRects;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (NSView*)dockTileScreen;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)reshapeDockTile;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/* Helper view. This view is added as a sub view of the parent view to track
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * main window changes. Whenever the main window is changed (which happens on
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * fullscreen/seamless entry/exit) the overlay window is informed & can add
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * them self as a child window again. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@class OverlayWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@interface OverlayHelperView: NSView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@private
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync OverlayWindow *m_pOverlayWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(id)initWithOverlayWindow:(OverlayWindow*)pOverlayWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/* Custom window class. This is the overlay window which contains our custom
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * NSView. Its a direct child of the Qt Main window. It marks its background
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * transparent & non opaque to make clipping possible. It also disable mouse
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * events and handle frame change events of the parent view. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@interface OverlayWindow: NSWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@private
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSView *m_pParentView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync OverlayView *m_pOverlayView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync OverlayHelperView *m_pOverlayHelperView;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSThread *m_Thread;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (id)initWithParentView:(NSView*)pParentView overlayView:(OverlayView*)pOverlayView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)parentWindowFrameChanged:(NSNotification *)note;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)parentWindowChanged:(NSWindow*)pWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@interface DockOverlayView: NSView
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSBitmapImageRep *m_ThumbBitmap;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSImage *m_ThumbImage;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSLock *m_Lock;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)dealloc;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)cleanup;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)lock;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)unlock;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)setFrame:(NSRect)frame;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)drawRect:(NSRect)aRect;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (NSBitmapImageRep*)thumbBitmap;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (NSImage*)thumbImage;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@end
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@implementation DockOverlayView
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (id)init
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync self = [super init];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (self)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* We need a lock cause the thumb image could be accessed from the main
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * thread when someone is calling display on the dock tile & from the
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * OpenGL thread when the thumbnail is updated. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_Lock = [[NSLock alloc] init];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return self;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)dealloc
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self cleanup];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_Lock release];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [super dealloc];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)cleanup
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (m_ThumbImage != nil)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_ThumbImage release];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_ThumbImage = nil;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (m_ThumbBitmap != nil)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_ThumbBitmap release];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_ThumbBitmap = nil;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)lock
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_Lock lock];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)unlock
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_Lock unlock];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)setFrame:(NSRect)frame
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [super setFrame:frame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self lock];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self cleanup];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Create a buffer for our thumbnail image. Its in the size of this view. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_ThumbBitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pixelsWide:frame.size.width
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync pixelsHigh:frame.size.height
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync bitsPerSample:8
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync samplesPerPixel:4
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync hasAlpha:YES
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync isPlanar:NO
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync colorSpaceName:NSDeviceRGBColorSpace
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync bytesPerRow:frame.size.width * 4
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync bitsPerPixel:8 * 4];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_ThumbImage = [[NSImage alloc] initWithSize:[m_ThumbBitmap size]];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_ThumbImage addRepresentation:m_ThumbBitmap];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self unlock];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (BOOL)isFlipped
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return YES;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)drawRect:(NSRect)aRect
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self lock];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync#ifdef SHOW_WINDOW_BACKGROUND
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [[NSColor colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:0.7] set];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSRect frame = [self frame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [NSBezierPath fillRect:NSMakeRect(0, 0, frame.size.width, frame.size.height)];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync#endif /* SHOW_WINDOW_BACKGROUND */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (m_ThumbImage != nil)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_ThumbImage drawAtPoint:NSMakePoint(0, 0) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self unlock];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (NSBitmapImageRep*)thumbBitmap
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return m_ThumbBitmap;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (NSImage*)thumbImage
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return m_ThumbImage;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@end
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OverlayOpenGLContext class implementation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@implementation OverlayOpenGLContext
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(id)initWithFormat:(NSOpenGLPixelFormat*)format shareContext:(NSOpenGLContext*)share
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pPixelFormat = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pView = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync self = [super initWithFormat:format shareContext:share];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (self)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pPixelFormat = format;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return self;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)dealloc
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("Dealloc context %X\n", (uint)self));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pPixelFormat release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super dealloc];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(void)setView:(NSView*)view
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef FBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pView = view;;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super setView: view];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(NSView*)view
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef FBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return m_pView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return [super view];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(void)clearDrawable
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pView = NULL;;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super clearDrawable];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(NSOpenGLPixelFormat*)openGLPixelFormat
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return m_pPixelFormat;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OverlayHelperView class implementation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@implementation OverlayHelperView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(id)initWithOverlayWindow:(OverlayWindow*)pOverlayWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync self = [super initWithFrame:NSZeroRect];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pOverlayWindow = pOverlayWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return self;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(void)viewDidMoveToWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pOverlayWindow parentWindowChanged:[self window]];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OverlayWindow class implementation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@implementation OverlayWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (id)initWithParentView:(NSView*)pParentView overlayView:(OverlayView*)pOverlayView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if(self = [super initWithContentRect:NSZeroRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO])
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pParentView = pParentView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pOverlayView = pOverlayView;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_Thread = [NSThread currentThread];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pOverlayHelperView = [[OverlayHelperView alloc] initWithOverlayWindow:self];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Add the helper view as a child of the parent view to get notifications */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pParentView addSubview:m_pOverlayHelperView];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Make sure this window is transparent */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef SHOW_WINDOW_BACKGROUND
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* For debugging */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self setBackgroundColor:[NSColor colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:0.7]];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self setBackgroundColor:[NSColor clearColor]];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self setOpaque:NO];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self setAlphaValue:.999];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Disable mouse events for this window */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self setIgnoresMouseEvents:YES];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSWindow *pParentWin = [m_pParentView window];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Initial set the position to the parents view top/left (Compiz fix). */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self setFrameOrigin:
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pParentWin convertBaseToScreen:
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pParentView convertPoint:NSZeroPoint toView:nil]]];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Set the overlay view as our content view */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self setContentView:m_pOverlayView];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Add ourself as a child to the parent views window. Note: this has to
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * be done last so that everything else is setup in
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * parentWindowChanged. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pParentWin addChildWindow:self ordered:NSWindowAbove];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return self;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)dealloc
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("Dealloc window %X\n", (uint)self));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [[NSNotificationCenter defaultCenter] removeObserver:self];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_pOverlayHelperView removeFromSuperview];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pOverlayHelperView release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super dealloc];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)parentWindowFrameChanged:(NSNotification*)pNote
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Reposition this window with the help of the OverlayView. Perform the
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * call in the OpenGL thread. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync// [m_pOverlayView performSelector:@selector(reshape) onThread:m_Thread withObject:nil waitUntilDone:YES];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pOverlayView reshape];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)parentWindowChanged:(NSWindow*)pWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [[NSNotificationCenter defaultCenter] removeObserver:self];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if(pWindow != nil)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Ask to get notifications when our parent window frame changes. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [[NSNotificationCenter defaultCenter]
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync addObserver:self
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync selector:@selector(parentWindowFrameChanged:)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync name:NSWindowDidResizeNotification
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync object:pWindow];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Add us self as child window */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pWindow addChildWindow:self ordered:NSWindowAbove];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Reshape the overlay view after a short waiting time to let the main
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * window resize itself properly. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync// [m_pOverlayView performSelector:@selector(reshape) withObject:nil afterDelay:0.2];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync// [NSTimer scheduledTimerWithTimeInterval:0.2 target:m_pOverlayView selector:@selector(reshape) userInfo:nil repeats:NO];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_pOverlayView reshape];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OverlayView class implementation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@implementation OverlayView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView*)pParentView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pParentView = pParentView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Make some reasonable defaults */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pGLCtx = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pSharedGLCtx = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync mThread = aThread;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOId = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOTexId = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOTexSize = NSZeroSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBODepthStencilPackedId = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_cClipRects = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_paClipRects = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_Pos = NSZeroPoint;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_Size = NSZeroSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_RootShift = NSZeroPoint;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("Init view %X (%X)\n", (uint)self, (uint)mThread));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync self = [super initWithFrame:frame];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return self;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)dealloc
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("Dealloc view %X\n", (uint)self));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self deleteFBO];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_pGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if ([m_pGLCtx view] == self)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pGLCtx clearDrawable];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_pSharedGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if ([m_pSharedGLCtx view] == self)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pSharedGLCtx clearDrawable];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pSharedGLCtx release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self clearVisibleRegions];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super dealloc];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)drawRect:(NSRect)aRect
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// NSGraphicsContext*pC = [NSGraphicsContext currentContext];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// [[NSColor blueColor] set];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// NSBezierPath *p = [[NSBezierPath alloc] bezierPathWithOvalInRect:[self frame]];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// [p fill];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// [[NSColor greenColor] set];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// [p stroke];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// if ([self lockFocusIfCanDraw])
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// [self renderFBOToView];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// [self unlockFocus];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)setGLCtx:(NSOpenGLContext*)pCtx
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pGLCtx = pCtx;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSOpenGLContext*)glCtx
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return m_pGLCtx;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)setPos:(NSPoint)pos
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_Pos = pos;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self reshape];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSPoint)pos
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return m_Pos;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)setSize:(NSSize)size
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_Size = size;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self reshape];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self updateFBO];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSSize)size
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return m_Size;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)updateViewport
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (m_pSharedGLCtx)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Update the viewport for our OpenGL view */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_pSharedGLCtx makeCurrentContext];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_pSharedGLCtx update];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSRect r = [self frame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Setup all matrices */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glMatrixMode(GL_PROJECTION);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glLoadIdentity();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glViewport(0, 0, r.size.width, r.size.height);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glOrtho(0, r.size.width, 0, r.size.height, -1, 1);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glMatrixMode(GL_TEXTURE);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glLoadIdentity();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTranslatef(0.0f, m_RootShift.y, 0.0f);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glMatrixMode(GL_MODELVIEW);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glLoadIdentity();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTranslatef(-m_RootShift.x, 0.0f, 0.0f);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Clear background to transparent */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glEnable(GL_TEXTURE_RECTANGLE_ARB);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_FBOTexId);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_pGLCtx makeCurrentContext];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)reshape
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Getting the right screen coordinates of the parents frame is a little bit
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * complicated. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSRect parentFrame = [m_pParentView frame];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSPoint parentPos = [[m_pParentView window] convertBaseToScreen:[[m_pParentView superview] convertPointToBase:NSMakePoint(parentFrame.origin.x, parentFrame.origin.y + parentFrame.size.height)]];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync parentFrame.origin.x = parentPos.x;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync parentFrame.origin.y = parentPos.y;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Calculate the new screen coordinates of the overlay window. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSPoint childPos = NSMakePoint(m_Pos.x, m_Pos.y + m_Size.height);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync childPos = [[m_pParentView window] convertBaseToScreen:[[m_pParentView superview] convertPointToBase:childPos]];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Make a frame out of it. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSRect childFrame = NSMakeRect(childPos.x, childPos.y, m_Size.width, m_Size.height);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* We have to make sure that the overlay window will not be displayed out
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * of the parent window. So intersect both frames & use the result as the new
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * frame for the window. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSRect newFrame = NSIntersectionRect(parentFrame, childFrame);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Later we have to correct the texture position in the case the window is
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * out of the parents window frame. So save the shift values for later use. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (parentFrame.origin.x > childFrame.origin.x)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_RootShift.x = parentFrame.origin.x - childFrame.origin.x;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_RootShift.x = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (parentFrame.origin.y > childFrame.origin.y)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_RootShift.y = parentFrame.origin.y - childFrame.origin.y;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_RootShift.y = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// NSScrollView *pScrollView = [[[m_pParentView window] contentView] enclosingScrollView];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// if (pScrollView)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// NSRect scrollRect = [pScrollView documentVisibleRect];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// NSRect scrollRect = [m_pParentView visibleRect];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// printf ("sc rect: %d %d %d %d\n", (int) scrollRect.origin.x,(int) scrollRect.origin.y,(int) scrollRect.size.width,(int) scrollRect.size.height);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// NSRect b = [[m_pParentView superview] bounds];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// printf ("bound rect: %d %d %d %d\n", (int) b.origin.x,(int) b.origin.y,(int) b.size.width,(int) b.size.height);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// newFrame.origin.x += scrollRect.origin.x;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// newFrame.origin.y += scrollRect.origin.y;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Set the new frame. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [[self window] setFrame:newFrame display:YES];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Inform the dock tile view as well */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self reshapeDockTile];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Make sure the context is updated according */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self updateViewport];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)createFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self deleteFBO];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GL_SAVE_STATE;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* If not previously setup generate IDs for FBO and its associated texture. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (!m_FBOId)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Make sure the framebuffer extension is supported */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync const GLubyte* strExt;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLboolean isFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Get the extension name string. It is a space-delimited list of the
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * OpenGL extensions that are supported by the current renderer. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync strExt = glGetString(GL_EXTENSIONS);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync isFBO = gluCheckExtension((const GLubyte*)"GL_EXT_framebuffer_object", strExt);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (!isFBO)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("Your system does not support framebuffer extension\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Create FBO object */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glGenFramebuffersEXT(1, &m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* & the texture as well the depth/stencil render buffer */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glGenTextures(1, &m_FBOTexId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG_1(("Create FBO %d %d\n", m_FBOId, m_FBOTexId));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glGenRenderbuffersEXT(1, &m_FBODepthStencilPackedId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOTexSize = m_Size;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Bind to FBO */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glEnable(GL_TEXTURE_RECTANGLE_ARB);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLfloat imageAspectRatio = m_FBOTexSize.width / m_FBOTexSize.height;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Sanity check against maximum OpenGL texture size. If bigger adjust to
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * maximum possible size while maintain the aspect ratio. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint maxTexSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// maxTexSize = 150;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint filter = GL_NEAREST;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_FBOTexSize.width > maxTexSize || m_FBOTexSize.height > maxTexSize)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync filter = GL_NICEST;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (imageAspectRatio > 1)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOTexSize.width = maxTexSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOTexSize.height = maxTexSize / imageAspectRatio;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOTexSize.width = maxTexSize * imageAspectRatio;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOTexSize.height = maxTexSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Initialize FBO Texture */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_FBOTexId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, filter);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, filter);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* The GPUs like the GL_BGRA / GL_UNSIGNED_INT_8_8_8_8_REV combination
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * others are also valid, but might incur a costly software translation. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, m_FBOTexSize.width, m_FBOTexSize.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Now attach texture to the FBO as its color destination */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, m_FBOTexId, 0);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_FBODepthStencilPackedId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_STENCIL_EXT, m_FBOTexSize.width, m_FBOTexSize.height);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_FBODepthStencilPackedId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_FBODepthStencilPackedId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Make sure the FBO was created succesfully. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (GL_FRAMEBUFFER_COMPLETE_EXT != glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT))
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("Framebuffer Object creation or update failed!\n"));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Is there a dock tile preview enabled in the GUI? If so setup a
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * additional thumbnail view for the dock tile. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSView *dockScreen = [self dockTileScreen];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (dockScreen)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (!m_FBOThumbId)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glGenFramebuffersEXT(1, &m_FBOThumbId);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glGenTextures(1, &m_FBOThumbTexId);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOThumbId);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Initialize FBO Texture */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_FBOThumbTexId);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NICEST);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NICEST);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* The GPUs like the GL_BGRA / GL_UNSIGNED_INT_8_8_8_8_REV combination
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * others are also valid, but might incur a costly software translation. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, m_FBOTexSize.width * m_FBOThumbScaleX, m_FBOTexSize.height * m_FBOThumbScaleY, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Now attach texture to the FBO as its color destination */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, m_FBOThumbTexId, 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Make sure the FBO was created succesfully. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (GL_FRAMEBUFFER_COMPLETE_EXT != glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT))
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync DEBUG_MSG(("Framebuffer Thumb Object creation or update failed!\n"));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_DockTileView = [[DockOverlayView alloc] init];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self reshapeDockTile];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [dockScreen addSubview:m_DockTileView];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Initialize with one big visual region over the full size */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self clearVisibleRegions];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_cClipRects = 1;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_paClipRects = (GLint*)RTMemAlloc(sizeof(GLint) * 4);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_paClipRects[0] = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_paClipRects[1] = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_paClipRects[2] = m_FBOTexSize.width;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_paClipRects[3] = m_FBOTexSize.height;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GL_RESTORE_STATE;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)deleteFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if ([NSOpenGLContext currentContext] != nil)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GL_SAVE_STATE;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_FBODepthStencilPackedId > 0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glDeleteRenderbuffersEXT(1, &m_FBODepthStencilPackedId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBODepthStencilPackedId = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_FBOTexId > 0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glEnable(GL_TEXTURE_RECTANGLE_ARB);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glDeleteTextures(1, &m_FBOTexId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOTexId = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_FBOId > 0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glDeleteFramebuffersEXT(1, &m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_FBOId = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GL_RESTORE_STATE;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (m_DockTileView != nil)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_DockTileView removeFromSuperview];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_DockTileView release];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_DockTileView = nil;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)updateFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self makeCurrentFBO];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_pGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef FBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self createFBO];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pGLCtx update];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)makeCurrentFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG_1(("MakeCurrent called %X\n", self));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef FBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_pGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if ([m_pGLCtx view] != self)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* We change the active view, so flush first */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glFlush();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pGLCtx setView: self];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync CHECK_GL_ERROR();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// if ([NSOpenGLContext currentContext] != m_pGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pGLCtx makeCurrentContext];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync CHECK_GL_ERROR();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// [m_pGLCtx update];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef FBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)swapFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG_1(("SwapCurrent called %X\n", self));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef FBO
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLint tmpFB;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &tmpFB);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync DEBUG_MSG_1(("Swap GetINT %d\n", tmpFB));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pGLCtx flushBuffer];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (tmpFB == m_FBOId)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if ([self lockFocusIfCanDraw])
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self renderFBOToView];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self unlockFocus];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pGLCtx flushBuffer];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)flushFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLint tmpFB;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &tmpFB);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glFlush();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync DEBUG_MSG_1 (("Flusj GetINT %d\n", tmpFB));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (tmpFB == m_FBOId)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if ([self lockFocusIfCanDraw])
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self renderFBOToView];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self unlockFocus];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)finishFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLint tmpFB;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &tmpFB);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glFinish();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync // glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync DEBUG_MSG_1 (("Finish GetINT %d\n", tmpFB));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (tmpFB == m_FBOId)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if ([self lockFocusIfCanDraw])
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self renderFBOToView];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self unlockFocus];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)bindFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)renderFBOToView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (!m_pSharedGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Create a shared context out of the main context. Use the same pixel format. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pSharedGLCtx = [[NSOpenGLContext alloc] initWithFormat:[(OverlayOpenGLContext*)m_pGLCtx openGLPixelFormat] shareContext:m_pGLCtx];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Set the new context as non opaque */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint opaque = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pSharedGLCtx setValues:&opaque forParameter:NSOpenGLCPSurfaceOpacity];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Only swap on screen refresh */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// GLint swap = 1;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// [m_pSharedGLCtx setValues:&swap forParameter:NSOpenGLCPSwapInterval];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Set this view as the drawable for the new context */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pSharedGLCtx setView: self];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self updateViewport];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_pSharedGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSRect r = [self frame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_FBOTexId > 0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pSharedGLCtx makeCurrentContext];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (m_FBOThumbTexId > 0 &&
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_DockTileView thumbBitmap] != nil)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync#if 0
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* todo: check this for optimization */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE,
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GL_STORAGE_SHARED_APPLE);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync sizex, sizey, 0, GL_BGRA,
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GL_UNSIGNED_INT_8_8_8_8_REV, myImagePtr);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB,
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync 0, 0, 0, 0, 0, image_width, image_height);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glFlush();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync // Do other work processing here, using a double or triple buffer
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glGetTexImage(GL_TEXTURE_RECTANGLE_ARB, 0, GL_BGRA,
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync#endif
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GL_SAVE_STATE;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOThumbId);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* We like to read from the primary color buffer */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSRect rr = [m_DockTileView frame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Setup all matrices */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glMatrixMode(GL_PROJECTION);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glLoadIdentity();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glViewport(0, 0, rr.size.width, rr.size.height);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glOrtho(0, rr.size.width, 0, rr.size.height, -1, 1);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glScalef(m_FBOThumbScaleX, m_FBOThumbScaleY, 1.0f);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glMatrixMode(GL_TEXTURE);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glLoadIdentity();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTranslatef(0.0f, m_RootShift.y, 0.0f);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glMatrixMode(GL_MODELVIEW);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glLoadIdentity();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Clear background to transparent */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glClear(GL_COLOR_BUFFER_BIT);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glEnable(GL_TEXTURE_RECTANGLE_ARB);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_FBOTexId);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLint i;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync for (i = 0; i < m_cClipRects; ++i)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLint x1 = m_paClipRects[4*i];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLint y1 = (r.size.height - m_paClipRects[4*i+1]);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLint x2 = m_paClipRects[4*i+2];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GLint y2 = (r.size.height - m_paClipRects[4*i+3]);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBegin(GL_QUADS);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexCoord2i(x1, y1); glVertex2i(x1, y1);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexCoord2i(x1, y2); glVertex2i(x1, y2);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexCoord2i(x2, y2); glVertex2i(x2, y2);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glTexCoord2i(x2, y1); glVertex2i(x2, y1);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glEnd();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glFinish();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Here the magic of reading the FBO content in our own buffer
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * happens. We have to lock this access, in the case the dock
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * is updated currently. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_DockTileView lock];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glReadPixels(0, 0, rr.size.width, rr.size.height,
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GL_RGBA,
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GL_UNSIGNED_BYTE,
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [[m_DockTileView thumbBitmap] bitmapData]);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_DockTileView unlock];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSDockTile *pDT = [[NSApplication sharedApplication] dockTile];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Send a display message to the dock tile in the main thread */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [[[NSApplication sharedApplication] dockTile] performSelectorOnMainThread:@selector(display) withObject:nil waitUntilDone:NO];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync GL_RESTORE_STATE;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Clear background to transparent */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glClear(GL_COLOR_BUFFER_BIT);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Blit the content of the FBO to the screen. todo: check for
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * optimization with display lists. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint i;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync for (i = 0; i < m_cClipRects; ++i)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint x1 = m_paClipRects[4*i];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint y1 = r.size.height - m_paClipRects[4*i+1];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint x2 = m_paClipRects[4*i+2];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync GLint y2 = r.size.height - m_paClipRects[4*i+3];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBegin(GL_QUADS);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glTexCoord2i(x1, y1); glVertex2i(x1, y1);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glTexCoord2i(x1, y2); glVertex2i(x1, y2);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glTexCoord2i(x2, y2); glVertex2i(x2, y2);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glTexCoord2i(x2, y1); glVertex2i(x2, y1);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glEnd();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pSharedGLCtx flushBuffer];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pGLCtx makeCurrentContext];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)clearVisibleRegions
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if(m_paClipRects)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync RTMemFree(m_paClipRects);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_paClipRects = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_cClipRects = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)setVisibleRegions:(GLint)cRects paRects:(GLint*)paRects
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG_1(("New region recieved\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self clearVisibleRegions];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (cRects>0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_paClipRects = (GLint*)RTMemAlloc(sizeof(GLint) * 4 * cRects);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_cClipRects = cRects;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync memcpy(m_paClipRects, paRects, sizeof(GLint) * 4 * cRects);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (NSView*)dockTileScreen
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSView *contentView = [[[NSApplication sharedApplication] dockTile] contentView];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSView *screenContent = nil;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if ([contentView respondsToSelector:@selector(screenContent)])
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync screenContent = [contentView performSelector:@selector(screenContent)];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return screenContent;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)reshapeDockTile
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSRect dockFrame = [[self dockTileScreen] frame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSRect parentFrame = [m_pParentView frame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_FBOThumbScaleX = (float)dockFrame.size.width / parentFrame.size.width;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_FBOThumbScaleY = (float)dockFrame.size.height / parentFrame.size.height;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync NSRect newFrame = NSMakeRect ((int)(m_Pos.x * m_FBOThumbScaleX), (int)(dockFrame.size.height - (m_Pos.y + m_Size.height - m_RootShift.y) * m_FBOThumbScaleY), (int)(m_Size.width * m_FBOThumbScaleX), (int)(m_Size.height * m_FBOThumbScaleY));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync// NSRect newFrame = NSMakeRect ((int)roundf(m_Pos.x * m_FBOThumbScaleX), (int)roundf(dockFrame.size.height - (m_Pos.y + m_Size.height) * m_FBOThumbScaleY), (int)roundf(m_Size.width * m_FBOThumbScaleX), (int)roundf(m_Size.height * m_FBOThumbScaleY));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync// NSRect newFrame = NSMakeRect ((m_Pos.x * m_FBOThumbScaleX), (dockFrame.size.height - (m_Pos.y + m_Size.height) * m_FBOThumbScaleY), (m_Size.width * m_FBOThumbScaleX), (m_Size.height * m_FBOThumbScaleY));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync// printf ("%f %f %f %f - %f %f\n", newFrame.origin.x, newFrame.origin.y, newFrame.size.width, newFrame.size.height, m_Size.height, m_FBOThumbScaleY);
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_DockTileView setFrame: newFrame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OpenGL context management
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaGLCtxCreate(NativeGLCtxRef *ppCtx, GLbitfield fVisParams)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLPixelFormatAttribute attribs[24] =
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLPFAWindow,
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLPFAAccelerated,
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync };
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync int i = 4;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_ALPHA_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("CR_ALPHA_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFAAlphaSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 8;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_DEPTH_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("CR_DEPTH_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFADepthSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 24;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_STENCIL_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("CR_STENCIL_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFAStencilSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 8;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_ACCUM_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("CR_ACCUM_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFAAccumSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_ALPHA_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 32;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 24;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_MULTISAMPLE_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("CR_MULTISAMPLE_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFASampleBuffers;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 1;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFASamples;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 4;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_DOUBLE_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("CR_DOUBLE_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFADoubleBuffer;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_STEREO_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("CR_DOUBLE_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFAStereo;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Mark the end */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Choose a pixel format */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLPixelFormat* pFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pFmt)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *ppCtx = [[OverlayOpenGLContext alloc] initWithFormat:pFmt shareContext:nil];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Enable multi threaded OpenGL engine */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// CGLContextObj cglCtx = [*ppCtx CGLContextObj];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// CGLError err = CGLEnable(cglCtx, kCGLCEMPEngine);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// if (err != kCGLNoError)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// printf ("Couldn't enable MT OpenGL engine!\n");
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG(("New context %X\n", (uint)*ppCtx));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaGLCtxDestroy(NativeGLCtxRef pCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// [pCtx release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* View management
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaViewCreate(NativeViewRef *ppView, NativeViewRef pParentView, GLbitfield fVisParams)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Create our worker view */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync OverlayView* pView = [[OverlayView alloc] initWithFrame:NSZeroRect thread:RTThreadSelf() parentView:pParentView];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pView)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* We need a real window as container for the view */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [[OverlayWindow alloc] initWithParentView:pParentView overlayView:pView];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Return the freshly created overlay view */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *ppView = pView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaViewDestroy(NativeViewRef pView)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* Hide the view early */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pView setHidden: YES];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSWindow *win = [pView window];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [[NSNotificationCenter defaultCenter] removeObserver:win];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [win setContentView: nil];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [[win parentWindow] removeChildWindow: win];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync int b = [win retainCount];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync for (; b > 1; --b)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [win release];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync /* There seems to be a bug in the performSelector method which is called in
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * parentWindowChanged above. The object is retained but not released. This
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * results in an unbalanced reference count, which is here manually
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * decremented. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync int a = [pView retainCount];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync for (; a > 1; --a)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [pView release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaViewShow(NativeViewRef pView, GLboolean fShowIt)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pView setHidden: fShowIt==GL_TRUE?NO:YES];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaViewDisplay(NativeViewRef pView)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [(OverlayView*)pView swapFBO];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaViewSetPosition(NativeViewRef pView, NativeViewRef pParentView, int x, int y)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [(OverlayView*)pView setPos:NSMakePoint(x, y)];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaViewSetSize(NativeViewRef pView, int w, int h)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [(OverlayView*)pView setSize:NSMakeSize(w, h)];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaViewGetGeometry(NativeViewRef pView, int *pX, int *pY, int *pW, int *pH)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSRect frame = [[pView window] frame];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *pX = frame.origin.x;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *pY = frame.origin.y;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *pW = frame.size.width;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *pH = frame.size.height;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaViewMakeCurrentContext(NativeViewRef pView, NativeGLCtxRef pCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [(OverlayView*)pView setGLCtx:pCtx];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [(OverlayView*)pView makeCurrentFBO];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaViewSetVisibleRegion(NativeViewRef pView, GLint cRects, GLint* paRects)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [(OverlayView*)pView setVisibleRegions:cRects paRects:paRects];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* Additional OpenGL wrapper
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaFlush()
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// glFlush();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync// return;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG_1(("glFlush called\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef FBO
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync# if 0
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLContext *pCtx = [NSOpenGLContext currentContext];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSView *pView = [pCtx view];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pView)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if ([pView respondsToSelector:@selector(flushFBO)])
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pView performSelector:@selector(flushFBO)];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync# endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glFlush();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaFinish()
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG_1(("glFinish called\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef FBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLContext *pCtx = [NSOpenGLContext currentContext];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSView *pView = [pCtx view];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pView)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if ([pView respondsToSelector:@selector(finishFBO)])
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pView performSelector:@selector(finishFBO)];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glFinish();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsyncvoid cocoaBindFramebufferEXT(GLenum target, GLuint framebuffer)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync DEBUG_MSG_1(("glRenderspuBindFramebufferEXT called %d\n", framebuffer));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#ifdef FBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (framebuffer != 0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(target, framebuffer);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLContext *pCtx = [NSOpenGLContext currentContext];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSView *pView = [pCtx view];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pView)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if ([pView respondsToSelector:@selector(bindFBO)])
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pView performSelector:@selector(bindFBO)];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync glBindFramebufferEXT(target, framebuffer);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync