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
......@@ -16,10 +16,10 @@
#define PERF_HUD 0 // Display time spent on vertex, setup and pixel processing for each thread
#define PERF_PROFILE 0 // Profile various pipeline stages and display the timing in SwiftConfig
#if defined(_WIN32)
#define S3TC_SUPPORT 1
#else
#define S3TC_SUPPORT 0
#if defined(_WIN32)
#define S3TC_SUPPORT 1
#else
#define S3TC_SUPPORT 0
#endif
#if PERF_PROFILE
......
......@@ -1007,20 +1007,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_STENCIL_CLEAR_VALUE: *params = mState.stencilClearValue; break;
case GL_SUBPIXEL_BITS: *params = 4; break;
case GL_MAX_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
{
if(S3TC_SUPPORT)
{
// GL_COMPRESSED_RGB_S3TC_DXT1_EXT
// GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
*params = 2;
}
else
{
*params = 0;
}
}
break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = NUM_COMPRESSED_TEXTURE_FORMATS; break;
case GL_SAMPLE_BUFFERS:
case GL_SAMPLES:
{
......@@ -1063,11 +1050,10 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
break;
case GL_COMPRESSED_TEXTURE_FORMATS:
{
if(S3TC_SUPPORT)
{
params[0] = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
params[1] = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
}
for(int i = 0; i < NUM_COMPRESSED_TEXTURE_FORMATS; i++)
{
params[i] = compressedTextureFormats[i];
}
}
break;
case GL_VIEWPORT:
......@@ -1195,7 +1181,7 @@ int Context::getQueryParameterNum(GLenum pname)
switch (pname)
{
case GL_COMPRESSED_TEXTURE_FORMATS:
return S3TC_SUPPORT ? 2 : 0;
return NUM_COMPRESSED_TEXTURE_FORMATS;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
case GL_ARRAY_BUFFER_BINDING:
case GL_FRAMEBUFFER_BINDING_OES:
......
......@@ -25,6 +25,7 @@
#define GL_API
#include <GLES/gl.h>
#include <GLES/glext.h>
#define EGLAPI
#include <EGL/egl.h>
......@@ -75,14 +76,17 @@ enum
IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5
};
enum QueryType
const GLenum compressedTextureFormats[] =
{
QUERY_ANY_SAMPLES_PASSED,
QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE,
QUERY_TYPE_COUNT
GL_ETC1_RGB8_OES,
#if (S3TC_SUPPORT)
GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
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_MAX = 1.0f;
const float ALIASED_POINT_SIZE_RANGE_MIN = 0.125f;
......
......@@ -87,6 +87,11 @@ namespace es1
sw::Format Image::selectInternalFormat(GLenum format, GLenum type)
{
if(format == GL_ETC1_RGB8_OES)
{
return sw::FORMAT_ETC1;
}
else
#if S3TC_SUPPORT
if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
......
......@@ -909,6 +909,8 @@ void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum inter
switch(internalformat)
{
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
if(!S3TC_SUPPORT)
......@@ -992,6 +994,8 @@ void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xof
switch(format)
{
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
if(!S3TC_SUPPORT)
......@@ -1125,6 +1129,8 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor
return error(GL_INVALID_OPERATION);
}
break;
case GL_ETC1_RGB8_OES:
return error(GL_INVALID_OPERATION);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
if(S3TC_SUPPORT)
......@@ -1135,7 +1141,6 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor
{
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -1255,13 +1260,22 @@ void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset,
return error(GL_INVALID_OPERATION);
}
break;
case GL_ETC1_RGB8_OES:
return error(GL_INVALID_OPERATION);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
return error(GL_INVALID_OPERATION);
if(S3TC_SUPPORT)
{
return error(GL_INVALID_OPERATION);
}
else
{
return error(GL_INVALID_ENUM);
}
case GL_DEPTH_STENCIL_OES:
return error(GL_INVALID_OPERATION);
default:
return error(GL_INVALID_OPERATION);
return error(GL_INVALID_ENUM);
}
texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
......@@ -2320,6 +2334,7 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
"GL_OES_blend_equation_separate "
"GL_OES_blend_func_separate "
"GL_OES_blend_subtract "
"GL_OES_compressed_ETC1_RGB8_texture "
"GL_OES_depth_texture "
"GL_OES_EGL_image "
"GL_OES_EGL_image_external "
......@@ -3287,9 +3302,18 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_ENUM);
}
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:
break;
if(S3TC_SUPPORT)
{
return error(GL_INVALID_OPERATION);
}
else
{
return error(GL_INVALID_ENUM);
}
case GL_DEPTH_STENCIL_OES:
switch(type)
{
......@@ -3314,30 +3338,17 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
{
switch(target)
{
case GL_TEXTURE_2D:
case GL_TEXTURE_2D:
if(width > (es1::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es1::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{
return error(GL_INVALID_VALUE);
}
break;
default:
default:
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)
{
es1::Texture2D *texture = context->getTexture2D();
......
......@@ -39,6 +39,7 @@ namespace es1
{
switch(format)
{
case GL_ETC1_RGB8_OES:
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
return 8 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f);
......@@ -49,35 +50,19 @@ namespace es1
bool IsCompressed(GLenum format)
{
if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
{
return true;
}
else
{
return false;
}
return format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
format == GL_ETC1_RGB8_OES;
}
bool IsDepthTexture(GLenum format)
{
if(format == GL_DEPTH_STENCIL_OES)
{
return true;
}
return false;
return format == GL_DEPTH_STENCIL_OES;
}
bool IsStencilTexture(GLenum format)
{
if(format == GL_DEPTH_STENCIL_OES)
{
return true;
}
return false;
return format == GL_DEPTH_STENCIL_OES;
}
// Returns the size, in bytes, of a single texel in an Image
......
......@@ -1323,25 +1323,10 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_STENCIL_BACK_WRITEMASK: *params = mState.stencilBackWritemask; break;
case GL_STENCIL_CLEAR_VALUE: *params = mState.stencilClearValue; 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_NUM_COMPRESSED_TEXTURE_FORMATS:
{
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_NUM_COMPRESSED_TEXTURE_FORMATS: *params = NUM_COMPRESSED_TEXTURE_FORMATS; break;
case GL_MAX_SAMPLES_ANGLE: *params = IMPLEMENTATION_MAX_SAMPLES; break;
case GL_SAMPLE_BUFFERS:
case GL_SAMPLES:
{
......@@ -1384,12 +1369,9 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
break;
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[1] = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
params[2] = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
params[3] = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
params[i] = compressedTextureFormats[i];
}
}
break;
......@@ -1515,7 +1497,7 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
case GL_COMPRESSED_TEXTURE_FORMATS:
{
*type = GL_INT;
*numParams = S3TC_SUPPORT ? 4 : 0;
*numParams = NUM_COMPRESSED_TEXTURE_FORMATS;
}
break;
case GL_SHADER_BINARY_FORMATS:
......
......@@ -80,20 +80,33 @@ enum
IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5
};
enum QueryType
const GLenum compressedTextureFormats[] =
{
QUERY_ANY_SAMPLES_PASSED,
QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE,
QUERY_TYPE_COUNT
GL_ETC1_RGB8_OES,
#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,
#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_MAX = 1.0f;
const float ALIASED_POINT_SIZE_RANGE_MIN = 0.125f;
const float ALIASED_POINT_SIZE_RANGE_MAX = 8192.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
{
float red;
......
......@@ -86,6 +86,11 @@ namespace es2
sw::Format Image::selectInternalFormat(GLenum format, GLenum type)
{
if(format == GL_ETC1_RGB8_OES)
{
return sw::FORMAT_ETC1;
}
else
#if S3TC_SUPPORT
if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
......
......@@ -736,6 +736,8 @@ void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum inter
switch(internalformat)
{
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
......@@ -860,6 +862,8 @@ void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xof
switch(format)
{
case GL_ETC1_RGB8_OES:
break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
......@@ -1024,6 +1028,8 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor
return error(GL_INVALID_OPERATION);
}
break;
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_DXT3_ANGLE:
......@@ -1036,7 +1042,6 @@ void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalfor
{
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
}
......@@ -1171,16 +1176,25 @@ void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset,
return error(GL_INVALID_OPERATION);
}
break;
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_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
return error(GL_INVALID_OPERATION);
if(S3TC_SUPPORT)
{
return error(GL_INVALID_OPERATION);
}
else
{
return error(GL_INVALID_ENUM);
}
case GL_DEPTH_COMPONENT:
case GL_DEPTH_STENCIL_OES:
return error(GL_INVALID_OPERATION);
default:
return error(GL_INVALID_OPERATION);
return error(GL_INVALID_ENUM);
}
texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
......@@ -2869,6 +2883,7 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
// EXT extensions
// Vendor extensions
return (GLubyte*)
"GL_OES_compressed_ETC1_RGB8_texture "
"GL_OES_depth_texture "
"GL_OES_depth_texture_cube_map "
"GL_OES_EGL_image "
......@@ -2885,15 +2900,17 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
"GL_EXT_blend_minmax "
"GL_EXT_occlusion_query_boolean "
"GL_EXT_read_format_bgra "
#if (S3TC_SUPPORT)
#if (S3TC_SUPPORT)
"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_format_BGRA8888 "
"GL_ANGLE_framebuffer_blit "
"GL_ANGLE_framebuffer_multisample "
#if (S3TC_SUPPORT)
"GL_ANGLE_texture_compression_dxt3 "
"GL_ANGLE_texture_compression_dxt5 "
#endif
"GL_NV_fence";
default:
return error(GL_INVALID_ENUM, (GLubyte*)NULL);
......@@ -4057,11 +4074,20 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_ENUM);
}
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_DXT3_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:
switch(type)
{
......@@ -4096,19 +4122,19 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
{
switch(target)
{
case GL_TEXTURE_2D:
case GL_TEXTURE_2D:
if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{
return error(GL_INVALID_VALUE);
}
break;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
if(width != height)
{
return error(GL_INVALID_VALUE);
......@@ -4120,25 +4146,10 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_VALUE);
}
break;
default:
default:
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)
{
es2::Texture2D *texture = context->getTexture2D();
......
......@@ -207,6 +207,7 @@ namespace es2
{
case GL_COMPRESSED_RGB_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);
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
......@@ -218,39 +219,23 @@ namespace es2
bool IsCompressed(GLenum format)
{
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)
{
return true;
}
else
{
return false;
}
return 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 ||
format == GL_ETC1_RGB8_OES;
}
bool IsDepthTexture(GLenum format)
{
if(format == GL_DEPTH_COMPONENT ||
format == GL_DEPTH_STENCIL_OES)
{
return true;
}
return false;
return format == GL_DEPTH_COMPONENT ||
format == GL_DEPTH_STENCIL_OES;
}
bool IsStencilTexture(GLenum format)
{
if(format == GL_STENCIL_INDEX_OES ||
format == GL_DEPTH_STENCIL_OES)
{
return true;
}
return false;
return format == GL_STENCIL_INDEX_OES ||
format == GL_DEPTH_STENCIL_OES;
}
// Returns the size, in bytes, of a single texel in an Image
......
......@@ -62,6 +62,7 @@ namespace sw
FORMAT_DXT5,
FORMAT_ATI1,
FORMAT_ATI2,
FORMAT_ETC1,
// Floating-point formats
FORMAT_R16F,
FORMAT_G16R16F,
......@@ -271,6 +272,7 @@ namespace sw
word c1;
dword clut;
};
#endif
struct ATI2
{
......@@ -310,7 +312,6 @@ namespace sw
qword rlut; // Skip first 16 bit
};
};
#endif
static void decodeR8G8B8(Buffer &destination, const Buffer &source);
static void decodeX8B8G8R8(Buffer &destination, const Buffer &source);
......@@ -326,9 +327,10 @@ namespace sw
static void decodeDXT1(Buffer &internal, const Buffer &external);
static void decodeDXT3(Buffer &internal, const Buffer &external);
static void decodeDXT5(Buffer &internal, const Buffer &external);
#endif
static void decodeATI1(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 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