10617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen/*
20617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * Copyright (c) 2010, Google Inc. All rights reserved.
30617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *
40617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * Redistribution and use in source and binary forms, with or without
50617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * modification, are permitted provided that the following conditions are
60617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * met:
70617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *
80617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *     * Redistributions of source code must retain the above copyright
90617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * notice, this list of conditions and the following disclaimer.
100617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *     * Redistributions in binary form must reproduce the above
110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * copyright notice, this list of conditions and the following disclaimer
120617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * in the documentation and/or other materials provided with the
130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * distribution.
140617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *     * Neither the name of Google Inc. nor the names of its
150617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * contributors may be used to endorse or promote products derived from
160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * this software without specific prior written permission.
170617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *
180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
220617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
230617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
270617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen */
300617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
310617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "config.h"
320617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
33a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(ACCELERATED_2D_CANVAS)
34a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "Texture.h"
360617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "Extensions3D.h"
385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "FloatRect.h"
39dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "GraphicsContext3D.h"
40f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "IntRect.h"
415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include <algorithm>
430617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include <wtf/OwnArrayPtr.h>
440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickusing namespace std;
465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
470617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsennamespace WebCore {
480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
49f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenTexture::Texture(GraphicsContext3D* context, PassOwnPtr<Vector<unsigned int> > tileTextureIds, Format format, int width, int height, int maxTextureSize)
51dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    : m_context(context)
520617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    , m_format(format)
53f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    , m_tiles(maxTextureSize, width, height, true)
54f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    , m_tileTextureIds(tileTextureIds)
550617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
560617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
570617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenTexture::~Texture()
590617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
60f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    for (unsigned int i = 0; i < m_tileTextureIds->size(); i++)
61f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        m_context->deleteTexture(m_tileTextureIds->at(i));
620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic void convertFormat(GraphicsContext3D* context, Texture::Format format, unsigned int* glFormat, unsigned int* glType, bool* swizzle)
650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    *swizzle = false;
670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    switch (format) {
685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    case Texture::RGBA8:
69dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        *glFormat = GraphicsContext3D::RGBA;
70dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        *glType = GraphicsContext3D::UNSIGNED_BYTE;
710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        break;
725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    case Texture::BGRA8:
7328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (context->getExtensions()->supports("GL_EXT_texture_format_BGRA8888")) {
7428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            *glFormat = Extensions3D::BGRA_EXT;
75f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            *glType = GraphicsContext3D::UNSIGNED_BYTE;
76f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else {
77f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            *glFormat = GraphicsContext3D::RGBA;
78f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            *glType = GraphicsContext3D::UNSIGNED_BYTE;
79f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            *swizzle = true;
80f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        }
810617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        break;
820617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    default:
83f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        ASSERT_NOT_REACHED();
840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        break;
850617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    }
860617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
870617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<Texture> Texture::create(GraphicsContext3D* context, Format format, int width, int height)
89f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
90f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    int maxTextureSize = 0;
91f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    context->getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &maxTextureSize);
92f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    TilingData tiling(maxTextureSize, width, height, true);
93f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    int numTiles = tiling.numTiles();
94f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
95f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    OwnPtr<Vector<unsigned int> > textureIds(new Vector<unsigned int>(numTiles));
96f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    textureIds->fill(0, numTiles);
97f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
98f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    for (int i = 0; i < numTiles; i++) {
99f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        int textureId = context->createTexture();
100f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (!textureId) {
101f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            for (int i = 0; i < numTiles; i++)
102f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                context->deleteTexture(textureIds->at(i));
103f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return 0;
104f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        }
105f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        textureIds->at(i) = textureId;
106f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
107f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        IntRect tileBoundsWithBorder = tiling.tileBoundsWithBorder(i);
108f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        unsigned int glFormat = 0;
110f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        unsigned int glType = 0;
111f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        bool swizzle;
112f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        convertFormat(context, format, &glFormat, &glType, &swizzle);
113f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        context->bindTexture(GraphicsContext3D::TEXTURE_2D, textureId);
114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        context->texImage2DResourceSafe(GraphicsContext3D::TEXTURE_2D, 0, glFormat,
115f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                        tileBoundsWithBorder.width(),
116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                        tileBoundsWithBorder.height(),
117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                        0, glFormat, glType);
118f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
1195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return adoptRef(new Texture(context, textureIds.leakPtr(), format, width, height, maxTextureSize));
120f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
121f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
122f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate <bool swizzle>
123f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickstatic uint32_t* copySubRect(uint32_t* src, int srcX, int srcY, uint32_t* dst, int width, int height, int srcStride)
124f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
125f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    uint32_t* srcOffset = src + srcX + srcY * srcStride;
126f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
127f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (!swizzle && width == srcStride)
128f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return srcOffset;
129f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (swizzle) {
1315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        uint32_t* dstPixel = dst;
1325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        for (int y = 0; y < height; ++y) {
1335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            for (int x = 0; x < width ; ++x) {
1345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                uint32_t pixel = srcOffset[x + y * srcStride];
135bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                *dstPixel = (pixel & 0xFF00FF00) | ((pixel & 0x00FF0000) >> 16) | ((pixel & 0x000000FF) << 16);
1365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                dstPixel++;
1375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
1385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
1395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    } else {
1405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        for (int y = 0; y < height; ++y) {
1415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            memcpy(dst + y * width, srcOffset + y * srcStride, 4 * width);
142f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        }
143f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
144f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return dst;
145f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
146f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid Texture::load(void* pixels)
1480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
1495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    updateSubRect(pixels, IntRect(0, 0, m_tiles.totalSizeX(), m_tiles.totalSizeY()));
1505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
152f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid Texture::updateSubRect(void* pixels, const IntRect& updateRect)
1535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
154f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    IntRect updateRectSanitized(updateRect);
155f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    updateRectSanitized.intersect(IntRect(0, 0, m_tiles.totalSizeX(), m_tiles.totalSizeY()));
156f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
157f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    uint32_t* pixels32 = static_cast<uint32_t*>(pixels);
1585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned int glFormat = 0;
1595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned int glType = 0;
1600617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    bool swizzle;
161f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    convertFormat(m_context, m_format, &glFormat, &glType, &swizzle);
1620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (swizzle) {
163dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        ASSERT(glFormat == GraphicsContext3D::RGBA && glType == GraphicsContext3D::UNSIGNED_BYTE);
1640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        // FIXME:  This could use PBO's to save doing an extra copy here.
165f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
166f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    int tempBuffSize = // Temporary buffer size is the smaller of the max texture size or the updateRectSanitized
167f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        min(m_tiles.maxTextureSize(), m_tiles.borderTexels() + updateRectSanitized.width()) *
168f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        min(m_tiles.maxTextureSize(), m_tiles.borderTexels() + updateRectSanitized.height());
1692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    OwnArrayPtr<uint32_t> tempBuff = adoptArrayPtr(new uint32_t[tempBuffSize]);
1705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    for (int tile = 0; tile < m_tiles.numTiles(); tile++) {
1725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // Intersect with tile
1735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        IntRect tileBoundsWithBorder = m_tiles.tileBoundsWithBorder(tile);
174f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
175f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        IntRect updateRectIntersected = updateRectSanitized;
1765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        updateRectIntersected.intersect(tileBoundsWithBorder);
177f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        IntRect dstRect = updateRectIntersected;
1795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        dstRect.move(-tileBoundsWithBorder.x(), -tileBoundsWithBorder.y());
1805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (updateRectIntersected.isEmpty())
1825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            continue;
1835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // Copy sub rectangle out of larger pixel data
185f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        uint32_t* uploadBuff = 0;
186f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (swizzle) {
187f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            uploadBuff = copySubRect<true>(
1885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            pixels32, updateRectIntersected.x(), updateRectIntersected.y(),
1895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            tempBuff.get(), updateRectIntersected.width(), updateRectIntersected.height(), m_tiles.totalSizeX());
190f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else {
191f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            uploadBuff = copySubRect<false>(
1925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            pixels32, updateRectIntersected.x(), updateRectIntersected.y(),
1935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            tempBuff.get(), updateRectIntersected.width(), updateRectIntersected.height(), m_tiles.totalSizeX());
1940617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        }
195f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_tileTextureIds->at(tile));
1975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_context->texSubImage2D(GraphicsContext3D::TEXTURE_2D, 0 /* level */,
1985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            dstRect.x(),
1995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            dstRect.y(),
2005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            updateRectIntersected.width(),
2015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            updateRectIntersected.height(), glFormat, glType, uploadBuff);
202f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
2030617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
2040617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
2055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid Texture::bindTile(int tile)
2060617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
207f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_tileTextureIds->at(tile));
208dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR);
209dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR);
210dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
211dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
2120617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
2130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
2140617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
215a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
217