Bug 750862 - Implement WEBGL_compressed_texture_pvrtc - r=jgilbert

This commit is contained in:
Benoit Jacob 2012-09-25 08:49:28 -04:00
parent faf08d911a
commit 64b67de1c3
16 changed files with 153 additions and 11 deletions

View File

@ -53,6 +53,7 @@ CPPSRCS += \
WebGLTexelConversions.cpp \
WebGLExtensionCompressedTextureS3TC.cpp \
WebGLExtensionCompressedTextureATC.cpp \
WebGLExtensionCompressedTexturePVRTC.cpp \
WebGLExtensionDepthTexture.cpp \
WebGLElementArrayCache.cpp \
$(NULL)

View File

@ -968,6 +968,11 @@ bool WebGLContext::IsExtensionSupported(WebGLExtensionID ext)
isSupported = true;
}
break;
case WEBGL_compressed_texture_pvrtc:
if (gl->IsExtensionSupported(GLContext::IMG_texture_compression_pvrtc)) {
isSupported = true;
}
break;
case WEBGL_depth_texture:
if (gl->IsGLES2() &&
gl->IsExtensionSupported(GLContext::OES_packed_depth_stencil) &&
@ -1035,6 +1040,12 @@ WebGLContext::GetExtension(const nsAString& aName)
if (IsExtensionSupported(WEBGL_compressed_texture_atc))
ext = WEBGL_compressed_texture_atc;
}
else if (aName.Equals(NS_LITERAL_STRING("MOZ_WEBGL_compressed_texture_pvrtc"),
nsCaseInsensitiveStringComparator()))
{
if (IsExtensionSupported(WEBGL_compressed_texture_pvrtc))
ext = WEBGL_compressed_texture_pvrtc;
}
else if (aName.Equals(NS_LITERAL_STRING("MOZ_WEBGL_depth_texture"),
nsCaseInsensitiveStringComparator()))
{
@ -1063,6 +1074,9 @@ WebGLContext::GetExtension(const nsAString& aName)
case WEBGL_compressed_texture_atc:
mExtensions[ext] = new WebGLExtensionCompressedTextureATC(this);
break;
case WEBGL_compressed_texture_pvrtc:
mExtensions[ext] = new WebGLExtensionCompressedTexturePVRTC(this);
break;
case WEBGL_depth_texture:
mExtensions[ext] = new WebGLExtensionDepthTexture(this);
break;
@ -1586,6 +1600,8 @@ WebGLContext::GetSupportedExtensions(Nullable< nsTArray<nsString> > &retval)
arr.AppendElement(NS_LITERAL_STRING("MOZ_WEBGL_compressed_texture_s3tc"));
if (IsExtensionSupported(WEBGL_compressed_texture_atc))
arr.AppendElement(NS_LITERAL_STRING("MOZ_WEBGL_compressed_texture_atc"));
if (IsExtensionSupported(WEBGL_compressed_texture_pvrtc))
arr.AppendElement(NS_LITERAL_STRING("MOZ_WEBGL_compressed_texture_pvrtc"));
if (IsExtensionSupported(WEBGL_depth_texture))
arr.AppendElement(NS_LITERAL_STRING("MOZ_WEBGL_depth_texture"));
}

View File

