| Index: src/gpu/gl/GrGpuGL.h
|
| diff --git a/src/gpu/gl/GrGpuGL.h b/src/gpu/gl/GrGpuGL.h
|
| deleted file mode 100644
|
| index d2a0d9a9ea7ac88b8d48cbd7c98e094940732d16..0000000000000000000000000000000000000000
|
| --- a/src/gpu/gl/GrGpuGL.h
|
| +++ /dev/null
|
| @@ -1,460 +0,0 @@
|
| -/*
|
| - * Copyright 2011 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#ifndef GrGpuGL_DEFINED
|
| -#define GrGpuGL_DEFINED
|
| -
|
| -#include "GrDrawState.h"
|
| -#include "GrGLContext.h"
|
| -#include "GrGLIRect.h"
|
| -#include "GrGLIndexBuffer.h"
|
| -#include "GrGLPathRendering.h"
|
| -#include "GrGLProgram.h"
|
| -#include "GrGLRenderTarget.h"
|
| -#include "GrGLStencilBuffer.h"
|
| -#include "GrGLTexture.h"
|
| -#include "GrGLVertexArray.h"
|
| -#include "GrGLVertexBuffer.h"
|
| -#include "GrGpu.h"
|
| -#include "GrOptDrawState.h"
|
| -#include "GrXferProcessor.h"
|
| -#include "SkTypes.h"
|
| -
|
| -#ifdef SK_DEVELOPER
|
| -#define PROGRAM_CACHE_STATS
|
| -#endif
|
| -
|
| -class GrGLGpu : public GrGpu {
|
| -public:
|
| - GrGLGpu(const GrGLContext& ctx, GrContext* context);
|
| - ~GrGLGpu() SK_OVERRIDE;
|
| -
|
| - void contextAbandoned() SK_OVERRIDE;
|
| -
|
| - const GrGLContext& glContext() const { return fGLContext; }
|
| -
|
| - const GrGLInterface* glInterface() const { return fGLContext.interface(); }
|
| - const GrGLContextInfo& ctxInfo() const { return fGLContext; }
|
| - GrGLStandard glStandard() const { return fGLContext.standard(); }
|
| - GrGLVersion glVersion() const { return fGLContext.version(); }
|
| - GrGLSLGeneration glslGeneration() const { return fGLContext.glslGeneration(); }
|
| - const GrGLCaps& glCaps() const { return *fGLContext.caps(); }
|
| -
|
| - GrGLPathRendering* glPathRendering() {
|
| - SkASSERT(glCaps().pathRenderingSupport());
|
| - return static_cast<GrGLPathRendering*>(pathRendering());
|
| - }
|
| -
|
| - void discard(GrRenderTarget*) SK_OVERRIDE;
|
| -
|
| - // Used by GrGLProgram and GrGLPathTexGenProgramEffects to configure OpenGL
|
| - // state.
|
| - void bindTexture(int unitIdx, const GrTextureParams& params, GrGLTexture* texture);
|
| -
|
| - // GrGpu overrides
|
| - GrPixelConfig preferredReadPixelsConfig(GrPixelConfig readConfig,
|
| - GrPixelConfig surfaceConfig) const SK_OVERRIDE;
|
| - GrPixelConfig preferredWritePixelsConfig(GrPixelConfig writeConfig,
|
| - GrPixelConfig surfaceConfig) const SK_OVERRIDE;
|
| - bool canWriteTexturePixels(const GrTexture*, GrPixelConfig srcConfig) const SK_OVERRIDE;
|
| - bool readPixelsWillPayForYFlip(GrRenderTarget* renderTarget,
|
| - int left, int top,
|
| - int width, int height,
|
| - GrPixelConfig config,
|
| - size_t rowBytes) const SK_OVERRIDE;
|
| - bool fullReadPixelsIsFasterThanPartial() const SK_OVERRIDE;
|
| -
|
| - bool initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc) SK_OVERRIDE;
|
| -
|
| - // These functions should be used to bind GL objects. They track the GL state and skip redundant
|
| - // bindings. Making the equivalent glBind calls directly will confuse the state tracking.
|
| - void bindVertexArray(GrGLuint id) {
|
| - fHWGeometryState.setVertexArrayID(this, id);
|
| - }
|
| - void bindIndexBufferAndDefaultVertexArray(GrGLuint id) {
|
| - fHWGeometryState.setIndexBufferIDOnDefaultVertexArray(this, id);
|
| - }
|
| - void bindVertexBuffer(GrGLuint id) {
|
| - fHWGeometryState.setVertexBufferID(this, id);
|
| - }
|
| -
|
| - // These callbacks update state tracking when GL objects are deleted. They are called from
|
| - // GrGLResource onRelease functions.
|
| - void notifyVertexArrayDelete(GrGLuint id) {
|
| - fHWGeometryState.notifyVertexArrayDelete(id);
|
| - }
|
| - void notifyVertexBufferDelete(GrGLuint id) {
|
| - fHWGeometryState.notifyVertexBufferDelete(id);
|
| - }
|
| - void notifyIndexBufferDelete(GrGLuint id) {
|
| - fHWGeometryState.notifyIndexBufferDelete(id);
|
| - }
|
| -
|
| - bool copySurface(GrSurface* dst,
|
| - GrSurface* src,
|
| - const SkIRect& srcRect,
|
| - const SkIPoint& dstPoint) SK_OVERRIDE;
|
| -
|
| - bool canCopySurface(const GrSurface* dst,
|
| - const GrSurface* src,
|
| - const SkIRect& srcRect,
|
| - const SkIPoint& dstPoint) SK_OVERRIDE;
|
| -
|
| -protected:
|
| - void buildProgramDesc(const GrOptDrawState&,
|
| - const GrProgramDesc::DescInfo&,
|
| - GrGpu::DrawType,
|
| - GrProgramDesc*) SK_OVERRIDE;
|
| -
|
| -private:
|
| - // GrGpu overrides
|
| - void onResetContext(uint32_t resetBits) SK_OVERRIDE;
|
| -
|
| - GrTexture* onCreateTexture(const GrSurfaceDesc& desc,
|
| - const void* srcData,
|
| - size_t rowBytes) SK_OVERRIDE;
|
| - GrTexture* onCreateCompressedTexture(const GrSurfaceDesc& desc,
|
| - const void* srcData) SK_OVERRIDE;
|
| - GrVertexBuffer* onCreateVertexBuffer(size_t size, bool dynamic) SK_OVERRIDE;
|
| - GrIndexBuffer* onCreateIndexBuffer(size_t size, bool dynamic) SK_OVERRIDE;
|
| - GrTexture* onWrapBackendTexture(const GrBackendTextureDesc&) SK_OVERRIDE;
|
| - GrRenderTarget* onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&) SK_OVERRIDE;
|
| - bool createStencilBufferForRenderTarget(GrRenderTarget* rt,
|
| - int width, int height) SK_OVERRIDE;
|
| - bool attachStencilBufferToRenderTarget(GrStencilBuffer* sb, GrRenderTarget* rt) SK_OVERRIDE;
|
| -
|
| - void onClear(GrRenderTarget*, const SkIRect* rect, GrColor color,
|
| - bool canIgnoreRect) SK_OVERRIDE;
|
| -
|
| - void onClearStencilClip(GrRenderTarget*, const SkIRect& rect, bool insideClip) SK_OVERRIDE;
|
| -
|
| - bool onReadPixels(GrRenderTarget* target,
|
| - int left, int top,
|
| - int width, int height,
|
| - GrPixelConfig,
|
| - void* buffer,
|
| - size_t rowBytes) SK_OVERRIDE;
|
| -
|
| - bool onWriteTexturePixels(GrTexture* texture,
|
| - int left, int top, int width, int height,
|
| - GrPixelConfig config, const void* buffer,
|
| - size_t rowBytes) SK_OVERRIDE;
|
| -
|
| - void onResolveRenderTarget(GrRenderTarget* target) SK_OVERRIDE;
|
| -
|
| - void onDraw(const GrOptDrawState&, const GrDrawTarget::DrawInfo&) SK_OVERRIDE;
|
| - void onStencilPath(const GrPath*, const StencilPathState&) SK_OVERRIDE;
|
| - void onDrawPath(const GrOptDrawState&, const GrPath*, const GrStencilSettings&) SK_OVERRIDE;
|
| - void onDrawPaths(const GrOptDrawState&,
|
| - const GrPathRange*,
|
| - const void* indices,
|
| - GrDrawTarget::PathIndexType,
|
| - const float transformValues[],
|
| - GrDrawTarget::PathTransformType,
|
| - int count,
|
| - const GrStencilSettings&) SK_OVERRIDE;
|
| -
|
| - void clearStencil(GrRenderTarget*) SK_OVERRIDE;
|
| -
|
| - // GrDrawTarget overrides
|
| - void didAddGpuTraceMarker() SK_OVERRIDE;
|
| - void didRemoveGpuTraceMarker() SK_OVERRIDE;
|
| -
|
| - // binds texture unit in GL
|
| - void setTextureUnit(int unitIdx);
|
| -
|
| - // Flushes state from GrOptDrawState to GL. Returns false if the state couldn't be set.
|
| - bool flushGLState(const GrOptDrawState&);
|
| -
|
| - // Sets up vertex attribute pointers and strides. On return indexOffsetInBytes gives the offset
|
| - // an into the index buffer. It does not account for drawInfo.startIndex() but rather the start
|
| - // index is relative to the returned offset.
|
| - void setupGeometry(const GrOptDrawState&,
|
| - const GrDrawTarget::DrawInfo& info,
|
| - size_t* indexOffsetInBytes);
|
| -
|
| - // Subclasses should call this to flush the blend state.
|
| - void flushBlend(const GrXferProcessor::BlendInfo& blendInfo);
|
| -
|
| - bool hasExtension(const char* ext) const { return fGLContext.hasExtension(ext); }
|
| -
|
| - static bool BlendCoeffReferencesConstant(GrBlendCoeff coeff);
|
| -
|
| - class ProgramCache : public ::SkNoncopyable {
|
| - public:
|
| - ProgramCache(GrGLGpu* gpu);
|
| - ~ProgramCache();
|
| -
|
| - void abandon();
|
| - GrGLProgram* getProgram(const GrOptDrawState&);
|
| -
|
| - private:
|
| - enum {
|
| - // We may actually have kMaxEntries+1 shaders in the GL context because we create a new
|
| - // shader before evicting from the cache.
|
| - kMaxEntries = 128,
|
| - kHashBits = 6,
|
| - };
|
| -
|
| - struct Entry;
|
| -
|
| - struct ProgDescLess;
|
| -
|
| - // binary search for entry matching desc. returns index into fEntries that matches desc or ~
|
| - // of the index of where it should be inserted.
|
| - int search(const GrProgramDesc& desc) const;
|
| -
|
| - // sorted array of all the entries
|
| - Entry* fEntries[kMaxEntries];
|
| - // hash table based on lowest kHashBits bits of the program key. Used to avoid binary
|
| - // searching fEntries.
|
| - Entry* fHashTable[1 << kHashBits];
|
| -
|
| - int fCount;
|
| - unsigned int fCurrLRUStamp;
|
| - GrGLGpu* fGpu;
|
| -#ifdef PROGRAM_CACHE_STATS
|
| - int fTotalRequests;
|
| - int fCacheMisses;
|
| - int fHashMisses; // cache hit but hash table missed
|
| -#endif
|
| - };
|
| -
|
| - void flushDither(bool dither);
|
| - void flushColorWrite(bool writeColor);
|
| - void flushDrawFace(GrDrawState::DrawFace face);
|
| -
|
| - // flushes the scissor. see the note on flushBoundTextureAndParams about
|
| - // flushing the scissor after that function is called.
|
| - void flushScissor(const GrScissorState&,
|
| - const GrGLIRect& rtViewport,
|
| - GrSurfaceOrigin rtOrigin);
|
| -
|
| - // disables the scissor
|
| - void disableScissor();
|
| -
|
| - void initFSAASupport();
|
| -
|
| - // determines valid stencil formats
|
| - void initStencilFormats();
|
| -
|
| - // sets a texture unit to use for texture operations other than binding a texture to a program.
|
| - // ensures that such operations don't negatively interact with tracking bound textures.
|
| - void setScratchTextureUnit();
|
| -
|
| - // bounds is region that may be modified and therefore has to be resolved.
|
| - // NULL means whole target. Can be an empty rect.
|
| - void flushRenderTarget(GrGLRenderTarget*, const SkIRect* bounds);
|
| -
|
| - void flushStencil(const GrStencilSettings&);
|
| - void flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool isLineDraw);
|
| -
|
| - bool configToGLFormats(GrPixelConfig config,
|
| - bool getSizedInternal,
|
| - GrGLenum* internalFormat,
|
| - GrGLenum* externalFormat,
|
| - GrGLenum* externalType);
|
| - // helper for onCreateTexture and writeTexturePixels
|
| - bool uploadTexData(const GrSurfaceDesc& desc,
|
| - bool isNewTexture,
|
| - int left, int top, int width, int height,
|
| - GrPixelConfig dataConfig,
|
| - const void* data,
|
| - size_t rowBytes);
|
| -
|
| - // helper for onCreateCompressedTexture. If width and height are
|
| - // set to -1, then this function will use desc.fWidth and desc.fHeight
|
| - // for the size of the data. The isNewTexture flag should be set to true
|
| - // whenever a new texture needs to be created. Otherwise, we assume that
|
| - // the texture is already in GPU memory and that it's going to be updated
|
| - // with new data.
|
| - bool uploadCompressedTexData(const GrSurfaceDesc& desc,
|
| - const void* data,
|
| - bool isNewTexture = true,
|
| - int left = 0, int top = 0,
|
| - int width = -1, int height = -1);
|
| -
|
| - bool createRenderTargetObjects(const GrSurfaceDesc&, GrGLuint texID, GrGLRenderTarget::IDDesc*);
|
| -
|
| - GrGLuint bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLIRect* viewport);
|
| -
|
| - GrGLContext fGLContext;
|
| -
|
| - // GL program-related state
|
| - ProgramCache* fProgramCache;
|
| - SkAutoTUnref<GrGLProgram> fCurrentProgram;
|
| -
|
| - ///////////////////////////////////////////////////////////////////////////
|
| - ///@name Caching of GL State
|
| - ///@{
|
| - int fHWActiveTextureUnitIdx;
|
| - GrGLuint fHWProgramID;
|
| -
|
| - enum TriState {
|
| - kNo_TriState,
|
| - kYes_TriState,
|
| - kUnknown_TriState
|
| - };
|
| -
|
| - // last scissor / viewport scissor state seen by the GL.
|
| - struct {
|
| - TriState fEnabled;
|
| - GrGLIRect fRect;
|
| - void invalidate() {
|
| - fEnabled = kUnknown_TriState;
|
| - fRect.invalidate();
|
| - }
|
| - } fHWScissorSettings;
|
| -
|
| - GrGLIRect fHWViewport;
|
| -
|
| - /**
|
| - * Tracks bound vertex and index buffers and vertex attrib array state.
|
| - */
|
| - class HWGeometryState {
|
| - public:
|
| - HWGeometryState() { fVBOVertexArray = NULL; this->invalidate(); }
|
| -
|
| - ~HWGeometryState() { SkSafeUnref(fVBOVertexArray); }
|
| -
|
| - void invalidate() {
|
| - fBoundVertexArrayIDIsValid = false;
|
| - fBoundVertexBufferIDIsValid = false;
|
| - fDefaultVertexArrayBoundIndexBufferID = false;
|
| - fDefaultVertexArrayBoundIndexBufferIDIsValid = false;
|
| - fDefaultVertexArrayAttribState.invalidate();
|
| - if (fVBOVertexArray) {
|
| - fVBOVertexArray->invalidateCachedState();
|
| - }
|
| - }
|
| -
|
| - void notifyVertexArrayDelete(GrGLuint id) {
|
| - if (fBoundVertexArrayIDIsValid && fBoundVertexArrayID == id) {
|
| - // Does implicit bind to 0
|
| - fBoundVertexArrayID = 0;
|
| - }
|
| - }
|
| -
|
| - void setVertexArrayID(GrGLGpu* gpu, GrGLuint arrayID) {
|
| - if (!gpu->glCaps().vertexArrayObjectSupport()) {
|
| - SkASSERT(0 == arrayID);
|
| - return;
|
| - }
|
| - if (!fBoundVertexArrayIDIsValid || arrayID != fBoundVertexArrayID) {
|
| - GR_GL_CALL(gpu->glInterface(), BindVertexArray(arrayID));
|
| - fBoundVertexArrayIDIsValid = true;
|
| - fBoundVertexArrayID = arrayID;
|
| - }
|
| - }
|
| -
|
| - void notifyVertexBufferDelete(GrGLuint id) {
|
| - if (fBoundVertexBufferIDIsValid && id == fBoundVertexBufferID) {
|
| - fBoundVertexBufferID = 0;
|
| - }
|
| - if (fVBOVertexArray) {
|
| - fVBOVertexArray->notifyVertexBufferDelete(id);
|
| - }
|
| - fDefaultVertexArrayAttribState.notifyVertexBufferDelete(id);
|
| - }
|
| -
|
| - void notifyIndexBufferDelete(GrGLuint id) {
|
| - if (fDefaultVertexArrayBoundIndexBufferIDIsValid &&
|
| - id == fDefaultVertexArrayBoundIndexBufferID) {
|
| - fDefaultVertexArrayBoundIndexBufferID = 0;
|
| - }
|
| - if (fVBOVertexArray) {
|
| - fVBOVertexArray->notifyIndexBufferDelete(id);
|
| - }
|
| - }
|
| -
|
| - void setVertexBufferID(GrGLGpu* gpu, GrGLuint id) {
|
| - if (!fBoundVertexBufferIDIsValid || id != fBoundVertexBufferID) {
|
| - GR_GL_CALL(gpu->glInterface(), BindBuffer(GR_GL_ARRAY_BUFFER, id));
|
| - fBoundVertexBufferIDIsValid = true;
|
| - fBoundVertexBufferID = id;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Binds the default vertex array and binds the index buffer. This is used when binding
|
| - * an index buffer in order to update it.
|
| - */
|
| - void setIndexBufferIDOnDefaultVertexArray(GrGLGpu* gpu, GrGLuint id) {
|
| - this->setVertexArrayID(gpu, 0);
|
| - if (!fDefaultVertexArrayBoundIndexBufferIDIsValid ||
|
| - id != fDefaultVertexArrayBoundIndexBufferID) {
|
| - GR_GL_CALL(gpu->glInterface(), BindBuffer(GR_GL_ELEMENT_ARRAY_BUFFER, id));
|
| - fDefaultVertexArrayBoundIndexBufferIDIsValid = true;
|
| - fDefaultVertexArrayBoundIndexBufferID = id;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Binds the vertex array object that should be used to render from the vertex buffer.
|
| - * The vertex array is bound and its attrib array state object is returned. The vertex
|
| - * buffer is bound. The index buffer (if non-NULL) is bound to the vertex array. The
|
| - * returned GrGLAttribArrayState should be used to set vertex attribute arrays.
|
| - */
|
| - GrGLAttribArrayState* bindArrayAndBuffersToDraw(GrGLGpu* gpu,
|
| - const GrGLVertexBuffer* vbuffer,
|
| - const GrGLIndexBuffer* ibuffer);
|
| -
|
| - private:
|
| - GrGLuint fBoundVertexArrayID;
|
| - GrGLuint fBoundVertexBufferID;
|
| - bool fBoundVertexArrayIDIsValid;
|
| - bool fBoundVertexBufferIDIsValid;
|
| -
|
| - GrGLuint fDefaultVertexArrayBoundIndexBufferID;
|
| - bool fDefaultVertexArrayBoundIndexBufferIDIsValid;
|
| - // We return a non-const pointer to this from bindArrayAndBuffersToDraw when vertex array 0
|
| - // is bound. However, this class is internal to GrGpuGL and this object never leaks out of
|
| - // GrGpuGL.
|
| - GrGLAttribArrayState fDefaultVertexArrayAttribState;
|
| -
|
| - // This is used when we're using a core profile and the vertices are in a VBO.
|
| - GrGLVertexArray* fVBOVertexArray;
|
| - } fHWGeometryState;
|
| -
|
| - struct {
|
| - GrBlendCoeff fSrcCoeff;
|
| - GrBlendCoeff fDstCoeff;
|
| - GrColor fConstColor;
|
| - bool fConstColorValid;
|
| - TriState fEnabled;
|
| -
|
| - void invalidate() {
|
| - fSrcCoeff = kInvalid_GrBlendCoeff;
|
| - fDstCoeff = kInvalid_GrBlendCoeff;
|
| - fConstColorValid = false;
|
| - fEnabled = kUnknown_TriState;
|
| - }
|
| - } fHWBlendState;
|
| -
|
| - TriState fMSAAEnabled;
|
| -
|
| - GrStencilSettings fHWStencilSettings;
|
| - TriState fHWStencilTestEnabled;
|
| -
|
| -
|
| - GrDrawState::DrawFace fHWDrawFace;
|
| - TriState fHWWriteToColor;
|
| - TriState fHWDitherEnabled;
|
| - uint32_t fHWBoundRenderTargetUniqueID;
|
| - SkTArray<uint32_t, true> fHWBoundTextureUniqueIDs;
|
| -
|
| - ///@}
|
| -
|
| - // we record what stencil format worked last time to hopefully exit early
|
| - // from our loop that tries stencil formats and calls check fb status.
|
| - int fLastSuccessfulStencilFmtIdx;
|
| -
|
| - typedef GrGpu INHERITED;
|
| - friend class GrGLPathRendering; // For accessing setTextureUnit.
|
| -};
|
| -
|
| -#endif
|
|
|