Index: src/gpu/gl/GrGLGpu.h |
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h |
index c2dda0a222be2ef16a73b1d8cd4fc1f5c4b6543c..c77076fc51fb6a8d14a675e464c87fb0ce683362 100644 |
--- a/src/gpu/gl/GrGLGpu.h |
+++ b/src/gpu/gl/GrGLGpu.h |
@@ -32,7 +32,7 @@ |
#define PROGRAM_CACHE_STATS |
#endif |
-class GrGLGpu final : public GrGpu { |
+class GrGLGpu : public GrGpu { |
public: |
static GrGpu* Create(GrBackendContext backendContext, const GrContextOptions& options, |
GrContext* context); |
@@ -73,20 +73,31 @@ |
// 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) { |
- fHWVertexArrayState.setVertexArrayID(this, 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) { |
- fHWVertexArrayState.notifyVertexArrayDelete(id); |
- } |
- |
- // 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*); |
+ fHWGeometryState.notifyVertexArrayDelete(id); |
+ } |
+ void notifyVertexBufferDelete(GrGLuint id) { |
+ fHWGeometryState.notifyVertexBufferDelete(id); |
+ } |
+ void notifyIndexBufferDelete(GrGLuint id) { |
+ fHWGeometryState.notifyIndexBufferDelete(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); |
const GrGLContext* glContextForTesting() const override { |
return &this->glContext(); |
@@ -127,7 +138,7 @@ |
GrGpuResource::LifeCycle lifeCycle, |
const SkTArray<GrMipLevel>& texels) override; |
- GrBuffer* onCreateBuffer(size_t size, GrBufferType intendedType, GrAccessPattern) override; |
+ GrBuffer* onCreateBuffer(GrBufferType, size_t size, GrAccessPattern) override; |
GrTexture* onWrapBackendTexture(const GrBackendTextureDesc&, GrWrapOwnership) override; |
GrRenderTarget* onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&, |
GrWrapOwnership) override; |
@@ -220,7 +231,7 @@ |
bool hasExtension(const char* ext) const { return fGLContext->hasExtension(ext); } |
- bool copySurfaceAsDraw(GrSurface* dst, |
+ void copySurfaceAsDraw(GrSurface* dst, |
GrSurface* src, |
const SkIRect& srcRect, |
const SkIPoint& dstPoint); |
@@ -233,7 +244,8 @@ |
const SkIRect& srcRect, |
const SkIPoint& dstPoint); |
- void stampPLSSetupRect(const SkRect& bounds); |
+ void stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGLint posXformUniform, |
+ GrGLuint arrayBuffer); |
void setupPixelLocalStorage(const GrPipeline&, const GrPrimitiveProcessor&); |
@@ -361,9 +373,11 @@ |
SkAutoTUnref<GrGLContext> fGLContext; |
- bool createCopyProgram(int progIdx); |
- bool createWireRectProgram(); |
- bool createPLSSetupProgram(); |
+ void createCopyPrograms(); |
+ void createWireRectProgram(); |
+ void createUnitRectBuffer(); |
+ |
+ void createPLSSetupProgram(); |
// GL program-related state |
ProgramCache* fProgramCache; |
@@ -398,19 +412,22 @@ |
GrGLIRect fHWViewport; |
/** |
- * Tracks vertex attrib array state. |
+ * Tracks bound vertex and index buffers and vertex attrib array state. |
*/ |
- class HWVertexArrayState { |
+ class HWGeometryState { |
public: |
- HWVertexArrayState() : fCoreProfileVertexArray(nullptr) { this->invalidate(); } |
- |
- ~HWVertexArrayState() { delete fCoreProfileVertexArray; } |
+ HWGeometryState() { fVBOVertexArray = nullptr; this->invalidate(); } |
+ |
+ ~HWGeometryState() { delete fVBOVertexArray; } |
void invalidate() { |
fBoundVertexArrayIDIsValid = false; |
+ fBoundVertexBufferIDIsValid = false; |
+ fDefaultVertexArrayBoundIndexBufferID = false; |
+ fDefaultVertexArrayBoundIndexBufferIDIsValid = false; |
fDefaultVertexArrayAttribState.invalidate(); |
- if (fCoreProfileVertexArray) { |
- fCoreProfileVertexArray->invalidateCachedState(); |
+ if (fVBOVertexArray) { |
+ fVBOVertexArray->invalidateCachedState(); |
} |
} |
@@ -433,41 +450,89 @@ |
} |
} |
+ 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 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. |
+ * Binds the default vertex array and binds the index buffer. This is used when binding |
+ * an index buffer in order to update it. |
*/ |
- GrGLAttribArrayState* bindInternalVertexArray(GrGLGpu*, const GrGLBuffer* ibuff = nullptr); |
+ 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. |
+ */ |
+ 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); |
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. |
- GrGLVertexArray* fCoreProfileVertexArray; |
- } fHWVertexArrayState; |
- |
- struct { |
- GrGLenum fGLTarget; |
- uint32_t fBoundBufferUniqueID; |
- bool fBufferZeroKnownBound; |
- |
- void invalidate() { |
- fBoundBufferUniqueID = SK_InvalidUniqueID; |
- fBufferZeroKnownBound = false; |
- } |
- } fHWBufferState[kGrBufferTypeCount]; |
+ // This is used when we're using a core profile and the vertices are in a VBO. |
+ GrGLVertexArray* fVBOVertexArray; |
+ } fHWGeometryState; |
+ |
+ GrGLuint fHWBoundTextureBufferID; |
+ GrGLuint fHWBoundDrawIndirectBufferID; |
+ bool fHWBoundTextureBufferIDIsValid; |
+ bool fHWBoundDrawIndirectBufferIDIsValid; |
struct { |
GrBlendEquation fEquation; |
@@ -510,14 +575,14 @@ |
GrGLint fTexCoordXformUniform; |
GrGLint fPosXformUniform; |
} fCopyPrograms[3]; |
- SkAutoTUnref<GrGLBuffer> fCopyProgramArrayBuffer; |
+ GrGLuint fCopyProgramArrayBuffer; |
struct { |
GrGLuint fProgram; |
GrGLint fColorUniform; |
GrGLint fRectUniform; |
} fWireRectProgram; |
- SkAutoTUnref<GrGLBuffer> fWireRectArrayBuffer; |
+ GrGLuint fWireRectArrayBuffer; |
static int TextureTargetToCopyProgramIdx(GrGLenum target) { |
switch (target) { |
@@ -534,9 +599,9 @@ |
} |
struct { |
- GrGLuint fProgram; |
- GrGLint fPosXformUniform; |
- SkAutoTUnref<GrGLBuffer> fArrayBuffer; |
+ GrGLuint fProgram; |
+ GrGLint fPosXformUniform; |
+ GrGLuint fArrayBuffer; |
} fPLSSetupProgram; |
bool fHWPLSEnabled; |