Title: [106607] trunk/Source/WebCore
Revision
106607
Author
[email protected]
Date
2012-02-02 17:35:29 -0800 (Thu, 02 Feb 2012)

Log Message

Refactor plugin drawing to be more data driven
https://bugs.webkit.org/show_bug.cgi?id=76715

Patch by Tim Dresser <[email protected]> on 2012-02-02
Reviewed by James Robinson.

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

CCLayerImpl::willDraw(LayerRendererChromium*) is called directly before appendQuads.
This allows for CCLayerImpl objects to allocate textures before appendQuads is called.

This is a refactor, so no new tests were added.
Flash was tested manually on Linux and Mac.

* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::PluginProgramBinding::set):
(PluginProgramBinding):
(WebCore):
(WebCore::TexStretchPluginProgramBinding::set):
(TexStretchPluginProgramBinding):
(WebCore::TexTransformPluginProgramBinding::set):
(TexTransformPluginProgramBinding):
(WebCore::LayerRendererChromium::drawPluginQuad):
* platform/graphics/chromium/cc/CCLayerImpl.h:
(WebCore::CCLayerImpl::willDraw):
* platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
(WebCore::CCLayerTreeHostImpl::calculateRenderPasses):
* platform/graphics/chromium/cc/CCPluginDrawQuad.cpp:
(WebCore::CCPluginDrawQuad::create):
(WebCore::CCPluginDrawQuad::CCPluginDrawQuad):
* platform/graphics/chromium/cc/CCPluginDrawQuad.h:
(CCPluginDrawQuad):
(WebCore::CCPluginDrawQuad::uvRect):
(WebCore::CCPluginDrawQuad::textureId):
(WebCore::CCPluginDrawQuad::flipped):
(WebCore::CCPluginDrawQuad::ioSurfaceWidth):
(WebCore::CCPluginDrawQuad::ioSurfaceHeight):
(WebCore::CCPluginDrawQuad::ioSurfaceTextureId):
* platform/graphics/chromium/cc/CCPluginLayerImpl.cpp:
(WebCore::CCPluginLayerImpl::willDraw):
(WebCore::CCPluginLayerImpl::appendQuads):
* platform/graphics/chromium/cc/CCPluginLayerImpl.h:
(CCPluginLayerImpl):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (106606 => 106607)


--- trunk/Source/WebCore/ChangeLog	2012-02-03 01:01:59 UTC (rev 106606)
+++ trunk/Source/WebCore/ChangeLog	2012-02-03 01:35:29 UTC (rev 106607)
@@ -1,3 +1,49 @@
+2012-02-02  Tim Dresser  <[email protected]>
+
+        Refactor plugin drawing to be more data driven
+        https://bugs.webkit.org/show_bug.cgi?id=76715
+
+        Reviewed by James Robinson.
+
+        CCPluginLayerImpl no longer handles drawing itself, but produces a list of CCPluginDrawQuads.
+        These quads are then drawn by LayerRendererChromium.
+
+        CCLayerImpl::willDraw(LayerRendererChromium*) is called directly before appendQuads.
+        This allows for CCLayerImpl objects to allocate textures before appendQuads is called.
+
+        This is a refactor, so no new tests were added.
+        Flash was tested manually on Linux and Mac.
+
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::PluginProgramBinding::set):
+        (PluginProgramBinding):
+        (WebCore):
+        (WebCore::TexStretchPluginProgramBinding::set):
+        (TexStretchPluginProgramBinding):
+        (WebCore::TexTransformPluginProgramBinding::set):
+        (TexTransformPluginProgramBinding):
+        (WebCore::LayerRendererChromium::drawPluginQuad):
+        * platform/graphics/chromium/cc/CCLayerImpl.h:
+        (WebCore::CCLayerImpl::willDraw):
+        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
+        (WebCore::CCLayerTreeHostImpl::calculateRenderPasses):
+        * platform/graphics/chromium/cc/CCPluginDrawQuad.cpp:
+        (WebCore::CCPluginDrawQuad::create):
+        (WebCore::CCPluginDrawQuad::CCPluginDrawQuad):
+        * platform/graphics/chromium/cc/CCPluginDrawQuad.h:
+        (CCPluginDrawQuad):
+        (WebCore::CCPluginDrawQuad::uvRect):
+        (WebCore::CCPluginDrawQuad::textureId):
+        (WebCore::CCPluginDrawQuad::flipped):
+        (WebCore::CCPluginDrawQuad::ioSurfaceWidth):
+        (WebCore::CCPluginDrawQuad::ioSurfaceHeight):
+        (WebCore::CCPluginDrawQuad::ioSurfaceTextureId):
+        * platform/graphics/chromium/cc/CCPluginLayerImpl.cpp:
+        (WebCore::CCPluginLayerImpl::willDraw):
+        (WebCore::CCPluginLayerImpl::appendQuads):
+        * platform/graphics/chromium/cc/CCPluginLayerImpl.h:
+        (CCPluginLayerImpl):
+
 2012-01-29  Pablo Flouret  <[email protected]>
 
         V8 idl code generator doesn't handle SerializedScriptValue attributes properly.

Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp (106606 => 106607)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2012-02-03 01:01:59 UTC (rev 106606)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2012-02-03 01:35:29 UTC (rev 106607)
@@ -697,10 +697,92 @@
     layer->draw(this);
 }
 