@ -461,12 +461,13 @@ class WebGLContext :
public WebGLRectangleObject,
public nsWrapperCache
{
friend class WebGLContextUserData;
friend class WebGLMemoryPressureObserver;
friend class WebGLMemoryMultiReporterWrapper;
friend class WebGLExtensionLoseContext;
friend class WebGLExtensionCompressedTextureS3TC;
friend class WebGLExtensionCompressedTextureATC;
friend class WebGLContextUserData;
friend class WebGLMemoryPressureObserver;
friend class WebGLExtensionCompressedTexturePVRTC;
friend class WebGLExtensionDepthTexture;
enum {
@ -1172,6 +1173,7 @@ protected:
WEBGL_lose_context,
WEBGL_compressed_texture_s3tc,
WEBGL_compressed_texture_atc,
WEBGL_compressed_texture_pvrtc,
WEBGL_depth_texture,
WebGLExtensionID_number_of_extensions,
WebGLExtensionID_unknown_extension
@ -1211,7 +1213,7 @@ protected:
bool ValidateGLSLString(const nsAString& string, const char *info);
bool ValidateTexImage2DTarget(WebGLenum target, WebGLsizei width, WebGLsizei height, const char* info);
bool ValidateCompressedTextureSize(WebGLint level, WebGLenum format, WebGLsizei width, WebGLsizei height, uint32_t byteLength, const char* info);
bool ValidateCompressedTextureSize(WebGLenum target, WebGLint level, WebGLenum format, WebGLsizei width, WebGLsizei height, uint32_t byteLength, const char* info);
bool ValidateLevelWidthHeightForTarget(WebGLenum target, WebGLint level, WebGLsizei width, WebGLsizei height, const char* info);
static uint32_t GetBitsPerTexel(WebGLenum format, WebGLenum type);

View File

@ -4225,17 +4225,13 @@ WebGLContext::CompressedTexImage2D(WebGLenum target, WebGLint level, WebGLenum i
return;
}
if (!ValidateLevelWidthHeightForTarget(target, level, width, height, "compressedTexImage2D")) {
return;
}
if (border) {
ErrorInvalidValue("compressedTexImage2D: border is not 0");
return;
}
uint32_t byteLength = view.Length();
if (!ValidateCompressedTextureSize(level, internalformat, width, height, byteLength, "compressedTexImage2D")) {
if (!ValidateCompressedTextureSize(target, level, internalformat, width, height, byteLength, "compressedTexImage2D")) {
return;
}
@ -4281,7 +4277,7 @@ WebGLContext::CompressedTexSubImage2D(WebGLenum target, WebGLint level, WebGLint
}
uint32_t byteLength = view.Length();
if (!ValidateCompressedTextureSize(level, format, width, height, byteLength, "compressedTexSubImage2D")) {
if (!ValidateCompressedTextureSize(target, level, format, width, height, byteLength, "compressedTexSubImage2D")) {
return;
}
@ -4323,6 +4319,19 @@ WebGLContext::CompressedTexSubImage2D(WebGLenum target, WebGLint level, WebGLint
}
break;
}
case LOCAL_GL_COMPRESSED_RGB_PVRTC_4BPPV1:
case LOCAL_GL_COMPRESSED_RGB_PVRTC_2BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_4BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_2BPPV1:
{
if (xoffset || yoffset ||
width != imageInfo.Width() ||
height != imageInfo.Height())
{
ErrorInvalidValue("compressedTexSubImage2D: the update rectangle doesn't match the existing image");
return;
}
}
}
gl->fCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, byteLength, view.Data());

View File

@ -201,6 +201,10 @@ WebGLContext::IsTextureFormatCompressed(GLenum format)
case LOCAL_GL_ATC_RGB:
case LOCAL_GL_ATC_RGBA_EXPLICIT_ALPHA:
case LOCAL_GL_ATC_RGBA_INTERPOLATED_ALPHA:
case LOCAL_GL_COMPRESSED_RGB_PVRTC_4BPPV1:
case LOCAL_GL_COMPRESSED_RGB_PVRTC_2BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_4BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_2BPPV1:
return true;
}

View File

