diff options
author | 2016-07-13 10:16:32 -0700 | |
---|---|---|
committer | 2016-07-13 10:16:32 -0700 | |
commit | 485a12003ab48b54965d6f7172f3183358919d8e (patch) | |
tree | 090548d2a98d35849dfbedeafa10020507f3194c /src/gpu/gl/GrGLGpu.cpp | |
parent | 6c3ada96ab2326f2119e1e9f44fbc8b0aeadbae8 (diff) |
Add resource provider flag to avoid client-side buffers
On some platforms, a newly-created buffer was liable to be CPU backed.
This would break code that expected a VBO (aka instanced rendering).
This change adds an optional flag to GrResourceProvider that requires
a buffer to be created in GPU memory.
It also moves the CPU backing logic into Gr land in order to properly
cache real VBOs on platforms that prefer client-side buffers.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2143333002
Review-Url: https://codereview.chromium.org/2143333002
Diffstat (limited to 'src/gpu/gl/GrGLGpu.cpp')
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index 9972690487..885e182c55 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -2053,9 +2053,7 @@ bool GrGLGpu::flushGLState(const GrPipeline& pipeline, const GrPrimitiveProcesso void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, const GrNonInstancedMesh& mesh, size_t* indexOffsetInBytes) { - const GrGLBuffer* vbuf; - vbuf = static_cast<const GrGLBuffer*>(mesh.vertexBuffer()); - + const GrBuffer* vbuf = mesh.vertexBuffer(); SkASSERT(vbuf); SkASSERT(!vbuf->isMapped()); @@ -2064,8 +2062,7 @@ void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, SkASSERT(indexOffsetInBytes); *indexOffsetInBytes = 0; - const GrGLBuffer* ibuf = static_cast<const GrGLBuffer*>(mesh.indexBuffer()); - + const GrBuffer* ibuf = mesh.indexBuffer(); SkASSERT(ibuf); SkASSERT(!ibuf->isMapped()); *indexOffsetInBytes += ibuf->baseOffset(); @@ -2102,7 +2099,7 @@ void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, } } -GrGLenum GrGLGpu::bindBuffer(GrBufferType type, const GrGLBuffer* buffer) { +GrGLenum GrGLGpu::bindBuffer(GrBufferType type, const GrBuffer* buffer) { this->handleDirtyContext(); // Index buffer state is tied to the vertex array. @@ -2114,10 +2111,15 @@ GrGLenum GrGLGpu::bindBuffer(GrBufferType type, const GrGLBuffer* buffer) { auto& bufferState = fHWBufferState[type]; if (buffer->getUniqueID() != bufferState.fBoundBufferUniqueID) { - if (!buffer->isCPUBacked() || !bufferState.fBufferZeroKnownBound) { - GL_CALL(BindBuffer(bufferState.fGLTarget, buffer->bufferID())); - bufferState.fBufferZeroKnownBound = buffer->isCPUBacked(); + if (buffer->isCPUBacked()) { + if (!bufferState.fBufferZeroKnownBound) { + GL_CALL(BindBuffer(bufferState.fGLTarget, 0)); + } + } else { + const GrGLBuffer* glBuffer = static_cast<const GrGLBuffer*>(buffer); + GL_CALL(BindBuffer(bufferState.fGLTarget, glBuffer->bufferID())); } + bufferState.fBufferZeroKnownBound = buffer->isCPUBacked(); bufferState.fBoundBufferUniqueID = buffer->getUniqueID(); } @@ -4568,7 +4570,7 @@ void GrGLGpu::resetShaderCacheForTesting() const { /////////////////////////////////////////////////////////////////////////////// GrGLAttribArrayState* GrGLGpu::HWVertexArrayState::bindInternalVertexArray(GrGLGpu* gpu, - const GrGLBuffer* ibuf) { + const GrBuffer* ibuf) { GrGLAttribArrayState* attribState; if (gpu->glCaps().isCoreProfile()) { |