+struct PluginProgramBinding {
+    template<class Program> void set(Program* program)
+    {
+        ASSERT(program && program->initialized());
+        programId = program->program();
+        samplerLocation = program->fragmentShader().samplerLocation();
+        matrixLocation = program->vertexShader().matrixLocation();
+        alphaLocation = program->fragmentShader().alphaLocation();
+    }
+    int programId;
+    int samplerLocation;
+    int matrixLocation;
+    int alphaLocation;
+};
+
+struct TexStretchPluginProgramBinding : PluginProgramBinding {
+    template<class Program> void set(Program* program)
+    {
+        PluginProgramBinding::set(program);
+        offsetLocation = program->vertexShader().offsetLocation();
+        scaleLocation = program->vertexShader().scaleLocation();
+    }
+    int offsetLocation;
+    int scaleLocation;
+};
+
+struct TexTransformPluginProgramBinding : PluginProgramBinding {
+    template<class Program> void set(Program* program)
+    {
+        PluginProgramBinding::set(program);
+        texTransformLocation = program->vertexShader().texTransformLocation();
+    }
+    int texTransformLocation;
+};
+
 void LayerRendererChromium::drawPluginQuad(const CCPluginDrawQuad* quad)
 {
-    CCLayerImpl* layer = quad->layer();
-    layer->draw(this);
+    ASSERT(CCProxy::isImplThread());
+
+    if (quad->ioSurfaceTextureId()) {
+        TexTransformPluginProgramBinding binding;
+        if (quad->flipped())
+            binding.set(pluginLayerTexRectProgramFlip());
+        else
+            binding.set(pluginLayerTexRectProgram());
+
+        GLC(context(), context()->activeTexture(GraphicsContext3D::TEXTURE0));
+        GLC(context(), context()->bindTexture(Extensions3D::TEXTURE_RECTANGLE_ARB, quad->ioSurfaceTextureId()));
+
+        GLC(context(), context()->useProgram(binding.programId));
+        GLC(context(), context()->uniform1i(binding.samplerLocation, 0));
+        // Note: this code path ignores quad->uvRect().
+        GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, 0, quad->ioSurfaceWidth(), quad->ioSurfaceHeight()));
+        const IntSize& bounds = quad->quadRect().size();
+        drawTexturedQuad(quad->layerTransform(), bounds.width(), bounds.height(), quad->opacity(), sharedGeometryQuad(),
+                                        binding.matrixLocation,
+                                        binding.alphaLocation,
+                                        -1);
+        GLC(context(), context()->bindTexture(Extensions3D::TEXTURE_RECTANGLE_ARB, 0));
+    } else {
+        TexStretchPluginProgramBinding binding;
+        if (quad->flipped())
+            binding.set(pluginLayerProgramFlip());
+        else
+            binding.set(pluginLayerProgram());
+
+        GLC(context(), context()->activeTexture(GraphicsContext3D::TEXTURE0));
+        GLC(context(), context()->bindTexture(GraphicsContext3D::TEXTURE_2D, quad->textureId()));
+
+        // FIXME: setting the texture parameters every time is redundant. Move this code somewhere
+        // where it will only happen once per texture.
+        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));
+        GLC(context, context()->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE));
+        GLC(context, context()->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE));
+
+        GLC(context, context()->useProgram(binding.programId));
+        GLC(context, context()->uniform1i(binding.samplerLocation, 0));
+        GLC(context, context()->uniform2f(binding.offsetLocation, quad->uvRect().x(), quad->uvRect().y()));
+        GLC(context, context()->uniform2f(binding.scaleLocation, quad->uvRect().width(), quad->uvRect().height()));
+        const IntSize& bounds = quad->quadRect().size();
+        drawTexturedQuad(quad->layerTransform(), bounds.width(), bounds.height(), quad->opacity(), sharedGeometryQuad(),
+                                        binding.matrixLocation,
+                                        binding.alphaLocation,
+                                        -1);
+    }
 }
 
 void LayerRendererChromium::finishDrawingFrame()

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h (106606 => 106607)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h	2012-02-03 01:01:59 UTC (rev 106606)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h	2012-02-03 01:35:29 UTC (rev 106607)
@@ -72,6 +72,7 @@
 #endif
 
     PassOwnPtr<CCSharedQuadState> createSharedQuadState() const;
