b=565404; add WebGLUniformLocation object; r=vlad

This commit is contained in:
Benoit Jacob 2010-06-01 23:09:19 -07:00
parent 723eb61a5d
commit 4268806ff0
8 changed files with 268 additions and 106 deletions

View File

@ -408,9 +408,13 @@ helper_nsICanvasRenderingContextWebGL_Uniform_x_iv(JSContext *cx, uintN argc, js
jsval *argv = JS_ARGV(cx, vp);
uint32 location;
if (!JS_ValueToECMAUint32(cx, argv[0], &location))
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_OBJECT(argv[1])) {
xpc_qsThrowBadArg(cx, NS_ERROR_FAILURE, vp, 1);
@ -478,9 +482,13 @@ helper_nsICanvasRenderingContextWebGL_Uniform_x_fv(JSContext *cx, uintN argc, js
jsval *argv = JS_ARGV(cx, vp);
uint32 location;
if (!JS_ValueToECMAUint32(cx, argv[0], &location))
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_OBJECT(argv[1])) {
xpc_qsThrowBadArg(cx, NS_ERROR_FAILURE, vp, 1);
@ -548,11 +556,15 @@ helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv(JSContext *cx, uintN ar
jsval *argv = JS_ARGV(cx, vp);
uint32 location;
int32 transpose;
if (!JS_ValueToECMAUint32(cx, argv[0], &location))
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;
}
int32 transpose;
if (!JS_ValueToECMAInt32(cx, argv[1], &transpose))
return JS_FALSE;
@ -760,7 +772,8 @@ nsICanvasRenderingContextWebGL_VertexAttrib4fv(JSContext *cx, uintN argc, jsval
#ifdef JS_TRACER
static inline jsval FASTCALL
helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg, int nElements)
helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(JSContext *cx, JSObject *obj, JSObject *locationobj,
JSObject *arg, int nElements)
{
XPC_QS_ASSERT_CONTEXT_OK(cx);
@ -774,6 +787,15 @@ helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(JSContext *cx, JSObject *o
js::AutoValueRooter obj_tvr(cx);
nsIWebGLUniformLocation *location;
xpc_qsSelfRef location_selfref;
nsresult rv_convert_arg0
= xpc_qsUnwrapThis(cx, locationobj, nsnull, &location, &location_selfref.ptr, &vp.array[1], nsnull);
if (NS_FAILED(rv_convert_arg0)) {
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
js::TypedArray *wa = 0;
if (helper_isInt32Array(arg)) {
@ -815,7 +837,8 @@ helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(JSContext *cx, JSObject *o
}
static inline jsval FASTCALL
helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg, int nElements)
helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(JSContext *cx, JSObject *obj, JSObject *locationobj,
JSObject *arg, int nElements)
{
XPC_QS_ASSERT_CONTEXT_OK(cx);
@ -829,6 +852,15 @@ helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(JSContext *cx, JSObject *o
js::AutoValueRooter obj_tvr(cx);
nsIWebGLUniformLocation *location;
xpc_qsSelfRef location_selfref;
nsresult rv_convert_arg0
= xpc_qsUnwrapThis(cx, locationobj, nsnull, &location, &location_selfref.ptr, &vp.array[1], nsnull);
if (NS_FAILED(rv_convert_arg0)) {
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
js::TypedArray *wa = 0;
if (helper_isFloat32Array(arg)) {
@ -870,7 +902,8 @@ helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(JSContext *cx, JSObject *o
}
static inline jsval FASTCALL
helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(JSContext *cx, JSObject *obj, uint32 location, JSBool transpose, JSObject *arg, int nElements)
helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(JSContext *cx, JSObject *obj, JSObject *locationobj,
JSBool transpose, JSObject *arg, int nElements)
{
XPC_QS_ASSERT_CONTEXT_OK(cx);
@ -884,6 +917,15 @@ helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(JSContext *cx, JSObj
js::AutoValueRooter obj_tvr(cx);
nsIWebGLUniformLocation *location;
xpc_qsSelfRef location_selfref;
nsresult rv_convert_arg0
= xpc_qsUnwrapThis(cx, locationobj, nsnull, &location, &location_selfref.ptr, &vp.array[1], nsnull);
if (NS_FAILED(rv_convert_arg0)) {
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
js::TypedArray *wa = 0;
if (helper_isFloat32Array(arg)) {
@ -922,102 +964,102 @@ helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(JSContext *cx, JSObj
}
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform1iv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg)
nsICanvasRenderingContextWebGL_Uniform1iv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(cx, obj, location, arg, 1);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform1iv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform1iv_tn, CONTEXT, THIS, UINT32, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform1iv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform2iv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg)
nsICanvasRenderingContextWebGL_Uniform2iv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(cx, obj, location, arg, 2);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform2iv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform2iv_tn, CONTEXT, THIS, UINT32, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform2iv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform3iv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg)
nsICanvasRenderingContextWebGL_Uniform3iv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(cx, obj, location, arg, 3);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform3iv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform3iv_tn, CONTEXT, THIS, UINT32, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform3iv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform4iv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg)
nsICanvasRenderingContextWebGL_Uniform4iv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(cx, obj, location, arg, 4);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform4iv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform4iv_tn, CONTEXT, THIS, UINT32, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform4iv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform1fv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg)
nsICanvasRenderingContextWebGL_Uniform1fv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(cx, obj, location, arg, 1);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform1fv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform1fv_tn, CONTEXT, THIS, UINT32, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform1fv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform2fv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg)
nsICanvasRenderingContextWebGL_Uniform2fv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(cx, obj, location, arg, 2);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform2fv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform2fv_tn, CONTEXT, THIS, UINT32, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform2fv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform3fv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg)
nsICanvasRenderingContextWebGL_Uniform3fv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(cx, obj, location, arg, 3);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform3fv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform3fv_tn, CONTEXT, THIS, UINT32, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform3fv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform4fv_tn(JSContext *cx, JSObject *obj, uint32 location, JSObject *arg)
nsICanvasRenderingContextWebGL_Uniform4fv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(cx, obj, location, arg, 4);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform4fv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform4fv_tn, CONTEXT, THIS, UINT32, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform4fv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_UniformMatrix2fv_tn(JSContext *cx, JSObject *obj, uint32 loc, JSBool transpose, JSObject *arg)
nsICanvasRenderingContextWebGL_UniformMatrix2fv_tn(JSContext *cx, JSObject *obj, JSObject *loc, JSBool transpose, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(cx, obj, loc, transpose, arg, 2);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_UniformMatrix2fv,
(5, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_UniformMatrix2fv_tn, CONTEXT, THIS, UINT32, BOOL, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(5, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_UniformMatrix2fv_tn, CONTEXT, THIS, OBJECT, BOOL, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_UniformMatrix3fv_tn(JSContext *cx, JSObject *obj, uint32 loc, JSBool transpose, JSObject *arg)
nsICanvasRenderingContextWebGL_UniformMatrix3fv_tn(JSContext *cx, JSObject *obj, JSObject *loc, JSBool transpose, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(cx, obj, loc, transpose, arg, 3);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_UniformMatrix3fv,
(5, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_UniformMatrix3fv_tn, CONTEXT, THIS, UINT32, BOOL, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(5, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_UniformMatrix3fv_tn, CONTEXT, THIS, OBJECT, BOOL, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_UniformMatrix4fv_tn(JSContext *cx, JSObject *obj, uint32 loc, JSBool transpose, JSObject *arg)
nsICanvasRenderingContextWebGL_UniformMatrix4fv_tn(JSContext *cx, JSObject *obj, JSObject *loc, JSBool transpose, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(cx, obj, loc, transpose, arg, 4);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_UniformMatrix4fv,
(5, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_UniformMatrix4fv_tn, CONTEXT, THIS, UINT32, BOOL, OBJECT, 0, nanojit::ACC_STORE_ANY)))
(5, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_UniformMatrix4fv_tn, CONTEXT, THIS, OBJECT, BOOL, OBJECT, 0, nanojit::ACC_STORE_ANY)))
#endif /* JS_TRACER */

View File

@ -418,6 +418,18 @@ NS_INTERFACE_MAP_BEGIN(WebGLRenderbuffer)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(WebGLRenderbuffer)
NS_INTERFACE_MAP_END
NS_IMPL_ADDREF(WebGLUniformLocation)
NS_IMPL_RELEASE(WebGLUniformLocation)
DOMCI_DATA(WebGLUniformLocation, WebGLUniformLocation)
NS_INTERFACE_MAP_BEGIN(WebGLUniformLocation)
NS_INTERFACE_MAP_ENTRY(WebGLUniformLocation)
NS_INTERFACE_MAP_ENTRY(nsIWebGLUniformLocation)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(WebGLUniformLocation)
NS_INTERFACE_MAP_END
#define NAME_NOT_SUPPORTED(base) \
NS_IMETHODIMP base::GetName(WebGLuint *aName) \
{ return NS_ERROR_NOT_IMPLEMENTED; } \
@ -430,3 +442,13 @@ NAME_NOT_SUPPORTED(WebGLProgram)
NAME_NOT_SUPPORTED(WebGLShader)
NAME_NOT_SUPPORTED(WebGLFramebuffer)
NAME_NOT_SUPPORTED(WebGLRenderbuffer)
/* [noscript] attribute WebGLint location; */
NS_IMETHODIMP WebGLUniformLocation::GetLocation(WebGLint *aLocation)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP WebGLUniformLocation::SetLocation(WebGLint aLocation)
{
return NS_ERROR_NOT_IMPLEMENTED;
}

View File

@ -69,6 +69,7 @@ class WebGLProgram;
class WebGLShader;
class WebGLFramebuffer;
class WebGLRenderbuffer;
class WebGLUniformLocation;
class WebGLZeroingObject;
@ -658,6 +659,33 @@ protected:
NS_DEFINE_STATIC_IID_ACCESSOR(WebGLRenderbuffer, WEBGLRENDERBUFFER_PRIVATE_IID)
#define WEBGLUNIFORMLOCATION_PRIVATE_IID \
{0x01a8a614, 0xb109, 0x42f1, {0xb4, 0x40, 0x8d, 0x8b, 0x87, 0x0b, 0x43, 0xa7}}
class WebGLUniformLocation :
public nsIWebGLUniformLocation,
public WebGLZeroingObject
{
public:
NS_DECLARE_STATIC_IID_ACCESSOR(WEBGLUNIFORMLOCATION_PRIVATE_IID)
WebGLUniformLocation(WebGLProgram *program, GLint location) :
mProgram(program), mLocation(location) { }
WebGLProgram *Program() const { return mProgram; }
GLint Location() const { return mLocation; }
// needed for our generic helpers to check nsIxxx parameters, see GetConcreteObject.
PRBool Deleted() { return PR_FALSE; }
NS_DECL_ISUPPORTS
NS_DECL_NSIWEBGLUNIFORMLOCATION
protected:
WebGLObjectRefPtr<WebGLProgram> mProgram;
GLint mLocation;
};
NS_DEFINE_STATIC_IID_ACCESSOR(WebGLUniformLocation, WEBGLUNIFORMLOCATION_PRIVATE_IID)
}
#endif

View File

@ -170,7 +170,7 @@ GetConcreteObjectAndGLName(BaseInterfaceType *aInterface,
PRBool *isDeleted = 0)
{
PRBool result = GetConcreteObject(aInterface, aConcreteObject, isNull, isDeleted);
if(result == PR_FALSE) return PR_FALSE;
if (result == PR_FALSE) return PR_FALSE;
*aGLObjectName = *aConcreteObject ? (*aConcreteObject)->GLName() : 0;
return PR_TRUE;
}
@ -1782,31 +1782,52 @@ WebGLContext::GetTexParameter(WebGLenum target, WebGLenum pname)
/* XXX fix */
/* any getUniform(in WebGLProgram program, in WebGLUniformLocation location) raises(DOMException); */
NS_IMETHODIMP
WebGLContext::GetUniform(nsIWebGLProgram *pobj, WebGLint location)
WebGLContext::GetUniform(nsIWebGLProgram *pobj, nsIWebGLUniformLocation *ploc)
{
WebGLuint progname;
if (!GetGLName<WebGLProgram>(pobj, &progname))
WebGLProgram *prog;
if (!GetConcreteObjectAndGLName(pobj, &prog, &progname))
return ErrorInvalidOperation("GetUniform: invalid program");
WebGLUniformLocation *location;
if (!GetConcreteObject(ploc, &location))
return ErrorInvalidValue("GetUniform: invalid uniform location");
if (location->Program() != prog)
return ErrorInvalidValue("GetUniform: this uniform location corresponds to another program");
NativeJSContext js;
if (NS_FAILED(js.error))
return js.error;
MakeContextCurrent();
GLint uArraySize = 0;
GLenum uType = 0;
GLint uniforms = 0;
gl->fGetProgramiv(progname, LOCAL_GL_ACTIVE_UNIFORMS, &uniforms);
gl->fGetActiveUniform(progname, location, 0, NULL, &uArraySize, &uType, NULL);
if (uArraySize == 0)
// we now need the type info to switch between fGetUniformfv and fGetUniformiv
// the only way to get that is to iterate through all active uniforms by index until
// one matches the given uniform location.
GLenum uniformType = 0;
GLint uniformNameMaxLength = 0;
gl->fGetProgramiv(progname, LOCAL_GL_ACTIVE_UNIFORM_MAX_LENGTH, &uniformNameMaxLength);
nsAutoArrayPtr<GLchar> uniformName(new GLchar[uniformNameMaxLength+1]);
GLint index;
for (index = 0; index < uniforms; ++index) {
GLsizei dummyLength;
GLint dummySize;
gl->fGetActiveUniform(progname, index, uniformNameMaxLength, &dummyLength,
&dummySize, &uniformType, uniformName);
if (gl->fGetUniformLocation(progname, uniformName) == location->Location())
break;
}
if (index == uniforms)
return NS_ERROR_FAILURE; // XXX GL error? shouldn't happen.
// glGetUniform needs to be called for each element of an array separately, so we don't
// have to deal with uArraySize at all.
GLenum baseType;
GLint unitSize;
if (!BaseTypeAndSizeFromUniformType(uType, &baseType, &unitSize))
if (!BaseTypeAndSizeFromUniformType(uniformType, &baseType, &unitSize))
return NS_ERROR_FAILURE;
// this should never happen
@ -1815,11 +1836,11 @@ WebGLContext::GetUniform(nsIWebGLProgram *pobj, WebGLint location)
if (baseType == LOCAL_GL_FLOAT) {
GLfloat fv[16];
gl->fGetUniformfv(progname, location, fv);
gl->fGetUniformfv(progname, location->Location(), fv);
js.SetRetVal(fv, unitSize);
} else if (baseType == LOCAL_GL_INT) {
GLint iv[16];
gl->fGetUniformiv(progname, location, iv);
gl->fGetUniformiv(progname, location->Location(), iv);
js.SetRetVal((PRInt32*)iv, unitSize);
} else {
js.SetRetValAsJSVal(JSVAL_NULL);
@ -1829,14 +1850,20 @@ WebGLContext::GetUniform(nsIWebGLProgram *pobj, WebGLint location)
}
NS_IMETHODIMP
WebGLContext::GetUniformLocation(nsIWebGLProgram *pobj, const nsAString& name, WebGLint *retval)
WebGLContext::GetUniformLocation(nsIWebGLProgram *pobj, const nsAString& name, nsIWebGLUniformLocation **retval)
{
WebGLuint progname;
if (!GetGLName<WebGLProgram>(pobj, &progname))
WebGLProgram *prog;
if (!GetConcreteObjectAndGLName(pobj, &prog, &progname))
return ErrorInvalidOperation("GetUniformLocation: invalid program");
MakeContextCurrent();
*retval = gl->fGetUniformLocation(progname, NS_LossyConvertUTF16toASCII(name).get());
GLint intlocation = gl->fGetUniformLocation(progname, NS_LossyConvertUTF16toASCII(name).get());
nsCOMPtr<WebGLUniformLocation> uloc = new WebGLUniformLocation(prog, intlocation);
*retval = uloc.forget().get();
return NS_OK;
}
@ -2230,24 +2257,33 @@ WebGLContext::DOMElementToImageSurface(nsIDOMElement *imageOrCanvas,
return NS_OK;
}
#define GL_SIMPLE_ARRAY_METHOD(name, cnt, arrayType, ptrType) \
#define OBTAIN_UNIFORM_LOCATION \
WebGLUniformLocation *location_object; \
if (!GetConcreteObject(ploc, &location_object)) \
return ErrorInvalidValue("Invalid uniform location parameter"); \
if(mCurrentProgram != location_object->Program()) \
return ErrorInvalidValue("This uniform location corresponds to another program"); \
GLint location = location_object->Location();
#define SIMPLE_ARRAY_METHOD_UNIFORM(name, cnt, arrayType, ptrType) \
NS_IMETHODIMP \
WebGLContext::name(PRInt32 dummy) { \
return NS_ERROR_NOT_IMPLEMENTED; \
} \
NS_IMETHODIMP \
WebGLContext::name##_array(WebGLint idx, js::TypedArray *wa) \
WebGLContext::name##_array(nsIWebGLUniformLocation *ploc, js::TypedArray *wa) \
{ \
OBTAIN_UNIFORM_LOCATION \
if (!wa || wa->type != js::TypedArray::arrayType) \
return ErrorInvalidOperation("array must be " #arrayType); \
if (wa->length == 0 || wa->length % cnt != 0) \
return ErrorInvalidOperation("array must be > 0 elements and have a length multiple of %d", cnt); \
MakeContextCurrent(); \
gl->f##name(idx, wa->length / cnt, (ptrType *)wa->data); \
gl->f##name(location, wa->length / cnt, (ptrType *)wa->data); \
return NS_OK; \
}
#define GL_SIMPLE_ARRAY_METHOD_NO_COUNT(name, cnt, arrayType, ptrType) \
#define SIMPLE_ARRAY_METHOD_NO_COUNT(name, cnt, arrayType, ptrType) \
NS_IMETHODIMP \
WebGLContext::name(PRInt32 dummy) { \
return NS_ERROR_NOT_IMPLEMENTED; \
@ -2264,56 +2300,81 @@ WebGLContext::name##_array(WebGLuint idx, js::TypedArray *wa) \
return NS_OK; \
}
#define GL_SIMPLE_MATRIX_METHOD(name, dim, arrayType, ptrType) \
#define SIMPLE_MATRIX_METHOD_UNIFORM(name, dim, arrayType, ptrType) \
NS_IMETHODIMP \
WebGLContext::name(PRInt32 dummy) { \
return NS_ERROR_NOT_IMPLEMENTED; \
} \
NS_IMETHODIMP \
WebGLContext::name##_array(WebGLint idx, WebGLboolean transpose, js::TypedArray *wa) \
WebGLContext::name##_array(nsIWebGLUniformLocation *ploc, WebGLboolean transpose, js::TypedArray *wa) \
{ \
OBTAIN_UNIFORM_LOCATION \
if (!wa || wa->type != js::TypedArray::arrayType) \
return ErrorInvalidOperation("array must be " #arrayType); \
if (wa->length == 0 || wa->length % (dim*dim) != 0) \
return ErrorInvalidOperation("array must be > 0 elements and have a length multiple of %d", dim*dim); \
MakeContextCurrent(); \
gl->f##name(idx, wa->length / (dim*dim), transpose, (ptrType *)wa->data); \
gl->f##name(location, wa->length / (dim*dim), transpose, (ptrType *)wa->data); \
return NS_OK; \
}
GL_SAME_METHOD_2(Uniform1i, Uniform1i, WebGLint, WebGLint)
GL_SAME_METHOD_3(Uniform2i, Uniform2i, WebGLint, WebGLint, WebGLint)
GL_SAME_METHOD_4(Uniform3i, Uniform3i, WebGLint, WebGLint, WebGLint, WebGLint)
GL_SAME_METHOD_5(Uniform4i, Uniform4i, WebGLint, WebGLint, WebGLint, WebGLint, WebGLint)
#define SIMPLE_METHOD_UNIFORM_1(glname, name, t1) \
NS_IMETHODIMP WebGLContext::name(nsIWebGLUniformLocation *ploc, t1 a1) { \
OBTAIN_UNIFORM_LOCATION \
MakeContextCurrent(); gl->f##glname(location, a1); return NS_OK; \
}
GL_SAME_METHOD_2(Uniform1f, Uniform1f, WebGLint, WebGLfloat)
GL_SAME_METHOD_3(Uniform2f, Uniform2f, WebGLint, WebGLfloat, WebGLfloat)
GL_SAME_METHOD_4(Uniform3f, Uniform3f, WebGLint, WebGLfloat, WebGLfloat, WebGLfloat)
GL_SAME_METHOD_5(Uniform4f, Uniform4f, WebGLint, WebGLfloat, WebGLfloat, WebGLfloat, WebGLfloat)
#define SIMPLE_METHOD_UNIFORM_2(glname, name, t1, t2) \
NS_IMETHODIMP WebGLContext::name(nsIWebGLUniformLocation *ploc, t1 a1, t2 a2) { \
OBTAIN_UNIFORM_LOCATION \
MakeContextCurrent(); gl->f##glname(location, a1, a2); return NS_OK; \
}
GL_SIMPLE_ARRAY_METHOD(Uniform1iv, 1, TYPE_INT32, WebGLint)
GL_SIMPLE_ARRAY_METHOD(Uniform2iv, 2, TYPE_INT32, WebGLint)
GL_SIMPLE_ARRAY_METHOD(Uniform3iv, 3, TYPE_INT32, WebGLint)
GL_SIMPLE_ARRAY_METHOD(Uniform4iv, 4, TYPE_INT32, WebGLint)
#define SIMPLE_METHOD_UNIFORM_3(glname, name, t1, t2, t3) \
NS_IMETHODIMP WebGLContext::name(nsIWebGLUniformLocation *ploc, t1 a1, t2 a2, t3 a3) { \
OBTAIN_UNIFORM_LOCATION \
MakeContextCurrent(); gl->f##glname(location, a1, a2, a3); return NS_OK; \
}
GL_SIMPLE_ARRAY_METHOD(Uniform1fv, 1, TYPE_FLOAT32, WebGLfloat)
GL_SIMPLE_ARRAY_METHOD(Uniform2fv, 2, TYPE_FLOAT32, WebGLfloat)
GL_SIMPLE_ARRAY_METHOD(Uniform3fv, 3, TYPE_FLOAT32, WebGLfloat)
GL_SIMPLE_ARRAY_METHOD(Uniform4fv, 4, TYPE_FLOAT32, WebGLfloat)
#define SIMPLE_METHOD_UNIFORM_4(glname, name, t1, t2, t3, t4) \
NS_IMETHODIMP WebGLContext::name(nsIWebGLUniformLocation *ploc, t1 a1, t2 a2, t3 a3, t4 a4) { \
OBTAIN_UNIFORM_LOCATION \
MakeContextCurrent(); gl->f##glname(location, a1, a2, a3, a4); return NS_OK; \
}
GL_SIMPLE_MATRIX_METHOD(UniformMatrix2fv, 2, TYPE_FLOAT32, WebGLfloat)
GL_SIMPLE_MATRIX_METHOD(UniformMatrix3fv, 3, TYPE_FLOAT32, WebGLfloat)
GL_SIMPLE_MATRIX_METHOD(UniformMatrix4fv, 4, TYPE_FLOAT32, WebGLfloat)
SIMPLE_METHOD_UNIFORM_1(Uniform1i, Uniform1i, WebGLint)
SIMPLE_METHOD_UNIFORM_2(Uniform2i, Uniform2i, WebGLint, WebGLint)
SIMPLE_METHOD_UNIFORM_3(Uniform3i, Uniform3i, WebGLint, WebGLint, WebGLint)
SIMPLE_METHOD_UNIFORM_4(Uniform4i, Uniform4i, WebGLint, WebGLint, WebGLint, WebGLint)
SIMPLE_METHOD_UNIFORM_1(Uniform1f, Uniform1f, WebGLfloat)
SIMPLE_METHOD_UNIFORM_2(Uniform2f, Uniform2f, WebGLfloat, WebGLfloat)
SIMPLE_METHOD_UNIFORM_3(Uniform3f, Uniform3f, WebGLfloat, WebGLfloat, WebGLfloat)
SIMPLE_METHOD_UNIFORM_4(Uniform4f, Uniform4f, WebGLfloat, WebGLfloat, WebGLfloat, WebGLfloat)
SIMPLE_ARRAY_METHOD_UNIFORM(Uniform1iv, 1, TYPE_INT32, WebGLint)
SIMPLE_ARRAY_METHOD_UNIFORM(Uniform2iv, 2, TYPE_INT32, WebGLint)
SIMPLE_ARRAY_METHOD_UNIFORM(Uniform3iv, 3, TYPE_INT32, WebGLint)
SIMPLE_ARRAY_METHOD_UNIFORM(Uniform4iv, 4, TYPE_INT32, WebGLint)
SIMPLE_ARRAY_METHOD_UNIFORM(Uniform1fv, 1, TYPE_FLOAT32, WebGLfloat)
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)
GL_SAME_METHOD_2(VertexAttrib1f, VertexAttrib1f, PRUint32, WebGLfloat)
GL_SAME_METHOD_3(VertexAttrib2f, VertexAttrib2f, PRUint32, WebGLfloat, WebGLfloat)
GL_SAME_METHOD_4(VertexAttrib3f, VertexAttrib3f, PRUint32, WebGLfloat, WebGLfloat, WebGLfloat)
GL_SAME_METHOD_5(VertexAttrib4f, VertexAttrib4f, PRUint32, WebGLfloat, WebGLfloat, WebGLfloat, WebGLfloat)
GL_SIMPLE_ARRAY_METHOD_NO_COUNT(VertexAttrib1fv, 1, TYPE_FLOAT32, WebGLfloat)
GL_SIMPLE_ARRAY_METHOD_NO_COUNT(VertexAttrib2fv, 2, TYPE_FLOAT32, WebGLfloat)
GL_SIMPLE_ARRAY_METHOD_NO_COUNT(VertexAttrib3fv, 3, TYPE_FLOAT32, WebGLfloat)
GL_SIMPLE_ARRAY_METHOD_NO_COUNT(VertexAttrib4fv, 4, TYPE_FLOAT32, WebGLfloat)
SIMPLE_ARRAY_METHOD_NO_COUNT(VertexAttrib1fv, 1, TYPE_FLOAT32, WebGLfloat)
SIMPLE_ARRAY_METHOD_NO_COUNT(VertexAttrib2fv, 2, TYPE_FLOAT32, WebGLfloat)
SIMPLE_ARRAY_METHOD_NO_COUNT(VertexAttrib3fv, 3, TYPE_FLOAT32, WebGLfloat)
SIMPLE_ARRAY_METHOD_NO_COUNT(VertexAttrib4fv, 4, TYPE_FLOAT32, WebGLfloat)
NS_IMETHODIMP
WebGLContext::UseProgram(nsIWebGLProgram *pobj)

View File

@ -1372,6 +1372,8 @@ static nsDOMClassInfoData sClassInfoData[] = {
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(WebGLRenderbuffer, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(WebGLUniformLocation, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(PaintRequest, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
@ -3813,7 +3815,11 @@ nsDOMClassInfo::Init()
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(WebGLRenderbuffer, nsIWebGLRenderbuffer)
DOM_CLASSINFO_MAP_ENTRY(nsIWebGLRenderbuffer)
DOM_CLASSINFO_MAP_ENTRY(nsIWebGLRenderbuffer)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(WebGLUniformLocation, nsIWebGLUniformLocation)
DOM_CLASSINFO_MAP_ENTRY(nsIWebGLUniformLocation)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(PaintRequest, nsIDOMPaintRequest)

View File

@ -457,6 +457,7 @@ DOMCI_CLASS(WebGLProgram)
DOMCI_CLASS(WebGLShader)
DOMCI_CLASS(WebGLFramebuffer)
DOMCI_CLASS(WebGLRenderbuffer)
DOMCI_CLASS(WebGLUniformLocation)
// WebGL Buffers
DOMCI_CLASS(PaintRequest)

View File

@ -120,6 +120,12 @@ interface nsIWebGLActiveInfo : nsISupports
readonly attribute DOMString name;
};
[scriptable, uuid(d38b0467-623e-4c82-9140-5f14a3bd1bad)]
interface nsIWebGLUniformLocation : nsISupports
{
[noscript] attribute WebGLint location;
};
[scriptable, uuid(f02c85e0-8305-11de-abe2-000c29206271)]
interface nsICanvasRenderingContextWebGL : nsISupports
@ -688,14 +694,9 @@ interface nsICanvasRenderingContextWebGL : nsISupports
void getTexParameter(in WebGLenum target, in WebGLenum pname);
// FIXME: This is problematic. We don't implicitly know how big the returned data buffer
// needs to be like in the other glGet* calls. The only way to find out is to iterate
// through all the active uniforms with glGetActiveUniform() looking for the corresponding
// 'location'. This will give us the type and size of the data. Since this is a get call
// maybe that's ok?
void getUniform(in nsIWebGLProgram program, in WebGLint location);
void getUniform (in nsIWebGLProgram program, in nsIWebGLUniformLocation location);
WebGLint getUniformLocation(in nsIWebGLProgram program, in DOMString name);
nsIWebGLUniformLocation getUniformLocation (in nsIWebGLProgram program, in DOMString name);
void getVertexAttrib(in WebGLuint index, in WebGLenum pname);
@ -769,14 +770,14 @@ interface nsICanvasRenderingContextWebGL : nsISupports
//void glTexParameter(in WebGLenum target, in WebGLenum pname, in nsIWebGLArray params);
// Modified: All the glUniform*v forms below are modified by replacing 'count' and 'v' with a nsIWebGLArray
void uniform1f(in WebGLint location, in WebGLfloat x);
void uniform1i(in WebGLint location, in WebGLint x);
void uniform2f(in WebGLint location, in WebGLfloat x, in WebGLfloat y);
void uniform2i(in WebGLint location, in WebGLint x, in WebGLint y);
void uniform3f(in WebGLint location, in WebGLfloat x, in WebGLfloat y, in WebGLfloat z);
void uniform3i(in WebGLint location, in WebGLint x, in WebGLint y, in WebGLint z);
void uniform4f(in WebGLint location, in WebGLfloat x, in WebGLfloat y, in WebGLfloat z, in WebGLfloat w);
void uniform4i(in WebGLint location, in WebGLint x, in WebGLint y, in WebGLint z, in WebGLint w);
void uniform1f (in nsIWebGLUniformLocation location, in WebGLfloat x);
void uniform1i (in nsIWebGLUniformLocation location, in WebGLint x);
void uniform2f (in nsIWebGLUniformLocation location, in WebGLfloat x, in WebGLfloat y);
void uniform2i (in nsIWebGLUniformLocation location, in WebGLint x, in WebGLint y);
void uniform3f (in nsIWebGLUniformLocation location, in WebGLfloat x, in WebGLfloat y, in WebGLfloat z);
void uniform3i (in nsIWebGLUniformLocation location, in WebGLint x, in WebGLint y, in WebGLint z);
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);
@ -787,23 +788,23 @@ interface nsICanvasRenderingContextWebGL : nsISupports
void uniform4fv([optional] in long dummy);
void uniform4iv([optional] in long dummy);
[noscript] void uniform1fv_array(in WebGLint location, in WebGLArrayPtr v);
[noscript] void uniform1iv_array(in WebGLint location, in WebGLArrayPtr v);
[noscript] void uniform2fv_array(in WebGLint location, in WebGLArrayPtr v);
[noscript] void uniform2iv_array(in WebGLint location, in WebGLArrayPtr v);
[noscript] void uniform3fv_array(in WebGLint location, in WebGLArrayPtr v);
[noscript] void uniform3iv_array(in WebGLint location, in WebGLArrayPtr v);
[noscript] void uniform4fv_array(in WebGLint location, in WebGLArrayPtr v);
[noscript] void uniform4iv_array(in WebGLint location, in WebGLArrayPtr v);
[noscript] void uniform1fv_array (in nsIWebGLUniformLocation location, in WebGLArrayPtr v);
[noscript] void uniform1iv_array (in nsIWebGLUniformLocation location, in WebGLArrayPtr v);
[noscript] void uniform2fv_array (in nsIWebGLUniformLocation location, in WebGLArrayPtr v);
[noscript] void uniform2iv_array (in nsIWebGLUniformLocation location, in WebGLArrayPtr v);
[noscript] void uniform3fv_array (in nsIWebGLUniformLocation location, in WebGLArrayPtr v);
[noscript] void uniform3iv_array (in nsIWebGLUniformLocation location, in WebGLArrayPtr v);
[noscript] void uniform4fv_array (in nsIWebGLUniformLocation location, in WebGLArrayPtr v);
[noscript] void uniform4iv_array (in nsIWebGLUniformLocation location, in WebGLArrayPtr v);
// Modified. These are modified by replacing 'count' and 'value' with a WebGLArrayPtr
void uniformMatrix2fv([optional] in long dummy);
void uniformMatrix3fv([optional] in long dummy);
void uniformMatrix4fv([optional] in long dummy);
[noscript] void uniformMatrix2fv_array(in WebGLint location, in WebGLboolean transpose, in WebGLArrayPtr value);
[noscript] void uniformMatrix3fv_array(in WebGLint location, in WebGLboolean transpose, in WebGLArrayPtr value);
[noscript] void uniformMatrix4fv_array(in WebGLint location, in WebGLboolean transpose, in WebGLArrayPtr value);
[noscript] void uniformMatrix2fv_array (in nsIWebGLUniformLocation location, in WebGLboolean transpose, in WebGLArrayPtr value);
[noscript] void uniformMatrix3fv_array (in nsIWebGLUniformLocation location, in WebGLboolean transpose, in WebGLArrayPtr value);
[noscript] void uniformMatrix4fv_array (in nsIWebGLUniformLocation location, in WebGLboolean transpose, in WebGLArrayPtr value);
// Added API using top entry from the passed nsIWebGLMatrixStack
//ZZ void glUniformMatrix(in WebGLint location, in WebGLboolean transpose, in nsIWebGLMatrixStack value);

View File

@ -493,6 +493,7 @@ irregularFilenames = {
'nsIWebGLFramebuffer': 'nsICanvasRenderingContextWebGL',
'nsIWebGLRenderbuffer': 'nsICanvasRenderingContextWebGL',
'nsIWebGLActiveInfo': 'nsICanvasRenderingContextWebGL',
'nsIWebGLUniformLocation': 'nsICanvasRenderingContextWebGL',
}
customIncludes = [