| Index: src/gpu/gl/GrGpuGL.cpp
|
| diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
|
| index a22988b01bbb8a117ea1262099dc8a934c076b25..0efb7ebdd002cbad9fffb4435a4c3c129be1bc62 100644
|
| --- a/src/gpu/gl/GrGpuGL.cpp
|
| +++ b/src/gpu/gl/GrGpuGL.cpp
|
| @@ -1344,6 +1344,112 @@ void GrGpuGL::flushScissor(const GrClipMaskManager::ScissorState& scissorState,
|
| this->disableScissor();
|
| }
|
|
|
| +bool GrGpuGL::flushGraphicsState(const GrOptDrawState& optState) {
|
| + // GrGpu::setupClipAndFlushState should have already checked this and bailed if not true.
|
| + SkASSERT(optState.getRenderTarget());
|
| +
|
| + if (kStencilPath_DrawType == optState.drawType()) {
|
| + const GrRenderTarget* rt = optState.getRenderTarget();
|
| + SkISize size;
|
| + size.set(rt->width(), rt->height());
|
| + this->glPathRendering()->setProjectionMatrix(optState.getViewMatrix(), size, rt->origin());
|
| + } else {
|
| + this->flushMiscFixedFunctionState(optState);
|
| +
|
| + fCurrentProgram.reset(fProgramCache->getProgram(optState));
|
| + if (NULL == fCurrentProgram.get()) {
|
| + SkDEBUGFAIL("Failed to create program!");
|
| + return false;
|
| + }
|
| +
|
| + fCurrentProgram.get()->ref();
|
| +
|
| + GrGLuint programID = fCurrentProgram->programID();
|
| + if (fHWProgramID != programID) {
|
| + GL_CALL(UseProgram(programID));
|
| + fHWProgramID = programID;
|
| + }
|
| +
|
| + this->flushBlend(optState);
|
| +
|
| + fCurrentProgram->setData(optState);
|
| + }
|
| +
|
| + GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(optState.getRenderTarget());
|
| + this->flushStencil(optState.getStencil(), optState.drawType());
|
| + this->flushScissor(optState.getScissorState(), glRT->getViewport(), glRT->origin());
|
| + this->flushAAState(optState);
|
| +
|
| + // This must come after textures are flushed because a texture may need
|
| + // to be msaa-resolved (which will modify bound FBO state).
|
| + this->flushRenderTarget(glRT, NULL);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void GrGpuGL::setupGeometry(const GrOptDrawState& optState,
|
| + const GrDrawTarget::DrawInfo& info,
|
| + size_t* indexOffsetInBytes) {
|
| + GrGLVertexBuffer* vbuf;
|
| + vbuf = (GrGLVertexBuffer*) info.vertexBuffer();
|
| +
|
| + SkASSERT(vbuf);
|
| + SkASSERT(!vbuf->isMapped());
|
| +
|
| + GrGLIndexBuffer* ibuf = NULL;
|
| + if (info.isIndexed()) {
|
| + SkASSERT(indexOffsetInBytes);
|
| +
|
| + *indexOffsetInBytes = 0;
|
| + ibuf = (GrGLIndexBuffer*)info.indexBuffer();
|
| +
|
| + SkASSERT(ibuf);
|
| + SkASSERT(!ibuf->isMapped());
|
| + *indexOffsetInBytes += ibuf->baseOffset();
|
| + }
|
| + GrGLAttribArrayState* attribState =
|
| + fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf);
|
| +
|
| + if (fCurrentProgram->hasVertexShader()) {
|
| + const GrGeometryProcessor* gp = optState.getGeometryProcessor();
|
| +
|
| + GrGLsizei stride = static_cast<GrGLsizei>(gp->getVertexStride());
|
| +
|
| + size_t vertexOffsetInBytes = stride * info.startVertex();
|
| +
|
| + vertexOffsetInBytes += vbuf->baseOffset();
|
| +
|
| + const SkTArray<GrGeometryProcessor::GrAttribute, true>& attribs = gp->getAttribs();
|
| + int vaCount = attribs.count();
|
| + uint32_t usedAttribArraysMask = 0;
|
| + size_t offset = 0;
|
| +
|
| + for (int attribIndex = 0; attribIndex < vaCount; attribIndex++) {
|
| + usedAttribArraysMask |= (1 << attribIndex);
|
| + GrVertexAttribType attribType = attribs[attribIndex].fType;
|
| + attribState->set(this,
|
| + attribIndex,
|
| + vbuf,
|
| + GrGLAttribTypeToLayout(attribType).fCount,
|
| + GrGLAttribTypeToLayout(attribType).fType,
|
| + GrGLAttribTypeToLayout(attribType).fNormalized,
|
| + stride,
|
| + reinterpret_cast<GrGLvoid*>(vertexOffsetInBytes + offset));
|
| + offset += attribs[attribIndex].fOffset;
|
| + }
|
| + attribState->disableUnusedArrays(this, usedAttribArraysMask);
|
| + }
|
| +}
|
| +
|
| +void GrGpuGL::buildProgramDesc(const GrOptDrawState& optState,
|
| + const GrProgramDesc::DescInfo& descInfo,
|
| + GrGpu::DrawType drawType,
|
| + GrProgramDesc* desc) {
|
| + if (!GrGLProgramDescBuilder::Build(optState, descInfo, drawType, this, desc)) {
|
| + SkDEBUGFAIL("Failed to generate GL program descriptor");
|
| + }
|
| +}
|
| +
|
| void GrGpuGL::disableScissor() {
|
| if (kNo_TriState != fHWScissorSettings.fEnabled) {
|
| GL_CALL(Disable(GR_GL_SCISSOR_TEST));
|
|
|