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; }