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