diff --git a/include/private/opengles/gl_context.h b/include/private/opengles/gl_context.h index 26cde3869..e0deba957 100644 --- a/include/private/opengles/gl_context.h +++ b/include/private/opengles/gl_context.h @@ -36,7 +36,12 @@ struct android_native_buffer_t; namespace android { -const unsigned int OGLES_NUM_COMPRESSED_TEXTURE_FORMATS = 10; + +const unsigned int OGLES_NUM_COMPRESSED_TEXTURE_FORMATS = 10 +#ifdef GL_OES_compressed_ETC1_RGB8_texture + + 1 +#endif + ; class EGLTextureObject; class EGLSurfaceManager; diff --git a/opengl/libagl/Android.mk b/opengl/libagl/Android.mk index c2e9f312e..6cb146c06 100644 --- a/opengl/libagl/Android.mk +++ b/opengl/libagl/Android.mk @@ -29,7 +29,7 @@ LOCAL_CFLAGS += -DLOG_TAG=\"libagl\" LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES LOCAL_CFLAGS += -fvisibility=hidden -LOCAL_SHARED_LIBRARIES := libcutils libhardware libutils libpixelflinger +LOCAL_SHARED_LIBRARIES := libcutils libhardware libutils libpixelflinger libETC1 LOCAL_LDLIBS := -lpthread -ldl ifeq ($(TARGET_ARCH),arm) diff --git a/opengl/libagl/state.cpp b/opengl/libagl/state.cpp index 0f1f27d8c..1224a96b9 100644 --- a/opengl/libagl/state.cpp +++ b/opengl/libagl/state.cpp @@ -51,6 +51,9 @@ static char const * const gExtensionsString = // "GL_OES_point_size_array " // TODO // "GL_OES_point_sprite " // TODO "GL_OES_EGL_image " // OK +#ifdef GL_OES_compressed_ETC1_RGB8_texture + "GL_OES_compressed_ETC1_RGB8_texture " // OK +#endif "GL_ARB_texture_compression " // OK "GL_ARB_texture_non_power_of_two " // OK "GL_ANDROID_user_clip_plane " // OK @@ -386,6 +389,7 @@ const GLubyte* glGetString(GLenum string) void glGetIntegerv(GLenum pname, GLint *params) { + int i; ogles_context_t* c = ogles_context_t::get(); switch (pname) { case GL_ALIASED_POINT_SIZE_RANGE: @@ -431,6 +435,10 @@ void glGetIntegerv(GLenum pname, GLint *params) params[ 7] = GL_PALETTE8_R5_G6_B5_OES; params[ 8] = GL_PALETTE8_RGBA4_OES; params[ 9] = GL_PALETTE8_RGB5_A1_OES; + i = 10; +#ifdef GL_OES_compressed_ETC1_RGB8_texture + params[i++] = GL_ETC1_RGB8_OES; +#endif break; case GL_DEPTH_BITS: params[0] = c->rasterizer.state.buffers.depth.format ? 0 : 16; diff --git a/opengl/libagl/texture.cpp b/opengl/libagl/texture.cpp index fae89b9b4..73b1db4e8 100644 --- a/opengl/libagl/texture.cpp +++ b/opengl/libagl/texture.cpp @@ -24,6 +24,7 @@ #include "TextureObjectManager.h" #include +#include #ifdef LIBAGL_USE_GRALLOC_COPYBITS #include "copybit.h" @@ -1081,11 +1082,6 @@ void glCompressedTexImage2D( ogles_error(c, GL_INVALID_ENUM); return; } - if ((internalformat < GL_PALETTE4_RGB8_OES || - internalformat > GL_PALETTE8_RGB5_A1_OES)) { - ogles_error(c, GL_INVALID_ENUM); - return; - } if (width<0 || height<0 || border!=0) { ogles_error(c, GL_INVALID_VALUE); return; @@ -1121,6 +1117,12 @@ void glCompressedTexImage2D( format = GL_RGBA; type = GL_UNSIGNED_SHORT_5_5_5_1; break; +#ifdef GL_OES_compressed_ETC1_RGB8_texture + case GL_ETC1_RGB8_OES: + format = GL_RGB; + type = GL_UNSIGNED_BYTE; + break; +#endif default: ogles_error(c, GL_INVALID_ENUM); return; @@ -1133,6 +1135,30 @@ void glCompressedTexImage2D( int32_t size; GGLSurface* surface; + +#ifdef GL_OES_compressed_ETC1_RGB8_texture + if (internalformat == GL_ETC1_RGB8_OES) { + GLsizei compressedSize = etc1_get_encoded_data_size(width, height); + if (compressedSize > imageSize) { + ogles_error(c, GL_INVALID_VALUE); + return; + } + int error = createTextureSurface(c, &surface, &size, + level, format, type, width, height); + if (error) { + ogles_error(c, error); + return; + } + if (etc1_decode_image( + (const etc1_byte*)data, + (etc1_byte*)surface->data, + width, height, 3, surface->stride) != 0) { + ogles_error(c, GL_INVALID_OPERATION); + } + return; + } +#endif + // all mipmap levels are specified at once. const int numLevels = level<0 ? -level : 1;