+    virtual void willDraw(LayerRendererChromium*) { }
     virtual void appendQuads(CCQuadList&, const CCSharedQuadState*);
     void appendDebugBorderQuad(CCQuadList&, const CCSharedQuadState*) const;
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp (106606 => 106607)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp	2012-02-03 01:01:59 UTC (rev 106606)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp	2012-02-03 01:35:29 UTC (rev 106607)
@@ -231,6 +231,7 @@
                 continue;
             }
 
+            layer->willDraw(m_layerRenderer.get());
             pass->appendQuadsForLayer(layer);
         }
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginDrawQuad.cpp (106606 => 106607)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginDrawQuad.cpp	2012-02-03 01:01:59 UTC (rev 106606)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginDrawQuad.cpp	2012-02-03 01:35:29 UTC (rev 106607)
@@ -29,16 +29,20 @@
 
 namespace WebCore {
 
-PassOwnPtr<CCPluginDrawQuad> CCPluginDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer)
+PassOwnPtr<CCPluginDrawQuad> CCPluginDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, const FloatRect& uvRect, unsigned textureId, bool flipped, int ioSurfaceWidth, int ioSurfaceHeight, unsigned ioSurfaceTextureId)
 {
-    return adoptPtr(new CCPluginDrawQuad(sharedQuadState, quadRect, layer));
+    return adoptPtr(new CCPluginDrawQuad(sharedQuadState, quadRect, uvRect, textureId, flipped, ioSurfaceWidth, ioSurfaceHeight, ioSurfaceTextureId));
 }
 
-CCPluginDrawQuad::CCPluginDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer)
+CCPluginDrawQuad::CCPluginDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, const FloatRect& uvRect, unsigned textureId, bool flipped, int ioSurfaceWidth, int ioSurfaceHeight, unsigned ioSurfaceTextureId)
     : CCDrawQuad(sharedQuadState, CCDrawQuad::PluginContent, quadRect)
