1ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
2ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com/*
3ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com * Copyright 2012 Google Inc.
4ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com *
5ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com * Use of this source code is governed by a BSD-style license that can be
6ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com * found in the LICENSE file.
7ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com */
8ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
9ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
10ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com#include "SkGLWidget.h"
11ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
12e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU
13e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com
14607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.comSkGLWidget::SkGLWidget(SkDebugger* debugger) : QGLWidget() {
15607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fDebugger = debugger;
162d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com    fCurIntf = NULL;
172d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com    fCurContext = NULL;
182d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com    fGpuDevice = NULL;
19830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    fCanvas = NULL;
20ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
21ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
22ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comSkGLWidget::~SkGLWidget() {
23ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    SkSafeUnref(fCurIntf);
24ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    SkSafeUnref(fCurContext);
25ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    SkSafeUnref(fGpuDevice);
26830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    SkSafeUnref(fCanvas);
27ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
28ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
29fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.orgvoid SkGLWidget::setSampleCount(int sampleCount)
30fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org{
31fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    QGLFormat currentFormat = format();
32fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    currentFormat.setSampleBuffers(sampleCount > 0);
33fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    currentFormat.setSamples(sampleCount);
34fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    setFormat(currentFormat);
35fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org}
36fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org
37ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comvoid SkGLWidget::initializeGL() {
38ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    fCurIntf = GrGLCreateNativeInterface();
390b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com    if (!fCurIntf) {
400b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com        return;
410b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com    }
42fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org    glStencilMask(0xffffffff);
43fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org    glClearStencil(0);
44fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org    glClear(GL_STENCIL_BUFFER_BIT);
45fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org
4616e3ddea6a80972aced04b21b1d66377fa95e7c7bsalomon@google.com    fCurContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf);
4716e3ddea6a80972aced04b21b1d66377fa95e7c7bsalomon@google.com    GrBackendRenderTargetDesc desc = this->getDesc(this->width(), this->height());
486577cd37c73bd6e3bbdb7b7af2fc625a2cd69b39robertphillips@google.com    desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
4916e3ddea6a80972aced04b21b1d66377fa95e7c7bsalomon@google.com    GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
504a8126e7f81384526629b1e21bf89b632ea13cd9reed    fGpuDevice = SkGpuDevice::Create(curRenderTarget,
514a8126e7f81384526629b1e21bf89b632ea13cd9reed                                     SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType));
52830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    fCanvas = new SkCanvas(fGpuDevice);
53ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    curRenderTarget->unref();
54ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
55ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
56ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comvoid SkGLWidget::resizeGL(int w, int h) {
570b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com    if (fCurContext) {
58fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org        glDisable(GL_SCISSOR_TEST);
59fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org        glStencilMask(0xffffffff);
60fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org        glClearStencil(0);
61fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org        glClear(GL_STENCIL_BUFFER_BIT);
62fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org        fCurContext->resetContext();
63fae599b4a642aae776966b0f2ea67e2fdf4d6a65commit-bot@chromium.org
640b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com        GrBackendRenderTargetDesc desc = this->getDesc(w, h);
650b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com        desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
660b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com        GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
670b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com        SkSafeUnref(fGpuDevice);
680b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com        SkSafeUnref(fCanvas);
694a8126e7f81384526629b1e21bf89b632ea13cd9reed        fGpuDevice = SkGpuDevice::Create(curRenderTarget,
704a8126e7f81384526629b1e21bf89b632ea13cd9reed                                         SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType));
710b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com        fCanvas = new SkCanvas(fGpuDevice);
720b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com    }
73a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips    fDebugger->setWindowSize(w, h);
74607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    draw();
75ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
76ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
77ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comvoid SkGLWidget::paintGL() {
780b4d6b289c89f0b6c6891e2fb812fa3614cb55a2bungeman@google.com    if (!this->isHidden() && fCanvas) {
79607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com        fDebugger->draw(fCanvas);
80607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com        // TODO(chudy): Implement an optional flush button in Gui.
81607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com        fCanvas->flush();
82607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com        emit drawComplete();
83607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    }
84ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
85ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
8616e3ddea6a80972aced04b21b1d66377fa95e7c7bsalomon@google.comGrBackendRenderTargetDesc SkGLWidget::getDesc(int w, int h) {
8716e3ddea6a80972aced04b21b1d66377fa95e7c7bsalomon@google.com    GrBackendRenderTargetDesc desc;
88e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    desc.fWidth = SkScalarRoundToInt(this->width());
89e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    desc.fHeight = SkScalarRoundToInt(this->height());
90fec0bc3fc13481f5bcb341ab2d2d695911f39bd4bsalomon@google.com    desc.fConfig = kSkia8888_GrPixelConfig;
91ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    GR_GL_GetIntegerv(fCurIntf, GR_GL_SAMPLES, &desc.fSampleCnt);
92ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    GR_GL_GetIntegerv(fCurIntf, GR_GL_STENCIL_BITS, &desc.fStencilBits);
93ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    GrGLint buffer;
94ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer);
95ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    desc.fRenderTargetHandle = buffer;
96ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
97ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    return desc;
98ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
99e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com
100e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
101