mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 19:35:51 +00:00
Bug 750862 - Implement WEBGL_compressed_texture_pvrtc - r=jgilbert
This commit is contained in:
parent
faf08d911a
commit
64b67de1c3
@ -53,6 +53,7 @@ CPPSRCS += \
|
||||
WebGLTexelConversions.cpp \
|
||||
WebGLExtensionCompressedTextureS3TC.cpp \
|
||||
WebGLExtensionCompressedTextureATC.cpp \
|
||||
WebGLExtensionCompressedTexturePVRTC.cpp \
|
||||
WebGLExtensionDepthTexture.cpp \
|
||||
WebGLElementArrayCache.cpp \
|
||||
$(NULL)
|
||||
|
@ -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"));
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
33
content/canvas/src/WebGLExtensionCompressedTexturePVRTC.cpp
Normal file
33
content/canvas/src/WebGLExtensionCompressedTexturePVRTC.cpp
Normal 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)
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -291,6 +291,7 @@ var interfaceNamesInGlobalScope =
|
||||
"SVGStopElement",
|
||||
"WebGLExtensionCompressedTextureS3TC",
|
||||
"WebGLExtensionCompressedTextureATC",
|
||||
"WebGLExtensionCompressedTexturePVRTC",
|
||||
"XULCommandEvent",
|
||||
"HTMLMediaElement",
|
||||
"SVGPathSegLinetoHorizontalAbs",
|
||||
|
@ -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",
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -477,6 +477,7 @@ irregularFilenames = {
|
||||
'nsIWebGLExtensionLoseContext' : 'nsIDOMWebGLRenderingContext',
|
||||
'nsIWebGLExtensionCompressedTextureS3TC' : 'nsIDOMWebGLRenderingContext',
|
||||
'nsIWebGLExtensionCompressedTextureATC' : 'nsIDOMWebGLRenderingContext',
|
||||
'nsIWebGLExtensionCompressedTexturePVRTC' : 'nsIDOMWebGLRenderingContext',
|
||||
'nsIWebGLExtensionDepthTexture' : 'nsIDOMWebGLRenderingContext',
|
||||
|
||||
'nsIIndexedDatabaseUsageCallback': 'nsIIndexedDatabaseManager',
|
||||
|
Loading…
Reference in New Issue
Block a user