GLWindowContext_unix.cpp revision 99eb6e2d5abab2cb74e3d413fc99d5cbbfac8765
199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth/* 399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth * Copyright 2016 Google Inc. 499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth * 599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth * Use of this source code is governed by a BSD-style license that can be 699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth * found in the LICENSE file. 799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth */ 899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth#include "GLWindowContext_unix.h" 1099eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 1199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth#include <GL/gl.h> 1299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 1399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth#include "Window_unix.h" 1499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 1599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverthnamespace sk_app { 1699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 1799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth// platform-dependent create 1899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverthGLWindowContext* GLWindowContext::Create(void* platformData, const DisplayParams& params) { 1999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth GLWindowContext_unix* ctx = new GLWindowContext_unix(platformData, params); 2099eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth if (!ctx->isValid()) { 2199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth delete ctx; 2299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth return nullptr; 2399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth } 2499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth return ctx; 2599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth} 2699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 2799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverthGLWindowContext_unix::GLWindowContext_unix(void* platformData, const DisplayParams& params) 2899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth : GLWindowContext(platformData, params) 2999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth , fDisplay(nullptr) 3099eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth , fWindow(0) 3199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth , fGLContext(0) { 3299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 3399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth // any config code here (particularly for msaa)? 3499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 3599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth this->initializeContext(platformData, params); 3699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth} 3799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 3899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverthGLWindowContext_unix::~GLWindowContext_unix() { 3999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth this->destroyContext(); 4099eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth} 4199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 4299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverthvoid GLWindowContext_unix::onInitializeContext(void* platformData, const DisplayParams& params) { 4399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth ContextPlatformData_unix* unixPlatformData = 4499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth reinterpret_cast<ContextPlatformData_unix*>(platformData); 4599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 4699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth if (unixPlatformData) { 4799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth fDisplay = unixPlatformData->fDisplay; 4899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth fWindow = unixPlatformData->fWindow; 4999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth fVisualInfo = unixPlatformData->fVisualInfo; 5099eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth } 5199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth SkASSERT(fDisplay); 5299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 5399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth fGLContext = glXCreateContext(fDisplay, fVisualInfo, nullptr, GL_TRUE); 5499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth if (!fGLContext) { 5599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth return; 5699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth } 5799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 5899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth if (glXMakeCurrent(fDisplay, fWindow, fGLContext)) { 5999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glClearStencil(0); 6099eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glClearColor(0, 0, 0, 0); 6199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glStencilMask(0xffffffff); 6299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 6399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 6499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth int redBits, greenBits, blueBits; 6599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glXGetConfig(fDisplay, fVisualInfo, GLX_RED_SIZE, &redBits); 6699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glXGetConfig(fDisplay, fVisualInfo, GLX_GREEN_SIZE, &greenBits); 6799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glXGetConfig(fDisplay, fVisualInfo, GLX_BLUE_SIZE, &blueBits); 6899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth fColorBits = redBits + greenBits + blueBits; 6999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glXGetConfig(fDisplay, fVisualInfo, GLX_STENCIL_SIZE, &fStencilBits); 7099eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glXGetConfig(fDisplay, fVisualInfo, GLX_SAMPLES_ARB, &fSampleCount); 7199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 7299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth XWindow root; 7399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth int x, y; 7499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth unsigned int border_width, depth; 7599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth XGetGeometry(fDisplay, fWindow, &root, &x, &y, 7699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth (unsigned int*)&fWidth, (unsigned int*)&fHeight, &border_width, &depth); 7799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glViewport(0, 0, fWidth, fHeight); 7899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth } 7999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth} 8099eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 8199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverthvoid GLWindowContext_unix::onDestroyContext() { 8299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth if (!fDisplay || !fGLContext) { 8399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth return; 8499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth } 8599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glXMakeCurrent(fDisplay, None, nullptr); 8699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glXDestroyContext(fDisplay, fGLContext); 8799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth fGLContext = nullptr; 8899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth} 8999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 9099eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 9199eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverthvoid GLWindowContext_unix::onSwapBuffers() { 9299eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth if (fDisplay && fGLContext) { 9399eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth printf("swapping\n"); 9499eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth glXSwapBuffers(fDisplay, fWindow); 9599eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth } 9699eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth} 9799eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 9899eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth 9999eb6e2d5abab2cb74e3d413fc99d5cbbfac8765jvanverth} //namespace sk_app 100