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