Changeset 105529 in webkit
- Timestamp:
- Jan 20, 2012 11:23:16 AM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r105524 r105529 1 2012-01-20 Tim Dresser <tdresser@chromium.org> 2 3 Refactor canvas drawing to be more data driven 4 https://bugs.webkit.org/show_bug.cgi?id=76635 5 6 CCCanvasLayerImpl no longer handles drawing itself, but produces a list of CCCanvasDrawQuads. 7 These quads are then drawn by LayerRendererChromium. 8 9 This is a refactor, so no new tests were added. 10 11 Reviewed by James Robinson. 12 13 * platform/graphics/chromium/LayerRendererChromium.cpp: 14 (WebCore::LayerRendererChromium::drawCanvasQuad): 15 * platform/graphics/chromium/cc/CCCanvasDrawQuad.cpp: 16 (WebCore::CCCanvasDrawQuad::create): 17 (WebCore::CCCanvasDrawQuad::CCCanvasDrawQuad): 18 * platform/graphics/chromium/cc/CCCanvasDrawQuad.h: 19 (WebCore::CCCanvasDrawQuad::textureId): 20 (WebCore::CCCanvasDrawQuad::hasAlpha): 21 (WebCore::CCCanvasDrawQuad::premultipliedAlpha): 22 * platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp: 23 (WebCore::CCCanvasLayerImpl::appendQuads): 24 * platform/graphics/chromium/cc/CCCanvasLayerImpl.h: 25 1 26 2012-01-19 Abhishek Arya <inferno@chromium.org> 2 27 -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
r105311 r105529 670 670 void LayerRendererChromium::drawCanvasQuad(const CCCanvasDrawQuad* quad) 671 671 { 672 CCLayerImpl* layer = quad->layer(); 673 layer->draw(this); 672 ASSERT(CCProxy::isImplThread()); 673 const CCCanvasLayerImpl::Program* program = canvasLayerProgram(); 674 ASSERT(program && program->initialized()); 675 GLC(context(), context()->activeTexture(GraphicsContext3D::TEXTURE0)); 676 GLC(context(), context()->bindTexture(GraphicsContext3D::TEXTURE_2D, quad->textureId())); 677 GLC(context(), context()->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR)); 678 GLC(context(), context()->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR)); 679 680 if (quad->hasAlpha() && !quad->premultipliedAlpha()) 681 GLC(context(), context()->blendFunc(GraphicsContext3D::SRC_ALPHA, GraphicsContext3D::ONE_MINUS_SRC_ALPHA)); 682 683 const IntSize& bounds = quad->quadRect().size(); 684 685 GLC(context(), context()->useProgram(program->program())); 686 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocation(), 0)); 687 drawTexturedQuad(quad->layerTransform(), bounds.width(), bounds.height(), quad->opacity(), sharedGeometryQuad(), 688 program->vertexShader().matrixLocation(), 689 program->fragmentShader().alphaLocation(), 690 -1); 691 692 GLC(m_context.get(), m_context->blendFunc(GraphicsContext3D::ONE, GraphicsContext3D::ONE_MINUS_SRC_ALPHA)); 674 693 } 675 694 -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasDrawQuad.cpp
r105311 r105529 30 30 namespace WebCore { 31 31 32 PassOwnPtr<CCCanvasDrawQuad> CCCanvasDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer)32 PassOwnPtr<CCCanvasDrawQuad> CCCanvasDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, unsigned textureId, bool hasAlpha, bool premultipliedAlpha) 33 33 { 34 return adoptPtr(new CCCanvasDrawQuad(sharedQuadState, quadRect, layer));34 return adoptPtr(new CCCanvasDrawQuad(sharedQuadState, quadRect, textureId, hasAlpha, premultipliedAlpha)); 35 35 } 36 36 37 CCCanvasDrawQuad::CCCanvasDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer)37 CCCanvasDrawQuad::CCCanvasDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, unsigned textureId, bool hasAlpha, bool premultipliedAlpha) 38 38 : CCDrawQuad(sharedQuadState, CCDrawQuad::CanvasContent, quadRect) 39 , m_layer(layer) 39 , m_textureId(textureId) 40 , m_hasAlpha(hasAlpha) 41 , m_premultipliedAlpha(premultipliedAlpha) 40 42 { 41 ASSERT(m_layer);42 43 } 43 44 -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasDrawQuad.h
r105311 r105529 36 36 WTF_MAKE_NONCOPYABLE(CCCanvasDrawQuad); 37 37 public: 38 static PassOwnPtr<CCCanvasDrawQuad> create(const CCSharedQuadState*, const IntRect&, CCLayerImpl*);38 static PassOwnPtr<CCCanvasDrawQuad> create(const CCSharedQuadState*, const IntRect&, unsigned texture_id, bool hasAlpha, bool premultipliedAlpha); 39 39 40 CCLayerImpl* layer() const { return m_layer; } 40 unsigned textureId() const { return m_textureId; } 41 bool hasAlpha() const { return m_hasAlpha; } 42 bool premultipliedAlpha() const { return m_premultipliedAlpha; } 41 43 42 44 private: 43 CCCanvasDrawQuad(const CCSharedQuadState*, const IntRect&, CCLayerImpl*); 44 45 CCLayerImpl* m_layer; 45 CCCanvasDrawQuad(const CCSharedQuadState*, const IntRect&, unsigned texture_id, bool hasAlpha, bool premultipliedAlpha); 46 47 unsigned m_textureId; 48 bool m_hasAlpha; 49 bool m_premultipliedAlpha; 46 50 }; 47 51 -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp
r105311 r105529 50 50 } 51 51 52 void CCCanvasLayerImpl::draw(LayerRendererChromium* layerRenderer)53 {54 ASSERT(CCProxy::isImplThread());55 const CCCanvasLayerImpl::Program* program = layerRenderer->canvasLayerProgram();56 ASSERT(program && program->initialized());57 GraphicsContext3D* context = layerRenderer->context();58 GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0));59 GLC(context, context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId));60 GLC(context, context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR));61 GLC(context, context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR));62 63 if (!m_hasAlpha) {64 // Even though the WebGL layer's texture was likely allocated65 // as GL_RGB, disable blending anyway for better robustness.66 context->disable(GraphicsContext3D::BLEND);67 } else {68 GC3Denum sfactor = m_premultipliedAlpha ? GraphicsContext3D::ONE : GraphicsContext3D::SRC_ALPHA;69 GLC(context, context->blendFunc(sfactor, GraphicsContext3D::ONE_MINUS_SRC_ALPHA));70 }71 GLC(context, context->useProgram(program->program()));72 GLC(context, context->uniform1i(program->fragmentShader().samplerLocation(), 0));73 layerRenderer->drawTexturedQuad(drawTransform(), bounds().width(), bounds().height(), drawOpacity(), layerRenderer->sharedGeometryQuad(),74 program->vertexShader().matrixLocation(),75 program->fragmentShader().alphaLocation(),76 -1);77 if (!m_hasAlpha)78 context->enable(GraphicsContext3D::BLEND);79 }80 81 52 void CCCanvasLayerImpl::appendQuads(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState) 82 53 { 83 54 IntRect quadRect(IntPoint(), bounds()); 84 quadList.append(CCCanvasDrawQuad::create(sharedQuadState, quadRect, this));55 quadList.append(CCCanvasDrawQuad::create(sharedQuadState, quadRect, m_textureId, m_hasAlpha, m_premultipliedAlpha)); 85 56 } 86 57 -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.h
r105311 r105529 45 45 typedef ProgramBinding<VertexShaderPosTex, FragmentShaderRGBATexFlipAlpha> Program; 46 46 47 virtual void draw(LayerRendererChromium*);48 49 47 virtual void dumpLayerProperties(TextStream&, int indent) const; 50 48
Note: See TracChangeset
for help on using the changeset viewer.