gfx/skia/trunk/src/gpu/gl/GrGpuGL.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 GrGpuGL_DEFINED
     9 #define GrGpuGL_DEFINED
    11 #include "GrBinHashKey.h"
    12 #include "GrDrawState.h"
    13 #include "GrGLContext.h"
    14 #include "GrGLIRect.h"
    15 #include "GrGLIndexBuffer.h"
    16 #include "GrGLProgram.h"
    17 #include "GrGLStencilBuffer.h"
    18 #include "GrGLTexture.h"
    19 #include "GrGLVertexArray.h"
    20 #include "GrGLVertexBuffer.h"
    21 #include "GrGpu.h"
    22 #include "GrTHashTable.h"
    23 #include "SkTypes.h"
    25 #ifdef SK_DEVELOPER
    26 #define PROGRAM_CACHE_STATS
    27 #endif
    29 class GrGpuGL : public GrGpu {
    30 public:
    31     GrGpuGL(const GrGLContext& ctx, GrContext* context);
    32     virtual ~GrGpuGL();
    34     const GrGLContext& glContext() const { return fGLContext; }
    36     const GrGLInterface* glInterface() const { return fGLContext.interface(); }
    37     const GrGLContextInfo& ctxInfo() const { return fGLContext; }
    38     GrGLStandard glStandard() const { return fGLContext.standard(); }
    39     GrGLVersion glVersion() const { return fGLContext.version(); }
    40     GrGLSLGeneration glslGeneration() const { return fGLContext.glslGeneration(); }
    41     const GrGLCaps& glCaps() const { return *fGLContext.caps(); }
    43     // Used by GrGLProgram and GrGLTexGenProgramEffects to configure OpenGL state.
    44     void bindTexture(int unitIdx, const GrTextureParams& params, GrGLTexture* texture);
    45     void setProjectionMatrix(const SkMatrix& matrix,
    46                              const SkISize& renderTargetSize,
    47                              GrSurfaceOrigin renderTargetOrigin);
    48     enum TexGenComponents {
    49         kS_TexGenComponents = 1,
    50         kST_TexGenComponents = 2,
    51         kSTR_TexGenComponents = 3
    52     };
    53     void enableTexGen(int unitIdx, TexGenComponents, const GrGLfloat* coefficients);
    54     void enableTexGen(int unitIdx, TexGenComponents, const SkMatrix& matrix);
    55     void flushTexGenSettings(int numUsedTexCoordSets);
    56     bool shouldUseFixedFunctionTexturing() const {
    57         return this->glCaps().fixedFunctionSupport() &&
    58                this->glCaps().pathRenderingSupport();
    59     }
    61     bool programUnitTest(int maxStages);
    63     // GrGpu overrides
    64     virtual GrPixelConfig preferredReadPixelsConfig(GrPixelConfig readConfig,
    65                                                     GrPixelConfig surfaceConfig) const SK_OVERRIDE;
    66     virtual GrPixelConfig preferredWritePixelsConfig(GrPixelConfig writeConfig,
    67                                                      GrPixelConfig surfaceConfig) const SK_OVERRIDE;
    68     virtual bool canWriteTexturePixels(const GrTexture*, GrPixelConfig srcConfig) const SK_OVERRIDE;
    69     virtual bool readPixelsWillPayForYFlip(
    70                                     GrRenderTarget* renderTarget,
    71                                     int left, int top,
    72                                     int width, int height,
    73                                     GrPixelConfig config,
    74                                     size_t rowBytes) const SK_OVERRIDE;
    75     virtual bool fullReadPixelsIsFasterThanPartial() const SK_OVERRIDE;
    77     virtual void initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc) SK_OVERRIDE;
    79     virtual void abandonResources() SK_OVERRIDE;
    81     // These functions should be used to bind GL objects. They track the GL state and skip redundant
    82     // bindings. Making the equivalent glBind calls directly will confuse the state tracking.
    83     void bindVertexArray(GrGLuint id) {
    84         fHWGeometryState.setVertexArrayID(this, id);
    85     }
    86     void bindIndexBufferAndDefaultVertexArray(GrGLuint id) {
    87         fHWGeometryState.setIndexBufferIDOnDefaultVertexArray(this, id);
    88     }
    89     void bindVertexBuffer(GrGLuint id) {
    90         fHWGeometryState.setVertexBufferID(this, id);
    91     }
    93     // These callbacks update state tracking when GL objects are deleted. They are called from
    94     // GrGLResource onRelease functions.
    95     void notifyVertexArrayDelete(GrGLuint id) {
    96         fHWGeometryState.notifyVertexArrayDelete(id);
    97     }
    98     void notifyVertexBufferDelete(GrGLuint id) {
    99         fHWGeometryState.notifyVertexBufferDelete(id);
   100     }
   101     void notifyIndexBufferDelete(GrGLuint id) {
   102         fHWGeometryState.notifyIndexBufferDelete(id);
   103     }
   104     void notifyTextureDelete(GrGLTexture* texture);
   105     void notifyRenderTargetDelete(GrRenderTarget* renderTarget);
   107 protected:
   108     virtual bool onCopySurface(GrSurface* dst,
   109                                GrSurface* src,
   110                                const SkIRect& srcRect,
   111                                const SkIPoint& dstPoint) SK_OVERRIDE;
   113     virtual bool onCanCopySurface(GrSurface* dst,
   114                                   GrSurface* src,
   115                                   const SkIRect& srcRect,
   116                                   const SkIPoint& dstPoint) SK_OVERRIDE;
   118 private:
   119     // GrGpu overrides
   120     virtual void onResetContext(uint32_t resetBits) SK_OVERRIDE;
   122     virtual GrTexture* onCreateTexture(const GrTextureDesc& desc,
   123                                        const void* srcData,
   124                                        size_t rowBytes) SK_OVERRIDE;
   125     virtual GrVertexBuffer* onCreateVertexBuffer(size_t size, bool dynamic) SK_OVERRIDE;
   126     virtual GrIndexBuffer* onCreateIndexBuffer(size_t size, bool dynamic) SK_OVERRIDE;
   127     virtual GrPath* onCreatePath(const SkPath&, const SkStrokeRec&) SK_OVERRIDE;
   128     virtual GrTexture* onWrapBackendTexture(const GrBackendTextureDesc&) SK_OVERRIDE;
   129     virtual GrRenderTarget* onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&) SK_OVERRIDE;
   130     virtual bool createStencilBufferForRenderTarget(GrRenderTarget* rt,
   131                                                     int width,
   132                                                     int height) SK_OVERRIDE;
   133     virtual bool attachStencilBufferToRenderTarget(
   134         GrStencilBuffer* sb,
   135         GrRenderTarget* rt) SK_OVERRIDE;
   137     virtual void onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect) SK_OVERRIDE;
   139     virtual void onForceRenderTargetFlush() SK_OVERRIDE;
   141     virtual bool onReadPixels(GrRenderTarget* target,
   142                               int left, int top,
   143                               int width, int height,
   144                               GrPixelConfig,
   145                               void* buffer,
   146                               size_t rowBytes) SK_OVERRIDE;
   148     virtual bool onWriteTexturePixels(GrTexture* texture,
   149                                       int left, int top, int width, int height,
   150                                       GrPixelConfig config, const void* buffer,
   151                                       size_t rowBytes) SK_OVERRIDE;
   153     virtual void onResolveRenderTarget(GrRenderTarget* target) SK_OVERRIDE;
   155     virtual void onGpuDraw(const DrawInfo&) SK_OVERRIDE;
   157     virtual void onGpuStencilPath(const GrPath*, SkPath::FillType) SK_OVERRIDE;
   158     virtual void onGpuDrawPath(const GrPath*, SkPath::FillType) SK_OVERRIDE;
   160     virtual void clearStencil() SK_OVERRIDE;
   161     virtual void clearStencilClip(const SkIRect& rect,
   162                                   bool insideClip) SK_OVERRIDE;
   163     virtual bool flushGraphicsState(DrawType, const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE;
   165     // GrDrawTarget ovverides
   166     virtual void onInstantGpuTraceEvent(const char* marker) SK_OVERRIDE;
   167     virtual void onPushGpuTraceEvent(const char* marker) SK_OVERRIDE;
   168     virtual void onPopGpuTraceEvent() SK_OVERRIDE;
   171     // binds texture unit in GL
   172     void setTextureUnit(int unitIdx);
   174     // Sets up vertex attribute pointers and strides. On return indexOffsetInBytes gives the offset
   175     // an into the index buffer. It does not account for drawInfo.startIndex() but rather the start
   176     // index is relative to the returned offset.
   177     void setupGeometry(const DrawInfo& info, size_t* indexOffsetInBytes);
   179     // Subclasses should call this to flush the blend state.
   180     // The params should be the final coefficients to apply
   181     // (after any blending optimizations or dual source blending considerations
   182     // have been accounted for).
   183     void flushBlend(bool isLines, GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff);
   185     bool hasExtension(const char* ext) const { return fGLContext.hasExtension(ext); }
   187     static bool BlendCoeffReferencesConstant(GrBlendCoeff coeff);
   189     class ProgramCache : public ::SkNoncopyable {
   190     public:
   191         ProgramCache(GrGpuGL* gpu);
   192         ~ProgramCache();
   194         void abandon();
   195         GrGLProgram* getProgram(const GrGLProgramDesc& desc,
   196                                 const GrEffectStage* colorStages[],
   197                                 const GrEffectStage* coverageStages[]);
   199     private:
   200         enum {
   201             // We may actually have kMaxEntries+1 shaders in the GL context because we create a new
   202             // shader before evicting from the cache.
   203             kMaxEntries = 32,
   204             kHashBits = 6,
   205         };
   207         struct Entry;
   209         struct ProgDescLess;
   211         // binary search for entry matching desc. returns index into fEntries that matches desc or ~
   212         // of the index of where it should be inserted.
   213         int search(const GrGLProgramDesc& desc) const;
   215         // sorted array of all the entries
   216         Entry*                      fEntries[kMaxEntries];
   217         // hash table based on lowest kHashBits bits of the program key. Used to avoid binary
   218         // searching fEntries.
   219         Entry*                      fHashTable[1 << kHashBits];
   221         int                         fCount;
   222         unsigned int                fCurrLRUStamp;
   223         GrGpuGL*                    fGpu;
   224 #ifdef PROGRAM_CACHE_STATS
   225         int                         fTotalRequests;
   226         int                         fCacheMisses;
   227         int                         fHashMisses; // cache hit but hash table missed
   228 #endif
   229     };
   231     // flushes dithering, color-mask, and face culling stat
   232     void flushMiscFixedFunctionState();
   234     // flushes the scissor. see the note on flushBoundTextureAndParams about
   235     // flushing the scissor after that function is called.
   236     void flushScissor();
   238     void initFSAASupport();
   240     // determines valid stencil formats
   241     void initStencilFormats();
   243     // sets a texture unit to use for texture operations other than binding a texture to a program.
   244     // ensures that such operations don't negatively interact with tracking bound textures.
   245     void setScratchTextureUnit();
   247     // bound is region that may be modified and therefore has to be resolved.
   248     // NULL means whole target. Can be an empty rect.
   249     void flushRenderTarget(const SkIRect* bound);
   250     void flushStencil(DrawType);
   251     void flushAAState(DrawType);
   252     void flushPathStencilSettings(SkPath::FillType fill);
   254     bool configToGLFormats(GrPixelConfig config,
   255                            bool getSizedInternal,
   256                            GrGLenum* internalFormat,
   257                            GrGLenum* externalFormat,
   258                            GrGLenum* externalType);
   259     // helper for onCreateTexture and writeTexturePixels
   260     bool uploadTexData(const GrGLTexture::Desc& desc,
   261                        bool isNewTexture,
   262                        int left, int top, int width, int height,
   263                        GrPixelConfig dataConfig,
   264                        const void* data,
   265                        size_t rowBytes);
   267     bool createRenderTargetObjects(int width, int height,
   268                                    GrGLuint texID,
   269                                    GrGLRenderTarget::Desc* desc);
   271     GrGLContext fGLContext;
   273     // GL program-related state
   274     ProgramCache*               fProgramCache;
   275     SkAutoTUnref<GrGLProgram>   fCurrentProgram;
   277     ///////////////////////////////////////////////////////////////////////////
   278     ///@name Caching of GL State
   279     ///@{
   280     int                         fHWActiveTextureUnitIdx;
   281     GrGLuint                    fHWProgramID;
   283     GrGLProgram::SharedGLState  fSharedGLProgramState;
   285     enum TriState {
   286         kNo_TriState,
   287         kYes_TriState,
   288         kUnknown_TriState
   289     };
   291     // last scissor / viewport scissor state seen by the GL.
   292     struct {
   293         TriState    fEnabled;
   294         GrGLIRect   fRect;
   295         void invalidate() {
   296             fEnabled = kUnknown_TriState;
   297             fRect.invalidate();
   298         }
   299     } fHWScissorSettings;
   301     GrGLIRect   fHWViewport;
   303     /**
   304      * Tracks bound vertex and index buffers and vertex attrib array state.
   305      */
   306     class HWGeometryState {
   307     public:
   308         HWGeometryState() { fVBOVertexArray = NULL; this->invalidate(); }
   310         ~HWGeometryState() { SkSafeUnref(fVBOVertexArray); }
   312         void invalidate() {
   313             fBoundVertexArrayIDIsValid = false;
   314             fBoundVertexBufferIDIsValid = false;
   315             fDefaultVertexArrayBoundIndexBufferID = false;
   316             fDefaultVertexArrayBoundIndexBufferIDIsValid = false;
   317             fDefaultVertexArrayAttribState.invalidate();
   318             if (NULL != fVBOVertexArray) {
   319                 fVBOVertexArray->invalidateCachedState();
   320             }
   321         }
   323         void notifyVertexArrayDelete(GrGLuint id) {
   324             if (fBoundVertexArrayIDIsValid && fBoundVertexArrayID == id) {
   325                 // Does implicit bind to 0
   326                 fBoundVertexArrayID = 0;
   327             }
   328         }
   330         void setVertexArrayID(GrGpuGL* gpu, GrGLuint arrayID) {
   331             if (!gpu->glCaps().vertexArrayObjectSupport()) {
   332                 SkASSERT(0 == arrayID);
   333                 return;
   334             }
   335             if (!fBoundVertexArrayIDIsValid || arrayID != fBoundVertexArrayID) {
   336                 GR_GL_CALL(gpu->glInterface(), BindVertexArray(arrayID));
   337                 fBoundVertexArrayIDIsValid = true;
   338                 fBoundVertexArrayID = arrayID;
   339             }
   340         }
   342         void notifyVertexBufferDelete(GrGLuint id) {
   343             if (fBoundVertexBufferIDIsValid && id == fBoundVertexBufferID) {
   344                 fBoundVertexBufferID = 0;
   345             }
   346             if (NULL != fVBOVertexArray) {
   347                 fVBOVertexArray->notifyVertexBufferDelete(id);
   348             }
   349             fDefaultVertexArrayAttribState.notifyVertexBufferDelete(id);
   350         }
   352         void notifyIndexBufferDelete(GrGLuint id) {
   353             if (fDefaultVertexArrayBoundIndexBufferIDIsValid &&
   354                 id == fDefaultVertexArrayBoundIndexBufferID) {
   355                 fDefaultVertexArrayBoundIndexBufferID = 0;
   356             }
   357             if (NULL != fVBOVertexArray) {
   358                 fVBOVertexArray->notifyIndexBufferDelete(id);
   359             }
   360         }
   362         void setVertexBufferID(GrGpuGL* gpu, GrGLuint id) {
   363             if (!fBoundVertexBufferIDIsValid || id != fBoundVertexBufferID) {
   364                 GR_GL_CALL(gpu->glInterface(), BindBuffer(GR_GL_ARRAY_BUFFER, id));
   365                 fBoundVertexBufferIDIsValid = true;
   366                 fBoundVertexBufferID = id;
   367             }
   368         }
   370         /**
   371          * Binds the default vertex array and binds the index buffer. This is used when binding
   372          * an index buffer in order to update it.
   373          */
   374         void setIndexBufferIDOnDefaultVertexArray(GrGpuGL* gpu, GrGLuint id) {
   375             this->setVertexArrayID(gpu, 0);
   376             if (!fDefaultVertexArrayBoundIndexBufferIDIsValid ||
   377                 id != fDefaultVertexArrayBoundIndexBufferID) {
   378                 GR_GL_CALL(gpu->glInterface(), BindBuffer(GR_GL_ELEMENT_ARRAY_BUFFER, id));
   379                 fDefaultVertexArrayBoundIndexBufferIDIsValid = true;
   380                 fDefaultVertexArrayBoundIndexBufferID = id;
   381             }
   382         }
   384         /**
   385          * Binds the vertex array object that should be used to render from the vertex buffer.
   386          * The vertex array is bound and its attrib array state object is returned. The vertex
   387          * buffer is bound. The index buffer (if non-NULL) is bound to the vertex array. The
   388          * returned GrGLAttribArrayState should be used to set vertex attribute arrays.
   389          */
   390         GrGLAttribArrayState* bindArrayAndBuffersToDraw(GrGpuGL* gpu,
   391                                                         const GrGLVertexBuffer* vbuffer,
   392                                                         const GrGLIndexBuffer* ibuffer);
   394     private:
   395         GrGLuint                fBoundVertexArrayID;
   396         GrGLuint                fBoundVertexBufferID;
   397         bool                    fBoundVertexArrayIDIsValid;
   398         bool                    fBoundVertexBufferIDIsValid;
   400         GrGLuint                fDefaultVertexArrayBoundIndexBufferID;
   401         bool                    fDefaultVertexArrayBoundIndexBufferIDIsValid;
   402         // We return a non-const pointer to this from bindArrayAndBuffersToDraw when vertex array 0
   403         // is bound. However, this class is internal to GrGpuGL and this object never leaks out of
   404         // GrGpuGL.
   405         GrGLAttribArrayState    fDefaultVertexArrayAttribState;
   407         // This is used when we're using a core profile and the vertices are in a VBO.
   408         GrGLVertexArray*        fVBOVertexArray;
   409     } fHWGeometryState;
   411     struct {
   412         GrBlendCoeff    fSrcCoeff;
   413         GrBlendCoeff    fDstCoeff;
   414         GrColor         fConstColor;
   415         bool            fConstColorValid;
   416         TriState        fEnabled;
   418         void invalidate() {
   419             fSrcCoeff = kInvalid_GrBlendCoeff;
   420             fDstCoeff = kInvalid_GrBlendCoeff;
   421             fConstColorValid = false;
   422             fEnabled = kUnknown_TriState;
   423         }
   424     } fHWBlendState;
   426     struct {
   427         TriState fMSAAEnabled;
   428         TriState fSmoothLineEnabled;
   429         void invalidate() {
   430             fMSAAEnabled = kUnknown_TriState;
   431             fSmoothLineEnabled = kUnknown_TriState;
   432         }
   433     } fHWAAState;
   436     GrGLProgram::MatrixState    fHWProjectionMatrixState;
   438     GrStencilSettings           fHWStencilSettings;
   439     TriState                    fHWStencilTestEnabled;
   440     GrStencilSettings           fHWPathStencilSettings;
   442     GrDrawState::DrawFace       fHWDrawFace;
   443     TriState                    fHWWriteToColor;
   444     TriState                    fHWDitherEnabled;
   445     GrRenderTarget*             fHWBoundRenderTarget;
   446     SkTArray<GrTexture*, true>  fHWBoundTextures;
   448     struct TexGenData {
   449         GrGLenum  fMode;
   450         GrGLint   fNumComponents;
   451         GrGLfloat fCoefficients[3 * 3];
   452     };
   453     int                         fHWActiveTexGenSets;
   454     SkTArray<TexGenData, true>  fHWTexGenSettings;
   455     ///@}
   457     // we record what stencil format worked last time to hopefully exit early
   458     // from our loop that tries stencil formats and calls check fb status.
   459     int fLastSuccessfulStencilFmtIdx;
   461     typedef GrGpu INHERITED;
   462 };
   464 #endif

mercurial