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