diff options
-rw-r--r-- | backends/platform/android/android.cpp | 4 | ||||
-rw-r--r-- | backends/platform/android/android.h | 4 | ||||
-rw-r--r-- | backends/platform/android/texture.cpp | 90 | ||||
-rw-r--r-- | backends/platform/android/texture.h | 95 |
4 files changed, 95 insertions, 98 deletions
diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index 239ecd4138..43b618d37b 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -326,9 +326,9 @@ void OSystem_Android::initBackend() { initSurface(); initViewport(); - _game_texture = new GLESPaletteTexture(); + _game_texture = new GLESPalette888Texture(); _overlay_texture = new GLES4444Texture(); - _mouse_texture = new GLESPaletteATexture(); + _mouse_texture = new GLESPalette8888Texture(); // renice this thread to boost the audio thread if (setpriority(PRIO_PROCESS, 0, 19) < 0) diff --git a/backends/platform/android/android.h b/backends/platform/android/android.h index bf72f98b01..3ccc84bc7e 100644 --- a/backends/platform/android/android.h +++ b/backends/platform/android/android.h @@ -103,7 +103,7 @@ private: bool _force_redraw; // Game layer - GLESPaletteTexture *_game_texture; + GLESPalette888Texture *_game_texture; int _shake_offset; Common::Rect _focus_rect; @@ -112,7 +112,7 @@ private: bool _show_overlay; // Mouse layer - GLESPaletteATexture *_mouse_texture; + GLESPalette8888Texture *_mouse_texture; Common::Point _mouse_hotspot; int _mouse_targetscale; bool _show_mouse; diff --git a/backends/platform/android/texture.cpp b/backends/platform/android/texture.cpp index 7d87c144c9..f715f7bc66 100644 --- a/backends/platform/android/texture.cpp +++ b/backends/platform/android/texture.cpp @@ -82,7 +82,12 @@ void GLESTexture::initGLExtensions() { } } -GLESTexture::GLESTexture() : +GLESTexture::GLESTexture(byte bytesPerPixel, GLenum glFormat, GLenum glType, + size_t paletteSize) : + _bytesPerPixel(bytesPerPixel), + _glFormat(glFormat), + _glType(glType), + _paletteSize(paletteSize), _texture_width(0), _texture_height(0), _all_dirty(true) @@ -92,7 +97,7 @@ GLESTexture::GLESTexture() : // This all gets reset later in allocBuffer: _surface.w = 0; _surface.h = 0; - _surface.pitch = _texture_width; + _surface.pitch = 0; _surface.pixels = 0; _surface.bytesPerPixel = 0; } @@ -109,7 +114,7 @@ void GLESTexture::release() { void GLESTexture::reinit() { GLCALL(glGenTextures(1, &_texture_name)); - if (paletteSize()) { + if (_paletteSize) { // paletted textures are in a local buffer, don't wipe it initSize(); } else { @@ -132,16 +137,15 @@ void GLESTexture::initSize() { GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); - GLCALL(glTexImage2D(GL_TEXTURE_2D, 0, glFormat(), + GLCALL(glTexImage2D(GL_TEXTURE_2D, 0, _glFormat, _texture_width, _texture_height, - 0, glFormat(), glType(), 0)); + 0, _glFormat, _glType, 0)); } void GLESTexture::allocBuffer(GLuint w, GLuint h) { - int bpp = bytesPerPixel(); _surface.w = w; _surface.h = h; - _surface.bytesPerPixel = bpp; + _surface.bytesPerPixel = _bytesPerPixel; // Already allocated a sufficiently large buffer? if (w <= _texture_width && h <= _texture_height) @@ -155,7 +159,7 @@ void GLESTexture::allocBuffer(GLuint w, GLuint h) { _texture_height = nextHigher2(_surface.h); } - _surface.pitch = _texture_width * bpp; + _surface.pitch = _texture_width * _bytesPerPixel; initSize(); } @@ -169,14 +173,14 @@ void GLESTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, setDirtyRect(Common::Rect(x, y, x + w, y + h)); - if (static_cast<int>(w) * bytesPerPixel() == pitch) { + if (static_cast<int>(w) * _bytesPerPixel == pitch) { GLCALL(glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, - glFormat(), glType(), buf)); + _glFormat, _glType, buf)); } else { // GLES removed the ability to specify pitch, so we // have to do this ourselves. #if TEXSUBIMAGE_IS_EXPENSIVE - byte *tmp = new byte[w * h * bytesPerPixel()]; + byte *tmp = new byte[w * h * _bytesPerPixel]; assert(tmp); const byte *src = static_cast<const byte *>(buf); @@ -184,13 +188,13 @@ void GLESTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, GLuint count = h; do { - memcpy(dst, src, w * bytesPerPixel()); - dst += w * bytesPerPixel(); + memcpy(dst, src, w * _bytesPerPixel); + dst += w * _bytesPerPixel; src += pitch; } while (--count); GLCALL(glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, - glFormat(), glType(), tmp)); + _glFormat, _glType, tmp)); delete[] tmp; #else @@ -199,7 +203,7 @@ void GLESTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, const byte *src = static_cast<const byte *>(buf); do { GLCALL(glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, - w, 1, glFormat(), glType(), src)); + w, 1, _glFormat, _glType, src)); ++y; src += pitch; } while (--h); @@ -208,7 +212,7 @@ void GLESTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, } void GLESTexture::fillBuffer(byte x) { - uint rowbytes = _surface.w * bytesPerPixel(); + uint rowbytes = _surface.w * _bytesPerPixel; byte *tmp = new byte[_surface.h * rowbytes]; assert(tmp); @@ -225,7 +229,7 @@ void GLESTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { #ifdef GL_OES_draw_texture // Great extension, but only works under specific conditions. // Still a work-in-progress - disabled for now. - if (false && draw_tex_supported && paletteSize() == 0) { + if (false && draw_tex_supported && _paletteSize == 0) { //GLCALL(glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)); const GLint crop[4] = { 0, _surface.h, _surface.w, -_surface.h }; @@ -266,8 +270,23 @@ void GLESTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { _dirty_rect = Common::Rect(); } -GLESPaletteTexture::GLESPaletteTexture() : - GLESTexture(), +GLES4444Texture::GLES4444Texture() : + GLESTexture(2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 0) { +} + +GLES4444Texture::~GLES4444Texture() { +} + +GLES565Texture::GLES565Texture() : + GLESTexture(2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0) { +} + +GLES565Texture::~GLES565Texture() { +} + +GLESPaletteTexture::GLESPaletteTexture(byte bytesPerPixel, GLenum glFormat, + GLenum glType, size_t paletteSize) : + GLESTexture(bytesPerPixel, glFormat, glType, paletteSize), _texture(0) { } @@ -277,10 +296,9 @@ GLESPaletteTexture::~GLESPaletteTexture() { } void GLESPaletteTexture::allocBuffer(GLuint w, GLuint h) { - int bpp = bytesPerPixel(); _surface.w = w; _surface.h = h; - _surface.bytesPerPixel = bpp; + _surface.bytesPerPixel = _bytesPerPixel; // Already allocated a sufficiently large buffer? if (w <= _texture_width && h <= _texture_height) @@ -293,20 +311,20 @@ void GLESPaletteTexture::allocBuffer(GLuint w, GLuint h) { _texture_width = nextHigher2(_surface.w); _texture_height = nextHigher2(_surface.h); } - _surface.pitch = _texture_width * bpp; + _surface.pitch = _texture_width * _bytesPerPixel; // Texture gets uploaded later (from drawTexture()) - byte *new_buffer = new byte[paletteSize() + - _texture_width * _texture_height * bytesPerPixel()]; + byte *new_buffer = new byte[_paletteSize + + _texture_width * _texture_height * _bytesPerPixel]; if (_texture) { // preserve palette - memcpy(new_buffer, _texture, paletteSize()); + memcpy(new_buffer, _texture, _paletteSize); delete[] _texture; } _texture = new_buffer; - _surface.pixels = _texture + paletteSize(); + _surface.pixels = _texture + _paletteSize; } void GLESPaletteTexture::fillBuffer(byte x) { @@ -324,7 +342,7 @@ void GLESPaletteTexture::updateBuffer(GLuint x, GLuint y, byte *dst = static_cast<byte *>(_surface.getBasePtr(x, y)); do { - memcpy(dst, src, w * bytesPerPixel()); + memcpy(dst, src, w * _bytesPerPixel); dst += _surface.pitch; src += pitch; } while (--h); @@ -332,9 +350,9 @@ void GLESPaletteTexture::updateBuffer(GLuint x, GLuint y, void GLESPaletteTexture::uploadTexture() const { const size_t texture_size = - paletteSize() + _texture_width * _texture_height * bytesPerPixel(); + _paletteSize + _texture_width * _texture_height * _bytesPerPixel; - GLCALL(glCompressedTexImage2D(GL_TEXTURE_2D, 0, glType(), + GLCALL(glCompressedTexImage2D(GL_TEXTURE_2D, 0, _glType, _texture_width, _texture_height, 0, texture_size, _texture)); } @@ -358,5 +376,19 @@ void GLESPaletteTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLESTexture::drawTexture(x, y, w, h); } +GLESPalette888Texture::GLESPalette888Texture() : + GLESPaletteTexture(1, GL_RGB, GL_PALETTE8_RGB8_OES, 256 * 3) { +} + +GLESPalette888Texture::~GLESPalette888Texture() { +} + +GLESPalette8888Texture::GLESPalette8888Texture() : + GLESPaletteTexture(1, GL_RGBA, GL_PALETTE8_RGBA8_OES, 256 * 4) { +} + +GLESPalette8888Texture::~GLESPalette8888Texture() { +} + #endif diff --git a/backends/platform/android/texture.h b/backends/platform/android/texture.h index cc1f4e3dae..f1bc46e997 100644 --- a/backends/platform/android/texture.h +++ b/backends/platform/android/texture.h @@ -39,9 +39,12 @@ class GLESTexture { public: static void initGLExtensions(); - GLESTexture(); +protected: + GLESTexture(byte bytesPerPixel, GLenum glFormat, GLenum glType, + size_t paletteSize); virtual ~GLESTexture(); +public: void release(); void reinit(); void initSize(); @@ -80,14 +83,6 @@ public: } protected: - virtual byte bytesPerPixel() const = 0; - virtual GLenum glFormat() const = 0; - virtual GLenum glType() const = 0; - - virtual size_t paletteSize() const { - return 0; - } - inline void setDirty() { _all_dirty = true; _dirty_rect = Common::Rect(); @@ -102,6 +97,11 @@ protected: } } + byte _bytesPerPixel; + GLenum _glFormat; + GLenum _glType; + size_t _paletteSize; + GLuint _texture_name; Graphics::Surface _surface; GLuint _texture_width; @@ -114,42 +114,25 @@ protected: // RGBA4444 texture class GLES4444Texture : public GLESTexture { -protected: - virtual byte bytesPerPixel() const { - return 2; - } - - virtual GLenum glFormat() const { - return GL_RGBA; - } - - virtual GLenum glType() const { - return GL_UNSIGNED_SHORT_4_4_4_4; - } +public: + GLES4444Texture(); + virtual ~GLES4444Texture(); }; // RGB565 texture class GLES565Texture : public GLESTexture { -protected: - virtual byte bytesPerPixel() const { - return 2; - } - - virtual GLenum glFormat() const { - return GL_RGB; - } - - virtual GLenum glType() const { - return GL_UNSIGNED_SHORT_5_6_5; - } +public: + GLES565Texture(); + virtual ~GLES565Texture(); }; -// RGB888 256-entry paletted texture class GLESPaletteTexture : public GLESTexture { -public: - GLESPaletteTexture(); +protected: + GLESPaletteTexture(byte bytesPerPixel, GLenum glFormat, GLenum glType, + size_t paletteSize); virtual ~GLESPaletteTexture(); +public: virtual void allocBuffer(GLuint width, GLuint height); virtual void updateBuffer(GLuint x, GLuint y, GLuint width, GLuint height, const void *buf, int pitch); @@ -171,41 +154,23 @@ public: }; protected: - virtual byte bytesPerPixel() const { - return 1; - } - - virtual GLenum glFormat() const { - return GL_RGB; - } - - virtual GLenum glType() const { - return GL_PALETTE8_RGB8_OES; - } - - virtual size_t paletteSize() const { - return 256 * 3; - } - void uploadTexture() const; byte *_texture; }; -// RGBA8888 256-entry paletted texture -class GLESPaletteATexture : public GLESPaletteTexture { -protected: - virtual GLenum glFormat() const { - return GL_RGBA; - } - - virtual GLenum glType() const { - return GL_PALETTE8_RGBA8_OES; - } +// RGB888 256-entry paletted texture +class GLESPalette888Texture : public GLESPaletteTexture { +public: + GLESPalette888Texture(); + virtual ~GLESPalette888Texture(); +}; - virtual size_t paletteSize() const { - return 256 * 4; - } +// RGBA8888 256-entry paletted texture +class GLESPalette8888Texture : public GLESPaletteTexture { +public: + GLESPalette8888Texture(); + virtual ~GLESPalette8888Texture(); }; #endif |