Bug 879954 - Implement OES_texture_float_linear - r=bjacob

This commit is contained in:
Guillaume Abadie 2013-06-10 16:00:52 -04:00
Родитель b41194424c
Коммит 5cb8bce316
10 изменённых файлов: 64 добавлений и 5 удалений

Просмотреть файл

@ -975,6 +975,9 @@ bool WebGLContext::IsExtensionSupported(JSContext *cx, WebGLExtensionID ext) con
case OES_texture_float:
return gl->IsExtensionSupported(gl->IsGLES2() ? GLContext::OES_texture_float
: GLContext::ARB_texture_float);
case OES_texture_float_linear:
return gl->IsExtensionSupported(gl->IsGLES2() ? GLContext::OES_texture_float_linear
: GLContext::ARB_texture_float);
case EXT_texture_filter_anisotropic:
return gl->IsExtensionSupported(GLContext::EXT_texture_filter_anisotropic);
case WEBGL_compressed_texture_s3tc:
@ -1041,6 +1044,10 @@ WebGLContext::GetExtension(JSContext *cx, const nsAString& aName, ErrorResult& r
{
ext = OES_texture_float;
}
else if (CompareWebGLExtensionName(name, "OES_texture_float_linear"))
{
ext = OES_texture_float_linear;
}
else if (CompareWebGLExtensionName(name, "OES_standard_derivatives"))
{
ext = OES_standard_derivatives;
@ -1129,6 +1136,9 @@ WebGLContext::GetExtension(JSContext *cx, const nsAString& aName, ErrorResult& r
case OES_texture_float:
obj = new WebGLExtensionTextureFloat(this);
break;
case OES_texture_float_linear:
obj = new WebGLExtensionTextureFloatLinear(this);
break;
default:
MOZ_ASSERT(false, "should not get there.");
}
@ -1470,6 +1480,8 @@ WebGLContext::GetSupportedExtensions(JSContext *cx, Nullable< nsTArray<nsString>
arr.AppendElement(NS_LITERAL_STRING("OES_element_index_uint"));
if (IsExtensionSupported(cx, OES_texture_float))
arr.AppendElement(NS_LITERAL_STRING("OES_texture_float"));
if (IsExtensionSupported(cx, OES_texture_float_linear))
arr.AppendElement(NS_LITERAL_STRING("OES_texture_float_linear"));
if (IsExtensionSupported(cx, OES_standard_derivatives))
arr.AppendElement(NS_LITERAL_STRING("OES_standard_derivatives"));
if (IsExtensionSupported(cx, EXT_texture_filter_anisotropic))

Просмотреть файл

@ -868,6 +868,7 @@ protected:
OES_element_index_uint,
OES_standard_derivatives,
OES_texture_float,
OES_texture_float_linear,
WEBGL_compressed_texture_atc,
WEBGL_compressed_texture_pvrtc,
WEBGL_compressed_texture_s3tc,

Просмотреть файл

@ -0,0 +1,20 @@
/* 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"
#include "mozilla/dom/WebGLRenderingContextBinding.h"
using namespace mozilla;
WebGLExtensionTextureFloatLinear::WebGLExtensionTextureFloatLinear(WebGLContext* context)
: WebGLExtensionBase(context)
{
}
WebGLExtensionTextureFloatLinear::~WebGLExtensionTextureFloatLinear()
{
}
IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionTextureFloatLinear)

Просмотреть файл

@ -140,6 +140,16 @@ public:
DECL_WEBGL_EXTENSION_GOOP
};
class WebGLExtensionTextureFloatLinear
: public WebGLExtensionBase
{
public:
WebGLExtensionTextureFloatLinear(WebGLContext*);
virtual ~WebGLExtensionTextureFloatLinear();
DECL_WEBGL_EXTENSION_GOOP
};
} // namespace mozilla
#endif // WEBGLEXTENSIONS_H_

Просмотреть файл

@ -328,21 +328,24 @@ WebGLTexture::NeedFakeBlack() {
}
}
if (ImageInfoAt(0).mType == LOCAL_GL_FLOAT)
if (ImageInfoAt(0).mType == LOCAL_GL_FLOAT &&
!Context()->IsExtensionEnabled(WebGLContext::OES_texture_float_linear))
{
if (mMinFilter == LOCAL_GL_LINEAR ||
mMinFilter == LOCAL_GL_LINEAR_MIPMAP_LINEAR ||
mMinFilter == LOCAL_GL_LINEAR_MIPMAP_NEAREST ||
mMinFilter == LOCAL_GL_NEAREST_MIPMAP_LINEAR)
{
mContext->GenerateWarning("%s is a texture with a linear minification filter "
"that is not compatible with gl.FLOAT", msg_rendering_as_black);
mContext->GenerateWarning("%s is a texture with a linear minification filter, "
"which is not compatible with gl.FLOAT by default. "
"Try enabling the OES_texture_float_linear extension if supported.", msg_rendering_as_black);
mFakeBlackStatus = DoNeedFakeBlack;
}
else if (mMagFilter == LOCAL_GL_LINEAR)
{
mContext->GenerateWarning("%s is a texture with a linear magnification filter "
"that is not compatible with gl.FLOAT", msg_rendering_as_black);
mContext->GenerateWarning("%s is a texture with a linear magnification filter, "
"which is not compatible with gl.FLOAT by default. "
"Try enabling the OES_texture_float_linear extension if supported.", msg_rendering_as_black);
mFakeBlackStatus = DoNeedFakeBlack;
}
}

Просмотреть файл

@ -45,6 +45,7 @@ if CONFIG['MOZ_WEBGL']:
'WebGLExtensionStandardDerivatives.cpp',
'WebGLExtensionTextureFilterAnisotropic.cpp',
'WebGLExtensionTextureFloat.cpp',
'WebGLExtensionTextureFloatLinear.cpp',
'WebGLFramebuffer.cpp',
'WebGLObjectModel.cpp',
'WebGLProgram.cpp',

Просмотреть файл

@ -1178,6 +1178,11 @@ DOMInterfaces = {
'headerFile': 'WebGLExtensions.h'
},
'WebGLExtensionTextureFloatLinear': {
'nativeType': 'mozilla::WebGLExtensionTextureFloatLinear',
'headerFile': 'WebGLExtensions.h'
},
'WebGLFramebuffer': {
'nativeType': 'mozilla::WebGLFramebuffer',
'headerFile': 'WebGLFramebuffer.h'

Просмотреть файл

@ -836,3 +836,8 @@ interface WebGLExtensionStandardDerivatives {
interface WebGLExtensionTextureFloat
{
};
[NoInterfaceObject]
interface WebGLExtensionTextureFloatLinear
{
};

Просмотреть файл

@ -58,6 +58,7 @@ static const char *sExtensionNames[] = {
"GL_ARB_pixel_buffer_object",
"GL_ARB_ES2_compatibility",
"GL_OES_texture_float",
"GL_OES_texture_float_linear",
"GL_ARB_texture_float",
"GL_EXT_unpack_subimage",
"GL_OES_standard_derivatives",

Просмотреть файл

@ -1000,6 +1000,7 @@ public:
ARB_pixel_buffer_object,
ARB_ES2_compatibility,
OES_texture_float,
OES_texture_float_linear,
ARB_texture_float,
EXT_unpack_subimage,
OES_standard_derivatives,