Refactor canvas drawing to be more data driven
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Jan 2012 19:23:16 +0000 (19:23 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Jan 2012 19:23:16 +0000 (19:23 +0000)
https://bugs.webkit.org/show_bug.cgi?id=76635

CCCanvasLayerImpl no longer handles drawing itself, but produces a list of CCCanvasDrawQuads.
These quads are then drawn by LayerRendererChromium.

This is a refactor, so no new tests were added.

Patch by Tim Dresser <tdresser@chromium.org> on 2012-01-20
Reviewed by James Robinson.

* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::drawCanvasQuad):
* platform/graphics/chromium/cc/CCCanvasDrawQuad.cpp:
(WebCore::CCCanvasDrawQuad::create):
(WebCore::CCCanvasDrawQuad::CCCanvasDrawQuad):
* platform/graphics/chromium/cc/CCCanvasDrawQuad.h:
(WebCore::CCCanvasDrawQuad::textureId):
(WebCore::CCCanvasDrawQuad::hasAlpha):
(WebCore::CCCanvasDrawQuad::premultipliedAlpha):
* platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp:
(WebCore::CCCanvasLayerImpl::appendQuads):
* platform/graphics/chromium/cc/CCCanvasLayerImpl.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@105529 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
Source/WebCore/platform/graphics/chromium/cc/CCCanvasDrawQuad.cpp
Source/WebCore/platform/graphics/chromium/cc/CCCanvasDrawQuad.h
Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp
Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.h

index e8ebc79..c133851 100755 (executable)
@@ -1,3 +1,28 @@
+2012-01-20  Tim Dresser  <tdresser@chromium.org>
+
+        Refactor canvas drawing to be more data driven
+        https://bugs.webkit.org/show_bug.cgi?id=76635
+
+        CCCanvasLayerImpl no longer handles drawing itself, but produces a list of CCCanvasDrawQuads.
+        These quads are then drawn by LayerRendererChromium.
+
+        This is a refactor, so no new tests were added.
+
+        Reviewed by James Robinson.
+
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::drawCanvasQuad):
+        * platform/graphics/chromium/cc/CCCanvasDrawQuad.cpp:
+        (WebCore::CCCanvasDrawQuad::create):
+        (WebCore::CCCanvasDrawQuad::CCCanvasDrawQuad):
+        * platform/graphics/chromium/cc/CCCanvasDrawQuad.h:
+        (WebCore::CCCanvasDrawQuad::textureId):
+        (WebCore::CCCanvasDrawQuad::hasAlpha):
+        (WebCore::CCCanvasDrawQuad::premultipliedAlpha):
+        * platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp:
+        (WebCore::CCCanvasLayerImpl::appendQuads):
+        * platform/graphics/chromium/cc/CCCanvasLayerImpl.h:
+
 2012-01-19  Abhishek Arya  <inferno@chromium.org>
 
         Crash in xsltParseGlobalVariable.
index eec179b..bbdf89d 100644 (file)
@@ -669,8 +669,27 @@ void LayerRendererChromium::drawTileQuad(const CCTileDrawQuad* quad)
 
 void LayerRendererChromium::drawCanvasQuad(const CCCanvasDrawQuad* quad)
 {
-    CCLayerImpl* layer = quad->layer();
-    layer->draw(this);
+    ASSERT(CCProxy::isImplThread());
+    const CCCanvasLayerImpl::Program* program = canvasLayerProgram();
+    ASSERT(program && program->initialized());
+    GLC(context(), context()->activeTexture(GraphicsContext3D::TEXTURE0));
+    GLC(context(), context()->bindTexture(GraphicsContext3D::TEXTURE_2D, quad->textureId()));
+    GLC(context(), context()->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR));
+    GLC(context(), context()->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR));
+
+    if (quad->hasAlpha() && !quad->premultipliedAlpha())
+        GLC(context(), context()->blendFunc(GraphicsContext3D::SRC_ALPHA, GraphicsContext3D::ONE_MINUS_SRC_ALPHA));
+
+    const IntSize& bounds = quad->quadRect().size();
+
+    GLC(context(), context()->useProgram(program->program()));
+    GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocation(), 0));
+    drawTexturedQuad(quad->layerTransform(), bounds.width(), bounds.height(), quad->opacity(), sharedGeometryQuad(),
+                                    program->vertexShader().matrixLocation(),
+                                    program->fragmentShader().alphaLocation(),
+                                    -1);
+
+    GLC(m_context.get(), m_context->blendFunc(GraphicsContext3D::ONE, GraphicsContext3D::ONE_MINUS_SRC_ALPHA));
 }
 
 void LayerRendererChromium::drawVideoQuad(const CCVideoDrawQuad* quad)
