diff options
author | Iain Merrick <husky@google.com> | 2010-09-13 16:35:48 +0100 |
---|---|---|
committer | Iain Merrick <husky@google.com> | 2010-09-16 12:10:42 +0100 |
commit | 5abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306 (patch) | |
tree | ddce1aa5e3b6967a69691892e500897558ff8ab6 /WebCore/platform/graphics/gpu/Texture.cpp | |
parent | 12bec63ec71e46baba27f0bd9bd9d8067683690a (diff) | |
download | external_webkit-5abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306.zip external_webkit-5abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306.tar.gz external_webkit-5abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306.tar.bz2 |
Merge WebKit at r67178 : Initial merge by git.
Change-Id: I57e01163b6866cb029cdadf405a0394a3918bc18
Diffstat (limited to 'WebCore/platform/graphics/gpu/Texture.cpp')
-rw-r--r-- | WebCore/platform/graphics/gpu/Texture.cpp | 68 |
1 files changed, 48 insertions, 20 deletions
diff --git a/WebCore/platform/graphics/gpu/Texture.cpp b/WebCore/platform/graphics/gpu/Texture.cpp index 557603c..95436ba 100644 --- a/WebCore/platform/graphics/gpu/Texture.cpp +++ b/WebCore/platform/graphics/gpu/Texture.cpp @@ -32,10 +32,15 @@ #include "Texture.h" +#include "FloatRect.h" #include "GraphicsContext3D.h" #include "IntRect.h" + +#include <algorithm> #include <wtf/OwnArrayPtr.h> +using namespace std; + namespace WebCore { @@ -81,7 +86,6 @@ PassRefPtr<Texture> Texture::create(GraphicsContext3D* context, Format format, i { int maxTextureSize = 0; context->getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &maxTextureSize); - TilingData tiling(maxTextureSize, width, height, true); int numTiles = tiling.numTiles(); @@ -120,15 +124,18 @@ static uint32_t* copySubRect(uint32_t* src, int srcX, int srcY, uint32_t* dst, i if (!swizzle && width == srcStride) return srcOffset; - uint32_t* dstPixel = dst; - for (int y = 0; y < height; y++) { - for (int x = 0; x < width ; x++) { - uint32_t pixel = srcOffset[x + y * srcStride]; - if (swizzle) + if (swizzle) { + uint32_t* dstPixel = dst; + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width ; ++x) { + uint32_t pixel = srcOffset[x + y * srcStride]; *dstPixel = pixel & 0xFF00FF00 | ((pixel & 0x00FF0000) >> 16) | ((pixel & 0x000000FF) << 16); - else - *dstPixel = pixel; - dstPixel++; + dstPixel++; + } + } + } else { + for (int y = 0; y < height; ++y) { + memcpy(dst + y * width, srcOffset + y * srcStride, 4 * width); } } return dst; @@ -136,6 +143,11 @@ static uint32_t* copySubRect(uint32_t* src, int srcX, int srcY, uint32_t* dst, i void Texture::load(void* pixels) { + updateSubRect(pixels, IntRect(0, 0, m_tiles.totalSizeX(), m_tiles.totalSizeY())); +} + +void Texture::updateSubRect(void* pixels, const IntRect updateRect) +{ uint32_t* pixels32 = static_cast<uint32_t*>(pixels); unsigned int glFormat = 0; unsigned int glType = 0; @@ -145,26 +157,42 @@ void Texture::load(void* pixels) ASSERT(glFormat == GraphicsContext3D::RGBA && glType == GraphicsContext3D::UNSIGNED_BYTE); // FIXME: This could use PBO's to save doing an extra copy here. } - OwnArrayPtr<uint32_t> tempBuff(new uint32_t[m_tiles.maxTextureSize() * m_tiles.maxTextureSize()]); + int tempBuffSize = // Temporary buffer size is the smaller of the max texture size or the updateRect + min(m_tiles.maxTextureSize(), m_tiles.borderTexels() + updateRect.width()) * + min(m_tiles.maxTextureSize(), m_tiles.borderTexels() + updateRect.height()); + OwnArrayPtr<uint32_t> tempBuff(new uint32_t[tempBuffSize]); + + for (int tile = 0; tile < m_tiles.numTiles(); tile++) { + // Intersect with tile + IntRect tileBoundsWithBorder = m_tiles.tileBoundsWithBorder(tile); - for (int i = 0; i < m_tiles.numTiles(); i++) { - IntRect tileBoundsWithBorder = m_tiles.tileBoundsWithBorder(i); + IntRect updateRectIntersected = updateRect; + updateRectIntersected.intersect(tileBoundsWithBorder); + IntRect dstRect = updateRectIntersected; + dstRect.move(-tileBoundsWithBorder.x(), -tileBoundsWithBorder.y()); + + if (updateRectIntersected.isEmpty()) + continue; + + // Copy sub rectangle out of larger pixel data uint32_t* uploadBuff = 0; if (swizzle) { uploadBuff = copySubRect<true>( - pixels32, tileBoundsWithBorder.x(), tileBoundsWithBorder.y(), - tempBuff.get(), tileBoundsWithBorder.width(), tileBoundsWithBorder.height(), m_tiles.totalSizeX()); + pixels32, updateRectIntersected.x(), updateRectIntersected.y(), + tempBuff.get(), updateRectIntersected.width(), updateRectIntersected.height(), m_tiles.totalSizeX()); } else { uploadBuff = copySubRect<false>( - pixels32, tileBoundsWithBorder.x(), tileBoundsWithBorder.y(), - tempBuff.get(), tileBoundsWithBorder.width(), tileBoundsWithBorder.height(), m_tiles.totalSizeX()); + pixels32, updateRectIntersected.x(), updateRectIntersected.y(), + tempBuff.get(), updateRectIntersected.width(), updateRectIntersected.height(), m_tiles.totalSizeX()); } - m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_tileTextureIds->at(i)); - m_context->texSubImage2D(GraphicsContext3D::TEXTURE_2D, 0, 0, 0, - tileBoundsWithBorder.width(), - tileBoundsWithBorder.height(), glFormat, glType, uploadBuff); + m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_tileTextureIds->at(tile)); + m_context->texSubImage2D(GraphicsContext3D::TEXTURE_2D, 0 /* level */, + dstRect.x(), + dstRect.y(), + updateRectIntersected.width(), + updateRectIntersected.height(), glFormat, glType, uploadBuff); } } |