GLWindowContext_mac.cpp revision a3f3caccdfa6e5e044cc1c76e256e55b8a6004ad
1a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
2a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth/*
3a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth * Copyright 2016 Google Inc.
4a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth *
5a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth * Use of this source code is governed by a BSD-style license that can be
6a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth * found in the LICENSE file.
7a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth */
8a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
9a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#include "GLWindowContext_mac.h"
10a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
11a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth//#include <GL/gl.h>
12a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
13a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#include "Window_mac.h"
14a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
15a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverthnamespace sk_app {
16a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
17a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth// platform-dependent create
18a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverthGLWindowContext* GLWindowContext::Create(void* platformData, const DisplayParams& params) {
19a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    GLWindowContext_mac* ctx = new GLWindowContext_mac(platformData, params);
20a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    if (!ctx->isValid()) {
21a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        delete ctx;
22a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        return nullptr;
23a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    }
24a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    return ctx;
25a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth}
26a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
27a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverthGLWindowContext_mac::GLWindowContext_mac(void* platformData, const DisplayParams& params)
28a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    : GLWindowContext(platformData, params)
29a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#if 0
30a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    // TODO: init Mac-specific OpenGL objects
31a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    , fDisplay(nullptr)
32a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    , fWindow(0)
33a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    , fGLContext(0)
34a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#endif
35a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    {
36a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
37a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    // any config code here (particularly for msaa)?
38a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
39a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    this->initializeContext(platformData, params);
40a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth}
41a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
42a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverthGLWindowContext_mac::~GLWindowContext_mac() {
43a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    this->destroyContext();
44a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth}
45a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
46a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverthvoid GLWindowContext_mac::onInitializeContext(void* platformData, const DisplayParams& params) {
47a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#if 0
48a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    // TODO: Init for Mac
49a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    ContextPlatformData_mac* unixPlatformData =
50a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        reinterpret_cast<ContextPlatformData_mac*>(platformData);
51a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
52a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    if (unixPlatformData) {
53a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        fDisplay = unixPlatformData->fDisplay;
54a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        fWindow = unixPlatformData->fWindow;
55a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        fVisualInfo = unixPlatformData->fVisualInfo;
56a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    }
57a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    SkASSERT(fDisplay);
58a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
59a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    fGLContext = glXCreateContext(fDisplay, fVisualInfo, nullptr, GL_TRUE);
60a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    if (!fGLContext) {
61a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        return;
62a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    }
63a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
64a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    if (glXMakeCurrent(fDisplay, fWindow, fGLContext)) {
65a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glClearStencil(0);
66a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glClearColor(0, 0, 0, 0);
67a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glStencilMask(0xffffffff);
68a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
69a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
70a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        int redBits, greenBits, blueBits;
71a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glXGetConfig(fDisplay, fVisualInfo, GLX_RED_SIZE, &redBits);
72a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glXGetConfig(fDisplay, fVisualInfo, GLX_GREEN_SIZE, &greenBits);
73a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glXGetConfig(fDisplay, fVisualInfo, GLX_BLUE_SIZE, &blueBits);
74a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        fColorBits = redBits + greenBits + blueBits;
75a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glXGetConfig(fDisplay, fVisualInfo, GLX_STENCIL_SIZE, &fStencilBits);
76a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glXGetConfig(fDisplay, fVisualInfo, GLX_SAMPLES_ARB, &fSampleCount);
77a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
78a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        XWindow root;
79a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        int x, y;
80a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        unsigned int border_width, depth;
81a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        XGetGeometry(fDisplay, fWindow, &root, &x, &y,
82a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth                     (unsigned int*)&fWidth, (unsigned int*)&fHeight, &border_width, &depth);
83a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glViewport(0, 0, fWidth, fHeight);
84a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    }
85a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#endif
86a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth}
87a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
88a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverthvoid GLWindowContext_mac::onDestroyContext() {
89a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#if 0
90a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    // TODO: teardown for Mac
91a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    if (!fDisplay || !fGLContext) {
92a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        return;
93a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    }
94a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    glXMakeCurrent(fDisplay, None, nullptr);
95a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    glXDestroyContext(fDisplay, fGLContext);
96a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    fGLContext = nullptr;
97a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#endif
98a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth}
99a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
100a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
101a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverthvoid GLWindowContext_mac::onSwapBuffers() {
102a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#if 0
103a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    // TODO: swap for Mac
104a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    if (fDisplay && fGLContext) {
105a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth        glXSwapBuffers(fDisplay, fWindow);
106a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth    }
107a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth#endif
108a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth}
109a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
110a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth
111a3f3caccdfa6e5e044cc1c76e256e55b8a6004adjvanverth}   //namespace sk_app
112