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 | 
