| Index: src/gpu/gl/GrGLGpu.h
|
| diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
|
| index c77076fc51fb6a8d14a675e464c87fb0ce683362..c2dda0a222be2ef16a73b1d8cd4fc1f5c4b6543c 100644
|
| --- a/src/gpu/gl/GrGLGpu.h
|
| +++ b/src/gpu/gl/GrGLGpu.h
|
| @@ -32,7 +32,7 @@ class GrSwizzle;
|
| #define PROGRAM_CACHE_STATS
|
| #endif
|
|
|
| -class GrGLGpu : public GrGpu {
|
| +class GrGLGpu final : public GrGpu {
|
| public:
|
| static GrGpu* Create(GrBackendContext backendContext, const GrContextOptions& options,
|
| GrContext* context);
|
| @@ -73,31 +73,20 @@ public:
|
| // 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);
|
| + fHWVertexArrayState.setVertexArrayID(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);
|
| + fHWVertexArrayState.notifyVertexArrayDelete(id);
|
| }
|
|
|
| - // id and type (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, etc.) of buffer to bind
|
| - void bindBuffer(GrGLuint id, GrGLenum type);
|
| -
|
| - void releaseBuffer(GrGLuint id, GrGLenum type);
|
| + // Binds a buffer to the GL target corresponding to 'type', updates internal state tracking, and
|
| + // returns the GL target the buffer was bound to.
|
| + // When 'type' is kIndex_GrBufferType, this function will also implicitly bind the default VAO.
|
| + // If the caller wishes to bind an index buffer to a specific VAO, it can call glBind directly.
|
| + GrGLenum bindBuffer(GrBufferType type, const GrGLBuffer*);
|
|
|
| const GrGLContext* glContextForTesting() const override {
|
| return &this->glContext();
|
| @@ -138,7 +127,7 @@ private:
|
| GrGpuResource::LifeCycle lifeCycle,
|
| const SkTArray<GrMipLevel>& texels) override;
|
|
|
| - GrBuffer* onCreateBuffer(GrBufferType, size_t size, GrAccessPattern) override;
|
| + GrBuffer* onCreateBuffer(size_t size, GrBufferType intendedType, GrAccessPattern) override;
|
| GrTexture* onWrapBackendTexture(const GrBackendTextureDesc&, GrWrapOwnership) override;
|
| GrRenderTarget* onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&,
|
| GrWrapOwnership) override;
|
| @@ -231,7 +220,7 @@ private:
|
|
|
| bool hasExtension(const char* ext) const { return fGLContext->hasExtension(ext); }
|
|
|
| - void copySurfaceAsDraw(GrSurface* dst,
|
| + bool copySurfaceAsDraw(GrSurface* dst,
|
| GrSurface* src,
|
| const SkIRect& srcRect,
|
| const SkIPoint& dstPoint);
|
| @@ -244,8 +233,7 @@ private:
|
| const SkIRect& srcRect,
|
| const SkIPoint& dstPoint);
|
|
|
| - void stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGLint posXformUniform,
|
| - GrGLuint arrayBuffer);
|
| + void stampPLSSetupRect(const SkRect& bounds);
|
|
|
| void setupPixelLocalStorage(const GrPipeline&, const GrPrimitiveProcessor&);
|
|
|
| @@ -373,11 +361,9 @@ private:
|
|
|
| SkAutoTUnref<GrGLContext> fGLContext;
|
|
|
| - void createCopyPrograms();
|
| - void createWireRectProgram();
|
| - void createUnitRectBuffer();
|
| -
|
| - void createPLSSetupProgram();
|
| + bool createCopyProgram(int progIdx);
|
| + bool createWireRectProgram();
|
| + bool createPLSSetupProgram();
|
|
|
| // GL program-related state
|
| ProgramCache* fProgramCache;
|
| @@ -412,22 +398,19 @@ private:
|
| GrGLIRect fHWViewport;
|
|
|
| /**
|
| - * Tracks bound vertex and index buffers and vertex attrib array state.
|
| + * Tracks vertex attrib array state.
|
| */
|
| - class HWGeometryState {
|
| + class HWVertexArrayState {
|
| public:
|
| - HWGeometryState() { fVBOVertexArray = nullptr; this->invalidate(); }
|
| + HWVertexArrayState() : fCoreProfileVertexArray(nullptr) { this->invalidate(); }
|
|
|
| - ~HWGeometryState() { delete fVBOVertexArray; }
|
| + ~HWVertexArrayState() { delete fCoreProfileVertexArray; }
|
|
|
| void invalidate() {
|
| fBoundVertexArrayIDIsValid = false;
|
| - fBoundVertexBufferIDIsValid = false;
|
| - fDefaultVertexArrayBoundIndexBufferID = false;
|
| - fDefaultVertexArrayBoundIndexBufferIDIsValid = false;
|
| fDefaultVertexArrayAttribState.invalidate();
|
| - if (fVBOVertexArray) {
|
| - fVBOVertexArray->invalidateCachedState();
|
| + if (fCoreProfileVertexArray) {
|
| + fCoreProfileVertexArray->invalidateCachedState();
|
| }
|
| }
|
|
|
| @@ -450,89 +433,41 @@ private:
|
| }
|
| }
|
|
|
| - 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-nullptr) is bound to the vertex array. The
|
| - * returned GrGLAttribArrayState should be used to set vertex attribute arrays.
|
| + * Binds the vertex array that should be used for internal draws, and returns its attrib
|
| + * state. This binds the default VAO (ID=zero) unless we are on a core profile, in which
|
| + * case we use a dummy array instead.
|
| + *
|
| + * If an index buffer is privided, it will be bound to the vertex array. Otherwise the
|
| + * index buffer binding will be left unchanged.
|
| + *
|
| + * The returned GrGLAttribArrayState should be used to set vertex attribute arrays.
|
| */
|
| - GrGLAttribArrayState* bindArrayAndBuffersToDraw(GrGLGpu* gpu,
|
| - const GrGLBuffer* vbuffer,
|
| - const GrGLBuffer* ibuffer);
|
| -
|
| - /** Variants of the above that takes GL buffer IDs. Note that 0 does not imply that a
|
| - buffer won't be bound. The "default buffer" will be bound, which is used for client-side
|
| - array rendering. */
|
| - GrGLAttribArrayState* bindArrayAndBufferToDraw(GrGLGpu* gpu, GrGLuint vbufferID);
|
| - GrGLAttribArrayState* bindArrayAndBuffersToDraw(GrGLGpu* gpu,
|
| - GrGLuint vbufferID,
|
| - GrGLuint ibufferID);
|
| + GrGLAttribArrayState* bindInternalVertexArray(GrGLGpu*, const GrGLBuffer* ibuff = nullptr);
|
|
|
| private:
|
| - GrGLAttribArrayState* internalBind(GrGLGpu* gpu, GrGLuint vbufferID, GrGLuint* ibufferID);
|
| -
|
| 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 GrGLGpu and this object never leaks out of
|
| // GrGLGpu.
|
| GrGLAttribArrayState fDefaultVertexArrayAttribState;
|
|
|
| - // This is used when we're using a core profile and the vertices are in a VBO.
|
| - GrGLVertexArray* fVBOVertexArray;
|
| - } fHWGeometryState;
|
| + // This is used when we're using a core profile.
|
| + GrGLVertexArray* fCoreProfileVertexArray;
|
| + } fHWVertexArrayState;
|
|
|
| - GrGLuint fHWBoundTextureBufferID;
|
| - GrGLuint fHWBoundDrawIndirectBufferID;
|
| - bool fHWBoundTextureBufferIDIsValid;
|
| - bool fHWBoundDrawIndirectBufferIDIsValid;
|
| + struct {
|
| + GrGLenum fGLTarget;
|
| + uint32_t fBoundBufferUniqueID;
|
| + bool fBufferZeroKnownBound;
|
| +
|
| + void invalidate() {
|
| + fBoundBufferUniqueID = SK_InvalidUniqueID;
|
| + fBufferZeroKnownBound = false;
|
| + }
|
| + } fHWBufferState[kGrBufferTypeCount];
|
|
|
| struct {
|
| GrBlendEquation fEquation;
|
| @@ -575,14 +510,14 @@ private:
|
| GrGLint fTexCoordXformUniform;
|
| GrGLint fPosXformUniform;
|
| } fCopyPrograms[3];
|
| - GrGLuint fCopyProgramArrayBuffer;
|
| + SkAutoTUnref<GrGLBuffer> fCopyProgramArrayBuffer;
|
|
|
| struct {
|
| GrGLuint fProgram;
|
| GrGLint fColorUniform;
|
| GrGLint fRectUniform;
|
| } fWireRectProgram;
|
| - GrGLuint fWireRectArrayBuffer;
|
| + SkAutoTUnref<GrGLBuffer> fWireRectArrayBuffer;
|
|
|
| static int TextureTargetToCopyProgramIdx(GrGLenum target) {
|
| switch (target) {
|
| @@ -599,9 +534,9 @@ private:
|
| }
|
|
|
| struct {
|
| - GrGLuint fProgram;
|
| - GrGLint fPosXformUniform;
|
| - GrGLuint fArrayBuffer;
|
| + GrGLuint fProgram;
|
| + GrGLint fPosXformUniform;
|
| + SkAutoTUnref<GrGLBuffer> fArrayBuffer;
|
| } fPLSSetupProgram;
|
|
|
| bool fHWPLSEnabled;
|
|
|