VirtualBox

source: vbox/trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.m@ 54167

Last change on this file since 54167 was 54167, checked in by vboxsync, 10 years ago

DevVGA-SVGA3d-cocoa.m/h: Build fix and dual profile support. (doesn't work better than the original)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.4 KB
Line 
1/* $Id: DevVGA-SVGA3d-cocoa.m 54167 2015-02-12 00:20:56Z vboxsync $ */
2/** @file
3 * VirtualBox OpenGL Cocoa Window System Helper Implementation.
4 *
5 * @remarks Inspired by HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m.
6 */
7
8/*
9 * Copyright (C) 2009-2014 Oracle Corporation
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 */
19
20#include "DevVGA-SVGA3d-cocoa.h"
21#import <Cocoa/Cocoa.h>
22#import <OpenGL/gl.h>
23
24#include <iprt/thread.h>
25#include <iprt/assert.h>
26
27/* Debug macros */
28#if 0 /*def DEBUG_VERBOSE*/
29/*# error "should be disabled!"*/
30# define DEBUG_INFO(text) do { \
31 crWarning text ; \
32 Assert(0); \
33 } while (0)
34
35# define DEBUG_MSG(text) \
36 printf text
37
38# define DEBUG_WARN(text) do { \
39 crWarning text ; \
40 Assert(0); \
41 } while (0)
42
43# define DEBUG_MSG_1(text) \
44 DEBUG_MSG(text)
45
46# define DEBUG_FUNC_ENTER() \
47 int cchDebugFuncEnter = printf("==>%s\n", __PRETTY_FUNCTION__)
48
49#define DEBUG_FUNC_LEAVE() do { \
50 DEBUG_MSG(("<==%s\n", __PRETTY_FUNCTION__)); \
51 } while (0)
52
53#define DEBUG_FUNC_RET(valuefmtnl) do { \
54 DEBUG_MSG(("<==%s returns", __PRETTY_FUNCTION__)); \
55 DEBUG_MSG(valuefmtnl); \
56 } while (0)
57
58#else
59
60# define DEBUG_INFO(text) do { \
61 crInfo text ; \
62 } while (0)
63
64# define DEBUG_MSG(text) \
65 do {} while (0)
66
67# define DEBUG_WARN(text) do { \
68 crWarning text ; \
69 } while (0)
70
71# define DEBUG_MSG_1(text) \
72 do {} while (0)
73
74# define DEBUG_FUNC_ENTER() int cchDebugFuncEnter = 0
75# define DEBUG_FUNC_LEAVE() NOREF(cchDebugFuncEnter)
76# define DEBUG_FUNC_RET(valuefmtnl) DEBUG_FUNC_LEAVE()
77
78#endif
79
80# define CHECK_GL_ERROR()\
81 do {} while (0)
82
83
84/** Custom OpenGL context class.
85 *
86 * This implementation doesn't allow to set a view to the
87 * context, but save the view for later use. Also it saves a copy of the
88 * pixel format used to create that context for later use. */
89@interface VMSVGA3DOpenGLContext: NSOpenGLContext
90{
91@private
92 NSOpenGLPixelFormat *m_pPixelFormat;
93 NSView *m_pView;
94}
95- (NSOpenGLPixelFormat*)openGLPixelFormat;
96@end
97
98@interface VMSVGA3DOverlayView: NSView
99{
100@private
101 NSView *m_pParentView;
102 NSWindow *m_pOverlayWin;
103
104 NSOpenGLContext *m_pGLCtx;
105
106 /* Position/Size tracking */
107 NSPoint m_Pos;
108 NSSize m_Size;
109
110 /** This is necessary for clipping on the root window */
111 NSRect m_RootRect;
112 float m_yInvRootOffset;
113}
114- (id)initWithFrame:(NSRect)frame parentView:(NSView*)pparentView;
115- (void)setGLCtx:(NSOpenGLContext*)pCtx;
116- (NSOpenGLContext*)glCtx;
117- (void)setOverlayWin: (NSWindow*)win;
118- (NSWindow*)overlayWin;
119- (void)setPos:(NSPoint)pos;
120- (NSPoint)pos;
121- (void)setSize:(NSSize)size;
122- (NSSize) size;
123- (void)updateViewportCS;
124- (void)reshape;
125@end
126
127/** Helper view.
128 *
129 * This view is added as a sub view of the parent view to track
130 * main window changes. Whenever the main window is changed
131 * (which happens on fullscreen/seamless entry/exit) the overlay
132 * window is informed & can add them self as a child window
133 * again. */
134@class VMSVGA3DOverlayWindow;
135@interface VMSVGA3DOverlayHelperView: NSView
136{
137@private
138 VMSVGA3DOverlayWindow *m_pOverlayWindow;
139}
140-(id)initWithOverlayWindow:(VMSVGA3DOverlayWindow*)pOverlayWindow;
141@end
142
143/** Custom window class.
144 *
145 * This is the overlay window which contains our custom NSView.
146 * Its a direct child of the Qt Main window. It marks its background
147 * transparent & non opaque to make clipping possible. It also disable mouse
148 * events and handle frame change events of the parent view. */
149@interface VMSVGA3DOverlayWindow: NSWindow
150{
151@private
152 NSView *m_pParentView;
153 VMSVGA3DOverlayView *m_pOverlayView;
154 VMSVGA3DOverlayHelperView *m_pOverlayHelperView;
155 NSThread *m_Thread;
156}
157- (id)initWithParentView:(NSView*)pParentView overlayView:(VMSVGA3DOverlayView*)pOverlayView;
158- (void)parentWindowFrameChanged:(NSNotification *)note;
159- (void)parentWindowChanged:(NSWindow*)pWindow;
160@end
161
162
163/********************************************************************************
164*
165* VMSVGA3DOpenGLContext class implementation
166*
167********************************************************************************/
168@implementation VMSVGA3DOpenGLContext
169
170-(id)initWithFormat:(NSOpenGLPixelFormat*)format shareContext:(NSOpenGLContext*)share
171{
172 DEBUG_FUNC_ENTER();
173
174 m_pPixelFormat = NULL;
175 m_pView = NULL;
176
177 self = [super initWithFormat:format shareContext:share];
178 if (self)
179 m_pPixelFormat = format;
180
181 DEBUG_MSG(("OCTX(%p): init VMSVGA3DOpenGLContext\n", (void*)self));
182 DEBUG_FUNC_RET(("%p\n", (void *)self));
183 return self;
184}
185
186- (void)dealloc
187{
188 DEBUG_FUNC_ENTER();
189 DEBUG_MSG(("OCTX(%p): dealloc VMSVGA3DOpenGLContext\n", (void*)self));
190
191 [m_pPixelFormat release];
192
193m_pPixelFormat = NULL;
194m_pView = NULL;
195
196 [super dealloc];
197 DEBUG_FUNC_LEAVE();
198}
199
200-(bool)isDoubleBuffer
201{
202 DEBUG_FUNC_ENTER();
203 GLint val;
204 [m_pPixelFormat getValues:&val forAttribute:NSOpenGLPFADoubleBuffer forVirtualScreen:0];
205 DEBUG_FUNC_RET(("%d\n", val == 1 ? YES : NO));
206 return val == 1 ? YES : NO;
207}
208
209-(void)setView:(NSView*)view
210{
211 DEBUG_FUNC_ENTER();
212 DEBUG_MSG(("OCTX(%p): setView: new view: %p\n", (void*)self, (void*)view));
213
214 m_pView = view;
215
216 DEBUG_FUNC_LEAVE();
217}
218
219-(NSView*)view
220{
221 DEBUG_FUNC_ENTER();
222 DEBUG_FUNC_RET(("%p\n", (void *)m_pView));
223 return m_pView;
224}
225
226-(void)clearDrawable
227{
228 DEBUG_FUNC_ENTER();
229 DEBUG_MSG(("OCTX(%p): clearDrawable\n", (void*)self));
230
231 m_pView = NULL;
232 [super clearDrawable];
233
234 DEBUG_FUNC_LEAVE();
235}
236
237-(NSOpenGLPixelFormat*)openGLPixelFormat
238{
239 DEBUG_FUNC_ENTER();
240 DEBUG_FUNC_RET(("%p\n", (void *)m_pPixelFormat));
241 return m_pPixelFormat;
242}
243
244@end
245
246
247
248/********************************************************************************
249*
250* VMSVGA3DOverlayHelperView class implementation
251*
252********************************************************************************/
253@implementation VMSVGA3DOverlayHelperView
254
255-(id)initWithOverlayWindow:(VMSVGA3DOverlayWindow*)pOverlayWindow
256{
257 DEBUG_FUNC_ENTER();
258
259 self = [super initWithFrame:NSZeroRect];
260
261 m_pOverlayWindow = pOverlayWindow;
262
263 DEBUG_MSG(("OHVW(%p): init OverlayHelperView\n", (void*)self));
264 DEBUG_FUNC_RET(("%p\n", (void *)self));
265 return self;
266}
267
268-(void)viewDidMoveToWindow
269{
270 DEBUG_FUNC_ENTER();
271 DEBUG_MSG(("OHVW(%p): viewDidMoveToWindow: new win: %p\n", (void*)self, (void*)[self window]));
272
273 [m_pOverlayWindow parentWindowChanged:[self window]];
274
275 DEBUG_FUNC_LEAVE();
276}
277
278@end
279
280/********************************************************************************
281*
282* VMSVGA3DOverlayWindow class implementation
283*
284********************************************************************************/
285@implementation VMSVGA3DOverlayWindow
286
287- (id)initWithParentView:(NSView*)pParentView overlayView:(VMSVGA3DOverlayView*)pOverlayView
288{
289 DEBUG_FUNC_ENTER();
290 NSWindow *pParentWin = nil;
291
292 if((self = [super initWithContentRect:NSZeroRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]))
293 {
294 m_pParentView = pParentView;
295 m_pOverlayView = pOverlayView;
296 m_Thread = [NSThread currentThread];
297
298 [m_pOverlayView setOverlayWin: self];
299
300 m_pOverlayHelperView = [[VMSVGA3DOverlayHelperView alloc] initWithOverlayWindow:self];
301 /* Add the helper view as a child of the parent view to get notifications */
302 [pParentView addSubview:m_pOverlayHelperView];
303
304 /* Make sure this window is transparent */
305#ifdef SHOW_WINDOW_BACKGROUND
306 /* For debugging */
307 [self setBackgroundColor:[NSColor colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:0.7]];
308#else
309 [self setBackgroundColor:[NSColor clearColor]];
310#endif
311 [self setOpaque:NO];
312 [self setAlphaValue:.999];
313 /* Disable mouse events for this window */
314 [self setIgnoresMouseEvents:YES];
315
316 pParentWin = [m_pParentView window];
317
318 /* Initial set the position to the parents view top/left (Compiz fix). */
319 [self setFrameOrigin:
320 [pParentWin convertBaseToScreen:
321 [m_pParentView convertPoint:NSZeroPoint toView:nil]]];
322
323 /* Set the overlay view as our content view */
324 [self setContentView:m_pOverlayView];
325
326 /* Add ourself as a child to the parent views window. Note: this has to
327 * be done last so that everything else is setup in
328 * parentWindowChanged. */
329 [pParentWin addChildWindow:self ordered:NSWindowAbove];
330 }
331 DEBUG_MSG(("OWIN(%p): init OverlayWindow\n", (void*)self));
332 DEBUG_FUNC_RET(("%p\n", (void *)self));
333 return self;
334}
335
336- (void)dealloc
337{
338 DEBUG_FUNC_ENTER();
339 DEBUG_MSG(("OWIN(%p): dealloc OverlayWindow\n", (void*)self));
340
341 [[NSNotificationCenter defaultCenter] removeObserver:self];
342
343 [m_pOverlayHelperView removeFromSuperview];
344 [m_pOverlayHelperView release];
345
346 [super dealloc];
347 DEBUG_FUNC_LEAVE();
348}
349
350- (void)parentWindowFrameChanged:(NSNotification*)pNote
351{
352 DEBUG_FUNC_ENTER();
353 DEBUG_MSG(("OWIN(%p): parentWindowFrameChanged\n", (void*)self));
354
355 [m_pOverlayView reshape];
356
357 DEBUG_FUNC_LEAVE();
358}
359
360- (void)parentWindowChanged:(NSWindow*)pWindow
361{
362 DEBUG_FUNC_ENTER();
363 DEBUG_MSG(("OWIN(%p): parentWindowChanged\n", (void*)self));
364
365 [[NSNotificationCenter defaultCenter] removeObserver:self];
366
367 if(pWindow != nil)
368 {
369 /* Ask to get notifications when our parent window frame changes. */
370 [[NSNotificationCenter defaultCenter]
371 addObserver:self
372 selector:@selector(parentWindowFrameChanged:)
373 name:NSWindowDidResizeNotification
374 object:pWindow];
375 /* Add us self as child window */
376 [pWindow addChildWindow:self ordered:NSWindowAbove];
377 [m_pOverlayView reshape];
378 }
379
380 DEBUG_FUNC_LEAVE();
381}
382
383@end
384
385/********************************************************************************
386*
387* VMSVGA3DOverlayView class implementation
388*
389********************************************************************************/
390@implementation VMSVGA3DOverlayView
391
392- (id)initWithFrame:(NSRect) frame parentView:(NSView*)pParentView
393{
394 DEBUG_FUNC_ENTER();
395
396 m_pParentView = pParentView;
397 /* Make some reasonable defaults */
398 m_pGLCtx = nil;
399 m_Pos = NSZeroPoint;
400 m_Size = NSMakeSize(1, 1);
401 m_RootRect = NSMakeRect(0, 0, m_Size.width, m_Size.height);
402 m_yInvRootOffset = 0;
403
404 self = [super initWithFrame: frame];
405
406 DEBUG_MSG(("OVIW(%p): init VMSVGA3DOverlayView\n", (void*)self));
407 DEBUG_FUNC_RET(("%p\n", (void *)self));
408 return self;
409}
410
411- (void)cleanupData
412{
413 DEBUG_FUNC_ENTER();
414
415 /*[self deleteDockTile];*/
416
417 [self setGLCtx:nil];
418
419#if 0
420 if (m_pSharedGLCtx)
421 {
422 if ([m_pSharedGLCtx view] == self)
423 [m_pSharedGLCtx clearDrawable];
424
425 [m_pSharedGLCtx release];
426
427 m_pSharedGLCtx = nil;
428
429 CrBltTerm(m_pBlitter);
430
431 RTMemFree(m_pBlitter);
432
433 m_pBlitter = nil;
434 }
435#endif
436
437 /*[self clearVisibleRegions];*/
438
439 DEBUG_FUNC_LEAVE();
440}
441
442- (void)dealloc
443{
444 DEBUG_FUNC_ENTER();
445 DEBUG_MSG(("OVIW(%p): dealloc OverlayView\n", (void*)self));
446
447 [self cleanupData];
448
449 [super dealloc];
450
451 DEBUG_FUNC_LEAVE();
452}
453
454
455- (void)setGLCtx:(NSOpenGLContext*)pCtx
456{
457 DEBUG_FUNC_ENTER();
458
459 DEBUG_MSG(("OVIW(%p): setGLCtx: new ctx: %p (old: %p)\n", (void*)self, (void*)pCtx, (void *)m_pGLCtx));
460 if (m_pGLCtx == pCtx)
461 {
462 DEBUG_FUNC_LEAVE();
463 return;
464 }
465
466 /* ensure the context drawable is cleared to avoid holding a reference to inexistent view */
467 if (m_pGLCtx)
468 {
469 [m_pGLCtx clearDrawable];
470 [m_pGLCtx release];
471 /*[m_pGLCtx performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];*/
472 }
473 m_pGLCtx = pCtx;
474 if (pCtx)
475 [pCtx retain];
476
477 DEBUG_FUNC_LEAVE();
478}
479
480- (NSOpenGLContext*)glCtx
481{
482 DEBUG_FUNC_ENTER();
483 DEBUG_FUNC_RET(("%p\n", (void *)m_pGLCtx));
484 return m_pGLCtx;
485}
486
487- (void)setOverlayWin:(NSWindow*)pWin
488{
489 DEBUG_FUNC_ENTER();
490 DEBUG_MSG(("OVIW(%p): setOverlayWin: new win: %p\n", (void*)self, (void*)pWin));
491 m_pOverlayWin = pWin;
492 DEBUG_FUNC_LEAVE();
493}
494
495- (NSWindow*)overlayWin
496{
497 DEBUG_FUNC_ENTER();
498 DEBUG_FUNC_RET(("%p\n", (void *)m_pOverlayWin));
499 return m_pOverlayWin;
500}
501
502- (void)setPos:(NSPoint)pos
503{
504 DEBUG_FUNC_ENTER();
505
506 m_Pos = pos;
507 [self reshape];
508 DEBUG_FUNC_LEAVE();
509}
510
511- (NSPoint)pos
512{
513 DEBUG_FUNC_ENTER();
514 DEBUG_FUNC_RET(("%f,%f\n", m_Pos.x, m_Pos.y));
515 return m_Pos;
516}
517
518- (void)setSize:(NSSize)size
519{
520 DEBUG_FUNC_ENTER();
521 m_Size = size;
522 [self reshape];
523 DEBUG_FUNC_LEAVE();
524}
525
526- (NSSize)size
527{
528 DEBUG_FUNC_ENTER();
529 DEBUG_FUNC_RET(("%f,%f\n", m_Size.width, m_Size.height));
530 return m_Size;
531}
532
533- (void)updateViewportCS
534{
535 DEBUG_FUNC_ENTER();
536 DEBUG_MSG(("OVIW(%p): updateViewport\n", (void*)self));
537
538 /* Update the viewport for our OpenGL view */
539/* [m_pSharedGLCtx update]; */
540
541 /* Clear background to transparent */
542/* glClearColor(0.0f, 0.0f, 0.0f, 0.0f);*/
543 DEBUG_FUNC_LEAVE();
544}
545
546- (void)reshape
547{
548 DEBUG_FUNC_ENTER();
549 NSRect parentFrame = NSZeroRect;
550 NSPoint parentPos = NSZeroPoint;
551 NSPoint childPos = NSZeroPoint;
552 NSRect childFrame = NSZeroRect;
553 NSRect newFrame = NSZeroRect;
554
555 DEBUG_MSG(("OVIW(%p): reshape\n", (void*)self));
556
557 /* Getting the right screen coordinates of the parents frame is a little bit
558 * complicated. */
559 parentFrame = [m_pParentView frame];
560 DEBUG_MSG(("FIXED parentFrame [%f:%f], [%f:%f]\n", parentFrame.origin.x, parentFrame.origin.y, parentFrame.size.width, parentFrame.size.height));
561 parentPos = [[m_pParentView window] convertBaseToScreen:[[m_pParentView superview] convertPointToBase:NSMakePoint(parentFrame.origin.x, parentFrame.origin.y + parentFrame.size.height)]];
562 parentFrame.origin.x = parentPos.x;
563 parentFrame.origin.y = parentPos.y;
564
565 /* Calculate the new screen coordinates of the overlay window. */
566 childPos = NSMakePoint(m_Pos.x, m_Pos.y + m_Size.height);
567 childPos = [[m_pParentView window] convertBaseToScreen:[[m_pParentView superview] convertPointToBase:childPos]];
568 DEBUG_MSG(("FIXED childPos(screen) [%f:%f]\n", childPos.x, childPos.y));
569
570 /* Make a frame out of it. */
571 childFrame = NSMakeRect(childPos.x, childPos.y, m_Size.width, m_Size.height);
572 DEBUG_MSG(("FIXED childFrame [%f:%f], [%f:%f]\n", childFrame.origin.x, childFrame.origin.y, childFrame.size.width, childFrame.size.height));
573
574 /* We have to make sure that the overlay window will not be displayed out
575 * of the parent window. So intersect both frames & use the result as the new
576 * frame for the window. */
577 newFrame = NSIntersectionRect(parentFrame, childFrame);
578
579 DEBUG_MSG(("[%p]: parentFrame pos[%f : %f] size[%f : %f]\n",
580 (void*)self,
581 parentFrame.origin.x, parentFrame.origin.y,
582 parentFrame.size.width, parentFrame.size.height));
583 DEBUG_MSG(("[%p]: childFrame pos[%f : %f] size[%f : %f]\n",
584 (void*)self,
585 childFrame.origin.x, childFrame.origin.y,
586 childFrame.size.width, childFrame.size.height));
587
588 DEBUG_MSG(("[%p]: newFrame pos[%f : %f] size[%f : %f]\n",
589 (void*)self,
590 newFrame.origin.x, newFrame.origin.y,
591 newFrame.size.width, newFrame.size.height));
592
593 /* Later we have to correct the texture position in the case the window is
594 * out of the parents window frame. So save the shift values for later use. */
595 m_RootRect.origin.x = newFrame.origin.x - childFrame.origin.x;
596 m_RootRect.origin.y = childFrame.size.height + childFrame.origin.y - (newFrame.size.height + newFrame.origin.y);
597 m_RootRect.size = newFrame.size;
598 m_yInvRootOffset = newFrame.origin.y - childFrame.origin.y;
599
600 DEBUG_MSG(("[%p]: m_RootRect pos[%f : %f] size[%f : %f]\n",
601 (void*)self,
602 m_RootRect.origin.x, m_RootRect.origin.y,
603 m_RootRect.size.width, m_RootRect.size.height));
604
605 /* Set the new frame. */
606 [[self window] setFrame:newFrame display:YES];
607
608#if 0
609 /* Make sure the context is updated according */
610 /* [self updateViewport]; */
611 if (m_pSharedGLCtx)
612 {
613 VBOX_CR_RENDER_CTX_INFO CtxInfo;
614 vboxCtxEnter(m_pSharedGLCtx, &CtxInfo);
615
616 [self updateViewportCS];
617
618 vboxCtxLeave(&CtxInfo);
619 }
620#endif
621 DEBUG_FUNC_LEAVE();
622}
623
624@end
625
626
627void vmsvga3dCocoaCreateContext(NativeNSOpenGLContextRef *ppCtx, NativeNSOpenGLContextRef pShareCtx, bool fOtherProfile)
628{
629 DEBUG_FUNC_ENTER();
630 NSOpenGLPixelFormat *pFmt = nil;
631 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
632
633 // Consider to remove it and check if it's harmless.
634 NSOpenGLPixelFormatAttribute attribs[] =
635 {
636 NSOpenGLPFAOpenGLProfile, (NSOpenGLPixelFormatAttribute)0,
637 //NSOpenGLPFAWindow, - obsolete/deprecated, try work without it...
638 NSOpenGLPFAAccelerated,
639 NSOpenGLPFADoubleBuffer,
640 NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24,
641 NSOpenGLPFAAlphaSize, (NSOpenGLPixelFormatAttribute)8,
642 NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)24,
643 0
644 };
645 attribs[1] = fOtherProfile ? NSOpenGLProfileVersion3_2Core : NSOpenGLProfileVersionLegacy;
646
647 /* Choose a pixel format */
648 pFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];
649 if (pFmt)
650 {
651 *ppCtx = [[VMSVGA3DOpenGLContext alloc] initWithFormat:pFmt shareContext:pShareCtx];
652 DEBUG_MSG(("New context %p\n", (void *)*ppCtx));
653 }
654 else
655 {
656 AssertFailed();
657 *ppCtx = NULL;
658 }
659
660 [pPool release];
661
662 DEBUG_FUNC_LEAVE();
663}
664
665void vmsvga3dCocoaDestroyContext(NativeNSOpenGLContextRef pCtx)
666{
667 DEBUG_FUNC_ENTER();
668 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
669 [pCtx release];
670 [pPool release];
671 DEBUG_FUNC_LEAVE();
672}
673
674void vmsvga3dCocoaCreateView(NativeNSViewRef *ppView, NativeNSViewRef pParentView)
675{
676 DEBUG_FUNC_ENTER();
677 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
678
679 /* Create our worker view */
680 VMSVGA3DOverlayView* pView = [[VMSVGA3DOverlayView alloc] initWithFrame:NSZeroRect parentView:pParentView];
681
682 if (pView)
683 {
684 /* We need a real window as container for the view */
685 [[VMSVGA3DOverlayWindow alloc] initWithParentView:pParentView overlayView:pView];
686 /* Return the freshly created overlay view */
687 *ppView = pView;
688 }
689
690 [pPool release];
691 DEBUG_FUNC_LEAVE();
692}
693
694void vmsvga3dCocoaDestroyView(NativeNSViewRef pView)
695{
696 DEBUG_FUNC_ENTER();
697 NSWindow *pWin = nil;
698
699 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
700 [pView setHidden: YES];
701
702 [pWin release];
703 [pView release];
704
705 [pPool release];
706 DEBUG_FUNC_LEAVE();
707}
708
709void vmsvga3dCocoaViewSetPosition(NativeNSViewRef pView, NativeNSViewRef pParentView, int x, int y)
710{
711 DEBUG_FUNC_ENTER();
712 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
713
714 [(VMSVGA3DOverlayView*)pView setPos:NSMakePoint(x, y)];
715
716 [pPool release];
717}
718
719void vmsvga3dCocoaViewSetSize(NativeNSViewRef pView, int w, int h)
720{
721 DEBUG_FUNC_ENTER();
722 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
723
724 [(VMSVGA3DOverlayView*)pView setSize:NSMakeSize(w, h)];
725
726 [pPool release];
727 DEBUG_FUNC_LEAVE();
728}
729
730void vmsvga3dCocoaViewMakeCurrentContext(NativeNSViewRef pView, NativeNSOpenGLContextRef pCtx)
731{
732 DEBUG_FUNC_ENTER();
733 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
734
735 DEBUG_MSG(("cocoaViewMakeCurrentContext(%p, %p)\n", (void*)pView, (void*)pCtx));
736
737 if (pView)
738 {
739 [(VMSVGA3DOverlayView*)pView setGLCtx:pCtx];
740/* [(VMSVGA3DOverlayView*)pView makeCurrentFBO];*/
741 [pCtx makeCurrentContext];
742 }
743 else
744 {
745 [NSOpenGLContext clearCurrentContext];
746 }
747
748 [pPool release];
749 DEBUG_FUNC_LEAVE();
750}
751
752void vmsvga3dCocoaSwapBuffers(NativeNSViewRef pView, NativeNSOpenGLContextRef pCtx)
753{
754 DEBUG_FUNC_ENTER();
755 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
756
757 [pCtx flushBuffer];
758
759 [pPool release];
760 DEBUG_FUNC_LEAVE();
761}
762
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette