11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef GrGLRenderTarget_DEFINED
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define GrGLRenderTarget_DEFINED
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrGLIRect.h"
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrRenderTarget.h"
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrScalar.h"
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGpuGL;
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGLTexture;
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGLTexID;
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGLRenderTarget : public GrRenderTarget {
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // set fTexFBOID to this value to indicate that it is multisampled but
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Gr doesn't know how to resolve it.
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum { kUnresolvableFBOID = 0 };
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    struct Desc {
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLuint      fRTFBOID;
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLuint      fTexFBOID;
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLuint      fMSColorRenderbufferID;
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool          fOwnIDs;
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrPixelConfig fConfig;
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int           fSampleCnt;
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // creates a GrGLRenderTarget associated with a texture
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLRenderTarget(GrGpuGL*          gpu,
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     const Desc&       desc,
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     const GrGLIRect&  viewport,
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     GrGLTexID*        texID,
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     GrGLTexture*      texture);
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // creates an independent GrGLRenderTarget
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLRenderTarget(GrGpuGL*          gpu,
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     const Desc&       desc,
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     const GrGLIRect&  viewport);
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual ~GrGLRenderTarget() { this->release(); }
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setViewport(const GrGLIRect& rect) { fViewport = rect; }
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrGLIRect& getViewport() const { return fViewport; }
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // The following two functions return the same ID when a
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // texture-rendertarget is multisampled, and different IDs when
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // it is.
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // FBO ID used to render into
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint renderFBOID() const { return fRTFBOID; }
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // FBO ID that has texture ID attached.
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint textureFBOID() const { return fTexFBOID; }
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // override of GrRenderTarget
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual intptr_t getRenderTargetHandle() const {
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this->renderFBOID();
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual intptr_t getRenderTargetResolvedHandle() const {
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this->textureFBOID();
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual ResolveType getResolveType() const {
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!this->isMultisampled() ||
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fRTFBOID == fTexFBOID) {
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // catches FBO 0 and non MSAA case
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return kAutoResolves_ResolveType;
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else if (kUnresolvableFBOID == fTexFBOID) {
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return kCantResolve_ResolveType;
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return kCanResolve_ResolveType;
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // override of GrResource
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onAbandon();
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onRelease();
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint      fRTFBOID;
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint      fTexFBOID;
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint      fMSColorRenderbufferID;
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Should this object delete IDs when it is destroyed or does someone
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // else own them.
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool        fOwnIDs;
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // when we switch to this rendertarget we want to set the viewport to
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // only render to to content area (as opposed to the whole allocation) and
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we want the rendering to be at top left (GL has origin in bottom left)
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLIRect fViewport;
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // non-NULL if this RT was created by Gr with an associated GrGLTexture.
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexID* fTexIDObj;
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void init(const Desc& desc, const GrGLIRect& viewport, GrGLTexID* texID);
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GrRenderTarget INHERITED;
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
111