-    , m_layer(layer)
+    , m_uvRect(uvRect)
+    , m_textureId(textureId)
+    , m_flipped(flipped)
+    , m_ioSurfaceWidth(ioSurfaceWidth)
+    , m_ioSurfaceHeight(ioSurfaceHeight)
+    , m_ioSurfaceTextureId(ioSurfaceTextureId)
 {
-    ASSERT(m_layer);
 }
 
 }

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginDrawQuad.h (106606 => 106607)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginDrawQuad.h	2012-02-03 01:01:59 UTC (rev 106606)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginDrawQuad.h	2012-02-03 01:35:29 UTC (rev 106607)
@@ -36,14 +36,25 @@
 class CCPluginDrawQuad : public CCDrawQuad {
     WTF_MAKE_NONCOPYABLE(CCPluginDrawQuad);
 public:
-    static PassOwnPtr<CCPluginDrawQuad> create(const CCSharedQuadState*, const IntRect&, CCLayerImpl*);
+    static PassOwnPtr<CCPluginDrawQuad> create(const CCSharedQuadState*, const IntRect& quadRect, const FloatRect& uvRect, unsigned textureId, bool flipped, int ioSurfaceWidth, int ioSurfaceHeight, unsigned m_ioSurfaceTextureId);
 
-    CCLayerImpl* layer() const { return m_layer; }
+    FloatRect uvRect() const { return m_uvRect; }
+    unsigned textureId() const { return m_textureId; }
+    bool flipped() const { return m_flipped; }
+    int ioSurfaceWidth() const { return m_ioSurfaceWidth; }
+    int ioSurfaceHeight() const { return m_ioSurfaceHeight; }
 
+    unsigned ioSurfaceTextureId() const { return m_ioSurfaceTextureId; }
+    
 private:
-    CCPluginDrawQuad(const CCSharedQuadState*, const IntRect&, CCLayerImpl*);
+    CCPluginDrawQuad(const CCSharedQuadState*, const IntRect& quadRect, const FloatRect& uvRect, unsigned textureId, bool flipped, int ioSurfaceWidth, int ioSurfaceHeight, unsigned ioSurfaceTextureId);
 
-    CCLayerImpl* m_layer;
+    FloatRect m_uvRect;
+    unsigned m_textureId;
+    bool m_flipped;
+    int m_ioSurfaceWidth;
+    int m_ioSurfaceHeight;
+    unsigned m_ioSurfaceTextureId;
 };
 
 }

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginLayerImpl.cpp (106606 => 106607)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginLayerImpl.cpp	2012-02-03 01:01:59 UTC (rev 106606)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginLayerImpl.cpp	2012-02-03 01:35:29 UTC (rev 106607)
@@ -36,45 +36,6 @@
 #include "cc/CCProxy.h"
 #include <wtf/text/WTFString.h>
 
-namespace {
-
-struct PluginProgramBinding {
-    template<class Program> void set(Program* program)
-    {
-        ASSERT(program && program->initialized());
-        programId = program->program();
-        samplerLocation = program->fragmentShader().samplerLocation();
-        matrixLocation = program->vertexShader().matrixLocation();
-        alphaLocation = program->fragmentShader().alphaLocation();
-    }
-    int programId;
-    int samplerLocation;
-    int matrixLocation;
-    int alphaLocation;
-};
-
-struct TexStretchPluginProgramBinding : PluginProgramBinding {
-    template<class Program> void set(Program* program)
-    {
-        PluginProgramBinding::set(program);
-        offsetLocation = program->vertexShader().offsetLocation();
-        scaleLocation = program->vertexShader().scaleLocation();
-    }
-    int offsetLocation;
-    int scaleLocation;
-};
-
-struct TexTransformPluginProgramBinding : PluginProgramBinding {
-    template<class Program> void set(Program* program)
-    {
-        PluginProgramBinding::set(program);
-        texTransformLocation = program->vertexShader().texTransformLocation();
-    }
-    int texTransformLocation;
-};
-
-} // anonymous namespace
-
 namespace WebCore {
 
 CCPluginLayerImpl::CCPluginLayerImpl(int id)
@@ -95,10 +56,8 @@
     cleanupResources();
 }
 
