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
+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.
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)
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);
}
}
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;
};
}
{
}
-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
typedef ProgramBinding<VertexShaderPosTex, FragmentShaderRGBATexFlipAlpha> Program;
- virtual void draw(LayerRendererChromium*);
-
virtual void dumpLayerProperties(TextStream&, int indent) const;
unsigned textureId() const { return m_textureId; }