index a5c768f..56f5083 100644 (file)
 
 namespace WebCore {
 
-PassOwnPtr<CCCanvasDrawQuad> CCCanvasDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer)
+PassOwnPtr<CCCanvasDrawQuad> CCCanvasDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, unsigned textureId, bool hasAlpha, bool premultipliedAlpha)
 {
-    return adoptPtr(new CCCanvasDrawQuad(sharedQuadState, quadRect, layer));
+    return adoptPtr(new CCCanvasDrawQuad(sharedQuadState, quadRect, textureId, hasAlpha, premultipliedAlpha));
 }
 
-CCCanvasDrawQuad::CCCanvasDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer)
+CCCanvasDrawQuad::CCCanvasDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, unsigned textureId, bool hasAlpha, bool premultipliedAlpha)
     : CCDrawQuad(sharedQuadState, CCDrawQuad::CanvasContent, quadRect)
-    , m_layer(layer)
+    , m_textureId(textureId)
+    , m_hasAlpha(hasAlpha)
+    , m_premultipliedAlpha(premultipliedAlpha)
 {
-    ASSERT(m_layer);
 }
 
 }
index 65b4c8a..aa85dbd 100644 (file)
@@ -35,14 +35,18 @@ class CCLayerImpl;
 class CCCanvasDrawQuad : public CCDrawQuad {
     WTF_MAKE_NONCOPYABLE(CCCanvasDrawQuad);
 public:
-    static PassOwnPtr<CCCanvasDrawQuad> create(const CCSharedQuadState*, const IntRect&, CCLayerImpl*);
+    static PassOwnPtr<CCCanvasDrawQuad> create(const CCSharedQuadState*, const IntRect&, unsigned texture_id, bool hasAlpha, bool premultipliedAlpha);
 
-    CCLayerImpl* layer() const { return m_layer; }
+    unsigned textureId() const { return  m_textureId; }
+    bool hasAlpha() const { return  m_hasAlpha; }
+    bool premultipliedAlpha() const { return  m_premultipliedAlpha; }
 
 private:
-    CCCanvasDrawQuad(const CCSharedQuadState*, const IntRect&, CCLayerImpl*);
-
-    CCLayerImpl* m_layer;
+    CCCanvasDrawQuad(const CCSharedQuadState*, const IntRect&, unsigned texture_id, bool hasAlpha, bool premultipliedAlpha);
+    
+    unsigned m_textureId;
+    bool m_hasAlpha;
+    bool m_premultipliedAlpha;
 };
 
 }
index ac18366..2bb3eff 100644 (file)
@@ -49,39 +49,10 @@ CCCanvasLayerImpl::~CCCanvasLayerImpl()
 {
 }
 
-void CCCanvasLayerImpl::draw(LayerRendererChromium* layerRenderer)
-{
-    ASSERT(CCProxy::isImplThread());
-    const CCCanvasLayerImpl::Program* program = layerRenderer->canvasLayerProgram();
-    ASSERT(program && program->initialized());
-    GraphicsContext3D* context = layerRenderer->context();
-    GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0));
-    GLC(context, context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId));
-    GLC(context, context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR));
-    GLC(context, context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR));
-
-    if (!m_hasAlpha) {
-        // Even though the WebGL layer's texture was likely allocated
-        // as GL_RGB, disable blending anyway for better robustness.
-        context->disable(GraphicsContext3D::BLEND);
-    } else {
-        GC3Denum sfactor = m_premultipliedAlpha ? GraphicsContext3D::ONE : GraphicsContext3D::SRC_ALPHA;
-        GLC(context, context->blendFunc(sfactor, GraphicsContext3D::ONE_MINUS_SRC_ALPHA));
-    }
-    GLC(context, context->useProgram(program->program()));
-    GLC(context, context->uniform1i(program->fragmentShader().samplerLocation(), 0));
-    layerRenderer->drawTexturedQuad(drawTransform(), bounds().width(), bounds().height(), drawOpacity(), layerRenderer->sharedGeometryQuad(),
-                                    program->vertexShader().matrixLocation(),
-                                    program->fragmentShader().alphaLocation(),
-                                    -1);
-    if (!m_hasAlpha)
-        context->enable(GraphicsContext3D::BLEND);
-}
-
 void CCCanvasLayerImpl::appendQuads(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState)
 {
     IntRect quadRect(IntPoint(), bounds());
-    quadList.append(CCCanvasDrawQuad::create(sharedQuadState, quadRect, this));
+    quadList.append(CCCanvasDrawQuad::create(sharedQuadState, quadRect, m_textureId, m_hasAlpha, m_premultipliedAlpha));
 }
 
 void CCCanvasLayerImpl::dumpLayerProperties(TextStream& ts, int indent) const
index 35b89e6..9126a7d 100644 (file)
@@ -44,8 +44,6 @@ public:
 
     typedef ProgramBinding<VertexShaderPosTex, FragmentShaderRGBATexFlipAlpha> Program;
 
-    virtual void draw(LayerRendererChromium*);
-
     virtual void dumpLayerProperties(TextStream&, int indent) const;
 
     unsigned textureId() const { return m_textureId; }