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