gfx/skia/trunk/include/gpu/GrRenderTarget.h

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 /*
     2  * Copyright 2011 Google Inc.
     3  *
     4  * Use of this source code is governed by a BSD-style license that can be
     5  * found in the LICENSE file.
     6  */
     8 #ifndef GrRenderTarget_DEFINED
     9 #define GrRenderTarget_DEFINED
    11 #include "GrSurface.h"
    12 #include "SkRect.h"
    14 class GrStencilBuffer;
    15 class GrTexture;
    17 /**
    18  * GrRenderTarget represents a 2D buffer of pixels that can be rendered to.
    19  * A context's render target is set by setRenderTarget(). Render targets are
    20  * created by a createTexture with the kRenderTarget_TextureFlag flag.
    21  * Additionally, GrContext provides methods for creating GrRenderTargets
    22  * that wrap externally created render targets.
    23  */
    24 class GrRenderTarget : public GrSurface {
    25 public:
    26     SK_DECLARE_INST_COUNT(GrRenderTarget)
    28     // GrResource overrides
    29     virtual size_t sizeInBytes() const SK_OVERRIDE;
    31     // GrSurface overrides
    32     /**
    33      * @return the texture associated with the render target, may be NULL.
    34      */
    35     virtual GrTexture* asTexture() SK_OVERRIDE { return fTexture; }
    36     virtual const GrTexture* asTexture() const SK_OVERRIDE { return fTexture; }
    38     /**
    39      * @return this render target.
    40      */
    41     virtual GrRenderTarget* asRenderTarget() SK_OVERRIDE { return this; }
    42     virtual const GrRenderTarget* asRenderTarget() const  SK_OVERRIDE {
    43         return this;
    44     }
    46     virtual bool readPixels(int left, int top, int width, int height,
    47                             GrPixelConfig config,
    48                             void* buffer,
    49                             size_t rowBytes = 0,
    50                             uint32_t pixelOpsFlags = 0) SK_OVERRIDE;
    52     virtual void writePixels(int left, int top, int width, int height,
    53                              GrPixelConfig config,
    54                              const void* buffer,
    55                              size_t rowBytes = 0,
    56                              uint32_t pixelOpsFlags = 0) SK_OVERRIDE;
    58     // GrRenderTarget
    59     /**
    60      * If this RT is multisampled, this is the multisample buffer
    61      * @return the 3D API's handle to this object (e.g. FBO ID in OpenGL)
    62      */
    63     virtual GrBackendObject getRenderTargetHandle() const = 0;
    65     /**
    66      * If this RT is multisampled, this is the buffer it is resolved to.
    67      * Otherwise, same as getRenderTargetHandle().
    68      * (In GL a separate FBO ID is used for the MSAA and resolved buffers)
    69      * @return the 3D API's handle to this object (e.g. FBO ID in OpenGL)
    70      */
    71     virtual GrBackendObject getRenderTargetResolvedHandle() const = 0;
    73     /**
    74      * @return true if the surface is multisampled, false otherwise
    75      */
    76     bool isMultisampled() const { return 0 != fDesc.fSampleCnt; }
    78     /**
    79      * @return the number of samples-per-pixel or zero if non-MSAA.
    80      */
    81     int numSamples() const { return fDesc.fSampleCnt; }
    83     /**
    84      * Call to indicate the multisample contents were modified such that the
    85      * render target needs to be resolved before it can be used as texture. Gr
    86      * tracks this for its own drawing and thus this only needs to be called
    87      * when the render target has been modified outside of Gr. This has no
    88      * effect on wrapped backend render targets.
    89      *
    90      * @param rect  a rect bounding the area needing resolve. NULL indicates
    91      *              the whole RT needs resolving.
    92      */
    93     void flagAsNeedingResolve(const SkIRect* rect = NULL);
    95     /**
    96      * Call to override the region that needs to be resolved.
    97      */
    98     void overrideResolveRect(const SkIRect rect);
   100     /**
   101      * Call to indicate that GrRenderTarget was externally resolved. This may
   102      * allow Gr to skip a redundant resolve step.
   103      */
   104     void flagAsResolved() { fResolveRect.setLargestInverted(); }
   106     /**
   107      * @return true if the GrRenderTarget requires MSAA resolving
   108      */
   109     bool needsResolve() const { return !fResolveRect.isEmpty(); }
   111     /**
   112      * Returns a rect bounding the region needing resolving.
   113      */
   114     const SkIRect& getResolveRect() const { return fResolveRect; }
   116     /**
   117      * If the render target is multisampled this will perform a multisample
   118      * resolve. Any pending draws to the target are first flushed. This only
   119      * applies to render targets that are associated with GrTextures. After the
   120      * function returns the GrTexture will contain the resolved pixels.
   121      */
   122     void resolve();
   124     // a MSAA RT may require explicit resolving , it may auto-resolve (e.g. FBO
   125     // 0 in GL), or be unresolvable because the client didn't give us the
   126     // resolve destination.
   127     enum ResolveType {
   128         kCanResolve_ResolveType,
   129         kAutoResolves_ResolveType,
   130         kCantResolve_ResolveType,
   131     };
   132     virtual ResolveType getResolveType() const = 0;
   134     /**
   135      * GrStencilBuffer is not part of the public API.
   136      */
   137     GrStencilBuffer* getStencilBuffer() const { return fStencilBuffer; }
   138     void setStencilBuffer(GrStencilBuffer* stencilBuffer);
   140 protected:
   141     GrRenderTarget(GrGpu* gpu,
   142                    bool isWrapped,
   143                    GrTexture* texture,
   144                    const GrTextureDesc& desc)
   145         : INHERITED(gpu, isWrapped, desc)
   146         , fStencilBuffer(NULL)
   147         , fTexture(texture) {
   148         fResolveRect.setLargestInverted();
   149     }
   151     // override of GrResource
   152     virtual void onAbandon() SK_OVERRIDE;
   153     virtual void onRelease() SK_OVERRIDE;
   155 private:
   156     friend class GrTexture;
   157     // called by ~GrTexture to remove the non-ref'ed back ptr.
   158     void owningTextureDestroyed() {
   159         SkASSERT(NULL != fTexture);
   160         fTexture = NULL;
   161     }
   163     GrStencilBuffer*  fStencilBuffer;
   164     GrTexture*        fTexture; // not ref'ed
   166     SkIRect           fResolveRect;
   168     typedef GrSurface INHERITED;
   169 };
   171 #endif

mercurial