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