gfx/skia/trunk/src/gpu/gl/GrGLRenderTarget.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/skia/trunk/src/gpu/gl/GrGLRenderTarget.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,110 @@
     1.4 +/*
     1.5 + * Copyright 2011 Google Inc.
     1.6 + *
     1.7 + * Use of this source code is governed by a BSD-style license that can be
     1.8 + * found in the LICENSE file.
     1.9 + */
    1.10 +
    1.11 +#include "GrGLRenderTarget.h"
    1.12 +
    1.13 +#include "GrGpuGL.h"
    1.14 +
    1.15 +#define GPUGL static_cast<GrGpuGL*>(getGpu())
    1.16 +
    1.17 +#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X)
    1.18 +
    1.19 +void GrGLRenderTarget::init(const Desc& desc,
    1.20 +                            const GrGLIRect& viewport,
    1.21 +                            GrGLTexID* texID) {
    1.22 +    fRTFBOID                = desc.fRTFBOID;
    1.23 +    fTexFBOID               = desc.fTexFBOID;
    1.24 +    fMSColorRenderbufferID  = desc.fMSColorRenderbufferID;
    1.25 +    fViewport               = viewport;
    1.26 +    fTexIDObj.reset(SkSafeRef(texID));
    1.27 +}
    1.28 +
    1.29 +namespace {
    1.30 +GrTextureDesc MakeDesc(GrTextureFlags flags,
    1.31 +                       int width, int height,
    1.32 +                       GrPixelConfig config, int sampleCnt,
    1.33 +                       GrSurfaceOrigin origin) {
    1.34 +    GrTextureDesc temp;
    1.35 +    temp.fFlags = flags;
    1.36 +    temp.fWidth = width;
    1.37 +    temp.fHeight = height;
    1.38 +    temp.fConfig = config;
    1.39 +    temp.fSampleCnt = sampleCnt;
    1.40 +    temp.fOrigin = origin;
    1.41 +    return temp;
    1.42 +}
    1.43 +
    1.44 +};
    1.45 +
    1.46 +GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
    1.47 +                                   const Desc& desc,
    1.48 +                                   const GrGLIRect& viewport,
    1.49 +                                   GrGLTexID* texID,
    1.50 +                                   GrGLTexture* texture)
    1.51 +    : INHERITED(gpu,
    1.52 +                desc.fIsWrapped,
    1.53 +                texture,
    1.54 +                MakeDesc(kNone_GrTextureFlags,
    1.55 +                         viewport.fWidth, viewport.fHeight,
    1.56 +                         desc.fConfig, desc.fSampleCnt,
    1.57 +                         desc.fOrigin)) {
    1.58 +    SkASSERT(NULL != texID);
    1.59 +    SkASSERT(NULL != texture);
    1.60 +    // FBO 0 can't also be a texture, right?
    1.61 +    SkASSERT(0 != desc.fRTFBOID);
    1.62 +    SkASSERT(0 != desc.fTexFBOID);
    1.63 +
    1.64 +    // we assume this is true, TODO: get rid of viewport as a param.
    1.65 +    SkASSERT(viewport.fWidth == texture->width());
    1.66 +    SkASSERT(viewport.fHeight == texture->height());
    1.67 +
    1.68 +    this->init(desc, viewport, texID);
    1.69 +}
    1.70 +
    1.71 +GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
    1.72 +                                   const Desc& desc,
    1.73 +                                   const GrGLIRect& viewport)
    1.74 +    : INHERITED(gpu,
    1.75 +                desc.fIsWrapped,
    1.76 +                NULL,
    1.77 +                MakeDesc(kNone_GrTextureFlags,
    1.78 +                         viewport.fWidth, viewport.fHeight,
    1.79 +                         desc.fConfig, desc.fSampleCnt,
    1.80 +                         desc.fOrigin)) {
    1.81 +    this->init(desc, viewport, NULL);
    1.82 +}
    1.83 +
    1.84 +void GrGLRenderTarget::onRelease() {
    1.85 +    GPUGL->notifyRenderTargetDelete(this);
    1.86 +    if (!this->isWrapped()) {
    1.87 +        if (fTexFBOID) {
    1.88 +            GL_CALL(DeleteFramebuffers(1, &fTexFBOID));
    1.89 +        }
    1.90 +        if (fRTFBOID && fRTFBOID != fTexFBOID) {
    1.91 +            GL_CALL(DeleteFramebuffers(1, &fRTFBOID));
    1.92 +        }
    1.93 +        if (fMSColorRenderbufferID) {
    1.94 +            GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID));
    1.95 +        }
    1.96 +    }
    1.97 +    fRTFBOID                = 0;
    1.98 +    fTexFBOID               = 0;
    1.99 +    fMSColorRenderbufferID  = 0;
   1.100 +    fTexIDObj.reset(NULL);
   1.101 +    INHERITED::onRelease();
   1.102 +}
   1.103 +
   1.104 +void GrGLRenderTarget::onAbandon() {
   1.105 +    fRTFBOID                = 0;
   1.106 +    fTexFBOID               = 0;
   1.107 +    fMSColorRenderbufferID  = 0;
   1.108 +    if (NULL != fTexIDObj.get()) {
   1.109 +        fTexIDObj->abandon();
   1.110 +        fTexIDObj.reset(NULL);
   1.111 +    }
   1.112 +    INHERITED::onAbandon();
   1.113 +}

mercurial