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
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef GrGLRenderTarget_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GrGLRenderTarget_DEFINED
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLIRect.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrRenderTarget.h"
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkScalar.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGpuGL;
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGLTexture;
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGLTexID;
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGLRenderTarget : public GrRenderTarget {
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // set fTexFBOID to this value to indicate that it is multisampled but
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // Gr doesn't know how to resolve it.
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum { kUnresolvableFBOID = 0 };
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    struct Desc {
28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        GrGLuint         fRTFBOID;
29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        GrGLuint         fTexFBOID;
30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        GrGLuint         fMSColorRenderbufferID;
31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        bool             fIsWrapped;
32096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        GrPixelConfig    fConfig;
33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        int              fSampleCnt;
34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        GrSurfaceOrigin  fOrigin;
3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        bool             fCheckAllocation;
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // creates a GrGLRenderTarget associated with a texture
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLRenderTarget(GrGpuGL*          gpu,
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     const Desc&       desc,
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     const GrGLIRect&  viewport,
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     GrGLTexID*        texID,
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     GrGLTexture*      texture);
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // creates an independent GrGLRenderTarget
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLRenderTarget(GrGpuGL*          gpu,
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     const Desc&       desc,
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     const GrGLIRect&  viewport);
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~GrGLRenderTarget() { this->release(); }
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setViewport(const GrGLIRect& rect) { fViewport = rect; }
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const GrGLIRect& getViewport() const { return fViewport; }
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // The following two functions return the same ID when a
56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // texture/render target is multisampled, and different IDs when
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // it is.
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // FBO ID used to render into
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLuint renderFBOID() const { return fRTFBOID; }
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // FBO ID that has texture ID attached.
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLuint textureFBOID() const { return fTexFBOID; }
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // override of GrRenderTarget
64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual GrBackendObject getRenderTargetHandle() const {
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return this->renderFBOID();
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual GrBackendObject getRenderTargetResolvedHandle() const {
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return this->textureFBOID();
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ResolveType getResolveType() const {
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (!this->isMultisampled() ||
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fRTFBOID == fTexFBOID) {
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            // catches FBO 0 and non MSAA case
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return kAutoResolves_ResolveType;
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        } else if (kUnresolvableFBOID == fTexFBOID) {
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return kCantResolve_ResolveType;
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        } else {
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return kCanResolve_ResolveType;
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // override of GrResource
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onAbandon() SK_OVERRIDE;
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onRelease() SK_OVERRIDE;
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLuint      fRTFBOID;
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLuint      fTexFBOID;
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLuint      fMSColorRenderbufferID;
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // when we switch to this render target we want to set the viewport to
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // only render to to content area (as opposed to the whole allocation) and
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // we want the rendering to be at top left (GL has origin in bottom left)
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLIRect fViewport;
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // non-NULL if this RT was created by Gr with an associated GrGLTexture.
10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkAutoTUnref<GrGLTexID> fTexIDObj;
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void init(const Desc& desc, const GrGLIRect& viewport, GrGLTexID* texID);
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef GrRenderTarget INHERITED;
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
108