bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync/* $Id$ */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/** @file
1d753fdeb00e3867c6bbf94ab3c36cd6734dd447vboxsync * VirtualBox OpenGL Cocoa Window System Helper Implementation.
1d753fdeb00e3867c6bbf94ab3c36cd6734dd447vboxsync *
1d753fdeb00e3867c6bbf94ab3c36cd6734dd447vboxsync * This source file is shared between the SharedOpenGL HGCM service and the
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * SVGA3d emulation.
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/*
d14682a025d2c801f1e777f491092d2ebbe78c3cvboxsync * Copyright (C) 2009-2014 Oracle Corporation
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
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync/** @page pg_opengl_cocoa OpenGL - Cocoa Window System Helper
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync *
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * How this works:
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * In general it is not so easy like on the other platforms, cause Cocoa
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * doesn't support any clipping of already painted stuff. In Mac OS X there is
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * the concept of translucent canvas's e.g. windows and there it is just
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * painted what should be visible to the user. Unfortunately this isn't the
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * concept of chromium. Therefor I reroute all OpenGL operation from the guest
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * to a frame buffer object (FBO). This is a OpenGL extension, which is
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * supported by all OS X versions we support (AFAIC tell). Of course the guest
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * doesn't know that and we have to make sure that the OpenGL state always is
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * in the right state to paint into the FBO and not to the front/back buffer.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * Several functions below (like cocoaBindFramebufferEXT, cocoaGetIntegerv,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * ...) doing this. When a swap or finish is triggered by the guest, the
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * content (which is already bound to an texture) is painted on the screen
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * within a separate OpenGL context. This allows the usage of the same
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * resources (texture ids, buffers ...) but at the same time having an
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * different internal OpenGL state. Another advantage is that we can paint a
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * thumbnail of the current output in a much more smaller (GPU accelerated
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * scale) version on a third context and use glReadPixels to get the actual
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * data. glReadPixels is a very slow operation, but as we just use a much more
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * smaller image, we can handle it (anyway this is only done 5 times per
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * second).
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync *
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * Other things to know:
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * - If the guest request double buffering, we have to make sure there are two
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * buffers. We use the same FBO with 2 color attachments. Also glDrawBuffer
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * and glReadBuffer is intercepted to make sure it is painted/read to/from
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * the correct buffers. On swap our buffers are swapped and not the
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * front/back buffer.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * - If the guest request a depth/stencil buffer, a combined render buffer for
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * this is created.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * - If the size of the guest OpenGL window changes, all FBO's, textures, ...
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * need to be recreated.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * - We need to track any changes to the parent window
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * (create/destroy/move/resize). The various classes like OverlayHelperView,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * OverlayWindow, ... are there for.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * - The HGCM service runs on a other thread than the Main GUI. Keeps this
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * always in mind (see e.g. performSelectorOnMainThread in renderFBOToView)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * - We make heavy use of late binding. We can not be sure that the GUI (or any
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * other third party GUI), overwrite our NSOpenGLContext. So we always ask if
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * this is our own one, before use. Really neat concept of Objective-C/Cocoa
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * ;)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync *
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/*******************************************************************************
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync* Header Files *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync*******************************************************************************/
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifdef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define LOG_GROUP LOG_GROUP_DEV_VMSVGA
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#include "renderspu_cocoa_helper.h"
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#import <Cocoa/Cocoa.h>
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#undef PVM /* sys/param.h (included via Cocoa.h) pollutes the namespace with this define. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifndef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# include "chromium.h" /* For the visual bits of chromium */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#include <iprt/assert.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#include <iprt/critsect.h>
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#include <iprt/mem.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#include <iprt/string.h>
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#include <iprt/time.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#include <iprt/thread.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
e6e69eb2216092b564f920a6214f5103333ce54cvboxsync#include <VBox/VBoxOGL.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#include <VBox/log.h>
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifdef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# include "DevVGA-SVGA3d-cocoa.h"
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync# include <OpenGL/OpenGL.h>
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync# include <OpenGL/gl3.h>
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync# include <OpenGL/gl3ext.h>
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync# include <OpenGL/glext.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#else
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# include <cr_vreg.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# include <cr_error.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# include <cr_blitter.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# ifdef VBOX_WITH_CRDUMPER_THUMBNAIL
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# include <cr_pixeldata.h>
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# endif
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# include "renderspu.h"
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/*******************************************************************************
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync* Defined Constants And Macros *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync*******************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/* Debug macros */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/** @def FBO
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Disable this to see how the output is without the FBO in the middle of the processing chain. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#define FBO 1
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/** @def CR_RENDER_FORCE_PRESENT_MAIN_THREAD
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Force present schedule to main thread. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/** @def SHOW_WINDOW_BACKGROUND
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Define this to see the window background even if the window is clipped. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/** @def DEBUG_VERBOSE
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Define this to get some debug info about the messages flow. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#if 0 || defined(DOXYGEN_RUNNING)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync# define CR_RENDER_FORCE_PRESENT_MAIN_THREAD
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync# define SHOW_WINDOW_BACKGROUND 1
56db633f06f3070f792e84b806b77873e3e98404vboxsync# define DEBUG_VERBOSE
730f8be51b729e8a3c1e32c756cd0f4ec088dd4dvboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync#ifdef DEBUG_VERBOSE
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync# error "should be disabled!"
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# ifdef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define DEBUG_INFO(text) do { LogRel(text); AssertFailed(); } while (0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define DEBUG_WARN(text) do { LogRel(text); AssertFailed(); } while (0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# else
56db633f06f3070f792e84b806b77873e3e98404vboxsync# define DEBUG_INFO(text) do { LogRel(text); AssertFailed(); } while (0)
56db633f06f3070f792e84b806b77873e3e98404vboxsync# define DEBUG_WARN(text) do { LogRel(text); AssertFailed(); } while (0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# endif
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync
56db633f06f3070f792e84b806b77873e3e98404vboxsync# define DEBUG_MSG(text) do { LogRel(text); } while (0)
56db633f06f3070f792e84b806b77873e3e98404vboxsync# define DEBUG_MSG_1(text) do { LogRel(text); } while (0)
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# ifdef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define DEBUG_INFO(text) do { LogRel(text); } while (0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define DEBUG_WARN(text) do { LogRel(text); } while (0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# else
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define DEBUG_INFO(text) do { crInfo text; } while (0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define DEBUG_WARN(text) do { crWarning text; } while (0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync# define DEBUG_MSG(text) do {} while (0)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync# define DEBUG_MSG_1(text) do {} while (0)
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifdef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define DEBUG_MSG_NOT_VMSVGA3D(a_TextArgs) do {} while (0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define COCOA_LOG_FLOW(a_TextArgs) LogFlow(a_TextArgs)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#else
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define DEBUG_MSG_NOT_VMSVGA3D(a_TextArgs) DEBUG_MSG(a_TextArgs)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define COCOA_LOG_FLOW(a_TextArgs) DEBUG_MSG(a_TextArgs)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#define DEBUG_FUNC_ENTER() DEBUG_MSG(("==>%s\n", __PRETTY_FUNCTION__))
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#define DEBUG_FUNC_LEAVE() DEBUG_MSG(("<==%s\n", __PRETTY_FUNCTION__))
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#define DEBUG_GL_SAVE_STATE() \
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync do { \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPushAttrib(GL_ALL_ATTRIB_BITS); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glMatrixMode(GL_PROJECTION); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPushMatrix(); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glMatrixMode(GL_TEXTURE); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPushMatrix(); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glMatrixMode(GL_COLOR); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPushMatrix(); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glMatrixMode(GL_MODELVIEW); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPushMatrix(); \
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync } while (0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#define DEBUG_GL_RESTORE_STATE() \
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync do { \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glMatrixMode(GL_MODELVIEW); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPopMatrix(); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glMatrixMode(GL_COLOR); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPopMatrix(); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glMatrixMode(GL_TEXTURE); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPopMatrix(); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glMatrixMode(GL_PROJECTION); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPopMatrix(); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPopClientAttrib(); \
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync glPopAttrib(); \
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync } while (0)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#ifdef VBOX_STRICT
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync# define DEBUG_CLEAR_GL_ERRORS() \
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync do { \
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync while (glGetError() != GL_NO_ERROR) \
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync { /* nothing */ } \
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync } while (0)
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync# define DEBUG_CHECK_GL_ERROR(a_szOp) \
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync do { \
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync GLenum iGlCheckErr = glGetError(); \
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync if (RT_UNLIKELY(iGlCheckErr != GL_NO_ERROR)) \
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync AssertMsgFailed((a_szOp ": iGlCheckErr=%#x\n", iGlCheckErr)); \
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync } while (0)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#else
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync# define DEBUG_CLEAR_GL_ERRORS() do {} while (0)
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync# define DEBUG_CHECK_GL_ERROR(a_szOp) do {} while (0)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync/* Whether we control NSView automatic content zooming on Retina/HiDPI displays. */
aa4cd5b56e5cf2c510a42ddc153bd0f1f0c64fbavboxsync#define VBOX_WITH_CONFIGURABLE_HIDPI_SCALING 1
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifdef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
aa4cd5b56e5cf2c510a42ddc153bd0f1f0c64fbavboxsync/*
7c19e11502220292d5270519296442234c2493cdvboxsync * VMSVGA3D compatibility glue.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync */
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsynctypedef struct WindowInfo WindowInfo;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_RGB_BIT RT_BIT_32(0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_ALPHA_BIT RT_BIT_32(1)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_DEPTH_BIT RT_BIT_32(2)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_STENCIL_BIT RT_BIT_32(3)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_ACCUM_BIT RT_BIT_32(4)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_DOUBLE_BIT RT_BIT_32(5)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_STEREO_BIT RT_BIT_32(6)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_MULTISAMPLE_BIT RT_BIT_32(7)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_OVERLAY_BIT RT_BIT_32(8)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# define CR_PBUFFER_BIT RT_BIT_32(9)
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync# define VMSVGA3D_NON_DEFAULT_PROFILE_BIT RT_BIT_32(31)
7c19e11502220292d5270519296442234c2493cdvboxsync# define CR_ALL_BITS UINT32_C(0x800003ff)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync#endif /* IN_VMSVGA3D */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsyncstatic NSOpenGLContext *vboxCtxGetCurrent(void)
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifdef IN_VMSVGA3D
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync return [NSOpenGLContext currentContext];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#else
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync GET_CONTEXT(pCtxInfo);
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync if (pCtxInfo)
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync {
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync Assert(pCtxInfo->context);
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync return pCtxInfo->context;
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync }
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync return nil;
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync#endif
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsyncstatic bool vboxCtxSyncCurrentInfo(void)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifdef IN_VMSVGA3D
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync return false;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#else
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync bool fAdjusted = false;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync GET_CONTEXT(pCtxInfo);
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync NSOpenGLContext *pCtx = [NSOpenGLContext currentContext];
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync NSView *pView = pCtx ? [pCtx view] : nil;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (pCtxInfo)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync WindowInfo *pWinInfo = pCtxInfo->currentWindow;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync Assert(pWinInfo);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if ( pCtxInfo->context != pCtx
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync || pWinInfo->window != pView)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync renderspu_SystemMakeCurrent(pWinInfo, 0, pCtxInfo);
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync fAdjusted = true;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync else if (pCtx)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [NSOpenGLContext clearCurrentContext];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync fAdjusted = true;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return fAdjusted;
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync#endif
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * State carrying structure for use with vboxCtxEnter and vboxCtxLeave
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsynctypedef struct VBOX_CR_RENDER_CTX_INFO
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync bool fIsValid;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSOpenGLContext *pCtx;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSView *pView;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync} VBOX_CR_RENDER_CTX_INFO;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/** Pointer to render context info for use with vboxCtxEnter/Leave. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsynctypedef VBOX_CR_RENDER_CTX_INFO *PVBOX_CR_RENDER_CTX_INFO;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsyncstatic void vboxCtxEnter(NSOpenGLContext *pNewCtx, PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSOpenGLContext *pOldCtx = vboxCtxGetCurrent();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSView *pOldView = pOldCtx ? [pOldCtx view] : nil;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSView *pNewView = [pNewCtx view];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync Assert(pNewCtx);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if ( pOldCtx != pNewCtx
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync || pOldView != pNewView)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (pOldCtx != nil)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync glFlush();
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CLEAR_GL_ERRORS();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [pNewCtx makeCurrentContext];
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CHECK_GL_ERROR("makeCurrentContext");
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pCtxInfo->fIsValid = true;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pCtxInfo->pCtx = pOldCtx;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @todo r=bird: Why do we save the NEW VIEW here? vboxCtxLeave calls it 'pOldView'. Bug? */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pCtxInfo->pView = pNewView;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync else
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* No context switch necessary. */
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync pCtxInfo->fIsValid = false;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync}
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsyncstatic void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync{
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (pCtxInfo->fIsValid)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSOpenGLContext *pOldCtx = pCtxInfo->pCtx;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSView *pOldView = pCtxInfo->pView;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync glFlush();
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync if (pOldCtx != nil)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* vboxCtxEnter saves the new view, not the old. So, what we actually
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync do here is switching the view of the old context to that of the new
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync one (wrt vboxCtxEnter) before making it current. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @todo r=bird: Figure out what we really want to do here, and either rename
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * pOldView or fix the code. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if ([pOldCtx view] != pOldView)
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CLEAR_GL_ERRORS();
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync [pOldCtx setView: pOldView];
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CHECK_GL_ERROR("setView");
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CLEAR_GL_ERRORS();
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync [pOldCtx makeCurrentContext];
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CHECK_GL_ERROR("makeCurrentContext");
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#ifdef VBOX_STRICT
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSOpenGLContext *pTstOldCtx = [NSOpenGLContext currentContext];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSView *pTstOldView = pTstOldCtx ? [pTstOldCtx view] : nil;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Assert(pTstOldCtx == pOldCtx);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync Assert(pTstOldView == pOldView);
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync#endif
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync else
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync {
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync [NSOpenGLContext clearCurrentContext];
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync}
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Custom OpenGL context class.
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * This implementation doesn't allow to set a view to the context, but save the
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * view for later use. Also it saves a copy of the pixel format used to create
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * that context for later use.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@interface OverlayOpenGLContext: NSOpenGLContext
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@private
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLPixelFormat *m_pPixelFormat;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSView *m_pView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSOpenGLPixelFormat *)openGLPixelFormat;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Abstrack task class.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@interface VBoxTask : NSObject
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)run;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@end
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@implementation VBoxTask
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/** Run method that the child classes must reimplement.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * This will abort the process. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)run
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync AssertReleaseFailed();
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@end
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Generic task class for executing a given method select.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@interface VBoxTaskPerformSelector : VBoxTask
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@private
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync id m_Object;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync SEL m_Selector;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync id m_Arg;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (id)initWithObject:(id)aObject selector:(SEL)aSelector arg:(id)aArg;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)run;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)dealloc;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@end
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@implementation VBoxTaskPerformSelector
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Initializes a VBoxTaskPerformSelector.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @param aObject The object (reference not consumed).
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @param aSelector The method selector.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @param aArg The method argument (reference not consumed).
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (id)initWithObject:(id)aObject selector:(SEL)aSelector arg:(id)aArg
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync self = [super init];
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync if (self)
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync {
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync [aObject retain];
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync m_Object = aObject;
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync m_Selector = aSelector;
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync if (aArg != nil)
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync [aArg retain];
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync m_Arg = aArg;
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync }
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync return self;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)run
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_Object performSelector:m_Selector withObject:m_Arg];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)dealloc
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_Object release];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync if (m_Arg != nil)
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_Arg release];
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync [super dealloc];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@end
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@interface VBoxTaskComposite : VBoxTask
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@private
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSUInteger m_CurIndex;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync RTCRITSECT m_Lock;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSMutableArray *m_pArray;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync}
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (id)init;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)add:(VBoxTask *)pTask;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)run;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)dealloc;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@end
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@implementation VBoxTaskComposite
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (id)init
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync self = [super init];
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync if (self)
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync int rc = RTCritSectInit(&m_Lock);
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync if (!RT_SUCCESS(rc))
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync {
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync DEBUG_WARN(("RTCritSectInit failed %d\n", rc));
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync return nil;
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync }
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync m_CurIndex = 0;
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync m_pArray = [[NSMutableArray alloc] init];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync return self;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Adds a task to the composite task object.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @param pTask Task to add. Reference is NOT consumed.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)add:(VBoxTask *)pTask
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
1b74aa05b7bce4d1ccaabd12bf298df1f08f8511vboxsync [pTask retain];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync int rc = RTCritSectEnter(&m_Lock);
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync if (RT_SUCCESS(rc))
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_pArray addObject:pTask];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync RTCritSectLeave(&m_Lock);
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync else
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync DEBUG_WARN(("RTCritSectEnter failed %d\n", rc));
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pTask release];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)run
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync for (;;)
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Dequeue a task.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync int rc = RTCritSectEnter(&m_Lock);
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync if (RT_FAILURE(rc))
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync DEBUG_WARN(("RTCritSectEnter failed %d\n", rc));
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync break;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync NSUInteger count = [m_pArray count];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync Assert(m_CurIndex <= count);
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync if (m_CurIndex == count)
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_pArray removeAllObjects];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync m_CurIndex = 0;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync RTCritSectLeave(&m_Lock);
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync break;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync VBoxTask *pTask = (VBoxTask *)[m_pArray objectAtIndex:m_CurIndex];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync Assert(pTask != nil);
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync ++m_CurIndex;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Remove the first 1025 empty entires.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync if (m_CurIndex > 1024)
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync NSRange range;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync range.location = 0;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync range.length = m_CurIndex;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_pArray removeObjectsInRange:range];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync m_CurIndex = 0;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync RTCritSectLeave(&m_Lock);
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Run the task and release it.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pTask run];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pTask release];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)dealloc
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync NSUInteger count = [m_pArray count];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync for (;m_CurIndex < count; ++m_CurIndex)
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync VBoxTask *pTask = (VBoxTask*)[m_pArray objectAtIndex:m_CurIndex];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync DEBUG_WARN(("dealloc with non-empty tasks! %p\n", pTask));
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pTask release];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_pArray release];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync RTCritSectDelete(&m_Lock);
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync [super dealloc];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@end
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@interface VBoxMainThreadTaskRunner : NSObject
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@private
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync VBoxTaskComposite *m_pTasks;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (id)init;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)add:(VBoxTask *)pTask;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)addObj:(id)aObject selector:(SEL)aSelector arg:(id)aArg;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)runTasks;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (bool)runTasksSyncIfPossible;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)dealloc;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync+ (VBoxMainThreadTaskRunner *) globalInstance;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@end
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@implementation VBoxMainThreadTaskRunner
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (id)init
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync self = [super init];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync if (self)
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync m_pTasks = [[VBoxTaskComposite alloc] init];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync return self;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync+ (VBoxMainThreadTaskRunner *) globalInstance
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync static dispatch_once_t s_DispatchOnce;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync static VBoxMainThreadTaskRunner *s_pRunner = nil;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync dispatch_once(&s_DispatchOnce, ^{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync s_pRunner = [[VBoxMainThreadTaskRunner alloc] init];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync });
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync return s_pRunner;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)add:(VBoxTask *)pTask
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync DEBUG_FUNC_ENTER();
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_pTasks add:pTask];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @todo r=bird: Unbalanced [self retain]. */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [self retain];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync if (![self runTasksSyncIfPossible])
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync DEBUG_MSG(("task will be processed async\n"));
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [self performSelectorOnMainThread:@selector(runTasks) withObject:nil waitUntilDone:NO];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync DEBUG_FUNC_LEAVE();
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Adds a task calling an object method (selector).
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @param aObject The object (reference not consumed)..
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @param aSelector The method selector.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @param aArg The method argument (reference not consumed).
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)addObj:(id)aObject selector:(SEL)aSelector arg:(id)aArg
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync VBoxTaskPerformSelector *pSelTask = [[VBoxTaskPerformSelector alloc] initWithObject:aObject selector:aSelector arg:aArg];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [self add:pSelTask];
1b74aa05b7bce4d1ccaabd12bf298df1f08f8511vboxsync [pSelTask release];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Internal method for running the pending tasks.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)runTasks
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if ([NSThread isMainThread])
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_pTasks run];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @todo r=bird: This release and the retain in the add method aren't
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * necessarily balanced if there are more than one call to add().
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * This could probably end up deleting the singleton prematurely and leave
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * globalInstance() returning pointers to a stale object in freed memory,
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * quite possibly causing crashes or/and heap corruption. */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [self release];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync else
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync DEBUG_WARN(("run tasks called not on main thread!\n"));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#ifndef DEBUG_VERBOSE
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync AssertFailed();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync#endif
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [self performSelectorOnMainThread:@selector(runTasks) withObject:nil waitUntilDone:YES];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Callback for calling runTasks via renderspuCalloutClient.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @param pvUser The VBoxMainThreadTaskRunner singleton.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsyncstatic DECLCALLBACK(void) VBoxMainThreadTaskRunner_RcdRunCallback(void *pvUser)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_FUNC_ENTER();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync VBoxMainThreadTaskRunner *pRunner = (VBoxMainThreadTaskRunner *)pvUser;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync Assert(pRunner == [VBoxMainThreadTaskRunner globalInstance]);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [pRunner runTasks];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_FUNC_LEAVE();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync}
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Runs pending tasks synchronously, if possible in the current context.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @returns true if executed tasks, false if not possible.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (bool)runTasksSyncIfPossible
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifndef IN_VMSVGA3D
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Call on main thread (?) via renderspuCalloutClient (whatever that is).
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync if (renderspuCalloutAvailable())
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync Assert(![NSThread isMainThread]);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync renderspuCalloutClient(VBoxMainThreadTaskRunner_RcdRunCallback, self);
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync return true;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Run directly if on main thread.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync if ([NSThread isMainThread])
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync {
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [self runTasks];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync return true;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync }
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Not possible. */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync return false;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync- (void)dealloc
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @todo r=bird: WTF is the point of the deallocator. The object is a singelton
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * stored in an inaccessible static variable! */
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [m_pTasks release];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync m_pTasks = nil;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
374a0d34cb36711e4f767e3fcb67c4c032bb386cvboxsync [super dealloc];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync}
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync@end
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@class DockOverlayView;
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * The custom view class.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * This is the main class of the cocoa OpenGL implementation. It manages a
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * frame buffer object for the rendering of the guest applications. The guest
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * applications render in this frame buffer which is bound to an OpenGL texture.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * To display the guest content, a secondary shared OpenGL context of the main
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * OpenGL context is created. The secondary context is marked as non-opaque and
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * the texture is displayed on an object which is composed out of the several
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * visible region rectangles.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@interface OverlayView : NSView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@private
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSView *m_pParentView;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSWindow *m_pOverlayWin;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSOpenGLContext *m_pGLCtx;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSOpenGLContext *m_pSharedGLCtx;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync RTTHREAD m_Thread;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync GLuint m_FBOId;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync /** The corresponding dock tile view of this OpenGL view & all helper
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * members. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DockOverlayView *m_DockTileView;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync GLfloat m_FBOThumbScaleX;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync GLfloat m_FBOThumbScaleY;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync uint64_t m_msDockUpdateTS;
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @name For clipping
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * @remarks appears to be unused and a complete waste of time + heap.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * @{ */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync GLint m_cClipRects;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync GLint *m_paClipRects;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @} */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @name Position/Size tracking
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @{ */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSPoint m_Pos;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSSize m_Size;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @} */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync /** This is necessary for clipping on the root window */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSRect m_RootRect;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync float m_yInvRootOffset;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync CR_BLITTER *m_pBlitter;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync WindowInfo *m_pWinInfo;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync bool m_fNeedViewportUpdate;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync bool m_fNeedCtxUpdate;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync bool m_fDataVisible;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync bool m_fCleanupNeeded;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync bool m_fEverSized;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync}
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView *)pParentView winInfo:(WindowInfo *)pWinInfo;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)setGLCtx:(NSOpenGLContext*)pCtx;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSOpenGLContext *)glCtx;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)setParentView: (NSView *)view;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSView *)parentView;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)setOverlayWin: (NSWindow *)win;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSWindow *)overlayWin;
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetPos:(NSPoint)pos;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetPosUI:(NSPoint)pos;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxSetPosUIObj:(NSValue *)pPos;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSPoint)pos;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (bool)isEverSized;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxDestroy;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetSizeUI:(NSSize)size;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxSetSizeUIObj:(NSValue *)pSize;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetSize:(NSSize)size;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSSize)size;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync- (void)updateViewportCS;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync#ifdef VBOX_WITH_CONFIGURABLE_HIDPI_SCALING
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync- (NSRect)safeConvertRectToBacking:(NSRect *)pRect;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync- (CGFloat)safeGetBackingScaleFactor;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync#endif
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync- (NSRect)safeConvertToScreen:(NSRect *)pRect;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (void)vboxReshapePerform;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (void)vboxReshapeOnResizePerform;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (void)vboxReshapeOnReparentPerform;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync- (void)createDockTile;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync- (void)deleteDockTile;
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)makeCurrentFBO;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)swapFBO;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetVisible:(GLboolean)fVisible;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxSetVisibleUIObj:(NSNumber *)pVisible;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetVisibleUI:(GLboolean)fVisible;
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync- (void)vboxTryDraw;
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync- (void)vboxTryDrawUI;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxReparent:(NSView *)pParentView;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxReparentUI:(NSView *)pParentView;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxPresent:(const VBOXVR_SCR_COMPOSITOR *)pCompositor;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxPresentCS:(const VBOXVR_SCR_COMPOSITOR *)pCompositor;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxPresentToDockTileCS:(const VBOXVR_SCR_COMPOSITOR *)pCompositor;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxPresentToViewCS:(const VBOXVR_SCR_COMPOSITOR *)pCompositor;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)presentComposition:(const VBOXVR_SCR_COMPOSITOR_ENTRY *)pChangedEntry;
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#ifndef IN_VMSVGA3D
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync- (void)vboxBlitterSyncWindow;
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)clearVisibleRegions;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)setVisibleRegions:(GLint)cRects paRects:(const GLint *)paRects;
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync- (GLboolean)vboxNeedsEmptyPresent;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSView *)dockTileScreen;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)reshapeDockTile;
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync- (void)cleanupData;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Helper view.
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync *
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync * This view is added as a sub view of the parent view to track
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync * main window changes. Whenever the main window is changed
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync * (which happens on fullscreen/seamless entry/exit) the overlay
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync * window is informed & can add them self as a child window
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * again.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@class OverlayWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@interface OverlayHelperView: NSView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@private
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync OverlayWindow *m_pOverlayWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync-(id)initWithOverlayWindow:(OverlayWindow *)pOverlayWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Custom window class.
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync *
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync * This is the overlay window which contains our custom NSView.
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync * 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
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * events and handle frame change events of the parent view.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@interface OverlayWindow : NSWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@private
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSView *m_pParentView;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync OverlayView *m_pOverlayView;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync OverlayHelperView *m_pOverlayHelperView;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSThread *m_Thread;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (id)initWithParentView:(NSView *)pParentView overlayView:(OverlayView *)pOverlayView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)parentWindowFrameChanged:(NSNotification *)note;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)parentWindowChanged:(NSWindow *)pWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync/**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Dock overlay view class.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@interface DockOverlayView: NSView
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSBitmapImageRep *m_ThumbBitmap;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSImage *m_ThumbImage;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync 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;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSBitmapImageRep *)thumbBitmap;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSImage *)thumbImage;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@end
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@implementation DockOverlayView
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (id)init
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync self = [super init];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (self)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * 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
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * OpenGL thread when the thumbnail is updated.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_Lock = [[NSLock alloc] init];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return self;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)dealloc
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self cleanup];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_Lock release];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [super dealloc];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)cleanup
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (m_ThumbImage != nil)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_ThumbImage release];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_ThumbImage = nil;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync if (m_ThumbBitmap != nil)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_ThumbBitmap release];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_ThumbBitmap = nil;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)lock
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_Lock lock];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)unlock
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_Lock unlock];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)setFrame:(NSRect)frame
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [super setFrame:frame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self lock];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self cleanup];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync if ( frame.size.width > 0
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync && frame.size.height > 0)
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync {
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync /* Create a buffer for our thumbnail image. Its in the size of this view. */
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync m_ThumbBitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync pixelsWide:frame.size.width
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync pixelsHigh:frame.size.height
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync bitsPerSample:8
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync samplesPerPixel:4
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync hasAlpha:YES
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync isPlanar:NO
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync colorSpaceName:NSDeviceRGBColorSpace
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync bitmapFormat:NSAlphaFirstBitmapFormat
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync bytesPerRow:frame.size.width * 4
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync bitsPerPixel:8 * 4
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync ];
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync m_ThumbImage = [[NSImage alloc] initWithSize:[m_ThumbBitmap size]];
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync [m_ThumbImage addRepresentation:m_ThumbBitmap];
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self unlock];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (BOOL)isFlipped
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return YES;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)drawRect:(NSRect)aRect
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync NSRect frame;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_FUNC_ENTER();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self lock];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync#ifdef SHOW_WINDOW_BACKGROUND
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [[NSColor colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:0.7] set];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync frame = [self frame];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync [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];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self unlock];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSBitmapImageRep *)thumbBitmap
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return m_ThumbBitmap;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSImage *)thumbImage
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync return m_ThumbImage;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync@end
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif /* !IN_VMSVGA3D */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OverlayOpenGLContext class implementation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@implementation OverlayOpenGLContext
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync-(id)initWithFormat:(NSOpenGLPixelFormat *)format shareContext:(NSOpenGLContext *)share
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pPixelFormat = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pView = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync self = [super initWithFormat:format shareContext:share];
7c19e11502220292d5270519296442234c2493cdvboxsync Assert(self != nil);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (self)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pPixelFormat = format;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OCTX(%p): init OverlayOpenGLContext\n", (void *)self));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return self;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)dealloc
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OCTX(%p): dealloc OverlayOpenGLContext\n", (void *)self));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pPixelFormat release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super dealloc];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
c9a593aa048a154e59b52d1237d89e3cdaee9b3dvboxsync-(bool)isDoubleBuffer
c9a593aa048a154e59b52d1237d89e3cdaee9b3dvboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
c9a593aa048a154e59b52d1237d89e3cdaee9b3dvboxsync GLint val;
c9a593aa048a154e59b52d1237d89e3cdaee9b3dvboxsync [m_pPixelFormat getValues:&val forAttribute:NSOpenGLPFADoubleBuffer forVirtualScreen:0];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
c9a593aa048a154e59b52d1237d89e3cdaee9b3dvboxsync return val == GL_TRUE ? YES : NO;
c9a593aa048a154e59b52d1237d89e3cdaee9b3dvboxsync}
c9a593aa048a154e59b52d1237d89e3cdaee9b3dvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync-(void)setView:(NSView *)view
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OCTX(%p): setView: new view: %p\n", (void *)self, (void *)view));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync#if 1 /* def FBO */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pView = view;;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super setView: view];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync-(NSView *)view
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync#if 1 /* def FBO */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return m_pView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#else
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return [super view];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(void)clearDrawable
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OCTX(%p): clearDrawable\n", (void *)self));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pView = NULL;;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super clearDrawable];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync-(NSOpenGLPixelFormat *)openGLPixelFormat
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return m_pPixelFormat;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@end /* @implementation OverlayOpenGLContext */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OverlayHelperView class implementation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@implementation OverlayHelperView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync-(id)initWithOverlayWindow:(OverlayWindow *)pOverlayWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync self = [super initWithFrame:NSZeroRect];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pOverlayWindow = pOverlayWindow;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OHVW(%p): init OverlayHelperView\n", (void *)self));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return self;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync-(void)viewDidMoveToWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OHVW(%p): viewDidMoveToWindow: new win: %p\n", (void *)self, (void *)[self window]));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pOverlayWindow parentWindowChanged:[self window]];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@end
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OverlayWindow class implementation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@implementation OverlayWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (id)initWithParentView:(NSView *)pParentView overlayView:(OverlayView *)pOverlayView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync NSWindow *pParentWin = nil;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync self = [super initWithContentRect:NSZeroRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (self)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pParentView = pParentView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pOverlayView = pOverlayView;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_Thread = [NSThread currentThread];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync [m_pOverlayView setOverlayWin: self];
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_pOverlayHelperView = [[OverlayHelperView alloc] initWithOverlayWindow:self];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
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];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Disable mouse events for this window */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self setIgnoresMouseEvents:YES];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync 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
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * parentWindowChanged. */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pParentWin addChildWindow:self ordered:NSWindowAbove];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OWIN(%p): init OverlayWindow\n", (void *)self));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return self;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)dealloc
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OWIN(%p): dealloc OverlayWindow\n", (void *)self));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [[NSNotificationCenter defaultCenter] removeObserver:self];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_pOverlayHelperView removeFromSuperview];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pOverlayHelperView release];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super dealloc];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)parentWindowFrameChanged:(NSNotification *)pNote
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OWIN(%p): parentWindowFrameChanged\n", (void *)self));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Reposition this window with the help of the OverlayView. Perform the
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * call in the OpenGL thread.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /*
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [m_pOverlayView performSelector:@selector(vboxReshapePerform) onThread:m_Thread withObject:nil waitUntilDone:YES];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if ([m_pOverlayView isEverSized])
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if ([NSThread isMainThread])
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [m_pOverlayView vboxReshapePerform];
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync else
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [self performSelectorOnMainThread:@selector(vboxReshapePerform) withObject:nil waitUntilDone:NO];
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)parentWindowChanged:(NSWindow *)pWindow
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OWIN(%p): parentWindowChanged\n", (void *)self));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [[NSNotificationCenter defaultCenter] removeObserver:self];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync 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];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Add us self as child window */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pWindow addChildWindow:self ordered:NSWindowAbove];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Reshape the overlay view after a short waiting time to let the main
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * window resize itself properly.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /*
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [m_pOverlayView performSelector:@selector(vboxReshapePerform) withObject:nil afterDelay:0.2];
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [NSTimer scheduledTimerWithTimeInterval:0.2 target:m_pOverlayView selector:@selector(vboxReshapePerform) userInfo:nil repeats:NO];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if ([m_pOverlayView isEverSized])
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if ([NSThread isMainThread])
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [m_pOverlayView vboxReshapePerform];
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync else
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [self performSelectorOnMainThread:@selector(vboxReshapePerform) withObject:nil waitUntilDone:NO];
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@end /* @implementation OverlayWindow */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OverlayView class implementation
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync@implementation OverlayView
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView *)pParentView winInfo:(WindowInfo *)pWinInfo
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p aThread=%p pParentView=%p pWinInfo=%p\n", __PRETTY_FUNCTION__, (void *)self,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (void *)aThread, (void *)pParentView, (void *)pWinInfo));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_pParentView = pParentView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Make some reasonable defaults */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_pGLCtx = nil;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_pSharedGLCtx = nil;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync m_Thread = aThread;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_FBOId = 0;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_cClipRects = 0;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_paClipRects = NULL;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_Pos = NSZeroPoint;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_Size = NSMakeSize(1, 1);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync m_RootRect = NSMakeRect(0, 0, m_Size.width, m_Size.height);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync m_yInvRootOffset = 0;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync m_pBlitter = nil;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync m_pWinInfo = pWinInfo;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif
aa4cd5b56e5cf2c510a42ddc153bd0f1f0c64fbavboxsync m_fNeedViewportUpdate = true;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync m_fNeedCtxUpdate = true;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_fDataVisible = false;
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync m_fCleanupNeeded = false;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_fEverSized = false;
aa4cd5b56e5cf2c510a42ddc153bd0f1f0c64fbavboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync self = [super initWithFrame:frame];
d800c4d5127fc4b317658e72babf7f69f912dba2vboxsync#if defined(VBOX_WITH_CONFIGURABLE_HIDPI_SCALING) && !defined(IN_VMSVGA3D)
aa4cd5b56e5cf2c510a42ddc153bd0f1f0c64fbavboxsync /* Always allocate HiDPI-ready backing store for NSView, so we will be able change HiDPI scaling option in runtime. */
aa4cd5b56e5cf2c510a42ddc153bd0f1f0c64fbavboxsync crDebug("HiDPI: Allocate big backing store for NSView. Up-scaling is currently %s.", render_spu.fUnscaledHiDPI ? "OFF" : "ON");
aa4cd5b56e5cf2c510a42ddc153bd0f1f0c64fbavboxsync [self performSelector:@selector(setWantsBestResolutionOpenGLSurface:) withObject: (id)YES];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns self=%p\n", __PRETTY_FUNCTION__, (void *)self));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return self;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync- (void)cleanupData
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync [self deleteDockTile];
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync [self setGLCtx:nil];
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_pSharedGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync if ([m_pSharedGLCtx view] == self)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pSharedGLCtx clearDrawable];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pSharedGLCtx release];
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync m_pSharedGLCtx = nil;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#ifndef IN_VMSVGA3D
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync CrBltTerm(m_pBlitter);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync RTMemFree(m_pBlitter);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync m_pBlitter = nil;
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self clearVisibleRegions];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync}
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync- (void)dealloc
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync [self cleanupData];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [super dealloc];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)drawRect:(NSRect)aRect
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p aRect=%d,%d %d,%d\n", __PRETTY_FUNCTION__, (void *)self, (int)aRect.origin.x, (int)aRect.origin.y,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (int)aRect.size.width, (int)aRect.size.height));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync [self vboxTryDrawUI];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)setGLCtx:(NSOpenGLContext *)pCtx
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pCtx=%p (old=%p)\n", __PRETTY_FUNCTION__, (void *)self, (void *)pCtx, m_pGLCtx));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Only do something if the context changes.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (m_pGLCtx != pCtx)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Ensure the context drawable is cleared to avoid holding a reference to inexistent view. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (m_pGLCtx)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#ifdef IN_VMSVGA3D
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync Assert(!pCtx);
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [m_pGLCtx clearDrawable];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [m_pGLCtx release];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*[m_pGLCtx performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];*/
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync m_pGLCtx = pCtx;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (pCtx)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [pCtx retain];
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSOpenGLContext *)glCtx
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p returns %p\n", __PRETTY_FUNCTION__, (void *)self, (void *)m_pGLCtx));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return m_pGLCtx;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSView *)parentView
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p returns %p\n", __PRETTY_FUNCTION__, (void *)self, (void *)m_pParentView));
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync return m_pParentView;
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync}
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)setParentView:(NSView *)pView
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pView=%p (old=%p)\n", __PRETTY_FUNCTION__, (void *)self, (void *)pView, m_pParentView));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_pParentView = pView;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync}
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)setOverlayWin:(NSWindow *)pWin
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pWin=%p (old=%p)\n", __PRETTY_FUNCTION__, (void *)self, (void *)pWin, m_pOverlayWin));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync m_pOverlayWin = pWin;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync}
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSWindow *)overlayWin
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p returns %p\n", __PRETTY_FUNCTION__, (void *)self, (void *)m_pOverlayWin));
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync return m_pOverlayWin;
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync}
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetPosUI:(NSPoint)pos
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pos=%d,%d (old pos=%d,%d)\n", __PRETTY_FUNCTION__, (void *)self, (int)pos.x, (int)pos.y,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (int)m_Pos.x, (int)m_Pos.y));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync DEBUG_MSG(("vboxSetPosUI: [%d, %d].\n", (int)pos.x, (int)pos.y));
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_Pos = pos;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if (m_fEverSized)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self vboxReshapePerform];
56db633f06f3070f792e84b806b77873e3e98404vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxSetPosUIObj:(NSValue *)pPos
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pPos=%p (%d,%d) (old pos=%d,%d)\n", __PRETTY_FUNCTION__, (void *)self, pPos,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (int)[pPos pointValue].x, (int)[pPos pointValue].y, (int)m_Pos.x, (int)m_Pos.y));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync NSPoint pos = [pPos pointValue];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self vboxSetPosUI:pos];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetPos:(NSPoint)pos
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pos=%d,%d (old pos=%d,%d)\n", __PRETTY_FUNCTION__, (void *)self, (int)pos.x, (int)pos.y,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (int)m_Pos.x, (int)m_Pos.y));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync NSValue *pPos = [NSValue valueWithPoint:pos];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pRunner addObj:self selector:@selector(vboxSetPosUIObj:) arg:pPos];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSPoint)pos
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p returns %d,%d\n", __PRETTY_FUNCTION__, (void *)self, (int)m_Pos.x, (int)m_Pos.y));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync return m_Pos;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (bool)isEverSized
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p returns %d\n", __PRETTY_FUNCTION__, (void *)self, m_fEverSized));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return m_fEverSized;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync}
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxDestroy
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync BOOL fIsMain = [NSThread isMainThread];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSWindow *pWin = nil;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync Assert(fIsMain);
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Hide the view early. */
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self setHidden: YES];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync pWin = [self window];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [[NSNotificationCenter defaultCenter] removeObserver:pWin];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [pWin setContentView: nil];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [[pWin parentWindow] removeChildWindow: pWin];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync if (fIsMain)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [pWin release];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync else
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync /* We can NOT run synchronously with the main thread since this may lead to a deadlock,
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync caused by main thread waiting xpcom thread, xpcom thread waiting to main hgcm thread,
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync and main hgcm thread waiting for us, this is why use waitUntilDone:NO,
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync which should cause no harm. */
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [pWin performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self cleanupData];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync if (fIsMain)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self release];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync else
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync /* We can NOT run synchronously with the main thread since this may lead to a deadlock,
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync caused by main thread waiting xpcom thread, xpcom thread waiting to main hgcm thread,
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync and main hgcm thread waiting for us, this is why use waitUntilDone:NO.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync We need to avoid concurrency though, so we cleanup some data right away via a cleanupData call. */
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync }
6f1977ffd39bde1977845dd91fb8c8027eeb247evboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
6f1977ffd39bde1977845dd91fb8c8027eeb247evboxsync renderspuWinRelease(m_pWinInfo);
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif
6f1977ffd39bde1977845dd91fb8c8027eeb247evboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxSetSizeUIObj:(NSValue *)pSize
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pSize=%p (%d,%d)\n", __PRETTY_FUNCTION__, (void *)self, (void *)pSize,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (int)[pSize sizeValue].width, (int)[pSize sizeValue].height));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync NSSize size = [pSize sizeValue];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self vboxSetSizeUI:size];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetSizeUI:(NSSize)size
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p size=%d,%d\n", __PRETTY_FUNCTION__, (void *)self, (int)size.width, (int)size.height));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_Size = size;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_fEverSized = true;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG(("OVIW(%p): vboxSetSize: new size: %dx%d\n", (void *)self, (int)m_Size.width, (int)m_Size.height));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self vboxReshapeOnResizePerform];
d66955d5e795c1a7cf73c38a799fed204d83c38cvboxsync
d66955d5e795c1a7cf73c38a799fed204d83c38cvboxsync /* ensure window contents is updated after that */
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self vboxTryDrawUI];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetSize:(NSSize)size
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p size=%d,%d\n", __PRETTY_FUNCTION__, (void *)self, (int)size.width, (int)size.height));
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync NSValue *pSize = [NSValue valueWithSize:size];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pRunner addObj:self selector:@selector(vboxSetSizeUIObj:) arg:pSize];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (NSSize)size
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p returns %d,%d\n", __PRETTY_FUNCTION__, (void *)self, (int)m_Size.width, (int)m_Size.height));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync return m_Size;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync- (void)updateViewportCS
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Update the viewport for our OpenGL view. */
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync [m_pSharedGLCtx update];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#ifndef IN_VMSVGA3D
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync [self vboxBlitterSyncWindow];
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#endif
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Clear background to transparent. */
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (void)vboxReshapeOnResizePerform
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
56db633f06f3070f792e84b806b77873e3e98404vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [self vboxReshapePerform];
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [self createDockTile];
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync /* have to rebind GL_TEXTURE_RECTANGLE_ARB as m_FBOTexId could be changed in updateFBO call */
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_fNeedViewportUpdate = true;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync#if 0
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync pCurCtx = [NSOpenGLContext currentContext];
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if (pCurCtx && pCurCtx == m_pGLCtx && (pCurView = [pCurCtx view]) == self)
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync {
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [m_pGLCtx update];
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_fNeedCtxUpdate = false;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync }
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync else
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync {
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync /* do it in a lazy way */
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_fNeedCtxUpdate = true;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync }
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync}
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (void)vboxReshapeOnReparentPerform
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync [self vboxReshapePerform];
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [self createDockTile];
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync}
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync#ifdef VBOX_WITH_CONFIGURABLE_HIDPI_SCALING
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync- (NSRect)safeConvertRectToBacking:(NSRect *)pRect
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync{
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync NSRect resultingRect = NSZeroRect;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync NSWindow *pWindow = [m_pParentView window];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync if (pWindow)
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync {
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync if ([pWindow respondsToSelector:@selector(convertRectToBacking:)])
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync {
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync NSMethodSignature *pSignature = [pWindow methodSignatureForSelector:@selector(convertRectToBacking:)];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync if (pSignature)
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync {
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync NSInvocation *pInvocation = [NSInvocation invocationWithMethodSignature:pSignature];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync if (pInvocation)
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync {
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync [pInvocation setSelector:@selector(convertRectToBacking:)];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync [pInvocation setTarget:pWindow];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync [pInvocation setArgument:pRect atIndex:2];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync [pInvocation invoke];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync [pInvocation getReturnValue:&resultingRect];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync DEBUG_MSG(("safeConvertRectToBacking: convert [X, Y, WxH]: [%d, %d, %dx%d] -> [%d, %d, %dx%d]\n",
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync (int)pRect ->origin.x, (int)pRect ->origin.y, (int)pRect ->size.width, (int)pRect ->size.width,
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync (int)resultingRect.origin.x, (int)resultingRect.origin.y, (int)resultingRect.size.width, (int)resultingRect.size.width));
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync return resultingRect;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync }
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync }
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync }
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync }
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync else
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync /* Should never happen. */
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync DEBUG_WARN(("safeConvertRectToBacking: parent widget has no window.\n"));
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync resultingRect = *pRect;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync DEBUG_MSG(("safeConvertRectToBacking (reurn as is): convert [X, Y, WxH]: [%d, %d, %dx%d] -> [%d, %d, %dx%d]\n",
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync (int)pRect ->origin.x, (int)pRect ->origin.y, (int)pRect ->size.width, (int)pRect ->size.width,
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync (int)resultingRect.origin.x, (int)resultingRect.origin.y, (int)resultingRect.size.width, (int)resultingRect.size.width));
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync return resultingRect;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync}
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync- (CGFloat)safeGetBackingScaleFactor
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync{
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync /* Assume its default value. */
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync CGFloat backingScaleFactor = 1.;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync NSWindow *pWindow = [m_pParentView window];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync if (pWindow)
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync {
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync NSScreen *pScreen = [pWindow screen];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync if (pScreen)
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync {
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync if ([pScreen respondsToSelector:@selector(backingScaleFactor)])
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync {
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync NSMethodSignature *pSignature = [pScreen methodSignatureForSelector:@selector(backingScaleFactor)];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync if (pSignature)
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync {
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync NSInvocation *pInvocation = [NSInvocation invocationWithMethodSignature:pSignature];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync if (pInvocation)
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync {
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync [pInvocation setSelector:@selector(backingScaleFactor)];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync [pInvocation setTarget:pScreen];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync [pInvocation invoke];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync [pInvocation getReturnValue:&backingScaleFactor];
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync DEBUG_MSG(("safeGetBackingScaleFactor: %d\n", (int)backingScaleFactor));
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync return backingScaleFactor;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync }
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync else
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync DEBUG_WARN(("safeGetBackingScaleFactor: unable to create invocation for backingScaleFactor method signature.\n"));
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync }
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync else
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync DEBUG_WARN(("safeGetBackingScaleFactor: unable to create method signature for backingScaleFactor selector.\n"));
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync }
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync else
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync DEBUG_WARN(("safeGetBackingScaleFactor: NSScreen does not respond to backingScaleFactor selector.\n"));
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync }
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync else
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync /* Should never happen. */
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync DEBUG_WARN(("safeGetBackingScaleFactor: parent window has no screen.\n"));
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync }
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync else
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync /* Should never happen. */
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync DEBUG_WARN(("safeGetBackingScaleFactor: parent widget has no window.\n"));
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync return backingScaleFactor;
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync}
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync#endif
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync- (NSRect)safeConvertToScreen:(NSRect *)pRect
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync{
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync NSRect resultingRect = NSZeroRect;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync NSWindow *pWindow = [m_pParentView window];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync if (pWindow)
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync {
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync if ([pWindow respondsToSelector:@selector(convertRectToScreen:)])
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync {
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync NSMethodSignature *pSignature = [pWindow methodSignatureForSelector:@selector(convertRectToScreen:)];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync if (pSignature)
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync {
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync NSInvocation *pInvocation = [NSInvocation invocationWithMethodSignature:pSignature];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync if (pInvocation)
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync {
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync [pInvocation setSelector:@selector(convertRectToScreen:)];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync [pInvocation setTarget:pWindow];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync [pInvocation setArgument:pRect atIndex:2];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync [pInvocation invoke];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync [pInvocation getReturnValue:&resultingRect];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync DEBUG_MSG(("safeConvertToScreen: convert [X, Y, WxH]: [%d, %d, %dx%d] -> [%d, %d, %dx%d]\n",
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync (int)pRect ->origin.x, (int)pRect ->origin.y, (int)pRect ->size.width, (int)pRect ->size.width,
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync (int)resultingRect.origin.x, (int)resultingRect.origin.y, (int)resultingRect.size.width, (int)resultingRect.size.width));
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync return resultingRect;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync }
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync }
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync }
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync /* If we failed, let's use deprecated @selector(convertBaseToScreen:). It is a bit hacky,
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * but what to do if we stick to SDK 10.6. */
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync resultingRect.origin = [[m_pParentView window] convertBaseToScreen:pRect->origin];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync resultingRect.size = pRect->size;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync }
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync else
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync /* Should never happen. */
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync DEBUG_WARN(("safeConvertToScreen: parent widget has no window.\n"));
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync DEBUG_MSG(("safeConvertToScreen (deprecated method): convert [X, Y, WxH]: [%d, %d, %dx%d] -> [%d, %d, %dx%d]\n",
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync (int)pRect ->origin.x, (int)pRect ->origin.y, (int)pRect ->size.width, (int)pRect ->size.width,
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync (int)resultingRect.origin.x, (int)resultingRect.origin.y, (int)resultingRect.size.width, (int)resultingRect.size.width));
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync return resultingRect;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync}
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (void)vboxReshapePerform
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p - m_DockTileView=%p\n", __PRETTY_FUNCTION__, (void *)self, (void *)m_DockTileView));
c624e0fc08da51139cec62056258316efed606c6vboxsync#else
c624e0fc08da51139cec62056258316efed606c6vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync /* NOTE: Please consider the next naming convention for variables.
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync *
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * Rectangle variables:
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync *
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * <object to represent><coordinate system>:
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * <object to represent>:
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * parentFrame - a frame of the parent container (NSView) object
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * childFrame - a frame required to display guest content
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * windowFrame - resulting window frame constructed as an intersection of parentFrame and childFrame
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * <coordinate system>:
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * VCS - View Coordinate System
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * WCS - Window Coordinate System
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * SCS - Screen Coordinate System
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync *
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * The same convention applied to offset variables naming as well which are of format:
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync *
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * <object to represent><coordinate><coordinate system>.
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync *
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaDrawingGuide/Transforms/Transforms.html
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync */
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync NSRect parentFrameVCS, parentFrameWCS, parentFrameSCS;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync NSRect childFrameWCS, childFrameSCS;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync NSRect windowFrameSCS;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync CGFloat childFrameXWCS, childFrameYWCS;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync /* We need to construct a new window frame (windowFrameSCS) for entire NSWindow object in
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * screen coordinates. In order to make 3D overlay window to do not overlap Cocoa and Qt GUI elements (titlebar,
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * Qt statusbar, scroll bars etc) let's do the next. Get parent view visible area (parentFrameSCS) in (NS)Screen
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * coordinates. Then get the area required to diaplay guest content (childFrameSCS) in (NS)Screen coordinates as well.
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * The intersection of these two areas in screen coordinates will be a new frame for entire NSWindow object. */
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync parentFrameVCS = [m_pParentView frame];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync parentFrameWCS = [m_pParentView convertRect:parentFrameVCS toView:nil];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync parentFrameSCS = [self safeConvertToScreen:&parentFrameWCS];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync /* Choose childFrame origin in a bit special way. Its pop-left corner should stick to its parent top-left corner. */
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync childFrameXWCS = parentFrameWCS.origin.x + m_Pos.x;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync childFrameYWCS = parentFrameWCS.origin.y - m_Pos.y - (m_Size.height - parentFrameWCS.size.height);
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync childFrameWCS = NSMakeRect(childFrameXWCS, childFrameYWCS, m_Size.width, m_Size.height);
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync childFrameSCS = [self safeConvertToScreen:&childFrameWCS];
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync windowFrameSCS = NSIntersectionRect(parentFrameSCS, childFrameSCS);
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync DEBUG_MSG(("vboxReshapePerform: a new overlay frame [%d, %d, %dx%d] has been constructed from intersection of window frame "
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync "[%d, %d, %dx%d] and guest content rectangle [%d, %d, %dx%d]; m_Pos=[%d, %d], m_Size=%dx%d.\n",
c7a5ac9dc5a01dea9d3895c6691232cacc9266efvboxsync (int)windowFrameSCS.origin.x, (int)windowFrameSCS.origin.y, (int)windowFrameSCS.size.width, (int)windowFrameSCS.size.width,
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync (int)parentFrameSCS.origin.x, (int)parentFrameSCS.origin.y, (int)parentFrameSCS.size.width, (int)parentFrameSCS.size.width,
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync (int)childFrameSCS .origin.x, (int)childFrameSCS .origin.y, (int)childFrameSCS .size.width, (int)childFrameSCS .size.width,
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync (int)m_Pos.x, (int)m_Pos.y, (int)m_Size.width, (int)m_Size.height));
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync /* @todo galitsyn: drop this!
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync * Later we have to correct the texture position in the case the window is
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync * out of the parents window frame. So save the shift values for later use. */
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync m_RootRect.origin.x = windowFrameSCS.origin.x - childFrameSCS.origin.x;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync m_RootRect.origin.y = childFrameSCS.size.height + childFrameSCS.origin.y - (windowFrameSCS.size.height + windowFrameSCS.origin.y);
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync m_RootRect.size = windowFrameSCS.size;
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync m_yInvRootOffset = windowFrameSCS.origin.y - childFrameSCS.origin.y;
56db633f06f3070f792e84b806b77873e3e98404vboxsync
56db633f06f3070f792e84b806b77873e3e98404vboxsync DEBUG_MSG(("vboxReshapePerform: [%#p]: m_RootRect pos[%d : %d] size[%d : %d]\n",
56db633f06f3070f792e84b806b77873e3e98404vboxsync (void *)self, (int)m_RootRect.origin.x, (int)m_RootRect.origin.y, (int)m_RootRect.size.width, (int)m_RootRect.size.height));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Set the new frame. */
8783dd0f367c3ae8fd28849c24c410b4ecbfb530vboxsync [[self window] setFrame:windowFrameSCS display:YES];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Inform the dock tile view as well. */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self reshapeDockTile];
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Make sure the context is updated accordingly. */
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync /* [self updateViewport]; */
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (m_pSharedGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync VBOX_CR_RENDER_CTX_INFO CtxInfo;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync vboxCtxEnter(m_pSharedGLCtx, &CtxInfo);
56db633f06f3070f792e84b806b77873e3e98404vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync [self updateViewportCS];
56db633f06f3070f792e84b806b77873e3e98404vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync vboxCtxLeave(&CtxInfo);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
c624e0fc08da51139cec62056258316efed606c6vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync- (void)createDockTile
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSView *pDockScreen = nil;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [self deleteDockTile];
56db633f06f3070f792e84b806b77873e3e98404vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Is there a dock tile preview enabled in the GUI? If so setup a
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync * additional thumbnail view for the dock tile. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pDockScreen = [self dockTileScreen];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (pDockScreen)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_DockTileView = [[DockOverlayView alloc] init];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [self reshapeDockTile];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync [pDockScreen addSubview:m_DockTileView];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns - m_DockTileView\n", __PRETTY_FUNCTION__, (void *)m_DockTileView));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync- (void)deleteDockTile
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p - m_DockTileView=%p\n", __PRETTY_FUNCTION__, (void *)self, (void *)m_DockTileView));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (m_DockTileView != nil)
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync {
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_DockTileView removeFromSuperview];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync [m_DockTileView release];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync m_DockTileView = nil;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif /* !IN_VMSVGA3D */
c624e0fc08da51139cec62056258316efed606c6vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)makeCurrentFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync COCOA_LOG_FLOW(("%s: self=%p - m_pGLCtx=%p m_fNeedCtxUpdate=%d\n", __PRETTY_FUNCTION__, (void *)self,
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync (void *)m_pGLCtx, m_fNeedCtxUpdate));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (m_pGLCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync NSOpenGLContext *pPrevCtx = [NSOpenGLContext currentContext];
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#ifdef IN_VMSVGA3D
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync /* Always flush before flush. glXMakeCurrent and wglMakeCurrent does this
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync implicitly, seemingly NSOpenGLContext::makeCurrentContext doesn't. */
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync if (pPrevCtx != nil)
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync {
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CLEAR_GL_ERRORS();
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync glFlush();
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CHECK_GL_ERROR("glFlush");
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync }
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#endif
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync if ([m_pGLCtx view] != self)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#ifndef IN_VMSVGA3D
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* We change the active view, so flush first */
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync if (pPrevCtx != nil)
129986ce8b48d5e5973ad84edae4465788db89aavboxsync glFlush();
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#endif
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CLEAR_GL_ERRORS();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pGLCtx setView: self];
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CHECK_GL_ERROR("setView");
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#if 0
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync if (pPrevCtx != m_pGLCtx)
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CLEAR_GL_ERRORS();
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync [m_pGLCtx makeCurrentContext];
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CHECK_GL_ERROR("makeCurrentContext");
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync Assert([NSOpenGLContext currentContext] == m_pGLCtx);
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync Assert([m_pGLCtx view] == self);
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync }
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync if (m_fNeedCtxUpdate == true)
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync {
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync [m_pGLCtx update];
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync m_fNeedCtxUpdate = false;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!m_FBOId)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync glGenFramebuffersEXT(1, &m_FBOId);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(m_FBOId);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync}
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (bool)vboxSharedCtxCreate
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if (m_pSharedGLCtx)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns true (m_pSharedGLCtx=%p)\n", __PRETTY_FUNCTION__, (void *)m_pSharedGLCtx));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return true;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync }
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#ifndef IN_VMSVGA3D
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync Assert(!m_pBlitter);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync m_pBlitter = RTMemAlloc(sizeof(*m_pBlitter));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (RT_UNLIKELY(!m_pBlitter))
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync {
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync DEBUG_WARN(("m_pBlitter allocation failed"));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns false - m_pBlitter allocation failed\n", __PRETTY_FUNCTION__));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return false;
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync }
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync int rc = CrBltInit(m_pBlitter, NULL, false /*fCreateNewCtx*/, false /*fForceDrawBlt*/,
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync &render_spu.GlobalShaders, &render_spu.blitterDispatch);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (RT_FAILURE(rc))
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync {
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync DEBUG_WARN(("CrBltInit failed, rc %d", rc));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync RTMemFree(m_pBlitter);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_pBlitter = NULL;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns false - CrBltInit failed with rc=%Rrc\n", __PRETTY_FUNCTION__, rc));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return false;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: blitter (%p) created successfully for view 0x%p\n", (void *)m_pBlitter, (void *)self));
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#endif /* !IN_VMSVGA3D */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync /* Create a shared context out of the main context. Use the same pixel format. */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync NSOpenGLPixelFormat *pPixelFormat = [(OverlayOpenGLContext *)m_pGLCtx openGLPixelFormat];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync NSOpenGLContext *pSharedGLCtx = [[NSOpenGLContext alloc] initWithFormat:pPixelFormat shareContext:m_pGLCtx];
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync /* Set the new context as non opaque */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync GLint opaque = 0;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [pSharedGLCtx setValues:&opaque forParameter:NSOpenGLCPSurfaceOpacity];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync /* Set this view as the drawable for the new context */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [pSharedGLCtx setView:self];
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_fNeedViewportUpdate = true;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_pSharedGLCtx = pSharedGLCtx;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns true - new m_pSharedGLCtx=%p\n", __PRETTY_FUNCTION__, (void *)m_pSharedGLCtx));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return true;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync}
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync- (void)vboxTryDraw
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync glFlush();
ab8158da86979881efcdda8d21b96cee145e61ebvboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Issue to the gui thread. */
53911b04965533f5d40b5ab2f840381efee79328vboxsync [self performSelectorOnMainThread:@selector(vboxTryDrawUI) withObject:nil waitUntilDone:NO];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync}
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetVisible:(GLboolean)fVisible
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p fVisible=%d\n", __PRETTY_FUNCTION__, (void *)self, fVisible));
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync NSNumber *pVisObj = [NSNumber numberWithBool:fVisible];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pRunner addObj:self selector:@selector(vboxSetVisibleUIObj:) arg:pVisObj];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
4d0b7e3cba16e39e96db76fdf56abea555187ba6vboxsync}
4d0b7e3cba16e39e96db76fdf56abea555187ba6vboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync- (void)vboxSetVisibleUI:(GLboolean)fVisible
4d0b7e3cba16e39e96db76fdf56abea555187ba6vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p fVisible=%d\n", __PRETTY_FUNCTION__, (void *)self, fVisible));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self setHidden: !fVisible];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
4d0b7e3cba16e39e96db76fdf56abea555187ba6vboxsync}
4d0b7e3cba16e39e96db76fdf56abea555187ba6vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync- (void)vboxSetVisibleUIObj:(NSNumber *)pVisibleObj
4d0b7e3cba16e39e96db76fdf56abea555187ba6vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pVisibleObj=%p(%d)\n", __PRETTY_FUNCTION__,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (void *)self, (void *)pVisibleObj, [pVisibleObj boolValue]));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync BOOL fVisible = [pVisibleObj boolValue];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self vboxSetVisibleUI:fVisible];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxReparent:(NSView *)pParentView
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pParentView=%p\n", __PRETTY_FUNCTION__, (void *)self, (void *)pParentView));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pRunner addObj:self selector:@selector(vboxReparentUI:) arg:pParentView];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (void)vboxReparentUI:(NSView *)pParentView
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pParentView=%p\n", __PRETTY_FUNCTION__, (void *)self, (void *)pParentView));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync /* Make sure the window is removed from any previous parent window. */
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync if ([[self overlayWin] parentWindow] != nil)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [[[self overlayWin] parentWindow] removeChildWindow:[self overlayWin]];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync /* Set the new parent view */
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self setParentView: pParentView];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync /* Add the overlay window as a child to the new parent window */
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync if (pParentView != nil)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [[pParentView window] addChildWindow:[self overlayWin] ordered:NSWindowAbove];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync if ([self isEverSized])
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [self vboxReshapeOnReparentPerform];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
4d0b7e3cba16e39e96db76fdf56abea555187ba6vboxsync}
4d0b7e3cba16e39e96db76fdf56abea555187ba6vboxsync
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync- (void)vboxTryDrawUI
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
e2a74585316778e8df03715924c81e4f32292f5evboxsync
e2a74585316778e8df03715924c81e4f32292f5evboxsync if ([self isHidden])
e2a74585316778e8df03715924c81e4f32292f5evboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns - request to draw on a hidden view\n", __PRETTY_FUNCTION__));
e2a74585316778e8df03715924c81e4f32292f5evboxsync return;
e2a74585316778e8df03715924c81e4f32292f5evboxsync }
e2a74585316778e8df03715924c81e4f32292f5evboxsync
e2a74585316778e8df03715924c81e4f32292f5evboxsync if ([[self overlayWin] parentWindow] == nil)
e2a74585316778e8df03715924c81e4f32292f5evboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns - request to draw a view w/o a parent\n", __PRETTY_FUNCTION__));
e2a74585316778e8df03715924c81e4f32292f5evboxsync return;
e2a74585316778e8df03715924c81e4f32292f5evboxsync }
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync#ifdef IN_VMSVGA3D
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync if (!m_pSharedGLCtx)
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync {
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync Assert(!m_fDataVisible);
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync Assert(!m_fCleanupNeeded);
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync if (![self vboxSharedCtxCreate])
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync {
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync COCOA_LOG_FLOW(("%s: returns - vboxSharedCtxCreate failed\n", __PRETTY_FUNCTION__));
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync return;
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync }
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync Assert(m_pSharedGLCtx);
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync }
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync#endif
e2a74585316778e8df03715924c81e4f32292f5evboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync const VBOXVR_SCR_COMPOSITOR *pCompositor = NULL;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync int rc = renderspuVBoxCompositorLock(m_pWinInfo, &pCompositor);
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync if (RT_FAILURE(rc))
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns - renderspuVBoxCompositorLock failed (%Rrc)\n", __PRETTY_FUNCTION__, rc));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return;
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync }
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync if (!pCompositor && !m_fCleanupNeeded)
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync {
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync renderspuVBoxCompositorUnlock(m_pWinInfo);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns - noCompositorUI\n", __PRETTY_FUNCTION__));
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync return;
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync }
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync VBOXVR_SCR_COMPOSITOR TmpCompositor;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if (pCompositor)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync {
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if (!m_pSharedGLCtx)
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync {
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync Assert(!m_fDataVisible);
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync Assert(!m_fCleanupNeeded);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync renderspuVBoxCompositorRelease(m_pWinInfo);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if (![self vboxSharedCtxCreate])
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns - vboxSharedCtxCreate failed\n", __PRETTY_FUNCTION__));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync Assert(m_pSharedGLCtx);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync pCompositor = renderspuVBoxCompositorAcquire(m_pWinInfo);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync Assert(!m_fDataVisible);
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync Assert(!m_fCleanupNeeded);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if (!pCompositor)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns - Failed to reacquire compositor\n", __PRETTY_FUNCTION__));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync return;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync }
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync }
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync else
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync DEBUG_MSG(("%s: NeedCleanup\n", __PRETTY_FUNCTION__));
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync Assert(m_fCleanupNeeded);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync CrVrScrCompositorInit(&TmpCompositor, NULL);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync pCompositor = &TmpCompositor;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync }
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif /* !IN_VMSVGA3D */
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync if ([self lockFocusIfCanDraw])
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: Calling vboxPresent\n", __PRETTY_FUNCTION__));
61bb42c2bd859f319e792927ad98a97c5826756avboxsync [self vboxPresent:pCompositor];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync [self unlockFocus];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifndef IN_VMSVGA3D /** @todo VMSVGA3 */
ab8158da86979881efcdda8d21b96cee145e61ebvboxsync else if (!m_pWinInfo->visible)
ab8158da86979881efcdda8d21b96cee145e61ebvboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: NotVisible\n", __PRETTY_FUNCTION__));
ab8158da86979881efcdda8d21b96cee145e61ebvboxsync m_fCleanupNeeded = false;
ab8158da86979881efcdda8d21b96cee145e61ebvboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync else
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: Reschedule\n", __PRETTY_FUNCTION__));
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(vboxTryDrawUI) userInfo:nil repeats:NO];
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
61bb42c2bd859f319e792927ad98a97c5826756avboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync renderspuVBoxCompositorUnlock(m_pWinInfo);
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync}
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)swapFBO
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p - m_pGLCtx=%p\n", __PRETTY_FUNCTION__, (void *)self, (void *)m_pGLCtx));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [m_pGLCtx flushBuffer];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync- (void)vboxPresent:(PCVBOXVR_SCR_COMPOSITOR)pCompositor
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pCompositor=%p\n", __PRETTY_FUNCTION__, (void *)self, (void *)pCompositor));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync /*DEBUG_MSG(("OVIW(%p): renderFBOToView\n", (void *)self));*/
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync AssertPtr(pCompositor);
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync VBOX_CR_RENDER_CTX_INFO CtxInfo;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync vboxCtxEnter(m_pSharedGLCtx, &CtxInfo);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync [self vboxPresentCS:pCompositor];
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync vboxCtxLeave(&CtxInfo);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync}
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync- (void)vboxPresentCS:(PCVBOXVR_SCR_COMPOSITOR)pCompositor
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pCompositor=%p\n", __PRETTY_FUNCTION__, (void *)self, (void *)pCompositor));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if ([m_pSharedGLCtx view] != self)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: Not current view of shared ctx! Switching... (self=%p, view=%p, m_pSharedGLCtx)\n",
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync __PRETTY_FUNCTION__, (void *)self, (void *)[m_pSharedGLCtx view], (void *)m_pSharedGLCtx));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [m_pSharedGLCtx setView: self];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync m_fNeedViewportUpdate = true;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (m_fNeedViewportUpdate)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [self updateViewportCS];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync m_fNeedViewportUpdate = false;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync m_fCleanupNeeded = false;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* Render FBO content to the dock tile when necessary. */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [self vboxPresentToDockTileCS:pCompositor];
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /* change to #if 0 to see thumbnail image */
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync#if 1
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [self vboxPresentToViewCS:pCompositor];
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync#else
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [m_pSharedGLCtx flushBuffer];
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync#endif
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsyncDECLINLINE(void) vboxNSRectToRect(const NSRect *pR, RTRECT *pRect)
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pRect->xLeft = (int)pR->origin.x;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pRect->yTop = (int)pR->origin.y;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pRect->xRight = (int)(pR->origin.x + pR->size.width);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync pRect->yBottom = (int)(pR->origin.y + pR->size.height);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync}
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsyncDECLINLINE(void) vboxNSRectToRectUnstretched(const NSRect *pR, RTRECT *pRect, float xStretch, float yStretch)
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pRect->xLeft = (int)(pR->origin.x / xStretch);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pRect->yTop = (int)(pR->origin.y / yStretch);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pRect->xRight = (int)((pR->origin.x + pR->size.width) / xStretch);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync pRect->yBottom = (int)((pR->origin.y + pR->size.height) / yStretch);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync}
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsyncDECLINLINE(void) vboxNSRectToRectStretched(const NSRect *pR, RTRECT *pRect, float xStretch, float yStretch)
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pRect->xLeft = (int)(pR->origin.x * xStretch);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pRect->yTop = (int)(pR->origin.y * yStretch);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pRect->xRight = (int)((pR->origin.x + pR->size.width) * xStretch);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync pRect->yBottom = (int)((pR->origin.y + pR->size.height) * yStretch);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync}
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync- (void)vboxPresentToViewCS:(PCVBOXVR_SCR_COMPOSITOR)pCompositor
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
8f0f3548de344cfe3e49ffd3e4c338792e1729cevboxsync NSRect r = [self frame];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p - r={%d,%d %d,%d}\n", __PRETTY_FUNCTION__, (void *)self,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (int)r.origin.x, (int)r.origin.y, (int)r.size.width, (int)r.size.height));
8f0f3548de344cfe3e49ffd3e4c338792e1729cevboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync#if 1 /* Set to 0 to see the docktile instead of the real output */
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync float backingStretchFactor = 1.;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# if defined(VBOX_WITH_CONFIGURABLE_HIDPI_SCALING) && !defined(IN_VMSVGA3D)
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync /* Adjust viewport according to current NSView's backing store parameters. */
d800c4d5127fc4b317658e72babf7f69f912dba2vboxsync if (render_spu.fUnscaledHiDPI)
d800c4d5127fc4b317658e72babf7f69f912dba2vboxsync {
d800c4d5127fc4b317658e72babf7f69f912dba2vboxsync /* Update stretch factor in order to satisfy current NSView's backing store parameters. */
d800c4d5127fc4b317658e72babf7f69f912dba2vboxsync backingStretchFactor = [self safeGetBackingScaleFactor];
d800c4d5127fc4b317658e72babf7f69f912dba2vboxsync }
0c1d0195c068479994fa76f06b3ecd8a52ed9fa0vboxsync
0c1d0195c068479994fa76f06b3ecd8a52ed9fa0vboxsync NSRect regularBounds = [self bounds];
0c1d0195c068479994fa76f06b3ecd8a52ed9fa0vboxsync NSRect backingBounds = [self safeConvertRectToBacking:&regularBounds];
0c1d0195c068479994fa76f06b3ecd8a52ed9fa0vboxsync glViewport(0, 0, backingBounds.size.width, backingBounds.size.height);
0c1d0195c068479994fa76f06b3ecd8a52ed9fa0vboxsync
0c1d0195c068479994fa76f06b3ecd8a52ed9fa0vboxsync crDebug("HiDPI: vboxPresentToViewCS: up-scaling is %s (backingStretchFactor=%d).",
0c1d0195c068479994fa76f06b3ecd8a52ed9fa0vboxsync render_spu.fUnscaledHiDPI ? "OFF" : "ON", (int)backingStretchFactor);
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# endif
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync glDrawBuffer(GL_BACK);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync /* Clear background to transparent */
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync glClear(GL_COLOR_BUFFER_BIT);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_fDataVisible = false;
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# ifndef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync float xStretch;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync float yStretch;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync CrVrScrCompositorGetStretching(pCompositor, &xStretch, &yStretch);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR CIter;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync CrVrScrCompositorConstIterInit(pCompositor, &CIter);
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync while ((pEntry = CrVrScrCompositorConstIterNext(&CIter)) != NULL)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync uint32_t cRegions;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync const RTRECT *paSrcRegions, *paDstRegions;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync int rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRegions, &paSrcRegions, &paDstRegions, NULL);
3ea1dbf096240fc221aea99352a74c17a367a9b6vboxsync uint32_t fFlags = CrVrScrCompositorEntryFlagsCombinedGet(pCompositor, pEntry);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (RT_SUCCESS(rc))
fabb3e1e51b589494ebe849b7c000e8bcc9ff473vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync rc = CrBltEnter(m_pBlitter);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync if (RT_SUCCESS(rc))
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync uint32_t i;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync for (i = 0; i < cRegions; ++i)
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync const CR_TEXDATA *pTexData;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync PCRTRECT pSrcRect = &paSrcRegions[i];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync PCRTRECT pDstRect = &paDstRegions[i];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync RTRECT DstRect, RestrictDstRect;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync RTRECT SrcRect, RestrictSrcRect;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync vboxNSRectToRect(&m_RootRect, &RestrictDstRect);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync VBoxRectIntersected(&RestrictDstRect, pDstRect, &DstRect);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync if (VBoxRectIsZero(&DstRect))
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync continue;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync VBoxRectTranslate(&DstRect, -RestrictDstRect.xLeft, -RestrictDstRect.yTop);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync vboxNSRectToRectUnstretched(&m_RootRect, &RestrictSrcRect, xStretch / backingStretchFactor, yStretch / backingStretchFactor);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync VBoxRectTranslate(&RestrictSrcRect,
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync -CrVrScrCompositorEntryRectGet(pEntry)->xLeft,
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync -CrVrScrCompositorEntryRectGet(pEntry)->yTop);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync VBoxRectIntersected(&RestrictSrcRect, pSrcRect, &SrcRect);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync if (VBoxRectIsZero(&SrcRect))
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync continue;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync pSrcRect = &SrcRect;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync pDstRect = &DstRect;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pTexData = CrVrScrCompositorEntryTexGet(pEntry);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync CrBltBlitTexMural(m_pBlitter, true, CrTdTexGet(pTexData), pSrcRect, pDstRect, 1, fFlags | CRBLT_F_NOALPHA);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync m_fDataVisible = true;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync }
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync CrBltLeave(m_pBlitter);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync }
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync else
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync DEBUG_WARN(("CrBltEnter failed rc %d", rc));
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# ifndef DEBUG_VERBOSE
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync AssertMsgFailed(("CrBltEnter failed rc %Rrc", rc));
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# endif
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync else
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync AssertMsgFailed(("BlitStretched: CrVrScrCompositorEntryRegionsGet failed rc %Rrc\n", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync DEBUG_MSG_1(("BlitStretched: CrVrScrCompositorEntryRegionsGet failed rc %d\n", rc));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync }
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# endif /* !IN_VMSVGA3D */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync#endif
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync glFinish();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [m_pSharedGLCtx flushBuffer];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync- (void)presentComposition:(PCVBOXVR_SCR_COMPOSITOR_ENTRY)pChangedEntry
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pChangedEntry=%p\n", __PRETTY_FUNCTION__, (void *)self, (void *)pChangedEntry));
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync [self vboxTryDraw];
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#ifndef IN_VMSVGA3D
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync- (void)vboxBlitterSyncWindow
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync CR_BLITTER_WINDOW WinInfo;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSRect r;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync if (!m_pBlitter)
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync return;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync RT_ZERO(WinInfo);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync r = [self frame];
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync WinInfo.width = r.size.width;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync WinInfo.height = r.size.height;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync Assert(WinInfo.width == m_RootRect.size.width);
a8d502445ce722c6b9700c5579b4a38b58827b7dvboxsync Assert(WinInfo.height == m_RootRect.size.height);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync /*CrBltMuralSetCurrentInfo(m_pBlitter, NULL);*/
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync CrBltMuralSetCurrentInfo(m_pBlitter, &WinInfo);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync CrBltCheckUpdateViewport(m_pBlitter);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync}
c02f671450508a0b9f4475f5d851cc078c8c01b8vboxsync#endif /* !IN_VMSVGA3D */
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# ifdef VBOX_WITH_CRDUMPER_THUMBNAIL
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsyncstatic int g_cVBoxTgaCtr = 0;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# endif
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync- (void)vboxPresentToDockTileCS:(PCVBOXVR_SCR_COMPOSITOR)pCompositor
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p pCompositor=%p\n", __PRETTY_FUNCTION__, (void *)self, (void *)pCompositor));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSRect r = [self frame];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSRect rr = NSZeroRect;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync NSDockTile *pDT = nil;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync float xStretch;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync float yStretch;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if ([m_DockTileView thumbBitmap] != nil)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Only update after at least 200 ms, cause glReadPixels is
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * heavy performance wise.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync uint64_t msTS = RTTimeSystemMilliTS();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR CIter;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (msTS - m_msDockUpdateTS > 200)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync m_msDockUpdateTS = msTS;
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# if 0
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /* todo: check this for optimization */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync GL_STORAGE_SHARED_APPLE);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync sizex, sizey, 0, GL_BGRA,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync GL_UNSIGNED_INT_8_8_8_8_REV, myImagePtr);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync 0, 0, 0, 0, 0, image_width, image_height);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glFlush();
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /* Do other work processing here, using a double or triple buffer */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glGetTexImage(GL_TEXTURE_RECTANGLE_ARB, 0, GL_BGRA,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# endif
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync glDrawBuffer(GL_BACK);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /* Clear background to transparent */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glClear(GL_COLOR_BUFFER_BIT);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync rr = [m_DockTileView frame];
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync CrVrScrCompositorGetStretching(pCompositor, &xStretch, &yStretch);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync CrVrScrCompositorConstIterInit(pCompositor, &CIter);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync while ((pEntry = CrVrScrCompositorConstIterNext(&CIter)) != NULL)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync uint32_t cRegions;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync PCRTRECT paSrcRegions;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync PCRTRECT paDstRegions;
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync int rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRegions, &paSrcRegions, &paDstRegions, NULL);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync uint32_t fFlags = CrVrScrCompositorEntryFlagsCombinedGet(pCompositor, pEntry);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (RT_SUCCESS(rc))
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync rc = CrBltEnter(m_pBlitter);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync if (RT_SUCCESS(rc))
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync uint32_t i;
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync for (i = 0; i < cRegions; ++i)
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync const CR_TEXDATA *pTexData;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync PCRTRECT pSrcRect = &paSrcRegions[i];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync PCRTRECT pDstRect = &paDstRegions[i];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync RTRECT DstRect, RestrictDstRect;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync RTRECT SrcRect, RestrictSrcRect;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync vboxNSRectToRect(&m_RootRect, &RestrictDstRect);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync VBoxRectIntersected(&RestrictDstRect, pDstRect, &DstRect);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync VBoxRectTranslate(&DstRect, -RestrictDstRect.xLeft, -RestrictDstRect.yTop);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
6e519506bee0a7f680824b1ca5d8e3fead3ae95evboxsync VBoxRectScale(&DstRect, m_FBOThumbScaleX, m_FBOThumbScaleY);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync if (VBoxRectIsZero(&DstRect))
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync continue;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync vboxNSRectToRectUnstretched(&m_RootRect, &RestrictSrcRect, xStretch, yStretch);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync VBoxRectTranslate(&RestrictSrcRect,
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync -CrVrScrCompositorEntryRectGet(pEntry)->xLeft,
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync -CrVrScrCompositorEntryRectGet(pEntry)->yTop);
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync VBoxRectIntersected(&RestrictSrcRect, pSrcRect, &SrcRect);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync if (VBoxRectIsZero(&SrcRect))
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync continue;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync pSrcRect = &SrcRect;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync pDstRect = &DstRect;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pTexData = CrVrScrCompositorEntryTexGet(pEntry);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync CrBltBlitTexMural(m_pBlitter, true, CrTdTexGet(pTexData), pSrcRect, pDstRect, 1, fFlags);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync }
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync CrBltLeave(m_pBlitter);
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync }
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync else
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
8cb6f31c3048428b42c7370dfbb20e4de7254f40vboxsync DEBUG_WARN(("CrBltEnter failed rc %d", rc));
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# ifndef DEBUG_VERBOSE
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync AssertMsgFailed(("CrBltEnter failed rc %Rrc", rc));
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# endif
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync else
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync DEBUG_MSG_1(("BlitStretched: CrVrScrCompositorEntryRegionsGet failed rc %d\n", rc));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync AssertMsgFailed(("BlitStretched: CrVrScrCompositorEntryRegionsGet failed rc %Rrc\n", rc));
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync }
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glFinish();
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync glReadBuffer(GL_BACK);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /* Here the magic of reading the FBO content in our own buffer
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * happens. We have to lock this access, in the case the dock
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * is updated currently. */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync [m_DockTileView lock];
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync glReadPixels(0, m_RootRect.size.height - rr.size.height, rr.size.width, rr.size.height,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync GL_BGRA,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync GL_UNSIGNED_INT_8_8_8_8,
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync [[m_DockTileView thumbBitmap] bitmapData]);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync [m_DockTileView unlock];
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# ifdef VBOX_WITH_CRDUMPER_THUMBNAIL
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync ++g_cVBoxTgaCtr;
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync crDumpNamedTGAF((GLint)rr.size.width, (GLint)rr.size.height,
8d1da51eb6665874aa82bf03668e03d1a0d63223vboxsync [[m_DockTileView thumbBitmap] bitmapData], "/Users/leo/vboxdumps/dump%d.tga", g_cVBoxTgaCtr);
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync# endif
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync pDT = [[NSApplication sharedApplication] dockTile];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /* Send a display message to the dock tile in the main thread */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync [[[NSApplication sharedApplication] dockTile] performSelectorOnMainThread:@selector(display) withObject:nil
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync waitUntilDone:NO];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif /* !IN_VMSVGA3D */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync- (void)clearVisibleRegions
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (m_paClipRects)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync RTMemFree(m_paClipRects);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_paClipRects = NULL;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync m_cClipRects = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync- (GLboolean)vboxNeedsEmptyPresent
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync{
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync if (m_fDataVisible)
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync {
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync m_fCleanupNeeded = true;
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync return GL_TRUE;
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync }
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync return GL_FALSE;
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync}
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync- (void)setVisibleRegions:(GLint)cRects paRects:(const GLint *)paRects
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p cRects=%d paRects=%p\n", __PRETTY_FUNCTION__, (void *)self, cRects, (void *)paRects));
77db08a24f69bca943d5abc40b1930ee97f593edvboxsync GLint cOldRects = m_cClipRects;
77db08a24f69bca943d5abc40b1930ee97f593edvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [self clearVisibleRegions];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync if (cRects > 0)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
d862f0eeb9eacdb46b9f5cc420de30a3d7c2c3f6vboxsync#ifdef DEBUG_poetzsch
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync int i = 0;
d862f0eeb9eacdb46b9f5cc420de30a3d7c2c3f6vboxsync for (i = 0; i < cRects; ++i)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG_1(("OVIW(%p): setVisibleRegions: %d - %d %d %d %d\n", (void *)self, i, paRects[i * 4], paRects[i * 4 + 1], paRects[i * 4 + 2], paRects[i * 4 + 3]));
d862f0eeb9eacdb46b9f5cc420de30a3d7c2c3f6vboxsync#endif
d862f0eeb9eacdb46b9f5cc420de30a3d7c2c3f6vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync m_paClipRects = (GLint *)RTMemDup(paRects, sizeof(GLint) * 4 * cRects);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync m_cClipRects = cRects;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#ifndef IN_VMSVGA3D
c624e0fc08da51139cec62056258316efed606c6vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync- (NSView *)dockTileScreen
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync NSView *pContentView = [[[NSApplication sharedApplication] dockTile] contentView];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync NSView *pScreenContent = nil;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * First try the new variant which checks if this window is within the
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * screen which is previewed in the dock.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if ([pContentView respondsToSelector:@selector(screenContentWithParentView:)])
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync pScreenContent = [pContentView performSelector:@selector(screenContentWithParentView:) withObject:(id)m_pParentView];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /*
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * If it fails, fall back to the old variant (VBox...).
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync else if ([pContentView respondsToSelector:@selector(screenContent)])
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync pScreenContent = [pContentView performSelector:@selector(screenContent)];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns %p (pContentView=%p)\n", __PRETTY_FUNCTION__, (void *)pScreenContent, (void *)pContentView));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync return pScreenContent;
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync- (void)reshapeDockTile
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s:\n", __PRETTY_FUNCTION__));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync NSRect newFrame = NSZeroRect;
9161d9a8318db73b2848c1feaef3880980474e64vboxsync NSView *pView = [self dockTileScreen];
9161d9a8318db73b2848c1feaef3880980474e64vboxsync if (pView != nil)
9161d9a8318db73b2848c1feaef3880980474e64vboxsync {
9161d9a8318db73b2848c1feaef3880980474e64vboxsync NSRect dockFrame = [pView frame];
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /** @todo This is not correct, we should use framebuffer size here, while
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * parent view frame size may differ in case of scrolling. */
9161d9a8318db73b2848c1feaef3880980474e64vboxsync NSRect parentFrame = [m_pParentView frame];
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
9161d9a8318db73b2848c1feaef3880980474e64vboxsync m_FBOThumbScaleX = (float)dockFrame.size.width / parentFrame.size.width;
9161d9a8318db73b2848c1feaef3880980474e64vboxsync m_FBOThumbScaleY = (float)dockFrame.size.height / parentFrame.size.height;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync newFrame = NSMakeRect((int)(m_Pos.x * m_FBOThumbScaleX),
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync (int)(dockFrame.size.height - (m_Pos.y + m_Size.height - m_yInvRootOffset) * m_FBOThumbScaleY),
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync (int)(m_Size.width * m_FBOThumbScaleX),
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync (int)(m_Size.height * m_FBOThumbScaleY));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /*
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync 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));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync 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));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync 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);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
9161d9a8318db73b2848c1feaef3880980474e64vboxsync [m_DockTileView setFrame: newFrame];
9161d9a8318db73b2848c1feaef3880980474e64vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("%s: returns - newFrame={%d,%d %d,%d} pView=%d\n", __PRETTY_FUNCTION__, (int)newFrame.origin.x,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (int)newFrame.origin.y, (int)newFrame.size.width, (int)newFrame.size.height, (void *)pView));
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync}
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
c624e0fc08da51139cec62056258316efed606c6vboxsync#endif /* !IN_VMSVGA3D */
c624e0fc08da51139cec62056258316efed606c6vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync@end /* @implementation OverlayView */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* OpenGL context management
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
ad1aea7f006b1feaea275f858b5b574ae61bfe39vboxsyncvoid cocoaGLCtxCreate(NativeNSOpenGLContextRef *ppCtx, GLbitfield fVisParams, NativeNSOpenGLContextRef pSharedCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaGLCtxCreate: ppCtx=%p fVisParams=%#x pSharedCtx=%p\n", (void *)ppCtx, fVisParams, (void *)pSharedCtx));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync NSOpenGLPixelFormat *pFmt = nil;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync NSOpenGLPixelFormatAttribute attribs[24] =
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync#ifdef IN_VMSVGA3D
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync NSOpenGLPFAOpenGLProfile, (NSOpenGLPixelFormatAttribute)0,
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync#endif
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLPFAAccelerated,
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync };
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
ae2a9b93d772d52146af2c010701ead81e4fb348vboxsync int i = 3;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
7c19e11502220292d5270519296442234c2493cdvboxsync#ifdef IN_VMSVGA3D
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync if (fVisParams & VMSVGA3D_NON_DEFAULT_PROFILE_BIT)
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync attribs[1] = VBOX_VMSVGA3D_DEFAULT_OGL_PROFILE >= 3.2 ? NSOpenGLProfileVersionLegacy : NSOpenGLProfileVersion3_2Core;
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync else
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync attribs[1] = VBOX_VMSVGA3D_DEFAULT_OGL_PROFILE >= 3.2 ? NSOpenGLProfileVersion3_2Core : NSOpenGLProfileVersionLegacy;
7c19e11502220292d5270519296442234c2493cdvboxsync#endif
7c19e11502220292d5270519296442234c2493cdvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_ALPHA_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW((" CR_ALPHA_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFAAlphaSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 8;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_DEPTH_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW((" CR_DEPTH_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFADepthSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 24;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_STENCIL_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW((" CR_STENCIL_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFAStencilSize;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 8;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync if (fVisParams & CR_ACCUM_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW((" 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 }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync if (fVisParams & CR_MULTISAMPLE_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW((" 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 {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW((" CR_DOUBLE_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFADoubleBuffer;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (fVisParams & CR_STEREO_BIT)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /* We don't support that.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW((" CR_STEREO_BIT requested\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = NSOpenGLPFAStereo;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
d14682a025d2c801f1e777f491092d2ebbe78c3cvboxsync if (VBoxOglIsOfflineRenderingAppropriate())
d14682a025d2c801f1e777f491092d2ebbe78c3cvboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW((" Offline rendering is enabled\n"));
d14682a025d2c801f1e777f491092d2ebbe78c3cvboxsync attribs[i++] = NSOpenGLPFAAllowOfflineRenderers;
d14682a025d2c801f1e777f491092d2ebbe78c3cvboxsync }
d14682a025d2c801f1e777f491092d2ebbe78c3cvboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Mark the end */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync attribs[i++] = 0;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Choose a pixel format */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync pFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync if (pFmt)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync {
aaa6e7826ca134b41d12c1f570bd7874ae1d8135vboxsync *ppCtx = [[OverlayOpenGLContext alloc] initWithFormat:pFmt shareContext:pSharedCtx];
7c19e11502220292d5270519296442234c2493cdvboxsync Assert(*ppCtx);
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync /* Enable multi threaded OpenGL engine */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync /*
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync CGLContextObj cglCtx = [*ppCtx CGLContextObj];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync CGLError err = CGLEnable(cglCtx, kCGLCEMPEngine);
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync if (err != kCGLNoError)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync printf ("Couldn't enable MT OpenGL engine!\n");
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync else
7c19e11502220292d5270519296442234c2493cdvboxsync {
7c19e11502220292d5270519296442234c2493cdvboxsync AssertFailed();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync *ppCtx = NULL;
7c19e11502220292d5270519296442234c2493cdvboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync COCOA_LOG_FLOW(("cocoaGLCtxCreate: returns *ppCtx=%p\n", (void *)*ppCtx));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
c4bfe32373c55416bf49dc29ebf45dfa560b4692vboxsyncvoid cocoaGLCtxDestroy(NativeNSOpenGLContextRef pCtx)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaGLCtxDestroy: pCtx=%p\n", (void *)pCtx));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
730f8be51b729e8a3c1e32c756cd0f4ec088dd4dvboxsync [pCtx release];
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync /*[pCtx performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];*/
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaGLCtxDestroy: returns\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync/********************************************************************************
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync* View management
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync********************************************************************************/
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncstatic OverlayView *vboxViewCreate(WindowInfo *pWinInfo, NativeNSViewRef pParentView)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("vboxViewCreate: pWinInfo=%p pParentView=%p\n", pWinInfo, (void *)pParentView));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync /* Create our worker view. */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync OverlayView *pView = [[OverlayView alloc] initWithFrame:NSZeroRect
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync thread:RTThreadSelf()
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync parentView:pParentView
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync winInfo:pWinInfo];
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 */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("vboxViewCreate: returns %p\n", (void *)pView));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync return pView;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("vboxViewCreate: returns NULL\n"));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync return NULL;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifndef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsynctypedef struct CR_RCD_CREATEVIEW
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync WindowInfo *pWinInfo;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync NSView *pParentView;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync GLbitfield fVisParams;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync /* out */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync OverlayView *pView;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync} CR_RCD_CREATEVIEW;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsyncstatic DECLCALLBACK(void) vboxRcdCreateView(void *pvCb)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CR_RCD_CREATEVIEW *pCreateView = (CR_RCD_CREATEVIEW *)pvCb;
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync pCreateView->pView = vboxViewCreate(pCreateView->pWinInfo, pCreateView->pParentView);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("vboxRcdCreateView: returns pView=%p\n", (void *)pCreateView->pView));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif /* !IN_VMSVGA3D */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsyncvoid cocoaViewCreate(NativeNSViewRef *ppView, WindowInfo *pWinInfo, NativeNSViewRef pParentView, GLbitfield fVisParams)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewCreate: ppView=%p pWinInfo=%p pParentView=%p fVisParams=%#x\n",
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (void *)ppView, (void *)pWinInfo, (void *)pParentView, fVisParams));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync /* make sure all tasks are run, to preserve the order */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pRunner runTasksSyncIfPossible];
6f1977ffd39bde1977845dd91fb8c8027eeb247evboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
6f1977ffd39bde1977845dd91fb8c8027eeb247evboxsync renderspuWinRetain(pWinInfo);
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync if (renderspuCalloutAvailable())
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync CR_RCD_CREATEVIEW CreateView;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync CreateView.pWinInfo = pWinInfo;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync CreateView.pParentView = pParentView;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync CreateView.fVisParams = fVisParams;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync CreateView.pView = NULL;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync renderspuCalloutClient(vboxRcdCreateView, &CreateView);
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync *ppView = CreateView.pView;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync else
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync DEBUG_MSG_NOT_VMSVGA3D(("no callout available on createWindow\n"));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync#if 0
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync dispatch_sync(dispatch_get_main_queue(), ^{
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync#endif
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync *ppView = vboxViewCreate(pWinInfo, pParentView);
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync#if 0
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync });
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync#endif
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#ifndef IN_VMSVGA3D
6f1977ffd39bde1977845dd91fb8c8027eeb247evboxsync if (!*ppView)
6f1977ffd39bde1977845dd91fb8c8027eeb247evboxsync renderspuWinRelease(pWinInfo);
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync#endif
6f1977ffd39bde1977845dd91fb8c8027eeb247evboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewCreate: returns *ppView=%p\n", (void *)*ppView));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync#ifndef IN_VMSVGA3D
c4bfe32373c55416bf49dc29ebf45dfa560b4692vboxsyncvoid cocoaViewReparent(NativeNSViewRef pView, NativeNSViewRef pParentView)
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewReparent: pView=%p pParentView=%p\n", (void *)pView, (void *)pParentView));
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync OverlayView *pOView = (OverlayView *)pView;
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync if (pOView)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync [pOView vboxReparent:pParentView];
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync
2dd7b4388106de88d20f33a8aa6c85c8babf507bvboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewReparent: returns\n"));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync#endif /* !IN_VMSVGA3D */
416817daa142e9bb7eaf14a1b10577978a5e691bvboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsyncvoid cocoaViewDestroy(NativeNSViewRef pView)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewDestroy: pView=%p\n", (void *)pView));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
3c9ed6defa3feca7e21adef4b5d1ba3002fc94c9vboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pRunner addObj:pView selector:@selector(vboxDestroy) arg:nil];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewDestroy: returns\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync#ifndef IN_VMSVGA3D
c4bfe32373c55416bf49dc29ebf45dfa560b4692vboxsyncvoid cocoaViewShow(NativeNSViewRef pView, GLboolean fShowIt)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewShow: pView=%p fShowIt=%d\n", (void *)pView, fShowIt));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [(OverlayView *)pView vboxSetVisible:fShowIt];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewShow: returns\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync#endif /* IN_VMSVGA3D */
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
c4bfe32373c55416bf49dc29ebf45dfa560b4692vboxsyncvoid cocoaViewDisplay(NativeNSViewRef pView)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewDisplay: pView=%p\n", (void *)pView));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifndef IN_VMSVGA3D
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_WARN(("cocoaViewDisplay should never happen!\n"));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync DEBUG_MSG_1(("cocoaViewDisplay %p\n", (void *)pView));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [(OverlayView *)pView swapFBO];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewDisplay: returns\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
c4bfe32373c55416bf49dc29ebf45dfa560b4692vboxsyncvoid cocoaViewSetPosition(NativeNSViewRef pView, NativeNSViewRef pParentView, int x, int y)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewSetPosition: pView=%p pParentView=%p x=%d y=%d\n", (void *)pView, (void *)pParentView, x, y));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [(OverlayView *)pView vboxSetPos:NSMakePoint(x, y)];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewSetPosition: returns\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncvoid cocoaViewSetSize(NativeNSViewRef pView, int cx, int cy)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewSetSize: pView=%p cx=%d cy=%d\n", (void *)pView, cx, cy));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [(OverlayView *)pView vboxSetSize:NSMakeSize(cx, cy)];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewSetSize: returns\n"));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync}
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifndef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsynctypedef struct CR_RCD_GETGEOMETRY
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync OverlayView *pView;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSRect rect;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync} CR_RCD_GETGEOMETRY;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsyncstatic DECLCALLBACK(void) vboxRcdGetGeomerty(void *pvUser)
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CR_RCD_GETGEOMETRY *pGetGeometry = (CR_RCD_GETGEOMETRY *)pvUser;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync pGetGeometry->rect = [[pGetGeometry->pView window] frame];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("vboxRcdGetGeomerty: (x,y)=(%d,%d) (cx,cy)=(%d,%d)\n", pGetGeometry->rect.origin.x, pGetGeometry->rect.origin.y,
56db633f06f3070f792e84b806b77873e3e98404vboxsync pGetGeometry->rect.size.width, pGetGeometry->rect.size.height));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncvoid cocoaViewGetGeometry(NativeNSViewRef pView, int *px, int *py, int *pcx, int *pcy)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewGetGeometry: pView=%p px=%p py=%p pcx=%p pcy=%p\n",
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (void *)pView, (void *)px, (void *)py, (void *)pcx, (void *)pcy));
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync NSAutoreleasePool *pPool;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync pPool = [[NSAutoreleasePool alloc] init];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync /* make sure all tasks are run, to preserve the order */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync [pRunner runTasksSyncIfPossible];
e23e238e79c2d0e00beb102d43bdb4e40cb8534fvboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync NSRect frame;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifndef IN_VMSVGA3D
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync if (renderspuCalloutAvailable())
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync CR_RCD_GETGEOMETRY GetGeometry;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync GetGeometry.pView = (OverlayView *)pView;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync renderspuCalloutClient(vboxRcdGetGeomerty, &GetGeometry);
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync frame = GetGeometry.rect;
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync else
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync DEBUG_MSG_NOT_VMSVGA3D(("no callout available on getGeometry\n"));
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync frame = [[pView window] frame];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync }
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync *px = frame.origin.x;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync *py = frame.origin.y;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync *pcx = frame.size.width;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync *pcy = frame.size.height;
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewGetGeometry: returns *px=%d, *py=%d, *pcx=%d, *pcy=%d\n", *px, *py, *pcx, *pcy));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncvoid cocoaViewPresentComposition(NativeNSViewRef pView, PCVBOXVR_SCR_COMPOSITOR_ENTRY pChangedEntry)
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewPresentComposition: pView=%p pChangedEntry=%p\n", (void *)pView, (void *)pChangedEntry));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync NSOpenGLContext *pCtx;
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync# ifdef IN_VMSVGA3D
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync Assert([(OverlayView *)pView glCtx]);
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync# else
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync /* The view may not necesserily have a GL context set. */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync pCtx = [(OverlayView *)pView glCtx];
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (!pCtx)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync ContextInfo *pCtxInfo = renderspuDefaultSharedContextAcquire();
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (!pCtxInfo)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync DEBUG_WARN(("renderspuDefaultSharedContextAcquire returned NULL"));
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync [pPool release];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync return;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync pCtx = pCtxInfo->context;
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [(OverlayView *)pView setGLCtx:pCtx];
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync# endif
b57c052e6d9d432fa8b66fb33d373fc608d4d050vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [(OverlayView *)pView presentComposition:pChangedEntry];
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewPresentComposition: returns\n"));
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync}
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync#endif /* !IN_VMSVGA3D */
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsyncvoid cocoaViewMakeCurrentContext(NativeNSViewRef pView, NativeNSOpenGLContextRef pCtx)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewMakeCurrentContext: pView=%p pCtx=%p\n", (void *)pView, (void *)pCtx));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
8be5264d31d6a6ec949ff2285764c9af57298b52vboxsync if (pView)
8be5264d31d6a6ec949ff2285764c9af57298b52vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [(OverlayView *)pView setGLCtx:pCtx];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [(OverlayView *)pView makeCurrentFBO];
8be5264d31d6a6ec949ff2285764c9af57298b52vboxsync }
8be5264d31d6a6ec949ff2285764c9af57298b52vboxsync else
8be5264d31d6a6ec949ff2285764c9af57298b52vboxsync {
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#ifdef IN_VMSVGA3D
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync /* Always flush before flush. glXMakeCurrent and wglMakeCurrent does this
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync implicitly, seemingly NSOpenGLContext::makeCurrentContext doesn't. */
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync if ([NSOpenGLContext currentContext] != nil)
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync {
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CLEAR_GL_ERRORS();
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync glFlush();
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync DEBUG_CHECK_GL_ERROR("glFlush");
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync }
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync#endif
7cfcbe810de5334cdc2e8b92e77db705da143adavboxsync [NSOpenGLContext clearCurrentContext];
8be5264d31d6a6ec949ff2285764c9af57298b52vboxsync }
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewMakeCurrentContext: returns\n"));
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync}
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync#ifndef IN_VMSVGA3D
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsyncGLboolean cocoaViewNeedsEmptyPresent(NativeNSViewRef pView)
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewNeedsEmptyPresent: pView=%p\n", (void *)pView));
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync GLboolean fNeedsPresent = [(OverlayView *)pView vboxNeedsEmptyPresent];
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewNeedsEmptyPresent: returns %d\n", fNeedsPresent));
d66955d5e795c1a7cf73c38a799fed204d83c38cvboxsync return fNeedsPresent;
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync}
ee357d0503e525172eab0eeb8f5befc2993c7ea5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncvoid cocoaViewSetVisibleRegion(NativeNSViewRef pView, GLint cRects, const GLint *paRects)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewSetVisibleRegion: pView=%p cRects=%d paRects=%p)\n", (void *)pView, cRects, (void const *)paRects));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [(OverlayView *)pView setVisibleRegions:cRects paRects:paRects];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [pPool release];
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync COCOA_LOG_FLOW(("cocoaViewSetVisibleRegion: returns\n"));
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync}
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
edc94eaddbb4c7bd67cc018acf79775ef01fb678vboxsync#endif /* IN_VMSVGA3D */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#ifdef IN_VMSVGA3D
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync/*
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * VMSVGA3D interface.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
07557d07616212d7ba6e7ab3059e85cb14633775vboxsyncVMSVGA3D_DECL(void) vmsvga3dCocoaCreateContext(NativeNSOpenGLContextRef *ppCtx, NativeNSOpenGLContextRef pSharedCtx,
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync bool fOtherProfile)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync{
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync cocoaGLCtxCreate(ppCtx, CR_ALPHA_BIT | CR_DEPTH_BIT | CR_DOUBLE_BIT | (fOtherProfile ? VMSVGA3D_NON_DEFAULT_PROFILE_BIT : 0),
7c19e11502220292d5270519296442234c2493cdvboxsync pSharedCtx);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync}
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncVMSVGA3D_DECL(void) vmsvga3dCocoaDestroyContext(NativeNSOpenGLContextRef pCtx)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync cocoaGLCtxDestroy(pCtx);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync}
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncVMSVGA3D_DECL(void) vmsvga3dCocoaCreateView(NativeNSViewRef *ppView, NativeNSViewRef pParentView)
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync{
011e0e639a8b7fe485d69dad0299ff9ea0f4505avboxsync cocoaViewCreate(ppView, NULL, pParentView, 0 /* fVisParams - ignored */);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync}
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncVMSVGA3D_DECL(void) vmsvga3dCocoaDestroyView(NativeNSViewRef pView)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync cocoaViewDestroy(pView);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync}
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncVMSVGA3D_DECL(void) vmsvga3dCocoaViewSetPosition(NativeNSViewRef pView, NativeNSViewRef pParentView, int x, int y)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync cocoaViewSetPosition(pView, pParentView, x, y);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync}
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncVMSVGA3D_DECL(void) vmsvga3dCocoaViewSetSize(NativeNSViewRef pView, int w, int h)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync cocoaViewSetSize(pView, w, h);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync}
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncVMSVGA3D_DECL(void) vmsvga3dCocoaViewMakeCurrentContext(NativeNSViewRef pView, NativeNSOpenGLContextRef pCtx)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync{
29c524c419977a7018139c3db3d4cb39dd63c408vboxsync Assert(!pView || [(OverlayView *)pView glCtx] == pCtx || [(OverlayView *)pView glCtx] == nil);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync cocoaViewMakeCurrentContext(pView, pCtx);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync}
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncVMSVGA3D_DECL(void) vmsvga3dCocoaSwapBuffers(NativeNSViewRef pView, NativeNSOpenGLContextRef pCtx)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync{
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# if 1
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync Assert([(OverlayView *)pView glCtx] == pCtx);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync cocoaViewDisplay(pView);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# else
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_ENTER();
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync [pCtx flushBuffer];
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync [pPool release];
5414e69c0f099d0a46301eb9c20cb1536ab1e71avboxsync DEBUG_FUNC_LEAVE();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync# endif
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync}
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync#endif /* IN_VMSVGA3D */