Commit 22658244 by Nicolas Capens Committed by Nicolas Capens

Implement ETC1 compressed textures support.

Bug 18559323 Change-Id: Iafa75778601436364406256602455993eb062de8 Reviewed-on: https://swiftshader-review.googlesource.com/1510Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 393e2f94
...@@ -1007,20 +1007,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1007,20 +1007,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_STENCIL_CLEAR_VALUE: *params = mState.stencilClearValue; break; case GL_STENCIL_CLEAR_VALUE: *params = mState.stencilClearValue; break;
case GL_SUBPIXEL_BITS: *params = 4; break; case GL_SUBPIXEL_BITS: *params = 4; break;
case GL_MAX_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; break; case GL_MAX_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS: case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = NUM_COMPRESSED_TEXTURE_FORMATS; break;
{
if(S3TC_SUPPORT)
{
// GL_COMPRESSED_RGB_S3TC_DXT1_EXT
// GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
*params = 2;
}
else
{
*params = 0;
}
}
break;
case GL_SAMPLE_BUFFERS: case GL_SAMPLE_BUFFERS:
case GL_SAMPLES: case GL_SAMPLES:
{ {
...@@ -1063,10 +1050,9 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1063,10 +1050,9 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
break; break;
case GL_COMPRESSED_TEXTURE_FORMATS: case GL_COMPRESSED_TEXTURE_FORMATS:
{ {
if(S3TC_SUPPORT) for(int i = 0; i < NUM_COMPRESSED_TEXTURE_FORMATS; i++)
{ {
params[0] = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; params[i] = compressedTextureFormats[i];
params[1] = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
} }
} }
break; break;
...@@ -1195,7 +1181,7 @@ int Context::getQueryParameterNum(GLenum pname) ...@@ -1195,7 +1181,7 @@ int Context::getQueryParameterNum(GLenum pname)
switch (pname) switch (pname)
{ {
case GL_COMPRESSED_TEXTURE_FORMATS: case GL_COMPRESSED_TEXTURE_FORMATS:
return S3TC_SUPPORT ? 2 : 0; return NUM_COMPRESSED_TEXTURE_FORMATS;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS: case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
case GL_ARRAY_BUFFER_BINDING: case GL_ARRAY_BUFFER_BINDING:
case GL_FRAMEBUFFER_BINDING_OES: case GL_FRAMEBUFFER_BINDING_OES:
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define GL_API #define GL_API
#include <GLES/gl.h> #include <GLES/gl.h>
#include <GLES/glext.h>
#define EGLAPI #define EGLAPI
#include <EGL/egl.h> #include <EGL/egl.h>
...@@ -75,14 +76,17 @@ enum ...@@ -75,14 +76,17 @@ enum
IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5 IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5
}; };
enum QueryType const GLenum compressedTextureFormats[] =
{ {
QUERY_ANY_SAMPLES_PASSED, GL_ETC1_RGB8_OES,
QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE, #if (S3TC_SUPPORT)
GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
QUERY_TYPE_COUNT GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
#endif
}; };
const GLint NUM_COMPRESSED_TEXTURE_FORMATS = sizeof(compressedTextureFormats) / sizeof(compressedTextureFormats[0]);
const float ALIASED_LINE_WIDTH_RANGE_MIN = 1.0f; const float ALIASED_LINE_WIDTH_RANGE_MIN = 1.0f;
const float ALIASED_LINE_WIDTH_RANGE_MAX = 1.0f; const float ALIASED_LINE_WIDTH_RANGE_MAX = 1.0f;
const float ALIASED_POINT_SIZE_RANGE_MIN = 0.125f; const float ALIASED_POINT_SIZE_RANGE_MIN = 0.125f;
......
...@@ -87,6 +87,11 @@ namespace es1 ...@@ -87,6 +87,11 @@ namespace es1
sw::Format Image::selectInternalFormat(GLenum format, GLenum type) sw::Format Image::selectInternalFormat(GLenum format, GLenum type)
{ {
if(format == GL_ETC1_RGB8_OES)
{
return sw::FORMAT_ETC1;
}
else
#if S3TC_SUPPORT #if S3TC_SUPPORT
if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
......
...@@ -909,6 +909,8 @@ void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum inter ...@@ -909,6 +909,8 @@ void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum inter
switch(internalformat) switch(internalformat)
{ {
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
if(!S3TC_SUPPORT) if(!S3TC_SUPPORT)
...@@ -992,6 +994,8 @@ void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xof ...@@ -992,6 +994,8 @@ void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xof
switch(format) switch(format)
{ {
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
if(!S3TC_SUPPORT) if(!S3TC_SUPPORT)
...@@ -1125,6 +1129,8 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor ...@@ -1125,6 +1129,8 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_ETC1_RGB8_OES:
return error(GL_INVALID_OPERATION);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
if(S3TC_SUPPORT) if(S3TC_SUPPORT)
...@@ -1135,7 +1141,6 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor ...@@ -1135,7 +1141,6 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor
{ {
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
...@@ -1255,13 +1260,22 @@ void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, ...@@ -1255,13 +1260,22 @@ void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_ETC1_RGB8_OES:
return error(GL_INVALID_OPERATION);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
if(S3TC_SUPPORT)
{
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
}
else
{
return error(GL_INVALID_ENUM);
}
case GL_DEPTH_STENCIL_OES: case GL_DEPTH_STENCIL_OES:
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
default: default:
return error(GL_INVALID_OPERATION); return error(GL_INVALID_ENUM);
} }
texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer); texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
...@@ -2320,6 +2334,7 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name) ...@@ -2320,6 +2334,7 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
"GL_OES_blend_equation_separate " "GL_OES_blend_equation_separate "
"GL_OES_blend_func_separate " "GL_OES_blend_func_separate "
"GL_OES_blend_subtract " "GL_OES_blend_subtract "
"GL_OES_compressed_ETC1_RGB8_texture "
"GL_OES_depth_texture " "GL_OES_depth_texture "
"GL_OES_EGL_image " "GL_OES_EGL_image "
"GL_OES_EGL_image_external " "GL_OES_EGL_image_external "
...@@ -3287,9 +3302,18 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, ...@@ -3287,9 +3302,18 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
break; break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below case GL_ETC1_RGB8_OES:
return error(GL_INVALID_OPERATION);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
break; if(S3TC_SUPPORT)
{
return error(GL_INVALID_OPERATION);
}
else
{
return error(GL_INVALID_ENUM);
}
case GL_DEPTH_STENCIL_OES: case GL_DEPTH_STENCIL_OES:
switch(type) switch(type)
{ {
...@@ -3325,19 +3349,6 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, ...@@ -3325,19 +3349,6 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
{
if(S3TC_SUPPORT)
{
return error(GL_INVALID_OPERATION);
}
else
{
return error(GL_INVALID_ENUM);
}
}
if(target == GL_TEXTURE_2D) if(target == GL_TEXTURE_2D)
{ {
es1::Texture2D *texture = context->getTexture2D(); es1::Texture2D *texture = context->getTexture2D();
......
...@@ -39,6 +39,7 @@ namespace es1 ...@@ -39,6 +39,7 @@ namespace es1
{ {
switch(format) switch(format)
{ {
case GL_ETC1_RGB8_OES:
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
return 8 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f); return 8 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f);
...@@ -49,35 +50,19 @@ namespace es1 ...@@ -49,35 +50,19 @@ namespace es1
bool IsCompressed(GLenum format) bool IsCompressed(GLenum format)
{ {
if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || return format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
{ format == GL_ETC1_RGB8_OES;
return true;
}
else
{
return false;
}
} }
bool IsDepthTexture(GLenum format) bool IsDepthTexture(GLenum format)
{ {
if(format == GL_DEPTH_STENCIL_OES) return format == GL_DEPTH_STENCIL_OES;
{
return true;
}
return false;
} }
bool IsStencilTexture(GLenum format) bool IsStencilTexture(GLenum format)
{ {
if(format == GL_DEPTH_STENCIL_OES) return format == GL_DEPTH_STENCIL_OES;
{
return true;
}
return false;
} }
// Returns the size, in bytes, of a single texel in an Image // Returns the size, in bytes, of a single texel in an Image
......
...@@ -1325,22 +1325,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1325,22 +1325,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_SUBPIXEL_BITS: *params = 4; break; case GL_SUBPIXEL_BITS: *params = 4; break;
case GL_MAX_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; break; case GL_MAX_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; break;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE; break; case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE; break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS: case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = NUM_COMPRESSED_TEXTURE_FORMATS; break;
{
if(S3TC_SUPPORT)
{
// GL_COMPRESSED_RGB_S3TC_DXT1_EXT
// GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
// GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE
// GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE
*params = 4;
}
else
{
*params = 0;
}
}
break;
case GL_MAX_SAMPLES_ANGLE: *params = IMPLEMENTATION_MAX_SAMPLES; break; case GL_MAX_SAMPLES_ANGLE: *params = IMPLEMENTATION_MAX_SAMPLES; break;
case GL_SAMPLE_BUFFERS: case GL_SAMPLE_BUFFERS:
case GL_SAMPLES: case GL_SAMPLES:
...@@ -1384,12 +1369,9 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1384,12 +1369,9 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
break; break;
case GL_COMPRESSED_TEXTURE_FORMATS: case GL_COMPRESSED_TEXTURE_FORMATS:
{ {
if(S3TC_SUPPORT) for(int i = 0; i < NUM_COMPRESSED_TEXTURE_FORMATS; i++)
{ {
params[0] = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; params[i] = compressedTextureFormats[i];
params[1] = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
params[2] = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
params[3] = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
} }
} }
break; break;
...@@ -1515,7 +1497,7 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu ...@@ -1515,7 +1497,7 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
case GL_COMPRESSED_TEXTURE_FORMATS: case GL_COMPRESSED_TEXTURE_FORMATS:
{ {
*type = GL_INT; *type = GL_INT;
*numParams = S3TC_SUPPORT ? 4 : 0; *numParams = NUM_COMPRESSED_TEXTURE_FORMATS;
} }
break; break;
case GL_SHADER_BINARY_FORMATS: case GL_SHADER_BINARY_FORMATS:
......
...@@ -80,20 +80,33 @@ enum ...@@ -80,20 +80,33 @@ enum
IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5 IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5
}; };
enum QueryType const GLenum compressedTextureFormats[] =
{ {
QUERY_ANY_SAMPLES_PASSED, GL_ETC1_RGB8_OES,
QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE, #if (S3TC_SUPPORT)
GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
QUERY_TYPE_COUNT GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,
GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,
#endif
}; };
const GLint NUM_COMPRESSED_TEXTURE_FORMATS = sizeof(compressedTextureFormats) / sizeof(compressedTextureFormats[0]);
const float ALIASED_LINE_WIDTH_RANGE_MIN = 1.0f; const float ALIASED_LINE_WIDTH_RANGE_MIN = 1.0f;
const float ALIASED_LINE_WIDTH_RANGE_MAX = 1.0f; const float ALIASED_LINE_WIDTH_RANGE_MAX = 1.0f;
const float ALIASED_POINT_SIZE_RANGE_MIN = 0.125f; const float ALIASED_POINT_SIZE_RANGE_MIN = 0.125f;
const float ALIASED_POINT_SIZE_RANGE_MAX = 8192.0f; const float ALIASED_POINT_SIZE_RANGE_MAX = 8192.0f;
const float MAX_TEXTURE_MAX_ANISOTROPY = 16.0f; const float MAX_TEXTURE_MAX_ANISOTROPY = 16.0f;
enum QueryType
{
QUERY_ANY_SAMPLES_PASSED,
QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE,
QUERY_TYPE_COUNT
};
struct Color struct Color
{ {
float red; float red;
......
...@@ -86,6 +86,11 @@ namespace es2 ...@@ -86,6 +86,11 @@ namespace es2
sw::Format Image::selectInternalFormat(GLenum format, GLenum type) sw::Format Image::selectInternalFormat(GLenum format, GLenum type)
{ {
if(format == GL_ETC1_RGB8_OES)
{
return sw::FORMAT_ETC1;
}
else
#if S3TC_SUPPORT #if S3TC_SUPPORT
if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
......
...@@ -736,6 +736,8 @@ void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum inter ...@@ -736,6 +736,8 @@ void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum inter
switch(internalformat) switch(internalformat)
{ {
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
...@@ -860,6 +862,8 @@ void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xof ...@@ -860,6 +862,8 @@ void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xof
switch(format) switch(format)
{ {
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
...@@ -1024,6 +1028,8 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor ...@@ -1024,6 +1028,8 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_ETC1_RGB8_OES:
return error(GL_INVALID_OPERATION);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
...@@ -1036,7 +1042,6 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor ...@@ -1036,7 +1042,6 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor
{ {
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
...@@ -1171,16 +1176,25 @@ void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, ...@@ -1171,16 +1176,25 @@ void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_ETC1_RGB8_OES:
return error(GL_INVALID_OPERATION);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
if(S3TC_SUPPORT)
{
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
}
else
{
return error(GL_INVALID_ENUM);
}
case GL_DEPTH_COMPONENT: case GL_DEPTH_COMPONENT:
case GL_DEPTH_STENCIL_OES: case GL_DEPTH_STENCIL_OES:
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
default: default:
return error(GL_INVALID_OPERATION); return error(GL_INVALID_ENUM);
} }
texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer); texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
...@@ -2869,6 +2883,7 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name) ...@@ -2869,6 +2883,7 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
// EXT extensions // EXT extensions
// Vendor extensions // Vendor extensions
return (GLubyte*) return (GLubyte*)
"GL_OES_compressed_ETC1_RGB8_texture "
"GL_OES_depth_texture " "GL_OES_depth_texture "
"GL_OES_depth_texture_cube_map " "GL_OES_depth_texture_cube_map "
"GL_OES_EGL_image " "GL_OES_EGL_image "
...@@ -2887,13 +2902,15 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name) ...@@ -2887,13 +2902,15 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
"GL_EXT_read_format_bgra " "GL_EXT_read_format_bgra "
#if (S3TC_SUPPORT) #if (S3TC_SUPPORT)
"GL_EXT_texture_compression_dxt1 " "GL_EXT_texture_compression_dxt1 "
"GL_ANGLE_texture_compression_dxt3 "
"GL_ANGLE_texture_compression_dxt5 "
#endif #endif
"GL_EXT_texture_filter_anisotropic " "GL_EXT_texture_filter_anisotropic "
"GL_EXT_texture_format_BGRA8888 " "GL_EXT_texture_format_BGRA8888 "
"GL_ANGLE_framebuffer_blit " "GL_ANGLE_framebuffer_blit "
"GL_ANGLE_framebuffer_multisample " "GL_ANGLE_framebuffer_multisample "
#if (S3TC_SUPPORT)
"GL_ANGLE_texture_compression_dxt3 "
"GL_ANGLE_texture_compression_dxt5 "
#endif
"GL_NV_fence"; "GL_NV_fence";
default: default:
return error(GL_INVALID_ENUM, (GLubyte*)NULL); return error(GL_INVALID_ENUM, (GLubyte*)NULL);
...@@ -4057,11 +4074,20 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, ...@@ -4057,11 +4074,20 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
break; break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below case GL_ETC1_RGB8_OES:
return error(GL_INVALID_OPERATION);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
break; if(S3TC_SUPPORT)
{
return error(GL_INVALID_OPERATION);
}
else
{
return error(GL_INVALID_ENUM);
}
case GL_DEPTH_COMPONENT: case GL_DEPTH_COMPONENT:
switch(type) switch(type)
{ {
...@@ -4124,21 +4150,6 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, ...@@ -4124,21 +4150,6 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
{
if(S3TC_SUPPORT)
{
return error(GL_INVALID_OPERATION);
}
else
{
return error(GL_INVALID_ENUM);
}
}
if(target == GL_TEXTURE_2D) if(target == GL_TEXTURE_2D)
{ {
es2::Texture2D *texture = context->getTexture2D(); es2::Texture2D *texture = context->getTexture2D();
......
...@@ -207,6 +207,7 @@ namespace es2 ...@@ -207,6 +207,7 @@ namespace es2
{ {
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_ETC1_RGB8_OES:
return 8 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f); return 8 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f);
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
...@@ -218,39 +219,23 @@ namespace es2 ...@@ -218,39 +219,23 @@ namespace es2
bool IsCompressed(GLenum format) bool IsCompressed(GLenum format)
{ {
if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || return format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT || format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE || format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE) format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE ||
{ format == GL_ETC1_RGB8_OES;
return true;
}
else
{
return false;
}
} }
bool IsDepthTexture(GLenum format) bool IsDepthTexture(GLenum format)
{ {
if(format == GL_DEPTH_COMPONENT || return format == GL_DEPTH_COMPONENT ||
format == GL_DEPTH_STENCIL_OES) format == GL_DEPTH_STENCIL_OES;
{
return true;
}
return false;
} }
bool IsStencilTexture(GLenum format) bool IsStencilTexture(GLenum format)
{ {
if(format == GL_STENCIL_INDEX_OES || return format == GL_STENCIL_INDEX_OES ||
format == GL_DEPTH_STENCIL_OES) format == GL_DEPTH_STENCIL_OES;
{
return true;
}
return false;
} }
// Returns the size, in bytes, of a single texel in an Image // Returns the size, in bytes, of a single texel in an Image
......
...@@ -38,10 +38,10 @@ namespace sw ...@@ -38,10 +38,10 @@ namespace sw
void Rect::clip(int minX, int minY, int maxX, int maxY) void Rect::clip(int minX, int minY, int maxX, int maxY)
{ {
x0 = sw::clamp(x0, minX, maxX); x0 = clamp(x0, minX, maxX);
y0 = sw::clamp(y0, minY, maxY); y0 = clamp(y0, minY, maxY);
x1 = sw::clamp(x1, minX, maxX); x1 = clamp(x1, minX, maxX);
y1 = sw::clamp(y1, minY, maxY); y1 = clamp(y1, minY, maxY);
} }
void Surface::Buffer::write(int x, int y, int z, const Color<float> &color) void Surface::Buffer::write(int x, int y, int z, const Color<float> &color)
...@@ -659,6 +659,7 @@ namespace sw ...@@ -659,6 +659,7 @@ namespace sw
case FORMAT_DXT1: case FORMAT_DXT1:
#endif #endif
case FORMAT_ATI1: case FORMAT_ATI1:
case FORMAT_ETC1:
return (unsigned char*)buffer + 8 * (x / 4) + (y / 4) * pitchB + z * sliceB; return (unsigned char*)buffer + 8 * (x / 4) + (y / 4) * pitchB + z * sliceB;
#if S3TC_SUPPORT #if S3TC_SUPPORT
case FORMAT_DXT3: case FORMAT_DXT3:
...@@ -941,6 +942,7 @@ namespace sw ...@@ -941,6 +942,7 @@ namespace sw
#endif #endif
case FORMAT_ATI1: return 2; // Column of four pixels case FORMAT_ATI1: return 2; // Column of four pixels
case FORMAT_ATI2: return 4; // Column of four pixels case FORMAT_ATI2: return 4; // Column of four pixels
case FORMAT_ETC1: return 2; // Column of four pixels
// Bumpmap formats // Bumpmap formats
case FORMAT_V8U8: return 2; case FORMAT_V8U8: return 2;
case FORMAT_L6V5U5: return 2; case FORMAT_L6V5U5: return 2;
...@@ -995,7 +997,10 @@ namespace sw ...@@ -995,7 +997,10 @@ namespace sw
{ {
#if S3TC_SUPPORT #if S3TC_SUPPORT
case FORMAT_DXT1: case FORMAT_DXT1:
#endif
case FORMAT_ETC1:
return 8 * ((width + 3) / 4); // 64 bit per 4x4 block, computed per 4 rows return 8 * ((width + 3) / 4); // 64 bit per 4x4 block, computed per 4 rows
#if S3TC_SUPPORT
case FORMAT_DXT3: case FORMAT_DXT3:
case FORMAT_DXT5: case FORMAT_DXT5:
return 16 * ((width + 3) / 4); // 128 bit per 4x4 block, computed per 4 rows return 16 * ((width + 3) / 4); // 128 bit per 4x4 block, computed per 4 rows
...@@ -1029,12 +1034,13 @@ namespace sw ...@@ -1029,12 +1034,13 @@ namespace sw
case FORMAT_DXT1: case FORMAT_DXT1:
case FORMAT_DXT3: case FORMAT_DXT3:
case FORMAT_DXT5: case FORMAT_DXT5:
return pitchB(width, format, target) * ((height + 3) / 4); // Pitch computed per 4 rows
#endif #endif
case FORMAT_ATI1: // Pitch computed per row case FORMAT_ETC1:
case FORMAT_ATI2: // Pitch computed per row return pitchB(width, format, target) * ((height + 3) / 4); // Pitch computed per 4 rows
case FORMAT_ATI1:
case FORMAT_ATI2:
default: default:
return pitchB(width, format, target) * height; return pitchB(width, format, target) * height; // Pitch computed per row
} }
} }
...@@ -1069,9 +1075,10 @@ namespace sw ...@@ -1069,9 +1075,10 @@ namespace sw
case FORMAT_DXT1: decodeDXT1(destination, source); break; // FIXME: Check destination format case FORMAT_DXT1: decodeDXT1(destination, source); break; // FIXME: Check destination format
case FORMAT_DXT3: decodeDXT3(destination, source); break; // FIXME: Check destination format case FORMAT_DXT3: decodeDXT3(destination, source); break; // FIXME: Check destination format
case FORMAT_DXT5: decodeDXT5(destination, source); break; // FIXME: Check destination format case FORMAT_DXT5: decodeDXT5(destination, source); break; // FIXME: Check destination format
#endif
case FORMAT_ATI1: decodeATI1(destination, source); break; // FIXME: Check destination format case FORMAT_ATI1: decodeATI1(destination, source); break; // FIXME: Check destination format
case FORMAT_ATI2: decodeATI2(destination, source); break; // FIXME: Check destination format case FORMAT_ATI2: decodeATI2(destination, source); break; // FIXME: Check destination format
#endif case FORMAT_ETC1: decodeETC1(destination, source); break; // FIXME: Check destination format
default: genericUpdate(destination, source); break; default: genericUpdate(destination, source); break;
} }
} }
...@@ -1466,7 +1473,7 @@ namespace sw ...@@ -1466,7 +1473,7 @@ namespace sw
void Surface::decodeDXT1(Buffer &internal, const Buffer &external) void Surface::decodeDXT1(Buffer &internal, const Buffer &external)
{ {
unsigned int *destSlice = (unsigned int*)internal.buffer; unsigned int *destSlice = (unsigned int*)internal.buffer;
DXT1 *source = (DXT1*)external.buffer; const DXT1 *source = (const DXT1*)external.buffer;
for(int z = 0; z < external.depth; z++) for(int z = 0; z < external.depth; z++)
{ {
...@@ -1528,7 +1535,7 @@ namespace sw ...@@ -1528,7 +1535,7 @@ namespace sw
void Surface::decodeDXT3(Buffer &internal, const Buffer &external) void Surface::decodeDXT3(Buffer &internal, const Buffer &external)
{ {
unsigned int *destSlice = (unsigned int*)internal.buffer; unsigned int *destSlice = (unsigned int*)internal.buffer;
DXT3 *source = (DXT3*)external.buffer; const DXT3 *source = (const DXT3*)external.buffer;
for(int z = 0; z < external.depth; z++) for(int z = 0; z < external.depth; z++)
{ {
...@@ -1575,7 +1582,7 @@ namespace sw ...@@ -1575,7 +1582,7 @@ namespace sw
void Surface::decodeDXT5(Buffer &internal, const Buffer &external) void Surface::decodeDXT5(Buffer &internal, const Buffer &external)
{ {
unsigned int *destSlice = (unsigned int*)internal.buffer; unsigned int *destSlice = (unsigned int*)internal.buffer;
DXT5 *source = (DXT5*)external.buffer; const DXT5 *source = (const DXT5*)external.buffer;
for(int z = 0; z < external.depth; z++) for(int z = 0; z < external.depth; z++)
{ {
...@@ -1642,11 +1649,12 @@ namespace sw ...@@ -1642,11 +1649,12 @@ namespace sw
(byte*&)destSlice += internal.sliceB; (byte*&)destSlice += internal.sliceB;
} }
} }
#endif
void Surface::decodeATI1(Buffer &internal, const Buffer &external) void Surface::decodeATI1(Buffer &internal, const Buffer &external)
{ {
byte *destSlice = (byte*)internal.buffer; byte *destSlice = (byte*)internal.buffer;
ATI1 *source = (ATI1*)external.buffer; const ATI1 *source = (const ATI1*)external.buffer;
for(int z = 0; z < external.depth; z++) for(int z = 0; z < external.depth; z++)
{ {
...@@ -1699,7 +1707,7 @@ namespace sw ...@@ -1699,7 +1707,7 @@ namespace sw
void Surface::decodeATI2(Buffer &internal, const Buffer &external) void Surface::decodeATI2(Buffer &internal, const Buffer &external)
{ {
word *destSlice = (word*)internal.buffer; word *destSlice = (word*)internal.buffer;
ATI2 *source = (ATI2*)external.buffer; const ATI2 *source = (const ATI2*)external.buffer;
for(int z = 0; z < external.depth; z++) for(int z = 0; z < external.depth; z++)
{ {
...@@ -1775,7 +1783,198 @@ namespace sw ...@@ -1775,7 +1783,198 @@ namespace sw
(byte*&)destSlice += internal.sliceB; (byte*&)destSlice += internal.sliceB;
} }
} }
#endif
struct bgrx8
{
byte b;
byte g;
byte r;
byte x;
inline bgrx8()
{
}
inline void set(int red, int green, int blue)
{
r = static_cast<byte>(clamp(red, 0, 255));
g = static_cast<byte>(clamp(green, 0, 255));
b = static_cast<byte>(clamp(blue, 0, 255));
x = 255;
}
};
struct ETC1
{
struct
{
union
{
struct // Individual colors
{
byte R2 : 4;
byte R1 : 4;
byte G2 : 4;
byte G1 : 4;
byte B2 : 4;
byte B1 : 4;
};
struct // Differential colors
{
sbyte dR : 3;
byte R : 5;
sbyte dG : 3;
byte G : 5;
sbyte dB : 3;
byte B : 5;
};
};
bool flipbit : 1;
bool diffbit : 1;
byte cw2 : 3;
byte cw1 : 3;
byte pixelIndexMSB[2];
byte pixelIndexLSB[2];
};
inline int getIndex(int x, int y) const
{
int bitIndex = x * 4 + y;
int bitOffset = bitIndex & 7;
int lsb = (pixelIndexLSB[1 - (bitIndex >> 3)] >> bitOffset) & 1;
int msb = (pixelIndexMSB[1 - (bitIndex >> 3)] >> bitOffset) & 1;
return (msb << 1) | lsb;
}
};
inline int extend_4to8bits(int x)
{
return (x << 4) | x;
}
inline int extend_5to8bits(int x)
{
return (x << 3) | (x >> 2);
}
void Surface::decodeETC1(Buffer &internal, const Buffer &external)
{
unsigned int *destSlice = (unsigned int*)internal.buffer;
const ETC1 *source = (const ETC1*)external.buffer;
for(int z = 0; z < external.depth; z++)
{
unsigned int *dest = destSlice;
for(int y = 0; y < external.height; y += 4)
{
for(int x = 0; x < external.width; x += 4)
{
bgrx8 *color = reinterpret_cast<bgrx8*>(&dest[x + y * internal.width]);
int r1, g1, b1;
int r2, g2, b2;
if(source->diffbit)
{
b1 = extend_5to8bits(source->B);
g1 = extend_5to8bits(source->G);
r1 = extend_5to8bits(source->R);
r2 = extend_5to8bits(source->R + source->dR);
g2 = extend_5to8bits(source->G + source->dG);
b2 = extend_5to8bits(source->B + source->dB);
}
else
{
r1 = extend_4to8bits(source->R1);
g1 = extend_4to8bits(source->G1);
b1 = extend_4to8bits(source->B1);
r2 = extend_4to8bits(source->R2);
g2 = extend_4to8bits(source->G2);
b2 = extend_4to8bits(source->B2);
}
bgrx8 subblockColors0[4];
bgrx8 subblockColors1[4];
// Table 3.17.2 sorted according to table 3.17.3
static const int intensityModifier[8][4] =
{
{2, 8, -2, -8},
{5, 17, -5, -17},
{9, 29, -9, -29},
{13, 42, -13, -42},
{18, 60, -18, -60},
{24, 80, -24, -80},
{33, 106, -33, -106},
{47, 183, -47, -183}
};
const int i10 = intensityModifier[source->cw1][0];
const int i11 = intensityModifier[source->cw1][1];
const int i12 = intensityModifier[source->cw1][2];
const int i13 = intensityModifier[source->cw1][3];
subblockColors0[0].set(r1 + i10, g1 + i10, b1 + i10);
subblockColors0[1].set(r1 + i11, g1 + i11, b1 + i11);
subblockColors0[2].set(r1 + i12, g1 + i12, b1 + i12);
subblockColors0[3].set(r1 + i13, g1 + i13, b1 + i13);
const int i20 = intensityModifier[source->cw2][0];
const int i21 = intensityModifier[source->cw2][1];
const int i22 = intensityModifier[source->cw2][2];
const int i23 = intensityModifier[source->cw2][3];
subblockColors1[0].set(r2 + i20, g2 + i20, b2 + i20);
subblockColors1[1].set(r2 + i21, g2 + i21, b2 + i21);
subblockColors1[2].set(r2 + i22, g2 + i22, b2 + i22);
subblockColors1[3].set(r2 + i23, g2 + i23, b2 + i23);
if(source->flipbit)
{
for(int y = 0; y < 2; y++)
{
color[0] = subblockColors0[source->getIndex(0, y)];
color[1] = subblockColors0[source->getIndex(1, y)];
color[2] = subblockColors0[source->getIndex(2, y)];
color[3] = subblockColors0[source->getIndex(3, y)];
color += internal.width;
}
for(int y = 2; y < 4; y++)
{
color[0] = subblockColors1[source->getIndex(0, y)];
color[1] = subblockColors1[source->getIndex(1, y)];
color[2] = subblockColors1[source->getIndex(2, y)];
color[3] = subblockColors1[source->getIndex(3, y)];
color += internal.width;
}
}
else
{
for(int y = 0; y < 4; y++)
{
color[0] = subblockColors0[source->getIndex(0, y)];
color[1] = subblockColors0[source->getIndex(1, y)];
color[2] = subblockColors1[source->getIndex(2, y)];
color[3] = subblockColors1[source->getIndex(3, y)];
color += internal.width;
}
}
source++;
}
}
(byte*&)destSlice += internal.sliceB;
}
}
unsigned int Surface::size(int width, int height, int depth, Format format) unsigned int Surface::size(int width, int height, int depth, Format format)
{ {
...@@ -1789,6 +1988,7 @@ namespace sw ...@@ -1789,6 +1988,7 @@ namespace sw
case FORMAT_DXT1: case FORMAT_DXT1:
#endif #endif
case FORMAT_ATI1: case FORMAT_ATI1:
case FORMAT_ETC1:
return width4 * height4 * depth / 2; return width4 * height4 * depth / 2;
#if S3TC_SUPPORT #if S3TC_SUPPORT
case FORMAT_DXT3: case FORMAT_DXT3:
...@@ -2032,6 +2232,7 @@ namespace sw ...@@ -2032,6 +2232,7 @@ namespace sw
#endif #endif
case FORMAT_ATI1: case FORMAT_ATI1:
case FORMAT_ATI2: case FORMAT_ATI2:
case FORMAT_ETC1:
return true; return true;
default: default:
return false; return false;
...@@ -2902,6 +3103,8 @@ namespace sw ...@@ -2902,6 +3103,8 @@ namespace sw
return FORMAT_R8; return FORMAT_R8;
case FORMAT_ATI2: case FORMAT_ATI2:
return FORMAT_G8R8; return FORMAT_G8R8;
case FORMAT_ETC1:
return FORMAT_X8R8G8B8;
// Bumpmap formats // Bumpmap formats
case FORMAT_V8U8: return FORMAT_V8U8; case FORMAT_V8U8: return FORMAT_V8U8;
case FORMAT_L6V5U5: return FORMAT_X8L8V8U8; case FORMAT_L6V5U5: return FORMAT_X8L8V8U8;
......
...@@ -62,6 +62,7 @@ namespace sw ...@@ -62,6 +62,7 @@ namespace sw
FORMAT_DXT5, FORMAT_DXT5,
FORMAT_ATI1, FORMAT_ATI1,
FORMAT_ATI2, FORMAT_ATI2,
FORMAT_ETC1,
// Floating-point formats // Floating-point formats
FORMAT_R16F, FORMAT_R16F,
FORMAT_G16R16F, FORMAT_G16R16F,
...@@ -271,6 +272,7 @@ namespace sw ...@@ -271,6 +272,7 @@ namespace sw
word c1; word c1;
dword clut; dword clut;
}; };
#endif
struct ATI2 struct ATI2
{ {
...@@ -310,7 +312,6 @@ namespace sw ...@@ -310,7 +312,6 @@ namespace sw
qword rlut; // Skip first 16 bit qword rlut; // Skip first 16 bit
}; };
}; };
#endif
static void decodeR8G8B8(Buffer &destination, const Buffer &source); static void decodeR8G8B8(Buffer &destination, const Buffer &source);
static void decodeX8B8G8R8(Buffer &destination, const Buffer &source); static void decodeX8B8G8R8(Buffer &destination, const Buffer &source);
...@@ -326,9 +327,10 @@ namespace sw ...@@ -326,9 +327,10 @@ namespace sw
static void decodeDXT1(Buffer &internal, const Buffer &external); static void decodeDXT1(Buffer &internal, const Buffer &external);
static void decodeDXT3(Buffer &internal, const Buffer &external); static void decodeDXT3(Buffer &internal, const Buffer &external);
static void decodeDXT5(Buffer &internal, const Buffer &external); static void decodeDXT5(Buffer &internal, const Buffer &external);
#endif
static void decodeATI1(Buffer &internal, const Buffer &external); static void decodeATI1(Buffer &internal, const Buffer &external);
static void decodeATI2(Buffer &internal, const Buffer &external); static void decodeATI2(Buffer &internal, const Buffer &external);
#endif static void decodeETC1(Buffer &internal, const Buffer &external);
static void update(Buffer &destination, Buffer &source); static void update(Buffer &destination, Buffer &source);
static void genericUpdate(Buffer &destination, Buffer &source); static void genericUpdate(Buffer &destination, Buffer &source);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment