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