@ -371,9 +371,17 @@ bool WebGLContext::ValidateTexImage2DTarget(WebGLenum target, WebGLsizei width,
return true;
}
bool WebGLContext::ValidateCompressedTextureSize(WebGLint level, WebGLenum format, WebGLsizei width,
WebGLsizei height, uint32_t byteLength, const char* info)
bool WebGLContext::ValidateCompressedTextureSize(WebGLenum target, WebGLint level,
WebGLenum format,
WebGLsizei width, WebGLsizei height, uint32_t byteLength, const char* info)
{
if (!ValidateLevelWidthHeightForTarget(target, level, width, height, info)) {
return false;
}
// negative width and height must already have been handled above
MOZ_ASSERT(width >= 0 && height >= 0);
CheckedUint32 required_byteLength = 0;
switch (format) {
@ -392,6 +400,18 @@ bool WebGLContext::ValidateCompressedTextureSize(WebGLint level, WebGLenum forma
required_byteLength = ((CheckedUint32(width) + 3) / 4) * ((CheckedUint32(height) + 3) / 4) * 16;
break;
}
case LOCAL_GL_COMPRESSED_RGB_PVRTC_4BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_4BPPV1:
{
required_byteLength = CheckedUint32(NS_MAX(width, 8)) * CheckedUint32(NS_MAX(height, 8)) / 2;
break;
}
case LOCAL_GL_COMPRESSED_RGB_PVRTC_2BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_2BPPV1:
{
required_byteLength = CheckedUint32(NS_MAX(width, 16)) * CheckedUint32(NS_MAX(height, 8)) / 4;
break;
}
}
if (!required_byteLength.isValid() || required_byteLength.value() != byteLength) {
@ -417,6 +437,18 @@ bool WebGLContext::ValidateCompressedTextureSize(WebGLint level, WebGLenum forma
ErrorInvalidOperation("%s: level parameter does not match width and height", info);
return false;
}
case LOCAL_GL_COMPRESSED_RGB_PVRTC_4BPPV1:
case LOCAL_GL_COMPRESSED_RGB_PVRTC_2BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_4BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_2BPPV1:
{
if (!is_pot_assuming_nonnegative(width) ||
!is_pot_assuming_nonnegative(height))
{
ErrorInvalidValue("%s: width and height must be powers of two", info);
return false;
}
}
}
return true;
@ -479,9 +511,14 @@ uint32_t WebGLContext::GetBitsPerTexel(WebGLenum format, WebGLenum type)
return 3 * multiplier;
case LOCAL_GL_RGBA:
return 4 * multiplier;
case LOCAL_GL_COMPRESSED_RGB_PVRTC_2BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_2BPPV1:
return 2;
case LOCAL_GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case LOCAL_GL_ATC_RGB:
case LOCAL_GL_COMPRESSED_RGB_PVRTC_4BPPV1:
case LOCAL_GL_COMPRESSED_RGBA_PVRTC_4BPPV1:
return 4;
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:

View File

@ -0,0 +1,33 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "WebGLContext.h"
#include "WebGLExtensions.h"
using namespace mozilla;
WebGLExtensionCompressedTexturePVRTC::WebGLExtensionCompressedTexturePVRTC(WebGLContext* context)
: WebGLExtension(context)
{
context->mCompressedTextureFormats.AppendElement(LOCAL_GL_COMPRESSED_RGB_PVRTC_4BPPV1);
context->mCompressedTextureFormats.AppendElement(LOCAL_GL_COMPRESSED_RGB_PVRTC_2BPPV1);
context->mCompressedTextureFormats.AppendElement(LOCAL_GL_COMPRESSED_RGBA_PVRTC_4BPPV1);
context->mCompressedTextureFormats.AppendElement(LOCAL_GL_COMPRESSED_RGBA_PVRTC_2BPPV1);
}
WebGLExtensionCompressedTexturePVRTC::~WebGLExtensionCompressedTexturePVRTC()
{
}
NS_IMPL_ADDREF_INHERITED(WebGLExtensionCompressedTexturePVRTC, WebGLExtension)
NS_IMPL_RELEASE_INHERITED(WebGLExtensionCompressedTexturePVRTC, WebGLExtension)
DOMCI_DATA(WebGLExtensionCompressedTexturePVRTC, WebGLExtensionCompressedTexturePVRTC)
NS_INTERFACE_MAP_BEGIN(WebGLExtensionCompressedTexturePVRTC)
NS_INTERFACE_MAP_ENTRY(nsIWebGLExtensionCompressedTexturePVRTC)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, WebGLExtension)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(WebGLExtensionCompressedTexturePVRTC)
NS_INTERFACE_MAP_END_INHERITING(WebGLExtension)

View File

@ -68,6 +68,18 @@ public:
NS_DECL_NSIWEBGLEXTENSION
};
class WebGLExtensionCompressedTexturePVRTC :
public nsIWebGLExtensionCompressedTexturePVRTC,
public WebGLExtension
{
public:
WebGLExtensionCompressedTexturePVRTC(WebGLContext* context);
virtual ~WebGLExtensionCompressedTexturePVRTC();
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIWEBGLEXTENSION
};
class WebGLExtensionDepthTexture :
public nsIWebGLExtensionDepthTexture,
public WebGLExtension

View File

