Bug 722154 - Part e: Remove custom quickstubs for uniform[1-4][i,f]v and uniformMatrix[2-4]fv; r=bjacob

This commit is contained in:
Ms2ger 2012-03-16 10:52:42 +01:00
Родитель 9d5622d081
Коммит 75d516dac5
4 изменённых файлов: 103 добавлений и 364 удалений

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

@ -336,227 +336,6 @@ nsIDOMWebGLRenderingContext_TexSubImage2D(JSContext *cx, unsigned argc, jsval *v
return JS_TRUE;
}
/* NOTE: There is a TN version of this below, update it as well */
static inline JSBool
helper_nsIDOMWebGLRenderingContext_Uniform_x_iv(JSContext *cx, unsigned argc, jsval *vp, int nElements)
{
XPC_QS_ASSERT_CONTEXT_OK(cx);
JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj)
return JS_FALSE;
nsresult rv;
nsIDOMWebGLRenderingContext *self;
xpc_qsSelfRef selfref;
JS::AutoValueRooter tvr(cx);
if (!xpc_qsUnwrapThis(cx, obj, &self, &selfref.ptr, tvr.jsval_addr(), nsnull))
return JS_FALSE;
if (argc < 2)
return xpc_qsThrow(cx, NS_ERROR_XPC_NOT_ENOUGH_ARGS);
jsval *argv = JS_ARGV(cx, vp);
nsIWebGLUniformLocation *location;
xpc_qsSelfRef location_selfref;
rv = xpc_qsUnwrapArg(cx, argv[0], &location, &location_selfref.ptr, &argv[0]);
if (NS_FAILED(rv)) {
xpc_qsThrowBadArg(cx, rv, vp, 0);
return JS_FALSE;
}
if (JSVAL_IS_PRIMITIVE(argv[1])) {
xpc_qsThrowBadArg(cx, NS_ERROR_FAILURE, vp, 1);
return JS_FALSE;
}
JSObject *arg1 = JSVAL_TO_OBJECT(argv[1]);
JS::AutoValueRooter obj_tvr(cx);
JSObject *wa = 0;
if (helper_isInt32Array(arg1)) {
wa = js::TypedArray::getTypedArray(arg1);
} else if (JS_IsArrayObject(cx, arg1)) {
JSObject *nobj = js_CreateTypedArrayWithArray(cx, js::TypedArray::TYPE_INT32, arg1);
if (!nobj) {
// XXX this will likely return a strange error message if it goes wrong
return JS_FALSE;
}
*obj_tvr.jsval_addr() = OBJECT_TO_JSVAL(nobj);
wa = js::TypedArray::getTypedArray(nobj);
} else {
xpc_qsThrowBadArg(cx, NS_ERROR_FAILURE, vp, 1);
return JS_FALSE;
}
if (nElements == 1) {
rv = self->Uniform1iv_array(location, wa);
} else if (nElements == 2) {
rv = self->Uniform2iv_array(location, wa);
} else if (nElements == 3) {
rv = self->Uniform3iv_array(location, wa);
} else if (nElements == 4) {
rv = self->Uniform4iv_array(location, wa);
}
if (NS_FAILED(rv))
return xpc_qsThrowMethodFailed(cx, rv, vp);
*vp = JSVAL_VOID;
return JS_TRUE;
}
/* NOTE: There is a TN version of this below, update it as well */
static inline JSBool
helper_nsIDOMWebGLRenderingContext_Uniform_x_fv(JSContext *cx, unsigned argc, jsval *vp, int nElements)
{
XPC_QS_ASSERT_CONTEXT_OK(cx);
JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj)
return JS_FALSE;
nsresult rv;
nsIDOMWebGLRenderingContext *self;
xpc_qsSelfRef selfref;
JS::AutoValueRooter tvr(cx);
if (!xpc_qsUnwrapThis(cx, obj, &self, &selfref.ptr, tvr.jsval_addr(), nsnull))
return JS_FALSE;
if (argc < 2)
return xpc_qsThrow(cx, NS_ERROR_XPC_NOT_ENOUGH_ARGS);
jsval *argv = JS_ARGV(cx, vp);
nsIWebGLUniformLocation *location;
xpc_qsSelfRef location_selfref;
rv = xpc_qsUnwrapArg(cx, argv[0], &location, &location_selfref.ptr, &argv[0]);
if (NS_FAILED(rv)) {
xpc_qsThrowBadArg(cx, rv, vp, 0);
return JS_FALSE;
}
if (JSVAL_IS_PRIMITIVE(argv[1])) {
xpc_qsThrowBadArg(cx, NS_ERROR_FAILURE, vp, 1);
return JS_FALSE;
}
JSObject *arg1 = JSVAL_TO_OBJECT(argv[1]);
JS::AutoValueRooter obj_tvr(cx);
JSObject *wa = 0;
if (helper_isFloat32Array(arg1)) {
wa = js::TypedArray::getTypedArray(arg1);
} else if (JS_IsArrayObject(cx, arg1)) {
JSObject *nobj = js_CreateTypedArrayWithArray(cx, js::TypedArray::TYPE_FLOAT32, arg1);
if (!nobj) {
// XXX this will likely return a strange error message if it goes wrong
return JS_FALSE;
}
*obj_tvr.jsval_addr() = OBJECT_TO_JSVAL(nobj);
wa = js::TypedArray::getTypedArray(nobj);
} else {
xpc_qsThrowBadArg(cx, NS_ERROR_FAILURE, vp, 1);
return JS_FALSE;
}
if (nElements == 1) {
rv = self->Uniform1fv_array(location, wa);
} else if (nElements == 2) {
rv = self->Uniform2fv_array(location, wa);
} else if (nElements == 3) {
rv = self->Uniform3fv_array(location, wa);
} else if (nElements == 4) {
rv = self->Uniform4fv_array(location, wa);
}
if (NS_FAILED(rv))
return xpc_qsThrowMethodFailed(cx, rv, vp);
*vp = JSVAL_VOID;
return JS_TRUE;
}
/* NOTE: There is a TN version of this below, update it as well */
static inline JSBool
helper_nsIDOMWebGLRenderingContext_UniformMatrix_x_fv(JSContext *cx, unsigned argc, jsval *vp, int nElements)
{
XPC_QS_ASSERT_CONTEXT_OK(cx);
JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj)
return JS_FALSE;
nsIDOMWebGLRenderingContext *self;
xpc_qsSelfRef selfref;
JS::AutoValueRooter tvr(cx);
if (!xpc_qsUnwrapThis(cx, obj, &self, &selfref.ptr, tvr.jsval_addr(), nsnull))
return JS_FALSE;
if (argc < 3)
return xpc_qsThrow(cx, NS_ERROR_XPC_NOT_ENOUGH_ARGS);
jsval *argv = JS_ARGV(cx, vp);
nsIWebGLUniformLocation *location;
xpc_qsSelfRef location_selfref;
nsresult rv = xpc_qsUnwrapArg(cx, argv[0], &location, &location_selfref.ptr, &argv[0]);
if (NS_FAILED(rv)) {
xpc_qsThrowBadArg(cx, rv, vp, 0);
return JS_FALSE;
}
JSBool transpose;
MOZ_ALWAYS_TRUE(JS_ValueToBoolean(cx, argv[1], &transpose));
if (JSVAL_IS_PRIMITIVE(argv[2])) {
xpc_qsThrowBadArg(cx, NS_ERROR_FAILURE, vp, 2);
return JS_FALSE;
}
JSObject *arg2 = JSVAL_TO_OBJECT(argv[2]);
JS::AutoValueRooter obj_tvr(cx);
JSObject *wa = 0;
if (helper_isFloat32Array(arg2)) {
wa = js::TypedArray::getTypedArray(arg2);
} else if (JS_IsArrayObject(cx, arg2)) {
JSObject *nobj = js_CreateTypedArrayWithArray(cx, js::TypedArray::TYPE_FLOAT32, arg2);
if (!nobj) {
// XXX this will likely return a strange error message if it goes wrong
return JS_FALSE;
}
*obj_tvr.jsval_addr() = OBJECT_TO_JSVAL(nobj);
wa = js::TypedArray::getTypedArray(nobj);
} else {
xpc_qsThrowBadArg(cx, NS_ERROR_FAILURE, vp, 2);
return JS_FALSE;
}
if (nElements == 2) {
rv = self->UniformMatrix2fv_array(location, transpose, wa);
} else if (nElements == 3) {
rv = self->UniformMatrix3fv_array(location, transpose, wa);
} else if (nElements == 4) {
rv = self->UniformMatrix4fv_array(location, transpose, wa);
}
if (NS_FAILED(rv))
return xpc_qsThrowMethodFailed(cx, rv, vp);
*vp = JSVAL_VOID;
return JS_TRUE;
}
static inline JSBool
helper_nsIDOMWebGLRenderingContext_VertexAttrib_x_fv(JSContext *cx, unsigned argc, jsval *vp, int nElements)
{
@ -625,72 +404,6 @@ helper_nsIDOMWebGLRenderingContext_VertexAttrib_x_fv(JSContext *cx, unsigned arg
return JS_TRUE;
}
static JSBool
nsIDOMWebGLRenderingContext_Uniform1iv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_Uniform_x_iv(cx, argc, vp, 1);
}
static JSBool
nsIDOMWebGLRenderingContext_Uniform2iv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_Uniform_x_iv(cx, argc, vp, 2);
}
static JSBool
nsIDOMWebGLRenderingContext_Uniform3iv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_Uniform_x_iv(cx, argc, vp, 3);
}
static JSBool
nsIDOMWebGLRenderingContext_Uniform4iv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_Uniform_x_iv(cx, argc, vp, 4);
}
static JSBool
nsIDOMWebGLRenderingContext_Uniform1fv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_Uniform_x_fv(cx, argc, vp, 1);
}
static JSBool
nsIDOMWebGLRenderingContext_Uniform2fv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_Uniform_x_fv(cx, argc, vp, 2);
}
static JSBool
nsIDOMWebGLRenderingContext_Uniform3fv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_Uniform_x_fv(cx, argc, vp, 3);
}
static JSBool
nsIDOMWebGLRenderingContext_Uniform4fv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_Uniform_x_fv(cx, argc, vp, 4);
}
static JSBool
nsIDOMWebGLRenderingContext_UniformMatrix2fv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_UniformMatrix_x_fv(cx, argc, vp, 2);
}
static JSBool
nsIDOMWebGLRenderingContext_UniformMatrix3fv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_UniformMatrix_x_fv(cx, argc, vp, 3);
}
static JSBool
nsIDOMWebGLRenderingContext_UniformMatrix4fv(JSContext *cx, unsigned argc, jsval *vp)
{
return helper_nsIDOMWebGLRenderingContext_UniformMatrix_x_fv(cx, argc, vp, 4);
}
static JSBool
nsIDOMWebGLRenderingContext_VertexAttrib1fv(JSContext *cx, unsigned argc, jsval *vp)
{

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

@ -4058,6 +4058,33 @@ WebGLContext::DOMElementToImageSurface(Element* imageOrCanvas,
return NS_OK;
}
template<size_t type>
static JSObject*
GetTypedArray(JSContext* aCx, const JS::Value& aValue)
{
if (!aValue.isObject()) {
return NULL;
}
JSObject& value = aValue.toObject();
if (js::GetObjectClass(&value) == &js::TypedArray::fastClasses[type]) {
return &value;
}
if (JS_IsArrayObject(aCx, &value)) {
return js_CreateTypedArrayWithArray(aCx, type, &value);
}
return NULL;
}
static JSObject*
GetFloat32Array(JSContext* aCx, const JS::Value& aValue)
{
return GetTypedArray<js::TypedArray::TYPE_FLOAT32>(aCx, aValue);
}
#define OBTAIN_UNIFORM_LOCATION(info) \
WebGLUniformLocation *location_object; \
bool isNull; \
@ -4074,46 +4101,70 @@ WebGLContext::DOMElementToImageSurface(Element* imageOrCanvas,
return ErrorInvalidOperation("%s: This uniform location is obsolete since the program has been relinked", info); \
GLint location = location_object->Location();
#define SIMPLE_ARRAY_METHOD_UNIFORM(name, cnt, arrayType, ptrType) \
NS_IMETHODIMP \
WebGLContext::name(PRInt32) { \
return NS_ERROR_NOT_IMPLEMENTED; \
} \
NS_IMETHODIMP \
WebGLContext::name##_array(nsIWebGLUniformLocation *ploc, JSObject *wa) \
{ \
if (!IsContextStable()) \
return NS_OK; \
OBTAIN_UNIFORM_LOCATION(#name ": location") \
if (!wa || JS_GetTypedArrayType(wa) != js::TypedArray::arrayType) \
#define SIMPLE_ARRAY_METHOD_UNIFORM(name, cnt, arrayType, ptrType) \
NS_IMETHODIMP \
WebGLContext::name(nsIWebGLUniformLocation *aLocation, const JS::Value& aValue, \
JSContext* aCx) \
{ \
JSObject* wa = GetTypedArray<js::TypedArray::arrayType>(aCx, aValue); \
if (!wa) { \
return NS_ERROR_FAILURE; \
} \
\
if (!IsContextStable()) { \
return NS_OK; \
} \
\
nsIWebGLUniformLocation* ploc = aLocation; \
OBTAIN_UNIFORM_LOCATION(#name ": location") \
if (JS_GetTypedArrayType(wa) != js::TypedArray::arrayType) { \
return ErrorInvalidOperation(#name ": array must be " #arrayType); \
if (JS_GetTypedArrayLength(wa) == 0 || JS_GetTypedArrayLength(wa) % cnt != 0)\
return ErrorInvalidValue(#name ": array must be > 0 elements and have a length multiple of %d", cnt); \
MakeContextCurrent(); \
gl->f##name(location, JS_GetTypedArrayLength(wa) / cnt, (ptrType *)JS_GetTypedArrayData(wa)); \
return NS_OK; \
} \
if (JS_GetTypedArrayLength(wa) == 0 || \
JS_GetTypedArrayLength(wa) % cnt != 0) { \
return ErrorInvalidValue(#name ": array must be > 0 elements and have " \
"a length multiple of %d", cnt); \
} \
\
MakeContextCurrent(); \
gl->f##name(location, JS_GetTypedArrayLength(wa) / cnt, \
static_cast<ptrType*>(JS_GetTypedArrayData(wa))); \
return NS_OK; \
}
#define SIMPLE_MATRIX_METHOD_UNIFORM(name, dim, arrayType, ptrType) \
NS_IMETHODIMP \
WebGLContext::name(PRInt32) { \
return NS_ERROR_NOT_IMPLEMENTED; \
} \
NS_IMETHODIMP \
WebGLContext::name##_array(nsIWebGLUniformLocation *ploc, WebGLboolean transpose, JSObject *wa) \
{ \
if (!IsContextStable()) \
return NS_OK; \
OBTAIN_UNIFORM_LOCATION(#name ": location") \
if (!wa || JS_GetTypedArrayType(wa) != js::TypedArray::arrayType) \
return ErrorInvalidValue(#name ": array must be " #arrayType); \
if (JS_GetTypedArrayLength(wa) == 0 || JS_GetTypedArrayLength(wa) % (dim*dim) != 0) \
return ErrorInvalidValue(#name ": array length must be >0 and multiple of %d", dim*dim); \
if (transpose) \
return ErrorInvalidValue(#name ": transpose must be FALSE as per the OpenGL ES 2.0 spec"); \
MakeContextCurrent(); \
gl->f##name(location, JS_GetTypedArrayLength(wa) / (dim*dim), transpose, (ptrType *)JS_GetTypedArrayData(wa)); \
return NS_OK; \
#define SIMPLE_MATRIX_METHOD_UNIFORM(name, dim) \
NS_IMETHODIMP \
WebGLContext::name(nsIWebGLUniformLocation* aLocation, bool aTranspose, \
const JS::Value& aValue, JSContext* aCx) \
{ \
JSObject* wa = GetFloat32Array(aCx, aValue); \
if (!wa) { \
return NS_ERROR_FAILURE; \
} \
\
if (!IsContextStable()) { \
return NS_OK; \
} \
\
nsIWebGLUniformLocation* ploc = aLocation; \
OBTAIN_UNIFORM_LOCATION(#name ": location") \
if (JS_GetTypedArrayType(wa) != js::TypedArray::TYPE_FLOAT32) { \
return ErrorInvalidValue(#name ": array must be TYPE_FLOAT32"); \
} \
if (JS_GetTypedArrayLength(wa) == 0 || \
JS_GetTypedArrayLength(wa) % (dim*dim) != 0) { \
return ErrorInvalidValue(#name ": array length must be >0 and " \
"multiple of %d", dim*dim); \
} \
if (aTranspose) { \
return ErrorInvalidValue(#name ": transpose must be FALSE as per the " \
"OpenGL ES 2.0 spec"); \
} \
\
MakeContextCurrent(); \
gl->f##name(location, JS_GetTypedArrayLength(wa) / (dim*dim), false, \
static_cast<WebGLfloat*>(JS_GetTypedArrayData(wa))); \
return NS_OK; \
}
#define SIMPLE_METHOD_UNIFORM_1(glname, name, t1) \
@ -4168,9 +4219,9 @@ SIMPLE_ARRAY_METHOD_UNIFORM(Uniform2fv, 2, TYPE_FLOAT32, WebGLfloat)
SIMPLE_ARRAY_METHOD_UNIFORM(Uniform3fv, 3, TYPE_FLOAT32, WebGLfloat)
SIMPLE_ARRAY_METHOD_UNIFORM(Uniform4fv, 4, TYPE_FLOAT32, WebGLfloat)
SIMPLE_MATRIX_METHOD_UNIFORM(UniformMatrix2fv, 2, TYPE_FLOAT32, WebGLfloat)
SIMPLE_MATRIX_METHOD_UNIFORM(UniformMatrix3fv, 3, TYPE_FLOAT32, WebGLfloat)
SIMPLE_MATRIX_METHOD_UNIFORM(UniformMatrix4fv, 4, TYPE_FLOAT32, WebGLfloat)
SIMPLE_MATRIX_METHOD_UNIFORM(UniformMatrix2fv, 2)
SIMPLE_MATRIX_METHOD_UNIFORM(UniformMatrix3fv, 3)
SIMPLE_MATRIX_METHOD_UNIFORM(UniformMatrix4fv, 4)
NS_IMETHODIMP
WebGLContext::VertexAttrib1f(PRUint32 index, WebGLfloat x0)

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

@ -177,7 +177,7 @@ interface nsIWebGLExtensionTextureFilterAnisotropic : nsIWebGLExtension
const WebGLenum MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
};
[scriptable, builtinclass, uuid(aae55fc4-b650-4178-920a-c985b720d9bb)]
[scriptable, builtinclass, uuid(77c303b8-9d86-48d4-a118-0c32358520ee)]
interface nsIDOMWebGLRenderingContext : nsISupports
{
//
@ -807,32 +807,18 @@ interface nsIDOMWebGLRenderingContext : nsISupports
void uniform4f (in nsIWebGLUniformLocation location, in WebGLfloat x, in WebGLfloat y, in WebGLfloat z, in WebGLfloat w);
void uniform4i (in nsIWebGLUniformLocation location, in WebGLint x, in WebGLint y, in WebGLint z, in WebGLint w);
void uniform1fv([optional] in long dummy);
void uniform1iv([optional] in long dummy);
void uniform2fv([optional] in long dummy);
void uniform2iv([optional] in long dummy);
void uniform3fv([optional] in long dummy);
void uniform3iv([optional] in long dummy);
void uniform4fv([optional] in long dummy);
void uniform4iv([optional] in long dummy);
[implicit_jscontext] void uniform1fv(in nsIWebGLUniformLocation location, in jsval v);
[implicit_jscontext] void uniform1iv(in nsIWebGLUniformLocation location, in jsval v);
[implicit_jscontext] void uniform2fv(in nsIWebGLUniformLocation location, in jsval v);
[implicit_jscontext] void uniform2iv(in nsIWebGLUniformLocation location, in jsval v);
[implicit_jscontext] void uniform3fv(in nsIWebGLUniformLocation location, in jsval v);
[implicit_jscontext] void uniform3iv(in nsIWebGLUniformLocation location, in jsval v);
[implicit_jscontext] void uniform4fv(in nsIWebGLUniformLocation location, in jsval v);
[implicit_jscontext] void uniform4iv(in nsIWebGLUniformLocation location, in jsval v);
[noscript] void uniform1fv_array (in nsIWebGLUniformLocation location, in WebGLJSObjectPtr v);
[noscript] void uniform1iv_array (in nsIWebGLUniformLocation location, in WebGLJSObjectPtr v);
[noscript] void uniform2fv_array (in nsIWebGLUniformLocation location, in WebGLJSObjectPtr v);
[noscript] void uniform2iv_array (in nsIWebGLUniformLocation location, in WebGLJSObjectPtr v);
[noscript] void uniform3fv_array (in nsIWebGLUniformLocation location, in WebGLJSObjectPtr v);
[noscript] void uniform3iv_array (in nsIWebGLUniformLocation location, in WebGLJSObjectPtr v);
[noscript] void uniform4fv_array (in nsIWebGLUniformLocation location, in WebGLJSObjectPtr v);
[noscript] void uniform4iv_array (in nsIWebGLUniformLocation location, in WebGLJSObjectPtr v);
// Modified. These are modified by replacing 'count' and 'value' with a WebGLJSObjectPtr
void uniformMatrix2fv([optional] in long dummy);
void uniformMatrix3fv([optional] in long dummy);
void uniformMatrix4fv([optional] in long dummy);
[noscript] void uniformMatrix2fv_array (in nsIWebGLUniformLocation location, in WebGLboolean transpose, in WebGLJSObjectPtr value);
[noscript] void uniformMatrix3fv_array (in nsIWebGLUniformLocation location, in WebGLboolean transpose, in WebGLJSObjectPtr value);
[noscript] void uniformMatrix4fv_array (in nsIWebGLUniformLocation location, in WebGLboolean transpose, in WebGLJSObjectPtr value);
[implicit_jscontext] void uniformMatrix2fv(in nsIWebGLUniformLocation location, in boolean transpose, in jsval value);
[implicit_jscontext] void uniformMatrix3fv(in nsIWebGLUniformLocation location, in boolean transpose, in jsval value);
[implicit_jscontext] void uniformMatrix4fv(in nsIWebGLUniformLocation location, in boolean transpose, in jsval value);
// Added API using top entry from the passed nsIWebGLMatrixStack
//ZZ void glUniformMatrix(in WebGLint location, in WebGLboolean transpose, in nsIWebGLMatrixStack value);

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

@ -980,17 +980,6 @@ customMethodCalls = {
# WebGL
'nsIDOMWebGLRenderingContext_TexImage2D': CUSTOM_QS,
'nsIDOMWebGLRenderingContext_TexSubImage2D': CUSTOM_QS,
'nsIDOMWebGLRenderingContext_Uniform1iv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_Uniform2iv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_Uniform3iv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_Uniform4iv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_Uniform1fv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_Uniform2fv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_Uniform3fv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_Uniform4fv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_UniformMatrix2fv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_UniformMatrix3fv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_UniformMatrix4fv': CUSTOM_QS_TN,
'nsIDOMWebGLRenderingContext_VertexAttrib1fv': CUSTOM_QS,
'nsIDOMWebGLRenderingContext_VertexAttrib2fv': CUSTOM_QS,
'nsIDOMWebGLRenderingContext_VertexAttrib3fv': CUSTOM_QS,