1a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard/* 2a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Copyright 2010, The Android Open Source Project 3a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 4a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Redistribution and use in source and binary forms, with or without 5a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * modification, are permitted provided that the following conditions 6a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * are met: 7a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions of source code must retain the above copyright 8a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer. 9a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions in binary form must reproduce the above copyright 10a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer in the 11a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * documentation and/or other materials provided with the distribution. 12a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 13a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard */ 25a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 26594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#define LOG_TAG "TileTexture" 27d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik#define LOG_NDEBUG 1 28d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik 29a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "config.h" 30594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "TileTexture.h" 318c3b4386c279f644e5e9d2c5769fe5a43c6cd0caNicolas Roard 32d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik#include "AndroidLog.h" 33594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "Tile.h" 34da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#include "ClassTracker.h" 35a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu#include "DrawQuadData.h" 36a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "GLUtils.h" 37594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "GLWebViewState.h" 38594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "TextureOwner.h" 398c3b4386c279f644e5e9d2c5769fe5a43c6cd0caNicolas Roard#include "TilesManager.h" 40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 41a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore { 42a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 43594c6b805969c2673c84d1d1d1a3556ce376ac7aChris CraikTileTexture::TileTexture(uint32_t w, uint32_t h) 4462ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu : m_owner(0) 458abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu , m_isPureColor(false) 46a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 47ac45fd040af509d8cc3470ad7f8dcdfe459d5c7cNicolas Roard m_size.set(w, h); 482986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik m_ownTextureId = 0; 497c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 50da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#ifdef DEBUG_COUNT 51594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik ClassTracker::instance()->increment("TileTexture"); 52da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#endif 53e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard} 54e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard 55594c6b805969c2673c84d1d1d1a3556ce376ac7aChris CraikTileTexture::~TileTexture() 56a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 57da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#ifdef DEBUG_COUNT 58594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik ClassTracker::instance()->decrement("TileTexture"); 59da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#endif 60a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 61a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 62594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid TileTexture::requireGLTexture() 632986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik{ 642986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik if (!m_ownTextureId) 65594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik m_ownTextureId = GLUtils::createTileGLTexture(m_size.width(), m_size.height()); 662986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik} 672986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik 68594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid TileTexture::discardGLTexture() 692986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik{ 702986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik if (m_ownTextureId) 712986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik GLUtils::deleteTexture(&m_ownTextureId); 72f6a40880028cf495025747229c627f42e25acc66Chris Craik 733a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik if (m_owner) { 743a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik // clear both Tile->Texture and Texture->Tile links 753a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik m_owner->removeTexture(this); 763a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik release(m_owner); 773a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik } 782986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik} 792986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik 8064d72d82692e48f595e7a31ac2a1680f11d9186bChris Craikbool TileTexture::acquire(TextureOwner* owner) 81a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 82530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik if (m_owner == owner) 83a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger return true; 841eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger 8564d72d82692e48f595e7a31ac2a1680f11d9186bChris Craik return setOwner(owner); 86211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard} 87211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard 8864d72d82692e48f595e7a31ac2a1680f11d9186bChris Craikbool TileTexture::setOwner(TextureOwner* owner) 89211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard{ 9062ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu bool proceed = true; 9162ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu if (m_owner && m_owner != owner) 9262ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu proceed = m_owner->removeTexture(this); 9362ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu 9462ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu if (proceed) { 9562ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu m_owner = owner; 9662ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu return true; 977f124a5e488ed4d4af51f2f535b740c5dac37033Nicolas Roard } 9862ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu 997f124a5e488ed4d4af51f2f535b740c5dac37033Nicolas Roard return false; 100a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 101a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 102594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikbool TileTexture::release(TextureOwner* owner) 10390455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger{ 104d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik ALOGV("texture %p releasing tile %p, m_owner %p", this, owner, m_owner); 105439cfed476441572caa4206a622e3ef3c188798bNicolas Roard if (m_owner != owner) 106439cfed476441572caa4206a622e3ef3c188798bNicolas Roard return false; 107439cfed476441572caa4206a622e3ef3c188798bNicolas Roard 108530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik m_owner = 0; 109439cfed476441572caa4206a622e3ef3c188798bNicolas Roard return true; 11090455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger} 11190455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger 112594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid TileTexture::transferComplete() 1133c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard{ 114f6a40880028cf495025747229c627f42e25acc66Chris Craik if (m_owner) { 115594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik Tile* owner = static_cast<Tile*>(m_owner); 116f6a40880028cf495025747229c627f42e25acc66Chris Craik owner->backTextureTransfer(); 117f8f42bbda64a56cfd5ab48a274020d4efc9a5594Chris Craik } else 118d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik ALOGE("ERROR: owner missing after transfer of texture %p", this); 11967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard} 12067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 121594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid TileTexture::drawGL(bool isLayer, const SkRect& rect, float opacity, 122a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu const TransformationMatrix* transform, 12332ce41e0241790f20e63cafea4d3c1db87423eecChris Craik bool forceBlending, bool usePointSampling, 124485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu const FloatRect& fillPortion) 125309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu{ 126309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu ShaderProgram* shader = TilesManager::instance()->shader(); 127a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu 128a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu if (isLayer && !transform) { 129a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu ALOGE("ERROR: Missing tranform for layers!"); 130a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu return; 131a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu } 132a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu 133a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu // For base layer, we just follow the forceBlending, otherwise, blending is 134a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu // always turned on. 135a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu // TODO: Don't blend tiles if they are fully opaque. 1363efc67e0caf0b63fe0350d6896d2cbc08661f5d7Teng-Hui Zhu bool useBlending = forceBlending || isLayer; 137a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu DrawQuadData commonData(isLayer ? LayerQuad : BaseQuad, transform, &rect, 13832ce41e0241790f20e63cafea4d3c1db87423eecChris Craik opacity, useBlending, fillPortion); 139a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu if (isPureColor()) { 140a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu PureColorQuadData data(commonData, pureColor()); 141a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu shader->drawQuad(&data); 142309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu } else { 1433efc67e0caf0b63fe0350d6896d2cbc08661f5d7Teng-Hui Zhu GLint filter = usePointSampling ? GL_NEAREST : GL_LINEAR; 1443efc67e0caf0b63fe0350d6896d2cbc08661f5d7Teng-Hui Zhu TextureQuadData data(commonData, m_ownTextureId, GL_TEXTURE_2D, filter); 145a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu shader->drawQuad(&data); 146309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu } 147309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu} 148309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu 149a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore 150