summaryrefslogtreecommitdiff
path: root/opengl/libagl/texture.cpp
diff options
context:
space:
mode:
author Mathias Agopian <mathias@google.com> 2010-02-01 18:24:52 -0800
committer Mathias Agopian <mathias@google.com> 2010-02-02 20:19:54 -0800
commit18b915a1026dfe9d273ee3fd2139b7feed22008c (patch)
tree456f1eb01eafbfe98c6f071b35c2442dac57c2cc /opengl/libagl/texture.cpp
parentb787383ba5208f1d86f90a8cdb762502c1f8829f (diff)
implement [2396050] Add ETC1 texture support to AGL
Diffstat (limited to 'opengl/libagl/texture.cpp')
-rw-r--r--opengl/libagl/texture.cpp36
1 files changed, 31 insertions, 5 deletions
diff --git a/opengl/libagl/texture.cpp b/opengl/libagl/texture.cpp
index fae89b9b4a..73b1db4e88 100644
--- a/opengl/libagl/texture.cpp
+++ b/opengl/libagl/texture.cpp
@@ -24,6 +24,7 @@
#include "TextureObjectManager.h"
#include <private/ui/android_natives_priv.h>
+#include <ETC1/etc1.h>
#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;