mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 790712 - Implement WEBGL_compressed_texture_atc - r=jgilbert
This commit is contained in:
parent
2729e13909
commit
d4fa48d92a
@ -52,6 +52,7 @@ CPPSRCS += \
|
||||
WebGLExtensionLoseContext.cpp \
|
||||
WebGLTexelConversions.cpp \
|
||||
WebGLExtensionCompressedTextureS3TC.cpp \
|
||||
WebGLExtensionCompressedTextureATC.cpp \
|
||||
WebGLExtensionDepthTexture.cpp \
|
||||
WebGLElementArrayCache.cpp \
|
||||
$(NULL)
|
||||
|
@ -963,6 +963,11 @@ bool WebGLContext::IsExtensionSupported(WebGLExtensionID ext)
|
||||
isSupported = true;
|
||||
}
|
||||
break;
|
||||
case WEBGL_compressed_texture_atc:
|
||||
if (gl->IsExtensionSupported(GLContext::AMD_compressed_ATC_texture)) {
|
||||
isSupported = true;
|
||||
}
|
||||
break;
|
||||
case WEBGL_depth_texture:
|
||||
if (gl->IsGLES2() &&
|
||||
gl->IsExtensionSupported(GLContext::OES_packed_depth_stencil) &&
|
||||
@ -1024,6 +1029,12 @@ WebGLContext::GetExtension(const nsAString& aName)
|
||||
if (IsExtensionSupported(WEBGL_compressed_texture_s3tc))
|
||||
ext = WEBGL_compressed_texture_s3tc;
|
||||
}
|
||||
else if (aName.Equals(NS_LITERAL_STRING("MOZ_WEBGL_compressed_texture_atc"),
|
||||
nsCaseInsensitiveStringComparator()))
|
||||
{
|
||||
if (IsExtensionSupported(WEBGL_compressed_texture_atc))
|
||||
ext = WEBGL_compressed_texture_atc;
|
||||
}
|
||||
else if (aName.Equals(NS_LITERAL_STRING("MOZ_WEBGL_depth_texture"),
|
||||
nsCaseInsensitiveStringComparator()))
|
||||
{
|
||||
@ -1049,6 +1060,9 @@ WebGLContext::GetExtension(const nsAString& aName)
|
||||
case WEBGL_compressed_texture_s3tc:
|
||||
mExtensions[ext] = new WebGLExtensionCompressedTextureS3TC(this);
|
||||
break;
|
||||
case WEBGL_compressed_texture_atc:
|
||||
mExtensions[ext] = new WebGLExtensionCompressedTextureATC(this);
|
||||
break;
|
||||
case WEBGL_depth_texture:
|
||||
mExtensions[ext] = new WebGLExtensionDepthTexture(this);
|
||||
break;
|
||||
@ -1570,6 +1584,8 @@ WebGLContext::GetSupportedExtensions(Nullable< nsTArray<nsString> > &retval)
|
||||
arr.AppendElement(NS_LITERAL_STRING("MOZ_WEBGL_lose_context"));
|
||||
if (IsExtensionSupported(WEBGL_compressed_texture_s3tc))
|
||||
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_depth_texture))
|
||||
arr.AppendElement(NS_LITERAL_STRING("MOZ_WEBGL_depth_texture"));
|
||||
}
|
||||
|
@ -464,6 +464,7 @@ class WebGLContext :
|
||||
friend class WebGLMemoryMultiReporterWrapper;
|
||||
friend class WebGLExtensionLoseContext;
|
||||
friend class WebGLExtensionCompressedTextureS3TC;
|
||||
friend class WebGLExtensionCompressedTextureATC;
|
||||
friend class WebGLContextUserData;
|
||||
friend class WebGLMemoryPressureObserver;
|
||||
friend class WebGLExtensionDepthTexture;
|
||||
@ -1170,6 +1171,7 @@ protected:
|
||||
EXT_texture_filter_anisotropic,
|
||||
WEBGL_lose_context,
|
||||
WEBGL_compressed_texture_s3tc,
|
||||
WEBGL_compressed_texture_atc,
|
||||
WEBGL_depth_texture,
|
||||
WebGLExtensionID_number_of_extensions,
|
||||
WebGLExtensionID_unknown_extension
|
||||
|
@ -198,6 +198,9 @@ WebGLContext::IsTextureFormatCompressed(GLenum format)
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
|
||||
case LOCAL_GL_ATC_RGB:
|
||||
case LOCAL_GL_ATC_RGBA_EXPLICIT_ALPHA:
|
||||
case LOCAL_GL_ATC_RGBA_INTERPOLATED_ALPHA:
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -374,36 +374,31 @@ bool WebGLContext::ValidateTexImage2DTarget(WebGLenum target, WebGLsizei width,
|
||||
bool WebGLContext::ValidateCompressedTextureSize(WebGLint level, WebGLenum format, WebGLsizei width,
|
||||
WebGLsizei height, uint32_t byteLength, const char* info)
|
||||
{
|
||||
CheckedUint32 calculated_byteLength = 0;
|
||||
CheckedUint32 checked_byteLength = byteLength;
|
||||
if (!checked_byteLength.isValid()) {
|
||||
ErrorInvalidValue("%s: data length out of bounds", info);
|
||||
return false;
|
||||
}
|
||||
CheckedUint32 required_byteLength = 0;
|
||||
|
||||
switch (format) {
|
||||
case LOCAL_GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
|
||||
case LOCAL_GL_ATC_RGB:
|
||||
{
|
||||
calculated_byteLength = ((CheckedUint32(width) + 3) / 4) * ((CheckedUint32(height) + 3) / 4) * 8;
|
||||
if (!calculated_byteLength.isValid() || !(checked_byteLength == calculated_byteLength)) {
|
||||
ErrorInvalidValue("%s: data size does not match dimensions", info);
|
||||
return false;
|
||||
}
|
||||
required_byteLength = ((CheckedUint32(width) + 3) / 4) * ((CheckedUint32(height) + 3) / 4) * 8;
|
||||
break;
|
||||
}
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
|
||||
case LOCAL_GL_ATC_RGBA_EXPLICIT_ALPHA:
|
||||
case LOCAL_GL_ATC_RGBA_INTERPOLATED_ALPHA:
|
||||
{
|
||||
calculated_byteLength = ((CheckedUint32(width) + 3) / 4) * ((CheckedUint32(height) + 3) / 4) * 16;
|
||||
if (!calculated_byteLength.isValid() || !(checked_byteLength == calculated_byteLength)) {
|
||||
ErrorInvalidValue("%s: data size does not match dimensions", info);
|
||||
return false;
|
||||
}
|
||||
required_byteLength = ((CheckedUint32(width) + 3) / 4) * ((CheckedUint32(height) + 3) / 4) * 16;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!required_byteLength.isValid() || required_byteLength.value() != byteLength) {
|
||||
ErrorInvalidValue("%s: data size does not match dimensions", info);
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (format) {
|
||||
case LOCAL_GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
|
||||
@ -411,19 +406,20 @@ bool WebGLContext::ValidateCompressedTextureSize(WebGLint level, WebGLenum forma
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
|
||||
{
|
||||
if (level == 0 && width % 4 == 0 && height % 4 == 0) {
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
if (level > 0
|
||||
&& (width == 0 || width == 1 || width == 2 || width % 4 == 0)
|
||||
&& (height == 0 || height == 1 || height == 2 || height % 4 == 0))
|
||||
{
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
ErrorInvalidOperation("%s: level parameter does not match width and height", info);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
ErrorInvalidOperation("%s: level parameter does not match width and height", info);
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WebGLContext::ValidateLevelWidthHeightForTarget(WebGLenum target, WebGLint level, WebGLsizei width,
|
||||
@ -485,9 +481,12 @@ uint32_t WebGLContext::GetBitsPerTexel(WebGLenum format, WebGLenum type)
|
||||
return 4 * multiplier;
|
||||
case LOCAL_GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
|
||||
case LOCAL_GL_ATC_RGB:
|
||||
return 4;
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
|
||||
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
|
||||
case LOCAL_GL_ATC_RGBA_EXPLICIT_ALPHA:
|
||||
case LOCAL_GL_ATC_RGBA_INTERPOLATED_ALPHA:
|
||||
return 8;
|
||||
default:
|
||||
break;
|
||||
|
32
content/canvas/src/WebGLExtensionCompressedTextureATC.cpp
Normal file
32
content/canvas/src/WebGLExtensionCompressedTextureATC.cpp
Normal file
@ -0,0 +1,32 @@
|
||||
/* 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;
|
||||
|
||||
WebGLExtensionCompressedTextureATC::WebGLExtensionCompressedTextureATC(WebGLContext* context)
|
||||
: WebGLExtension(context)
|
||||
{
|
||||
context->mCompressedTextureFormats.AppendElement(LOCAL_GL_ATC_RGB);
|
||||
context->mCompressedTextureFormats.AppendElement(LOCAL_GL_ATC_RGBA_EXPLICIT_ALPHA);
|
||||
context->mCompressedTextureFormats.AppendElement(LOCAL_GL_ATC_RGBA_INTERPOLATED_ALPHA);
|
||||
}
|
||||
|
||||
WebGLExtensionCompressedTextureATC::~WebGLExtensionCompressedTextureATC()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(WebGLExtensionCompressedTextureATC, WebGLExtension)
|
||||
NS_IMPL_RELEASE_INHERITED(WebGLExtensionCompressedTextureATC, WebGLExtension)
|
||||
|
||||
DOMCI_DATA(WebGLExtensionCompressedTextureATC, WebGLExtensionCompressedTextureATC)
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN(WebGLExtensionCompressedTextureATC)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIWebGLExtensionCompressedTextureATC)
|
||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, WebGLExtension)
|
||||
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(WebGLExtensionCompressedTextureATC)
|
||||
NS_INTERFACE_MAP_END_INHERITING(WebGLExtension)
|
@ -56,6 +56,18 @@ public:
|
||||
NS_DECL_NSIWEBGLEXTENSION
|
||||
};
|
||||
|
||||
class WebGLExtensionCompressedTextureATC :
|
||||
public nsIWebGLExtensionCompressedTextureATC,
|
||||
public WebGLExtension
|
||||
{
|
||||
public:
|
||||
WebGLExtensionCompressedTextureATC(WebGLContext* context);
|
||||
virtual ~WebGLExtensionCompressedTextureATC();
|
||||
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
NS_DECL_NSIWEBGLEXTENSION
|
||||
};
|
||||
|
||||
class WebGLExtensionDepthTexture :
|
||||
public nsIWebGLExtensionDepthTexture,
|
||||
public WebGLExtension
|
||||
|
@ -1584,6 +1584,9 @@ static nsDOMClassInfoData sClassInfoData[] = {
|
||||
NS_DEFINE_CLASSINFO_DATA(WebGLExtensionCompressedTextureS3TC, WebGLExtensionSH,
|
||||
DOM_DEFAULT_SCRIPTABLE_FLAGS |
|
||||
nsIXPCScriptable::WANT_ADDPROPERTY)
|
||||
NS_DEFINE_CLASSINFO_DATA(WebGLExtensionCompressedTextureATC, WebGLExtensionSH,
|
||||
DOM_DEFAULT_SCRIPTABLE_FLAGS |
|
||||
nsIXPCScriptable::WANT_ADDPROPERTY)
|
||||
NS_DEFINE_CLASSINFO_DATA(WebGLExtensionDepthTexture, WebGLExtensionSH,
|
||||
DOM_DEFAULT_SCRIPTABLE_FLAGS |
|
||||
nsIXPCScriptable::WANT_ADDPROPERTY)
|
||||
@ -4281,6 +4284,10 @@ nsDOMClassInfo::Init()
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIWebGLExtensionCompressedTextureS3TC)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(WebGLExtensionCompressedTextureATC, nsIWebGLExtensionCompressedTextureATC)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIWebGLExtensionCompressedTextureATC)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(WebGLExtensionDepthTexture, nsIWebGLExtensionDepthTexture)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIWebGLExtensionDepthTexture)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
@ -459,6 +459,7 @@ DOMCI_CLASS(WebGLExtensionStandardDerivatives)
|
||||
DOMCI_CLASS(WebGLExtensionTextureFilterAnisotropic)
|
||||
DOMCI_CLASS(WebGLExtensionLoseContext)
|
||||
DOMCI_CLASS(WebGLExtensionCompressedTextureS3TC)
|
||||
DOMCI_CLASS(WebGLExtensionCompressedTextureATC)
|
||||
DOMCI_CLASS(WebGLExtensionDepthTexture)
|
||||
|
||||
DOMCI_CLASS(PaintRequest)
|
||||
|
@ -155,6 +155,15 @@ interface nsIWebGLExtensionCompressedTextureS3TC : nsIWebGLExtension
|
||||
const WebGLenum COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;
|
||||
};
|
||||
|
||||
[scriptable, builtinclass, uuid(9592637f-ee3b-4c42-8329-5c9ad47411c1)]
|
||||
interface nsIWebGLExtensionCompressedTextureATC : nsIWebGLExtension
|
||||
{
|
||||
/* Compressed Texture Formats */
|
||||
const WebGLenum COMPRESSED_RGB_ATC_WEBGL = 0x8C92;
|
||||
const WebGLenum COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8C93;
|
||||
const WebGLenum COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87EE;
|
||||
};
|
||||
|
||||
[scriptable, builtinclass, uuid(ef36f000-c1b2-11e1-afa7-0800200c9a66)]
|
||||
interface nsIWebGLExtensionDepthTexture : nsIWebGLExtension
|
||||
{
|
||||
|
@ -290,6 +290,7 @@ var interfaceNamesInGlobalScope =
|
||||
"CSSPrimitiveValue",
|
||||
"SVGStopElement",
|
||||
"WebGLExtensionCompressedTextureS3TC",
|
||||
"WebGLExtensionCompressedTextureATC",
|
||||
"XULCommandEvent",
|
||||
"HTMLMediaElement",
|
||||
"SVGPathSegLinetoHorizontalAbs",
|
||||
|
@ -69,6 +69,7 @@ static const char *sExtensionNames[] = {
|
||||
"GL_EXT_texture_compression_dxt1",
|
||||
"GL_ANGLE_texture_compression_dxt3",
|
||||
"GL_ANGLE_texture_compression_dxt5",
|
||||
"GL_AMD_compressed_ATC_texture",
|
||||
"GL_EXT_framebuffer_blit",
|
||||
"GL_ANGLE_framebuffer_blit",
|
||||
"GL_EXT_framebuffer_multisample",
|
||||
|
@ -1658,6 +1658,7 @@ public:
|
||||
EXT_texture_compression_dxt1,
|
||||
ANGLE_texture_compression_dxt3,
|
||||
ANGLE_texture_compression_dxt5,
|
||||
AMD_compressed_ATC_texture,
|
||||
EXT_framebuffer_blit,
|
||||
ANGLE_framebuffer_blit,
|
||||
EXT_framebuffer_multisample,
|
||||
|
@ -3093,6 +3093,11 @@ typedef void* GLeglImage;
|
||||
#define LOCAL_WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
|
||||
#define LOCAL_WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
|
||||
|
||||
// AMD_compressed_ATC_texture
|
||||
#define LOCAL_GL_ATC_RGB 0x8C92
|
||||
#define LOCAL_GL_ATC_RGBA_EXPLICIT_ALPHA 0x8C93
|
||||
#define LOCAL_GL_ATC_RGBA_INTERPOLATED_ALPHA 0x87EE
|
||||
|
||||
#define LOCAL_WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
|
||||
#define LOCAL_WGL_DRAW_TO_WINDOW_ARB 0x2001
|
||||
#define LOCAL_WGL_DRAW_TO_BITMAP_ARB 0x2002
|
||||
|
@ -476,6 +476,7 @@ irregularFilenames = {
|
||||
'nsIWebGLExtensionTextureFilterAnisotropic' : 'nsIDOMWebGLRenderingContext',
|
||||
'nsIWebGLExtensionLoseContext' : 'nsIDOMWebGLRenderingContext',
|
||||
'nsIWebGLExtensionCompressedTextureS3TC' : 'nsIDOMWebGLRenderingContext',
|
||||
'nsIWebGLExtensionCompressedTextureATC' : 'nsIDOMWebGLRenderingContext',
|
||||
'nsIWebGLExtensionDepthTexture' : 'nsIDOMWebGLRenderingContext',
|
||||
|
||||
'nsIIndexedDatabaseUsageCallback': 'nsIIndexedDatabaseManager',
|
||||
|
Loading…
Reference in New Issue
Block a user