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 @@ ...@@ -16,10 +16,10 @@
#define PERF_HUD 0 // Display time spent on vertex, setup and pixel processing for each thread #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 #define PERF_PROFILE 0 // Profile various pipeline stages and display the timing in SwiftConfig
#if defined(_WIN32) #if defined(_WIN32)
#define S3TC_SUPPORT 1 #define S3TC_SUPPORT 1
#else #else
#define S3TC_SUPPORT 0 #define S3TC_SUPPORT 0
#endif #endif
#if PERF_PROFILE #if PERF_PROFILE
......
...@@ -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,11 +1050,10 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1063,11 +1050,10 @@ 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;
case GL_VIEWPORT: case GL_VIEWPORT:
...@@ -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:
return error(GL_INVALID_OPERATION); if(S3TC_SUPPORT)
{
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)
{ {
...@@ -3314,30 +3338,17 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, ...@@ -3314,30 +3338,17 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
{ {
switch(target) switch(target)
{ {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
if(width > (es1::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) || if(width > (es1::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es1::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level)) height > (es1::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
break; break;
default: default:
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
......
...@@ -1323,25 +1323,10 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1323,25 +1323,10 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_STENCIL_BACK_WRITEMASK: *params = mState.stencilBackWritemask; break; case GL_STENCIL_BACK_WRITEMASK: *params = mState.stencilBackWritemask; break;
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_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;
{ case GL_MAX_SAMPLES_ANGLE: *params = IMPLEMENTATION_MAX_SAMPLES; 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_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:
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_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 "
...@@ -2885,15 +2900,17 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name) ...@@ -2885,15 +2900,17 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
"GL_EXT_blend_minmax " "GL_EXT_blend_minmax "
"GL_EXT_occlusion_query_boolean " "GL_EXT_occlusion_query_boolean "
"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 " #endif
"GL_ANGLE_texture_compression_dxt5 "
#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)
{ {
...@@ -4096,19 +4122,19 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, ...@@ -4096,19 +4122,19 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
{ {
switch(target) switch(target)
{ {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) || if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level)) height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
break; break;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X: case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
if(width != height) if(width != height)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
...@@ -4120,25 +4146,10 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, ...@@ -4120,25 +4146,10 @@ void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat,
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
break; break;
default: default:
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
......
...@@ -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