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