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 "WebGLLayerChromium.h"
365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "GraphicsContext3D.h"
385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "LayerRendererChromium.h"
395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricknamespace WebCore {
415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickPassRefPtr<WebGLLayerChromium> WebGLLayerChromium::create(GraphicsLayerChromium* owner)
435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return adoptRef(new WebGLLayerChromium(owner));
455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickWebGLLayerChromium::WebGLLayerChromium(GraphicsLayerChromium* owner)
485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    : CanvasLayerChromium(owner)
495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    , m_context(0)
502bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_textureUpdated(false)
515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWebGLLayerChromium::~WebGLLayerChromium()
552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_context && layerRenderer())
572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        layerRenderer()->removeChildContext(m_context);
582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
602bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebGLLayerChromium::updateCompositorResources()
615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
62f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_contentsDirty)
63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
6568513a70bcd92384395513322f1b801e7bf9c729Steve Block    GraphicsContext3D* rendererContext = layerRendererContext();
665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ASSERT(m_context);
675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (m_textureChanged) {
6868513a70bcd92384395513322f1b801e7bf9c729Steve Block        rendererContext->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId);
695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // Set the min-mag filters to linear and wrap modes to GL_CLAMP_TO_EDGE
705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // to get around NPOT texture limitations of GLES.
7168513a70bcd92384395513322f1b801e7bf9c729Steve Block        rendererContext->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR);
7268513a70bcd92384395513322f1b801e7bf9c729Steve Block        rendererContext->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR);
7368513a70bcd92384395513322f1b801e7bf9c729Steve Block        rendererContext->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
7468513a70bcd92384395513322f1b801e7bf9c729Steve Block        rendererContext->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_textureChanged = false;
765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // Update the contents of the texture used by the compositor.
782bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_contentsDirty && m_textureUpdated) {
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // prepareTexture copies the contents of the off-screen render target into the texture
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // used by the compositor.
812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        //
825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_context->prepareTexture();
832bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_context->markLayerComposited();
845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_contentsDirty = false;
852bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_textureUpdated = false;
865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
892bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebGLLayerChromium::setTextureUpdated()
902bde8e466a4451c7319e3a072d118917957d6554Steve Block{
912bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_textureUpdated = true;
922bde8e466a4451c7319e3a072d118917957d6554Steve Block}
932bde8e466a4451c7319e3a072d118917957d6554Steve Block
945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid WebGLLayerChromium::setContext(const GraphicsContext3D* context)
955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_context != context && layerRenderer()) {
972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_context)
982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            layerRenderer()->removeChildContext(m_context);
992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (context)
1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            layerRenderer()->addChildContext(const_cast<GraphicsContext3D*>(context));
1012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    m_context = const_cast<GraphicsContext3D*>(context);
1045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned int textureId = m_context->platformTexture();
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (textureId != m_textureId) {
1075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_textureChanged = true;
1082bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_textureUpdated = true;
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    m_textureId = textureId;
11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_premultipliedAlpha = m_context->getContextAttributes().premultipliedAlpha;
1125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebGLLayerChromium::setLayerRenderer(LayerRendererChromium* newLayerRenderer)
1152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (layerRenderer() != newLayerRenderer) {
1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_context) {
1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (layerRenderer())
1192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                layerRenderer()->removeChildContext(m_context);
1202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (newLayerRenderer)
1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                newLayerRenderer->addChildContext(m_context);
1222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        LayerChromium::setLayerRenderer(newLayerRenderer);
1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif // USE(ACCELERATED_COMPOSITING)
130