Changeset 105529 in webkit


Ignore:
Timestamp:
Jan 20, 2012 11:23:16 AM (12 years ago)
Author:
commit-queue@webkit.org
Message:

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.

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:
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r105524 r105529  
     12012-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
    1262012-01-19  Abhishek Arya  <inferno@chromium.org>
    227
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp

    r105311 r105529  
    670670void LayerRendererChromium::drawCanvasQuad(const CCCanvasDrawQuad* quad)
    671671{
    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));
    674693}
    675694
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasDrawQuad.cpp

    r105311 r105529  
    3030namespace WebCore {
    3131
    32 PassOwnPtr<CCCanvasDrawQuad> CCCanvasDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer)
     32PassOwnPtr<CCCanvasDrawQuad> CCCanvasDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, unsigned textureId, bool hasAlpha, bool premultipliedAlpha)
    3333{
    34     return adoptPtr(new CCCanvasDrawQuad(sharedQuadState, quadRect, layer));
     34    return adoptPtr(new CCCanvasDrawQuad(sharedQuadState, quadRect, textureId, hasAlpha, premultipliedAlpha));
    3535}
    3636
    37 CCCanvasDrawQuad::CCCanvasDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer)
     37CCCanvasDrawQuad::CCCanvasDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, unsigned textureId, bool hasAlpha, bool premultipliedAlpha)
    3838    : CCDrawQuad(sharedQuadState, CCDrawQuad::CanvasContent, quadRect)
    39     , m_layer(layer)
     39    , m_textureId(textureId)
     40    , m_hasAlpha(hasAlpha)
     41    , m_premultipliedAlpha(premultipliedAlpha)
    4042{
    41     ASSERT(m_layer);
    4243}
    4344
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasDrawQuad.h

    r105311 r105529  
    3636    WTF_MAKE_NONCOPYABLE(CCCanvasDrawQuad);
    3737public:
    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);
    3939
    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; }
    4143
    4244private:
    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;
    4650};
    4751
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp

    r105311 r105529  
    5050}
    5151
    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 allocated
    65         // 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 
    8152void CCCanvasLayerImpl::appendQuads(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState)
    8253{
    8354    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));
    8556}
    8657
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.h

    r105311 r105529  
    4545    typedef ProgramBinding<VertexShaderPosTex, FragmentShaderRGBATexFlipAlpha> Program;
    4646
    47     virtual void draw(LayerRendererChromium*);
    48 
    4947    virtual void dumpLayerProperties(TextStream&, int indent) const;
    5048
Note: See TracChangeset for help on using the changeset viewer.