13f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com/* 23f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Copyright 2011 Google Inc. 33f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * 43f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 53f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * found in the LICENSE file. 63f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com */ 73f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 83f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrGLRenderTarget.h" 93f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrGpuGL.h" 113f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 123f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GPUGL static_cast<GrGpuGL*>(getGpu()) 133f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 143f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X) 153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comvoid GrGLRenderTarget::init(const Desc& desc, 173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const GrGLIRect& viewport, 183f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLTexID* texID) { 193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fRTFBOID = desc.fRTFBOID; 203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fTexFBOID = desc.fTexFBOID; 213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fMSColorRenderbufferID = desc.fMSColorRenderbufferID; 223f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fViewport = viewport; 2360c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org fTexIDObj.reset(SkSafeRef(texID)); 243f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com} 253f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 263ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.comnamespace { 273ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.comGrTextureDesc MakeDesc(GrTextureFlags flags, 283ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com int width, int height, 29e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org GrPixelConfig config, int sampleCnt, 30e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org GrSurfaceOrigin origin) { 313ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com GrTextureDesc temp; 323ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com temp.fFlags = flags; 333ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com temp.fWidth = width; 343ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com temp.fHeight = height; 353ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com temp.fConfig = config; 363ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com temp.fSampleCnt = sampleCnt; 37e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org temp.fOrigin = origin; 383ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com return temp; 393ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com} 403ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com 413ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com}; 423ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com 433f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comGrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 443f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const Desc& desc, 453f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const GrGLIRect& viewport, 463f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLTexID* texID, 473f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLTexture* texture) 483f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com : INHERITED(gpu, 4955dcfe8e57a379c114d711fb5e7fc740d837e76bbsalomon@google.com desc.fIsWrapped, 503f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com texture, 513ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com MakeDesc(kNone_GrTextureFlags, 523ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com viewport.fWidth, viewport.fHeight, 53e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org desc.fConfig, desc.fSampleCnt, 54e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org desc.fOrigin)) { 553f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrAssert(NULL != texID); 563f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrAssert(NULL != texture); 573f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // FBO 0 can't also be a texture, right? 583f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrAssert(0 != desc.fRTFBOID); 593f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrAssert(0 != desc.fTexFBOID); 606ac0c1516fcc80b08bcd9b2180627cbf3a52152bbsalomon@google.com 616ac0c1516fcc80b08bcd9b2180627cbf3a52152bbsalomon@google.com // we assume this is true, TODO: get rid of viewport as a param. 626ac0c1516fcc80b08bcd9b2180627cbf3a52152bbsalomon@google.com GrAssert(viewport.fWidth == texture->width()); 636ac0c1516fcc80b08bcd9b2180627cbf3a52152bbsalomon@google.com GrAssert(viewport.fHeight == texture->height()); 646ac0c1516fcc80b08bcd9b2180627cbf3a52152bbsalomon@google.com 653f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com this->init(desc, viewport, texID); 663f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com} 673f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 683f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comGrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 693f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const Desc& desc, 703f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const GrGLIRect& viewport) 713f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com : INHERITED(gpu, 7255dcfe8e57a379c114d711fb5e7fc740d837e76bbsalomon@google.com desc.fIsWrapped, 733f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com NULL, 743ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com MakeDesc(kNone_GrTextureFlags, 753ad8d9fd0fb39437dabf62b8757ed358e19fdeb4robertphillips@google.com viewport.fWidth, viewport.fHeight, 76e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org desc.fConfig, desc.fSampleCnt, 77e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org desc.fOrigin)) { 783f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com this->init(desc, viewport, NULL); 793f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com} 803f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 813f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comvoid GrGLRenderTarget::onRelease() { 823f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GPUGL->notifyRenderTargetDelete(this); 8355dcfe8e57a379c114d711fb5e7fc740d837e76bbsalomon@google.com if (!this->isWrapped()) { 843f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com if (fTexFBOID) { 853f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GL_CALL(DeleteFramebuffers(1, &fTexFBOID)); 863f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } 873f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com if (fRTFBOID && fRTFBOID != fTexFBOID) { 883f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GL_CALL(DeleteFramebuffers(1, &fRTFBOID)); 893f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } 903f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com if (fMSColorRenderbufferID) { 913f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); 923f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } 933f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } 943f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fRTFBOID = 0; 953f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fTexFBOID = 0; 963f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fMSColorRenderbufferID = 0; 9760c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org fTexIDObj.reset(NULL); 9877edb42a16492674ebc3fd2d3985c82941217083robertphillips@google.com INHERITED::onRelease(); 993f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com} 1003f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 1013f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comvoid GrGLRenderTarget::onAbandon() { 1023f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fRTFBOID = 0; 1033f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fTexFBOID = 0; 1043f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fMSColorRenderbufferID = 0; 10560c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org if (NULL != fTexIDObj.get()) { 1063f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com fTexIDObj->abandon(); 10760c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org fTexIDObj.reset(NULL); 1083f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } 10977edb42a16492674ebc3fd2d3985c82941217083robertphillips@google.com INHERITED::onAbandon(); 1103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com} 111