-void CCPluginLayerImpl::draw(LayerRendererChromium* layerRenderer)
+void CCPluginLayerImpl::willDraw(LayerRendererChromium* layerRenderer)
 {
-    ASSERT(CCProxy::isImplThread());
-
     if (m_ioSurfaceChanged) {
         GraphicsContext3D* context = layerRenderer->context();
         Extensions3DChromium* extensions = static_cast<Extensions3DChromium*>(context->getExtensions());
@@ -127,60 +86,12 @@
         // allocated.
         m_ioSurfaceChanged = false;
     }
-
-    if (m_ioSurfaceTextureId) {
-        TexTransformPluginProgramBinding binding;
-        if (m_flipped)
-            binding.set(layerRenderer->pluginLayerTexRectProgramFlip());
-        else
-            binding.set(layerRenderer->pluginLayerTexRectProgram());
-
-        GraphicsContext3D* context = layerRenderer->context();
-        GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0));
-        GLC(context, context->bindTexture(Extensions3D::TEXTURE_RECTANGLE_ARB, m_ioSurfaceTextureId));
-
-        GLC(context, context->useProgram(binding.programId));
-        GLC(context, context->uniform1i(binding.samplerLocation, 0));
-        // Note: this code path ignores m_uvRect.
-        GLC(context, context->uniform4f(binding.texTransformLocation, 0, 0, m_ioSurfaceWidth, m_ioSurfaceHeight));
-        layerRenderer->drawTexturedQuad(drawTransform(), bounds().width(), bounds().height(), drawOpacity(), layerRenderer->sharedGeometryQuad(),
-                                        binding.matrixLocation,
-                                        binding.alphaLocation,
-                                        -1);
-        GLC(context, context->bindTexture(Extensions3D::TEXTURE_RECTANGLE_ARB, 0));
-    } else {
-        TexStretchPluginProgramBinding binding;
-        if (m_flipped)
-            binding.set(layerRenderer->pluginLayerProgramFlip());
-        else
-            binding.set(layerRenderer->pluginLayerProgram());
-
-        GraphicsContext3D* context = layerRenderer->context();
-        GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0));
-        GLC(context, context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId));
-
-        // FIXME: setting the texture parameters every time is redundant. Move this code somewhere
-        // where it will only happen once per texture.
-        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));
-        GLC(context, context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE));
-        GLC(context, context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE));
-
-        GLC(context, context->useProgram(binding.programId));
-        GLC(context, context->uniform1i(binding.samplerLocation, 0));
-        GLC(context, context->uniform2f(binding.offsetLocation, m_uvRect.x(), m_uvRect.y()));
-        GLC(context, context->uniform2f(binding.scaleLocation, m_uvRect.width(), m_uvRect.height()));
-        layerRenderer->drawTexturedQuad(drawTransform(), bounds().width(), bounds().height(), drawOpacity(), layerRenderer->sharedGeometryQuad(),
-                                        binding.matrixLocation,
-                                        binding.alphaLocation,
-                                        -1);
-    }
 }
 
 void CCPluginLayerImpl::appendQuads(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState)
 {
     IntRect quadRect(IntPoint(), bounds());
-    quadList.append(CCPluginDrawQuad::create(sharedQuadState, quadRect, this));
+    quadList.append(CCPluginDrawQuad::create(sharedQuadState, quadRect, m_uvRect, m_textureId, m_flipped, m_ioSurfaceWidth, m_ioSurfaceHeight, m_ioSurfaceTextureId));
 }
 
 void CCPluginLayerImpl::dumpLayerProperties(TextStream& ts, int indent) const

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginLayerImpl.h (106606 => 106607)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginLayerImpl.h	2012-02-03 01:01:59 UTC (rev 106606)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCPluginLayerImpl.h	2012-02-03 01:35:29 UTC (rev 106607)
@@ -41,6 +41,7 @@
     }
     virtual ~CCPluginLayerImpl();
 
+    virtual void willDraw(LayerRendererChromium*);
     virtual void appendQuads(CCQuadList&, const CCSharedQuadState*);
 
     typedef ProgramBinding<VertexShaderPosTexStretch, FragmentShaderRGBATexAlpha> Program;
@@ -48,8 +49,6 @@
     typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexRectAlpha> TexRectProgram;
     typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexRectFlipAlpha> TexRectProgramFlip;
 
-    virtual void draw(LayerRendererChromium*);
-
     virtual void dumpLayerProperties(TextStream&, int indent) const;
 
     void setTextureId(unsigned id) { m_textureId = id; }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to