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
93f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#ifndef GrGLRenderTarget_DEFINED
103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GrGLRenderTarget_DEFINED
113f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
123f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrGLIRect.h"
133f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrRenderTarget.h"
143a729be1ae6a0bdfb6a8745f1859e8cb7f23baddbsalomon@google.com#include "SkScalar.h"
153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrGpuGL;
173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrGLTexture;
183f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrGLTexID;
193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrGLRenderTarget : public GrRenderTarget {
213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
223f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.compublic:
233f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // set fTexFBOID to this value to indicate that it is multisampled but
243f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // Gr doesn't know how to resolve it.
253f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    enum { kUnresolvableFBOID = 0 };
263f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
273f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    struct Desc {
28e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org        GrGLuint         fRTFBOID;
29e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org        GrGLuint         fTexFBOID;
30e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org        GrGLuint         fMSColorRenderbufferID;
31e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org        bool             fIsWrapped;
32e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org        GrPixelConfig    fConfig;
33e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org        int              fSampleCnt;
34e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org        GrSurfaceOrigin  fOrigin;
35cdd5aef1b8933a3c8d96845a33555da863d8aef5senorblanco@chromium.org        bool             fCheckAllocation;
363f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    };
373f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
383f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // creates a GrGLRenderTarget associated with a texture
393f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrGLRenderTarget(GrGpuGL*          gpu,
403f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                     const Desc&       desc,
413f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                     const GrGLIRect&  viewport,
423f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                     GrGLTexID*        texID,
433f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                     GrGLTexture*      texture);
443f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
453f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // creates an independent GrGLRenderTarget
463f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrGLRenderTarget(GrGpuGL*          gpu,
473f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                     const Desc&       desc,
483f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                     const GrGLIRect&  viewport);
493f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
503f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    virtual ~GrGLRenderTarget() { this->release(); }
513f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
523f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void setViewport(const GrGLIRect& rect) { fViewport = rect; }
533f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    const GrGLIRect& getViewport() const { return fViewport; }
543f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
55935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com    // The following two functions return the same ID when a
568780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com    // texture/render target is multisampled, and different IDs when
573f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // it is.
583f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // FBO ID used to render into
593f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrGLuint renderFBOID() const { return fRTFBOID; }
603f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // FBO ID that has texture ID attached.
613f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrGLuint textureFBOID() const { return fTexFBOID; }
623f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
63935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com    // override of GrRenderTarget
64e0abdaaf1026d10f2b0c1f3ae3865dfb2861aa00bsalomon@google.com    virtual GrBackendObject getRenderTargetHandle() const {
65935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com        return this->renderFBOID();
663f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
67e0abdaaf1026d10f2b0c1f3ae3865dfb2861aa00bsalomon@google.com    virtual GrBackendObject getRenderTargetResolvedHandle() const {
683f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        return this->textureFBOID();
693f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
703f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    virtual ResolveType getResolveType() const {
71015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com
72015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com        if (!this->isMultisampled() ||
73015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com            fRTFBOID == fTexFBOID) {
743f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            // catches FBO 0 and non MSAA case
753f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            return kAutoResolves_ResolveType;
763f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        } else if (kUnresolvableFBOID == fTexFBOID) {
773f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            return kCantResolve_ResolveType;
783f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        } else {
793f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            return kCanResolve_ResolveType;
803f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        }
813f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
823f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
833f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comprotected:
843f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // override of GrResource
8577edb42a16492674ebc3fd2d3985c82941217083robertphillips@google.com    virtual void onAbandon() SK_OVERRIDE;
8677edb42a16492674ebc3fd2d3985c82941217083robertphillips@google.com    virtual void onRelease() SK_OVERRIDE;
873f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
883f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comprivate:
893f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrGLuint      fRTFBOID;
903f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrGLuint      fTexFBOID;
913f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
923f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrGLuint      fMSColorRenderbufferID;
933f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
948780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com    // when we switch to this render target we want to set the viewport to
953f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // only render to to content area (as opposed to the whole allocation) and
963f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // we want the rendering to be at top left (GL has origin in bottom left)
973f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrGLIRect fViewport;
983f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
993f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    // non-NULL if this RT was created by Gr with an associated GrGLTexture.
10060c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org    SkAutoTUnref<GrGLTexID> fTexIDObj;
1013f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
1023f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    void init(const Desc& desc, const GrGLIRect& viewport, GrGLTexID* texID);
1033f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
1043f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    typedef GrRenderTarget INHERITED;
1053f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com};
1063f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
1073f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#endif
108