180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLRenderTarget.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGpuGL.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GPUGL static_cast<GrGpuGL*>(getGpu()) 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X) 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid GrGLRenderTarget::init(const Desc& desc, 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrGLIRect& viewport, 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLTexID* texID) { 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fRTFBOID = desc.fRTFBOID; 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fTexFBOID = desc.fTexFBOID; 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fMSColorRenderbufferID = desc.fMSColorRenderbufferID; 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fViewport = viewport; 2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fTexIDObj.reset(SkSafeRef(texID)); 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querunamespace { 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrTextureDesc MakeDesc(GrTextureFlags flags, 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int width, int height, 29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrPixelConfig config, int sampleCnt, 30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrSurfaceOrigin origin) { 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrTextureDesc temp; 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru temp.fFlags = flags; 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru temp.fWidth = width; 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru temp.fHeight = height; 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru temp.fConfig = config; 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru temp.fSampleCnt = sampleCnt; 37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger temp.fOrigin = origin; 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return temp; 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const Desc& desc, 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrGLIRect& viewport, 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLTexID* texID, 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLTexture* texture) 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru : INHERITED(gpu, 49d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger desc.fIsWrapped, 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru texture, 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru MakeDesc(kNone_GrTextureFlags, 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru viewport.fWidth, viewport.fHeight, 53096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger desc.fConfig, desc.fSampleCnt, 54096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger desc.fOrigin)) { 550a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(NULL != texID); 560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(NULL != texture); 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // FBO 0 can't also be a texture, right? 580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(0 != desc.fRTFBOID); 590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(0 != desc.fTexFBOID); 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // we assume this is true, TODO: get rid of viewport as a param. 620a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(viewport.fWidth == texture->width()); 630a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(viewport.fHeight == texture->height()); 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->init(desc, viewport, texID); 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const Desc& desc, 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrGLIRect& viewport) 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru : INHERITED(gpu, 72d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger desc.fIsWrapped, 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru NULL, 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru MakeDesc(kNone_GrTextureFlags, 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru viewport.fWidth, viewport.fHeight, 76096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger desc.fConfig, desc.fSampleCnt, 77096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger desc.fOrigin)) { 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->init(desc, viewport, NULL); 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid GrGLRenderTarget::onRelease() { 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GPUGL->notifyRenderTargetDelete(this); 83d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger if (!this->isWrapped()) { 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fTexFBOID) { 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GL_CALL(DeleteFramebuffers(1, &fTexFBOID)); 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fRTFBOID && fRTFBOID != fTexFBOID) { 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GL_CALL(DeleteFramebuffers(1, &fRTFBOID)); 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fMSColorRenderbufferID) { 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fRTFBOID = 0; 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fTexFBOID = 0; 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fMSColorRenderbufferID = 0; 9758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fTexIDObj.reset(NULL); 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru INHERITED::onRelease(); 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid GrGLRenderTarget::onAbandon() { 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fRTFBOID = 0; 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fTexFBOID = 0; 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fMSColorRenderbufferID = 0; 10558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (NULL != fTexIDObj.get()) { 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fTexIDObj->abandon(); 10758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fTexIDObj.reset(NULL); 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru INHERITED::onAbandon(); 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 111