Skip to content

Commit

Permalink
OPENGL: Properly setup pixel data alignment.
Browse files Browse the repository at this point in the history
If we do not do this, we might end up with a default alignment of 4, which will
fail (as in the graphics will be messed up) in case the screen resolution is
not divisible by 4.

Thanks to digitall for noticing this problem and finding out about
GL_UNPACK_ALIGNMENT.
  • Loading branch information
Johannes Schickel committed Feb 24, 2011
1 parent e04d983 commit f5e10f3
Showing 1 changed file with 13 additions and 2 deletions.
15 changes: 13 additions & 2 deletions backends/graphics/opengl/opengl-graphics.cpp
Expand Up @@ -341,9 +341,9 @@ void OpenGLGraphicsManager::copyRectToScreen(const byte *buf, int pitch, int x,

// Copy buffer data to game screen internal buffer
const byte *src = buf;
byte *dst = (byte *)_screenData.pixels + y * _screenData.pitch;
byte *dst = (byte *)_screenData.pixels + y * _screenData.pitch + x * _screenData.bytesPerPixel;
for (int i = 0; i < h; i++) {
memcpy(dst + x * _screenData.bytesPerPixel, src, w * _screenData.bytesPerPixel);
memcpy(dst, src, w * _screenData.bytesPerPixel);
src += pitch;
dst += _screenData.pitch;
}
Expand Down Expand Up @@ -1063,6 +1063,8 @@ void OpenGLGraphicsManager::loadTextures() {
delete _gameTexture;
#endif

uint gameScreenBPP = 0;

if (!_gameTexture) {
byte bpp;
GLenum intformat;
Expand All @@ -1073,6 +1075,7 @@ void OpenGLGraphicsManager::loadTextures() {
#else
getGLPixelFormat(Graphics::PixelFormat::createFormatCLUT8(), bpp, intformat, format, type);
#endif
gameScreenBPP = bpp;
_gameTexture = new GLTexture(bpp, intformat, format, type);
} else
_gameTexture->refresh();
Expand Down Expand Up @@ -1119,6 +1122,14 @@ void OpenGLGraphicsManager::loadTextures() {
_overlayNeedsRedraw = true;
_cursorNeedsRedraw = true;

// We need to setup a proper unpack alignment value here, else we will
// get problems with the texture updates, in case the surface data is
// not properly aligned.
// For now we use the gcd of the game screen format and 2, since 2 is
// the BPP value for the overlay and the OSD.
if (gameScreenBPP)
glPixelStorei(GL_UNPACK_ALIGNMENT, Common::gcd<uint>(gameScreenBPP, 2));

#ifdef USE_OSD
if (!_osdTexture)
_osdTexture = new GLTexture(2, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
Expand Down

0 comments on commit f5e10f3

Please sign in to comment.