diff options
Diffstat (limited to 'backends/graphics/opengl')
-rw-r--r-- | backends/graphics/opengl/gltexture.cpp | 54 | ||||
-rw-r--r-- | backends/graphics/opengl/opengl-graphics.cpp | 14 |
2 files changed, 52 insertions, 16 deletions
diff --git a/backends/graphics/opengl/gltexture.cpp b/backends/graphics/opengl/gltexture.cpp index ce69dc4aab..ca674563df 100644 --- a/backends/graphics/opengl/gltexture.cpp +++ b/backends/graphics/opengl/gltexture.cpp @@ -108,9 +108,18 @@ void GLTexture::allocBuffer(GLuint w, GLuint h) { _realWidth = w; _realHeight = h; - if (w <= _textureWidth && h <= _textureHeight && !_refresh) - // Already allocated a sufficiently large buffer - return; + if (!_refresh) { + if (npot_supported && _filter == GL_LINEAR) { + // Check if we already allocated a correctly-sized buffer + // This is so we don't need to duplicate the last row/column + if (w == _textureWidth && h == _textureHeight) + return; + } else { + // Check if we already have a large enough buffer + if (w <= _textureWidth && h <= _textureHeight) + return; + } + } if (npot_supported) { _textureWidth = w; @@ -151,12 +160,37 @@ void GLTexture::updateBuffer(const void *buf, int pitch, GLuint x, GLuint y, GLu } else { // Update the texture row by row const byte *src = (const byte *)buf; + GLuint curY = y; + GLuint height = h; do { - glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, + glTexSubImage2D(GL_TEXTURE_2D, 0, x, curY, w, 1, _glFormat, _glType, src); CHECK_GL_ERROR(); - ++y; + curY++; src += pitch; - } while (--h); + } while (--height); + } + + // If we're in linear filter mode, repeat the last row/column if the real dimensions + // doesn't match the texture dimensions. + if (_filter == GL_LINEAR) { + if (_realWidth != _textureWidth && x + w == _realWidth) { + const byte *src = (const byte *)buf + (w - 1) * _bytesPerPixel; + GLuint curY = y; + GLuint height = h; + + do { + glTexSubImage2D(GL_TEXTURE_2D, 0, x + w, + curY, 1, 1, _glFormat, _glType, src); CHECK_GL_ERROR(); + + curY++; + src += pitch; + } while (--height); + } + + if (_realHeight != _textureHeight && y + h == _realHeight) { + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y + h, + w, 1, _glFormat, _glType, (const byte *)buf + pitch * (h - 1)); CHECK_GL_ERROR(); + } } } @@ -177,10 +211,10 @@ void GLTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { // Calculate the screen rect where the texture will be drawn const GLshort vertices[] = { - x, y, - x + w, y, - x, y + h, - x + w, y + h, + x, y, + (GLshort)(x + w), y, + x, (GLshort)(y + h), + (GLshort)(x + w), (GLshort)(y + h), }; glVertexPointer(2, GL_SHORT, 0, vertices); CHECK_GL_ERROR(); diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp index dce902d894..48e2663d44 100644 --- a/backends/graphics/opengl/opengl-graphics.cpp +++ b/backends/graphics/opengl/opengl-graphics.cpp @@ -902,7 +902,7 @@ void OpenGLGraphicsManager::getGLPixelFormat(Graphics::PixelFormat pixelFormat, bpp = 4; intFormat = GL_RGBA; glFormat = GL_RGBA; - gltype = GL_UNSIGNED_BYTE; + gltype = GL_UNSIGNED_INT_8_8_8_8; } else if (pixelFormat == Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0)) { // RGB888 bpp = 3; intFormat = GL_RGB; @@ -918,11 +918,6 @@ void OpenGLGraphicsManager::getGLPixelFormat(Graphics::PixelFormat pixelFormat, intFormat = GL_RGBA; glFormat = GL_RGBA; gltype = GL_UNSIGNED_SHORT_5_5_5_1; - } else if (pixelFormat == Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)) { // RGB555 - bpp = 2; - intFormat = GL_RGB; - glFormat = GL_BGRA; - gltype = GL_UNSIGNED_SHORT_1_5_5_5_REV; } else if (pixelFormat == Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0)) { // RGBA4444 bpp = 2; intFormat = GL_RGBA; @@ -936,6 +931,13 @@ void OpenGLGraphicsManager::getGLPixelFormat(Graphics::PixelFormat pixelFormat, glFormat = GL_RGB; gltype = GL_UNSIGNED_BYTE; #ifndef USE_GLES + } else if (pixelFormat == Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)) { // RGB555 + // GL_BGRA does not exist in every GLES implementation so should not be configured if + // USE_GLES is set. + bpp = 2; + intFormat = GL_RGB; + glFormat = GL_BGRA; + gltype = GL_UNSIGNED_SHORT_1_5_5_5_REV; } else if (pixelFormat == Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24)) { // ARGB8888 bpp = 4; intFormat = GL_RGBA; |