| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * Copyright 2011 Google Inc. |    2  * Copyright 2011 Google Inc. | 
|    3  * |    3  * | 
|    4  * Use of this source code is governed by a BSD-style license that can be |    4  * Use of this source code is governed by a BSD-style license that can be | 
|    5  * found in the LICENSE file. |    5  * found in the LICENSE file. | 
|    6  */ |    6  */ | 
|    7  |    7  | 
|    8 #include "GrGpuGL.h" |    8 #include "GrGpuGL.h" | 
|    9  |    9  | 
|   10 #include "builders/GrGLProgramBuilder.h" |   10 #include "builders/GrGLProgramBuilder.h" | 
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  194         } |  194         } | 
|  195     } |  195     } | 
|  196     ++fCurrLRUStamp; |  196     ++fCurrLRUStamp; | 
|  197     return entry->fProgram; |  197     return entry->fProgram; | 
|  198 } |  198 } | 
|  199  |  199  | 
|  200 //////////////////////////////////////////////////////////////////////////////// |  200 //////////////////////////////////////////////////////////////////////////////// | 
|  201  |  201  | 
|  202 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) |  202 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) | 
|  203  |  203  | 
|  204 bool GrGpuGL::flushGraphicsState(DrawType type, |  204 bool GrGpuGL::flushGraphicsState(const GrOptDrawState& optState, | 
 |  205                                  DrawType type, | 
|  205                                  const GrClipMaskManager::ScissorState& scissorS
     tate, |  206                                  const GrClipMaskManager::ScissorState& scissorS
     tate, | 
|  206                                  const GrDeviceCoordTexture* dstCopy) { |  207                                  const GrDeviceCoordTexture* dstCopy) { | 
|  207     SkAutoTUnref<GrOptDrawState> optState(GrOptDrawState::Create(this->getDrawSt
     ate(), |  | 
|  208                                                                  this, |  | 
|  209                                                                  dstCopy, |  | 
|  210                                                                  type)); |  | 
|  211  |  | 
|  212     if (!optState) { |  | 
|  213         return false; |  | 
|  214     } |  | 
|  215  |  | 
|  216     // GrGpu::setupClipAndFlushState should have already checked this and bailed
      if not true. |  208     // GrGpu::setupClipAndFlushState should have already checked this and bailed
      if not true. | 
|  217     SkASSERT(optState->getRenderTarget()); |  209     SkASSERT(optState.getRenderTarget()); | 
|  218  |  210  | 
|  219     if (kStencilPath_DrawType == type) { |  211     if (kStencilPath_DrawType == type) { | 
|  220         const GrRenderTarget* rt = optState->getRenderTarget(); |  212         const GrRenderTarget* rt = optState.getRenderTarget(); | 
|  221         SkISize size; |  213         SkISize size; | 
|  222         size.set(rt->width(), rt->height()); |  214         size.set(rt->width(), rt->height()); | 
|  223         this->glPathRendering()->setProjectionMatrix(optState->getViewMatrix(), 
     size, rt->origin()); |  215         this->glPathRendering()->setProjectionMatrix(optState.getViewMatrix(), s
     ize, rt->origin()); | 
|  224     } else { |  216     } else { | 
|  225         this->flushMiscFixedFunctionState(*optState.get()); |  217         this->flushMiscFixedFunctionState(optState); | 
|  226  |  218  | 
|  227         GrBlendCoeff srcCoeff = optState->getSrcBlendCoeff(); |  219         GrBlendCoeff srcCoeff = optState.getSrcBlendCoeff(); | 
|  228         GrBlendCoeff dstCoeff = optState->getDstBlendCoeff(); |  220         GrBlendCoeff dstCoeff = optState.getDstBlendCoeff(); | 
|  229  |  221  | 
|  230         // In these blend coeff's we end up drawing nothing so we can skip draw 
     all together |  222         // In these blend coeff's we end up drawing nothing so we can skip draw 
     all together | 
|  231         if (kZero_GrBlendCoeff == srcCoeff && kOne_GrBlendCoeff == dstCoeff && |  223         if (kZero_GrBlendCoeff == srcCoeff && kOne_GrBlendCoeff == dstCoeff && | 
|  232             !optState->getStencil().doesWrite()) { |  224             !optState.getStencil().doesWrite()) { | 
|  233             return false; |  225             return false; | 
|  234         } |  226         } | 
|  235  |  227  | 
|  236         fCurrentProgram.reset(fProgramCache->getProgram(*optState.get(), type)); |  228         fCurrentProgram.reset(fProgramCache->getProgram(optState, type)); | 
|  237         if (NULL == fCurrentProgram.get()) { |  229         if (NULL == fCurrentProgram.get()) { | 
|  238             SkDEBUGFAIL("Failed to create program!"); |  230             SkDEBUGFAIL("Failed to create program!"); | 
|  239             return false; |  231             return false; | 
|  240         } |  232         } | 
|  241  |  233  | 
|  242         fCurrentProgram.get()->ref(); |  234         fCurrentProgram.get()->ref(); | 
|  243  |  235  | 
|  244         GrGLuint programID = fCurrentProgram->programID(); |  236         GrGLuint programID = fCurrentProgram->programID(); | 
|  245         if (fHWProgramID != programID) { |  237         if (fHWProgramID != programID) { | 
|  246             GL_CALL(UseProgram(programID)); |  238             GL_CALL(UseProgram(programID)); | 
|  247             fHWProgramID = programID; |  239             fHWProgramID = programID; | 
|  248         } |  240         } | 
|  249  |  241  | 
|  250         this->flushBlend(*optState.get(), kDrawLines_DrawType == type, srcCoeff,
      dstCoeff); |  242         this->flushBlend(optState, kDrawLines_DrawType == type, srcCoeff, dstCoe
     ff); | 
|  251  |  243  | 
|  252         fCurrentProgram->setData(*optState.get(), type, dstCopy); |  244         fCurrentProgram->setData(optState, type, dstCopy); | 
|  253     } |  245     } | 
|  254  |  246  | 
|  255     GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(optState->getRenderT
     arget()); |  247     GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(optState.getRenderTa
     rget()); | 
|  256     this->flushStencil(optState->getStencil(), type); |  248     this->flushStencil(optState.getStencil(), type); | 
|  257     this->flushScissor(scissorState, glRT->getViewport(), glRT->origin()); |  249     this->flushScissor(scissorState, glRT->getViewport(), glRT->origin()); | 
|  258     this->flushAAState(*optState.get(), type); |  250     this->flushAAState(optState, type); | 
|  259  |  251  | 
|  260     // This must come after textures are flushed because a texture may need |  252     // This must come after textures are flushed because a texture may need | 
|  261     // to be msaa-resolved (which will modify bound FBO state). |  253     // to be msaa-resolved (which will modify bound FBO state). | 
|  262     this->flushRenderTarget(glRT, NULL); |  254     this->flushRenderTarget(glRT, NULL); | 
|  263  |  255  | 
|  264     return true; |  256     return true; | 
|  265 } |  257 } | 
|  266  |  258  | 
|  267 void GrGpuGL::setupGeometry(const GrDrawTarget::DrawInfo& info, size_t* indexOff
     setInBytes) { |  259 void GrGpuGL::setupGeometry(const GrOptDrawState& optState, | 
|  268     SkAutoTUnref<GrOptDrawState> optState( |  260                             const GrDrawTarget::DrawInfo& info, | 
|  269         GrOptDrawState::Create(this->getDrawState(), this, info.getDstCopy(), |  261                             size_t* indexOffsetInBytes) { | 
|  270                                PrimTypeToDrawType(info.primitiveType()))); |  262     GrGLsizei stride = static_cast<GrGLsizei>(optState.getVertexStride()); | 
|  271  |  | 
|  272     // If the optState would is NULL it should have been caught in flushGraphics
     State before getting |  | 
|  273     // here. |  | 
|  274     SkASSERT(optState); |  | 
|  275  |  | 
|  276     GrGLsizei stride = static_cast<GrGLsizei>(optState->getVertexStride()); |  | 
|  277  |  263  | 
|  278     size_t vertexOffsetInBytes = stride * info.startVertex(); |  264     size_t vertexOffsetInBytes = stride * info.startVertex(); | 
|  279  |  265  | 
|  280     GrGLVertexBuffer* vbuf; |  266     GrGLVertexBuffer* vbuf; | 
|  281     vbuf = (GrGLVertexBuffer*) this->getGeomSrc().fVertexBuffer; |  267     vbuf = (GrGLVertexBuffer*) this->getGeomSrc().fVertexBuffer; | 
|  282  |  268  | 
|  283     SkASSERT(vbuf); |  269     SkASSERT(vbuf); | 
|  284     SkASSERT(!vbuf->isMapped()); |  270     SkASSERT(!vbuf->isMapped()); | 
|  285     vertexOffsetInBytes += vbuf->baseOffset(); |  271     vertexOffsetInBytes += vbuf->baseOffset(); | 
|  286  |  272  | 
|  287     GrGLIndexBuffer* ibuf = NULL; |  273     GrGLIndexBuffer* ibuf = NULL; | 
|  288     if (info.isIndexed()) { |  274     if (info.isIndexed()) { | 
|  289         SkASSERT(indexOffsetInBytes); |  275         SkASSERT(indexOffsetInBytes); | 
|  290  |  276  | 
|  291         *indexOffsetInBytes = 0; |  277         *indexOffsetInBytes = 0; | 
|  292         ibuf = (GrGLIndexBuffer*)this->getGeomSrc().fIndexBuffer; |  278         ibuf = (GrGLIndexBuffer*)this->getGeomSrc().fIndexBuffer; | 
|  293  |  279  | 
|  294         SkASSERT(ibuf); |  280         SkASSERT(ibuf); | 
|  295         SkASSERT(!ibuf->isMapped()); |  281         SkASSERT(!ibuf->isMapped()); | 
|  296         *indexOffsetInBytes += ibuf->baseOffset(); |  282         *indexOffsetInBytes += ibuf->baseOffset(); | 
|  297     } |  283     } | 
|  298     GrGLAttribArrayState* attribState = |  284     GrGLAttribArrayState* attribState = | 
|  299         fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf); |  285         fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf); | 
|  300  |  286  | 
|  301     if (fCurrentProgram->hasVertexShader()) { |  287     if (fCurrentProgram->hasVertexShader()) { | 
|  302         int vertexAttribCount = optState->getVertexAttribCount(); |  288         int vertexAttribCount = optState.getVertexAttribCount(); | 
|  303         uint32_t usedAttribArraysMask = 0; |  289         uint32_t usedAttribArraysMask = 0; | 
|  304         const GrVertexAttrib* vertexAttrib = optState->getVertexAttribs(); |  290         const GrVertexAttrib* vertexAttrib = optState.getVertexAttribs(); | 
|  305  |  291  | 
|  306         for (int vertexAttribIndex = 0; vertexAttribIndex < vertexAttribCount; |  292         for (int vertexAttribIndex = 0; vertexAttribIndex < vertexAttribCount; | 
|  307              ++vertexAttribIndex, ++vertexAttrib) { |  293              ++vertexAttribIndex, ++vertexAttrib) { | 
|  308             usedAttribArraysMask |= (1 << vertexAttribIndex); |  294             usedAttribArraysMask |= (1 << vertexAttribIndex); | 
|  309             GrVertexAttribType attribType = vertexAttrib->fType; |  295             GrVertexAttribType attribType = vertexAttrib->fType; | 
|  310             attribState->set(this, |  296             attribState->set(this, | 
|  311                              vertexAttribIndex, |  297                              vertexAttribIndex, | 
|  312                              vbuf, |  298                              vbuf, | 
|  313                              GrGLAttribTypeToLayout(attribType).fCount, |  299                              GrGLAttribTypeToLayout(attribType).fCount, | 
|  314                              GrGLAttribTypeToLayout(attribType).fType, |  300                              GrGLAttribTypeToLayout(attribType).fType, | 
|  315                              GrGLAttribTypeToLayout(attribType).fNormalized, |  301                              GrGLAttribTypeToLayout(attribType).fNormalized, | 
|  316                              stride, |  302                              stride, | 
|  317                              reinterpret_cast<GrGLvoid*>( |  303                              reinterpret_cast<GrGLvoid*>( | 
|  318                                  vertexOffsetInBytes + vertexAttrib->fOffset)); |  304                                  vertexOffsetInBytes + vertexAttrib->fOffset)); | 
|  319         } |  305         } | 
|  320         attribState->disableUnusedArrays(this, usedAttribArraysMask); |  306         attribState->disableUnusedArrays(this, usedAttribArraysMask); | 
|  321     } |  307     } | 
|  322 } |  308 } | 
|  323  |  309  | 
|  324 void GrGpuGL::buildProgramDesc(const GrOptDrawState& optState, |  310 void GrGpuGL::buildProgramDesc(const GrOptDrawState& optState, | 
|  325                                const GrProgramDesc::DescInfo& descInfo, |  311                                const GrProgramDesc::DescInfo& descInfo, | 
|  326                                GrGpu::DrawType drawType, |  312                                GrGpu::DrawType drawType, | 
|  327                                const GrDeviceCoordTexture* dstCopy, |  313                                const GrDeviceCoordTexture* dstCopy, | 
|  328                                GrProgramDesc* desc) { |  314                                GrProgramDesc* desc) { | 
|  329     if (!GrGLProgramDescBuilder::Build(optState, descInfo, drawType, this, dstCo
     py, desc)) { |  315     if (!GrGLProgramDescBuilder::Build(optState, descInfo, drawType, this, dstCo
     py, desc)) { | 
|  330         SkDEBUGFAIL("Failed to generate GL program descriptor"); |  316         SkDEBUGFAIL("Failed to generate GL program descriptor"); | 
|  331     } |  317     } | 
|  332 } |  318 } | 
| OLD | NEW |