15abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick/*
25abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * Copyright (C) 2010 Google Inc. All rights reserved.
35abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *
45abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * Redistribution and use in source and binary forms, with or without
55abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * modification, are permitted provided that the following conditions are
65abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * met:
75abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *
85abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *     * Redistributions of source code must retain the above copyright
95abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * notice, this list of conditions and the following disclaimer.
105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *     * Redistributions in binary form must reproduce the above
115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * copyright notice, this list of conditions and the following disclaimer
125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * in the documentation and/or other materials provided with the
135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * distribution.
145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *     * Neither the name of Google Inc. nor the names of its
155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * contributors may be used to endorse or promote products derived from
165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * this software without specific prior written permission.
175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *
185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick */
305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "config.h"
325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if USE(ACCELERATED_COMPOSITING)
345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "Canvas2DLayerChromium.h"
365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "DrawingBuffer.h"
3868513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "GraphicsContext3D.h"
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "LayerRendererChromium.h"
405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricknamespace WebCore {
425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickPassRefPtr<Canvas2DLayerChromium> Canvas2DLayerChromium::create(DrawingBuffer* drawingBuffer, GraphicsLayerChromium* owner)
445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return adoptRef(new Canvas2DLayerChromium(drawingBuffer, owner));
465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickCanvas2DLayerChromium::Canvas2DLayerChromium(DrawingBuffer* drawingBuffer, GraphicsLayerChromium* owner)
495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    : CanvasLayerChromium(owner)
505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    , m_drawingBuffer(drawingBuffer)
515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickCanvas2DLayerChromium::~Canvas2DLayerChromium()
555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (m_textureId)
5768513a70bcd92384395513322f1b801e7bf9c729Steve Block        layerRendererContext()->deleteTexture(m_textureId);
582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_drawingBuffer && layerRenderer())
592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D().get());
605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
622bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid Canvas2DLayerChromium::updateCompositorResources()
635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_contentsDirty || !m_drawingBuffer)
655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return;
665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (m_textureChanged) { // We have to generate a new backing texture.
6768513a70bcd92384395513322f1b801e7bf9c729Steve Block        GraphicsContext3D* context = layerRendererContext();
685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (m_textureId)
6968513a70bcd92384395513322f1b801e7bf9c729Steve Block            context->deleteTexture(m_textureId);
7068513a70bcd92384395513322f1b801e7bf9c729Steve Block        m_textureId = context->createTexture();
7168513a70bcd92384395513322f1b801e7bf9c729Steve Block        context->activeTexture(GraphicsContext3D::TEXTURE0);
7268513a70bcd92384395513322f1b801e7bf9c729Steve Block        context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId);
735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        IntSize size = m_drawingBuffer->size();
74f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        context->texImage2DResourceSafe(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::RGBA, size.width(), size.height(), 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE);
7568513a70bcd92384395513322f1b801e7bf9c729Steve Block        // Set the min-mag filters to linear and wrap modes to GraphicsContext3D::CLAMP_TO_EDGE
765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // to get around NPOT texture limitations of GLES.
7768513a70bcd92384395513322f1b801e7bf9c729Steve Block        context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR);
7868513a70bcd92384395513322f1b801e7bf9c729Steve Block        context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR);
7968513a70bcd92384395513322f1b801e7bf9c729Steve Block        context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
8068513a70bcd92384395513322f1b801e7bf9c729Steve Block        context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_textureChanged = false;
8268513a70bcd92384395513322f1b801e7bf9c729Steve Block        // FIXME: The finish() here is required because we have to make sure that the texture created in this
835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // context (the compositor context) is actually created by the service side before the child context
8468513a70bcd92384395513322f1b801e7bf9c729Steve Block        // attempts to use it (in publishToPlatformLayer).  finish() is currently the only call with strong
855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // enough semantics to promise this, but is actually much stronger.  Ideally we'd do something like
865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // inserting a fence here and waiting for it before trying to publish.
8768513a70bcd92384395513322f1b801e7bf9c729Steve Block        context->finish();
885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // Update the contents of the texture used by the compositor.
905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (m_contentsDirty) {
915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_drawingBuffer->publishToPlatformLayer();
925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_contentsDirty = false;
935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid Canvas2DLayerChromium::setTextureChanged()
975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    m_textureChanged = true;
995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickunsigned Canvas2DLayerChromium::textureId() const
1025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return m_textureId;
1045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid Canvas2DLayerChromium::setDrawingBuffer(DrawingBuffer* drawingBuffer)
1075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (drawingBuffer != m_drawingBuffer) {
1092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_drawingBuffer && layerRenderer())
1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D().get());
1112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_drawingBuffer = drawingBuffer;
1135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_textureChanged = true;
1142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (drawingBuffer && layerRenderer())
1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            layerRenderer()->addChildContext(m_drawingBuffer->graphicsContext3D().get());
1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid Canvas2DLayerChromium::setLayerRenderer(LayerRendererChromium* newLayerRenderer)
1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (layerRenderer() != newLayerRenderer) {
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_drawingBuffer->graphicsContext3D()) {
1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (layerRenderer())
1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D().get());
1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (newLayerRenderer)
1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                newLayerRenderer->addChildContext(m_drawingBuffer->graphicsContext3D().get());
1282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        LayerChromium::setLayerRenderer(newLayerRenderer);
1315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
1325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif // USE(ACCELERATED_COMPOSITING)
136