@ -1587,6 +1587,9 @@ static nsDOMClassInfoData sClassInfoData[] = {
NS_DEFINE_CLASSINFO_DATA(WebGLExtensionCompressedTextureATC, WebGLExtensionSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS |
nsIXPCScriptable::WANT_ADDPROPERTY)
NS_DEFINE_CLASSINFO_DATA(WebGLExtensionCompressedTexturePVRTC, WebGLExtensionSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS |
nsIXPCScriptable::WANT_ADDPROPERTY)
NS_DEFINE_CLASSINFO_DATA(WebGLExtensionDepthTexture, WebGLExtensionSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS |
nsIXPCScriptable::WANT_ADDPROPERTY)
@ -4288,6 +4291,10 @@ nsDOMClassInfo::Init()
DOM_CLASSINFO_MAP_ENTRY(nsIWebGLExtensionCompressedTextureATC)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(WebGLExtensionCompressedTexturePVRTC, nsIWebGLExtensionCompressedTexturePVRTC)
DOM_CLASSINFO_MAP_ENTRY(nsIWebGLExtensionCompressedTexturePVRTC)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(WebGLExtensionDepthTexture, nsIWebGLExtensionDepthTexture)
DOM_CLASSINFO_MAP_ENTRY(nsIWebGLExtensionDepthTexture)
DOM_CLASSINFO_MAP_END

View File

@ -460,6 +460,7 @@ DOMCI_CLASS(WebGLExtensionTextureFilterAnisotropic)
DOMCI_CLASS(WebGLExtensionLoseContext)
DOMCI_CLASS(WebGLExtensionCompressedTextureS3TC)
DOMCI_CLASS(WebGLExtensionCompressedTextureATC)
DOMCI_CLASS(WebGLExtensionCompressedTexturePVRTC)
DOMCI_CLASS(WebGLExtensionDepthTexture)
DOMCI_CLASS(PaintRequest)

View File

@ -164,6 +164,16 @@ interface nsIWebGLExtensionCompressedTextureATC : nsIWebGLExtension
const WebGLenum COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87EE;
};
[scriptable, builtinclass, uuid(c33aa5a1-035c-4dfa-b240-df71395ad0f8)]
interface nsIWebGLExtensionCompressedTexturePVRTC : nsIWebGLExtension
{
/* Compressed Texture Formats */
const WebGLenum COMPRESSED_RGB_PVRTC_4BPPV1 = 0x8C00;
const WebGLenum COMPRESSED_RGB_PVRTC_2BPPV1 = 0x8C01;
const WebGLenum COMPRESSED_RGBA_PVRTC_4BPPV1 = 0x8C02;
const WebGLenum COMPRESSED_RGBA_PVRTC_2BPPV1 = 0x8C03;
};
[scriptable, builtinclass, uuid(ef36f000-c1b2-11e1-afa7-0800200c9a66)]
interface nsIWebGLExtensionDepthTexture : nsIWebGLExtension
{

View File

@ -291,6 +291,7 @@ var interfaceNamesInGlobalScope =
"SVGStopElement",
"WebGLExtensionCompressedTextureS3TC",
"WebGLExtensionCompressedTextureATC",
"WebGLExtensionCompressedTexturePVRTC",
"XULCommandEvent",
"HTMLMediaElement",
"SVGPathSegLinetoHorizontalAbs",

View File

@ -70,6 +70,7 @@ static const char *sExtensionNames[] = {
"GL_ANGLE_texture_compression_dxt3",
"GL_ANGLE_texture_compression_dxt5",
"GL_AMD_compressed_ATC_texture",
"GL_IMG_texture_compression_pvrtc",
"GL_EXT_framebuffer_blit",
"GL_ANGLE_framebuffer_blit",
"GL_EXT_framebuffer_multisample",

View File

@ -1659,6 +1659,7 @@ public:
ANGLE_texture_compression_dxt3,
ANGLE_texture_compression_dxt5,
AMD_compressed_ATC_texture,
IMG_texture_compression_pvrtc,
EXT_framebuffer_blit,
ANGLE_framebuffer_blit,
EXT_framebuffer_multisample,

View File

@ -3098,6 +3098,12 @@ typedef void* GLeglImage;
#define LOCAL_GL_ATC_RGBA_EXPLICIT_ALPHA 0x8C93
#define LOCAL_GL_ATC_RGBA_INTERPOLATED_ALPHA 0x87EE
// IMG_texture_compression_pvrtc
#define LOCAL_GL_COMPRESSED_RGB_PVRTC_4BPPV1 0x8C00
#define LOCAL_GL_COMPRESSED_RGB_PVRTC_2BPPV1 0x8C01
#define LOCAL_GL_COMPRESSED_RGBA_PVRTC_4BPPV1 0x8C02
#define LOCAL_GL_COMPRESSED_RGBA_PVRTC_2BPPV1 0x8C03
#define LOCAL_WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
#define LOCAL_WGL_DRAW_TO_WINDOW_ARB 0x2001
#define LOCAL_WGL_DRAW_TO_BITMAP_ARB 0x2002

View File

@ -477,6 +477,7 @@ irregularFilenames = {
'nsIWebGLExtensionLoseContext' : 'nsIDOMWebGLRenderingContext',
'nsIWebGLExtensionCompressedTextureS3TC' : 'nsIDOMWebGLRenderingContext',
'nsIWebGLExtensionCompressedTextureATC' : 'nsIDOMWebGLRenderingContext',
'nsIWebGLExtensionCompressedTexturePVRTC' : 'nsIDOMWebGLRenderingContext',
'nsIWebGLExtensionDepthTexture' : 'nsIDOMWebGLRenderingContext',
'nsIIndexedDatabaseUsageCallback': 'nsIIndexedDatabaseManager',