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