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