content/canvas/src/WebGLContextState.cpp

Thu, 15 Jan 2015 21:03:48 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 21:03:48 +0100
branch
TOR_BUG_9701
changeset 11
deefc01c0e14
permissions
-rw-r--r--

Integrate friendly tips from Tor colleagues to make (or not) 4.5 alpha 3;
This includes removal of overloaded (but unused) methods, and addition of
a overlooked call to DataStruct::SetData(nsISupports, uint32_t, bool.)

michael@0 1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
michael@0 2 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 3 * License, v. 2.0. If a copy of the MPL was not distributed with this
michael@0 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 5
michael@0 6 #include "WebGLContext.h"
michael@0 7 #include "WebGLContextUtils.h"
michael@0 8 #include "WebGLBuffer.h"
michael@0 9 #include "WebGLShader.h"
michael@0 10 #include "WebGLProgram.h"
michael@0 11 #include "WebGLFramebuffer.h"
michael@0 12 #include "WebGLRenderbuffer.h"
michael@0 13 #include "WebGLTexture.h"
michael@0 14 #include "WebGLVertexArray.h"
michael@0 15 #include "GLContext.h"
michael@0 16 #include "mozilla/dom/ToJSValue.h"
michael@0 17
michael@0 18 using namespace mozilla;
michael@0 19 using namespace dom;
michael@0 20
michael@0 21 void
michael@0 22 WebGLContext::Disable(GLenum cap)
michael@0 23 {
michael@0 24 if (IsContextLost())
michael@0 25 return;
michael@0 26
michael@0 27 if (!ValidateCapabilityEnum(cap, "disable"))
michael@0 28 return;
michael@0 29
michael@0 30 realGLboolean* trackingSlot = GetStateTrackingSlot(cap);
michael@0 31
michael@0 32 if (trackingSlot)
michael@0 33 {
michael@0 34 *trackingSlot = 0;
michael@0 35 }
michael@0 36
michael@0 37 MakeContextCurrent();
michael@0 38 gl->fDisable(cap);
michael@0 39 }
michael@0 40
michael@0 41 void
michael@0 42 WebGLContext::Enable(GLenum cap)
michael@0 43 {
michael@0 44 if (IsContextLost())
michael@0 45 return;
michael@0 46
michael@0 47 if (!ValidateCapabilityEnum(cap, "enable"))
michael@0 48 return;
michael@0 49
michael@0 50 realGLboolean* trackingSlot = GetStateTrackingSlot(cap);
michael@0 51
michael@0 52 if (trackingSlot)
michael@0 53 {
michael@0 54 *trackingSlot = 1;
michael@0 55 }
michael@0 56
michael@0 57 MakeContextCurrent();
michael@0 58 gl->fEnable(cap);
michael@0 59 }
michael@0 60
michael@0 61 static JS::Value
michael@0 62 StringValue(JSContext* cx, const char* chars, ErrorResult& rv)
michael@0 63 {
michael@0 64 JSString* str = JS_NewStringCopyZ(cx, chars);
michael@0 65 if (!str) {
michael@0 66 rv.Throw(NS_ERROR_OUT_OF_MEMORY);
michael@0 67 return JS::NullValue();
michael@0 68 }
michael@0 69
michael@0 70 return JS::StringValue(str);
michael@0 71 }
michael@0 72
michael@0 73 JS::Value
michael@0 74 WebGLContext::GetParameter(JSContext* cx, GLenum pname, ErrorResult& rv)
michael@0 75 {
michael@0 76 if (IsContextLost())
michael@0 77 return JS::NullValue();
michael@0 78
michael@0 79 MakeContextCurrent();
michael@0 80
michael@0 81 if (MinCapabilityMode()) {
michael@0 82 switch(pname) {
michael@0 83 ////////////////////////////
michael@0 84 // Single-value params
michael@0 85
michael@0 86 // int
michael@0 87 case LOCAL_GL_MAX_VERTEX_ATTRIBS:
michael@0 88 return JS::Int32Value(MINVALUE_GL_MAX_VERTEX_ATTRIBS);
michael@0 89
michael@0 90 case LOCAL_GL_MAX_FRAGMENT_UNIFORM_VECTORS:
michael@0 91 return JS::Int32Value(MINVALUE_GL_MAX_FRAGMENT_UNIFORM_VECTORS);
michael@0 92
michael@0 93 case LOCAL_GL_MAX_VERTEX_UNIFORM_VECTORS:
michael@0 94 return JS::Int32Value(MINVALUE_GL_MAX_VERTEX_UNIFORM_VECTORS);
michael@0 95
michael@0 96 case LOCAL_GL_MAX_VARYING_VECTORS:
michael@0 97 return JS::Int32Value(MINVALUE_GL_MAX_VARYING_VECTORS);
michael@0 98
michael@0 99 case LOCAL_GL_MAX_TEXTURE_SIZE:
michael@0 100 return JS::Int32Value(MINVALUE_GL_MAX_TEXTURE_SIZE);
michael@0 101
michael@0 102 case LOCAL_GL_MAX_CUBE_MAP_TEXTURE_SIZE:
michael@0 103 return JS::Int32Value(MINVALUE_GL_MAX_CUBE_MAP_TEXTURE_SIZE);
michael@0 104
michael@0 105 case LOCAL_GL_MAX_TEXTURE_IMAGE_UNITS:
michael@0 106 return JS::Int32Value(MINVALUE_GL_MAX_TEXTURE_IMAGE_UNITS);
michael@0 107
michael@0 108 case LOCAL_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
michael@0 109 return JS::Int32Value(MINVALUE_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS);
michael@0 110
michael@0 111 case LOCAL_GL_MAX_RENDERBUFFER_SIZE:
michael@0 112 return JS::Int32Value(MINVALUE_GL_MAX_RENDERBUFFER_SIZE);
michael@0 113
michael@0 114 default:
michael@0 115 // Return the real value; we're not overriding this one
michael@0 116 break;
michael@0 117 }
michael@0 118 }
michael@0 119
michael@0 120 if (IsExtensionEnabled(WebGLExtensionID::WEBGL_draw_buffers)) {
michael@0 121 if (pname == LOCAL_GL_MAX_COLOR_ATTACHMENTS) {
michael@0 122 return JS::Int32Value(mGLMaxColorAttachments);
michael@0 123
michael@0 124 } else if (pname == LOCAL_GL_MAX_DRAW_BUFFERS) {
michael@0 125 return JS::Int32Value(mGLMaxDrawBuffers);
michael@0 126
michael@0 127 } else if (pname >= LOCAL_GL_DRAW_BUFFER0 &&
michael@0 128 pname < GLenum(LOCAL_GL_DRAW_BUFFER0 + mGLMaxDrawBuffers))
michael@0 129 {
michael@0 130 if (mBoundFramebuffer) {
michael@0 131 GLint iv = 0;
michael@0 132 gl->fGetIntegerv(pname, &iv);
michael@0 133 return JS::Int32Value(iv);
michael@0 134 }
michael@0 135
michael@0 136 GLint iv = 0;
michael@0 137 gl->fGetIntegerv(pname, &iv);
michael@0 138
michael@0 139 if (iv == GLint(LOCAL_GL_COLOR_ATTACHMENT0 + pname - LOCAL_GL_DRAW_BUFFER0)) {
michael@0 140 return JS::Int32Value(LOCAL_GL_BACK);
michael@0 141 }
michael@0 142
michael@0 143 return JS::Int32Value(LOCAL_GL_NONE);
michael@0 144 }
michael@0 145 }
michael@0 146
michael@0 147 if (IsExtensionEnabled(WebGLExtensionID::OES_vertex_array_object)) {
michael@0 148 if (pname == LOCAL_GL_VERTEX_ARRAY_BINDING) {
michael@0 149 if (mBoundVertexArray == mDefaultVertexArray){
michael@0 150 return WebGLObjectAsJSValue(cx, (WebGLVertexArray *) nullptr, rv);
michael@0 151 }
michael@0 152
michael@0 153 return WebGLObjectAsJSValue(cx, mBoundVertexArray.get(), rv);
michael@0 154 }
michael@0 155 }
michael@0 156
michael@0 157 switch (pname) {
michael@0 158 //
michael@0 159 // String params
michael@0 160 //
michael@0 161 case LOCAL_GL_VENDOR:
michael@0 162 return StringValue(cx, "Mozilla", rv);
michael@0 163 case LOCAL_GL_RENDERER:
michael@0 164 return StringValue(cx, "Mozilla", rv);
michael@0 165 case LOCAL_GL_VERSION: {
michael@0 166 const char* version = 0;
michael@0 167
michael@0 168 if (IsWebGL2()) {
michael@0 169 version = "WebGL 2.0";
michael@0 170 } else {
michael@0 171 version = "WebGL 1.0";
michael@0 172 }
michael@0 173
michael@0 174 MOZ_ASSERT(version != 0);
michael@0 175 return StringValue(cx, version, rv);
michael@0 176 }
michael@0 177 case LOCAL_GL_SHADING_LANGUAGE_VERSION:
michael@0 178 return StringValue(cx, "WebGL GLSL ES 1.0", rv);
michael@0 179
michael@0 180 // Privileged string params exposed by WEBGL_debug_renderer_info:
michael@0 181 case UNMASKED_VENDOR_WEBGL:
michael@0 182 case UNMASKED_RENDERER_WEBGL: {
michael@0 183 // The privilege check is done in WebGLContext::IsExtensionSupported.
michael@0 184 // So here we just have to check that the extension is enabled.
michael@0 185 if (!IsExtensionEnabled(WebGLExtensionID::WEBGL_debug_renderer_info)) {
michael@0 186 break;
michael@0 187 }
michael@0 188 GLenum glstringname = LOCAL_GL_NONE;
michael@0 189 if (pname == UNMASKED_VENDOR_WEBGL) {
michael@0 190 glstringname = LOCAL_GL_VENDOR;
michael@0 191 } else if (pname == UNMASKED_RENDERER_WEBGL) {
michael@0 192 glstringname = LOCAL_GL_RENDERER;
michael@0 193 }
michael@0 194 const char* string = reinterpret_cast<const char*>(gl->fGetString(glstringname));
michael@0 195 return StringValue(cx, string, rv);
michael@0 196 }
michael@0 197
michael@0 198 ////////////////////////////////
michael@0 199 // Single-value params
michael@0 200
michael@0 201 // unsigned int
michael@0 202 case LOCAL_GL_CULL_FACE_MODE:
michael@0 203 case LOCAL_GL_FRONT_FACE:
michael@0 204 case LOCAL_GL_ACTIVE_TEXTURE:
michael@0 205 case LOCAL_GL_STENCIL_FUNC:
michael@0 206 case LOCAL_GL_STENCIL_FAIL:
michael@0 207 case LOCAL_GL_STENCIL_PASS_DEPTH_FAIL:
michael@0 208 case LOCAL_GL_STENCIL_PASS_DEPTH_PASS:
michael@0 209 case LOCAL_GL_STENCIL_BACK_FUNC:
michael@0 210 case LOCAL_GL_STENCIL_BACK_FAIL:
michael@0 211 case LOCAL_GL_STENCIL_BACK_PASS_DEPTH_FAIL:
michael@0 212 case LOCAL_GL_STENCIL_BACK_PASS_DEPTH_PASS:
michael@0 213 case LOCAL_GL_DEPTH_FUNC:
michael@0 214 case LOCAL_GL_BLEND_SRC_RGB:
michael@0 215 case LOCAL_GL_BLEND_SRC_ALPHA:
michael@0 216 case LOCAL_GL_BLEND_DST_RGB:
michael@0 217 case LOCAL_GL_BLEND_DST_ALPHA:
michael@0 218 case LOCAL_GL_BLEND_EQUATION_RGB:
michael@0 219 case LOCAL_GL_BLEND_EQUATION_ALPHA:
michael@0 220 case LOCAL_GL_GENERATE_MIPMAP_HINT: {
michael@0 221 GLint i = 0;
michael@0 222 gl->fGetIntegerv(pname, &i);
michael@0 223 return JS::NumberValue(uint32_t(i));
michael@0 224 }
michael@0 225 // int
michael@0 226 case LOCAL_GL_STENCIL_CLEAR_VALUE:
michael@0 227 case LOCAL_GL_STENCIL_REF:
michael@0 228 case LOCAL_GL_STENCIL_BACK_REF:
michael@0 229 case LOCAL_GL_UNPACK_ALIGNMENT:
michael@0 230 case LOCAL_GL_PACK_ALIGNMENT:
michael@0 231 case LOCAL_GL_SUBPIXEL_BITS:
michael@0 232 case LOCAL_GL_SAMPLE_BUFFERS:
michael@0 233 case LOCAL_GL_SAMPLES:
michael@0 234 case LOCAL_GL_MAX_VERTEX_ATTRIBS:
michael@0 235 case LOCAL_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
michael@0 236 case LOCAL_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
michael@0 237 case LOCAL_GL_MAX_TEXTURE_IMAGE_UNITS:
michael@0 238 case LOCAL_GL_RED_BITS:
michael@0 239 case LOCAL_GL_GREEN_BITS:
michael@0 240 case LOCAL_GL_BLUE_BITS:
michael@0 241 case LOCAL_GL_ALPHA_BITS:
michael@0 242 case LOCAL_GL_DEPTH_BITS:
michael@0 243 case LOCAL_GL_STENCIL_BITS: {
michael@0 244 GLint i = 0;
michael@0 245 gl->fGetIntegerv(pname, &i);
michael@0 246 return JS::Int32Value(i);
michael@0 247 }
michael@0 248 case LOCAL_GL_FRAGMENT_SHADER_DERIVATIVE_HINT: {
michael@0 249 if (IsExtensionEnabled(WebGLExtensionID::OES_standard_derivatives)) {
michael@0 250 GLint i = 0;
michael@0 251 gl->fGetIntegerv(pname, &i);
michael@0 252 return JS::Int32Value(i);
michael@0 253 } else {
michael@0 254 break;
michael@0 255 }
michael@0 256 }
michael@0 257 case LOCAL_GL_MAX_TEXTURE_SIZE:
michael@0 258 return JS::Int32Value(mGLMaxTextureSize);
michael@0 259
michael@0 260 case LOCAL_GL_MAX_CUBE_MAP_TEXTURE_SIZE:
michael@0 261 return JS::Int32Value(mGLMaxCubeMapTextureSize);
michael@0 262
michael@0 263 case LOCAL_GL_MAX_RENDERBUFFER_SIZE:
michael@0 264 return JS::Int32Value(mGLMaxRenderbufferSize);
michael@0 265
michael@0 266 case LOCAL_GL_MAX_VERTEX_UNIFORM_VECTORS:
michael@0 267 return JS::Int32Value(mGLMaxVertexUniformVectors);
michael@0 268
michael@0 269 case LOCAL_GL_MAX_FRAGMENT_UNIFORM_VECTORS:
michael@0 270 return JS::Int32Value(mGLMaxFragmentUniformVectors);
michael@0 271
michael@0 272 case LOCAL_GL_MAX_VARYING_VECTORS:
michael@0 273 return JS::Int32Value(mGLMaxVaryingVectors);
michael@0 274
michael@0 275 case LOCAL_GL_NUM_COMPRESSED_TEXTURE_FORMATS:
michael@0 276 return JS::Int32Value(0);
michael@0 277 case LOCAL_GL_COMPRESSED_TEXTURE_FORMATS: {
michael@0 278 uint32_t length = mCompressedTextureFormats.Length();
michael@0 279 JSObject* obj = Uint32Array::Create(cx, this, length, mCompressedTextureFormats.Elements());
michael@0 280 if (!obj) {
michael@0 281 rv = NS_ERROR_OUT_OF_MEMORY;
michael@0 282 }
michael@0 283 return JS::ObjectOrNullValue(obj);
michael@0 284 }
michael@0 285 case LOCAL_GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: {
michael@0 286 if (!IsWebGL2()) {
michael@0 287 break;
michael@0 288 }
michael@0 289 return JS::Int32Value(mGLMaxTransformFeedbackSeparateAttribs);
michael@0 290 }
michael@0 291
michael@0 292 // unsigned int. here we may have to return very large values like 2^32-1 that can't be represented as
michael@0 293 // javascript integer values. We just return them as doubles and javascript doesn't care.
michael@0 294 case LOCAL_GL_STENCIL_BACK_VALUE_MASK:
michael@0 295 case LOCAL_GL_STENCIL_BACK_WRITEMASK:
michael@0 296 case LOCAL_GL_STENCIL_VALUE_MASK:
michael@0 297 case LOCAL_GL_STENCIL_WRITEMASK: {
michael@0 298 GLint i = 0; // the GL api (glGetIntegerv) only does signed ints
michael@0 299 gl->fGetIntegerv(pname, &i);
michael@0 300 GLuint i_unsigned(i); // this is where -1 becomes 2^32-1
michael@0 301 double i_double(i_unsigned); // pass as FP value to allow large values such as 2^32-1.
michael@0 302 return JS::DoubleValue(i_double);
michael@0 303 }
michael@0 304
michael@0 305 // float
michael@0 306 case LOCAL_GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: {
michael@0 307 if (IsExtensionEnabled(WebGLExtensionID::EXT_texture_filter_anisotropic)) {
michael@0 308 GLfloat f = 0.f;
michael@0 309 gl->fGetFloatv(pname, &f);
michael@0 310 return JS::DoubleValue(f);
michael@0 311 } else {
michael@0 312 break;
michael@0 313 }
michael@0 314 }
michael@0 315 case LOCAL_GL_DEPTH_CLEAR_VALUE:
michael@0 316 case LOCAL_GL_LINE_WIDTH:
michael@0 317 case LOCAL_GL_POLYGON_OFFSET_FACTOR:
michael@0 318 case LOCAL_GL_POLYGON_OFFSET_UNITS:
michael@0 319 case LOCAL_GL_SAMPLE_COVERAGE_VALUE: {
michael@0 320 GLfloat f = 0.f;
michael@0 321 gl->fGetFloatv(pname, &f);
michael@0 322 return JS::DoubleValue(f);
michael@0 323 }
michael@0 324
michael@0 325 // bool
michael@0 326 case LOCAL_GL_BLEND:
michael@0 327 case LOCAL_GL_DEPTH_TEST:
michael@0 328 case LOCAL_GL_STENCIL_TEST:
michael@0 329 case LOCAL_GL_CULL_FACE:
michael@0 330 case LOCAL_GL_DITHER:
michael@0 331 case LOCAL_GL_POLYGON_OFFSET_FILL:
michael@0 332 case LOCAL_GL_SCISSOR_TEST:
michael@0 333 case LOCAL_GL_SAMPLE_COVERAGE_INVERT:
michael@0 334 case LOCAL_GL_DEPTH_WRITEMASK: {
michael@0 335 realGLboolean b = 0;
michael@0 336 gl->fGetBooleanv(pname, &b);
michael@0 337 return JS::BooleanValue(bool(b));
michael@0 338 }
michael@0 339
michael@0 340 // bool, WebGL-specific
michael@0 341 case UNPACK_FLIP_Y_WEBGL:
michael@0 342 return JS::BooleanValue(mPixelStoreFlipY);
michael@0 343 case UNPACK_PREMULTIPLY_ALPHA_WEBGL:
michael@0 344 return JS::BooleanValue(mPixelStorePremultiplyAlpha);
michael@0 345
michael@0 346 // uint, WebGL-specific
michael@0 347 case UNPACK_COLORSPACE_CONVERSION_WEBGL:
michael@0 348 return JS::NumberValue(uint32_t(mPixelStoreColorspaceConversion));
michael@0 349
michael@0 350 ////////////////////////////////
michael@0 351 // Complex values
michael@0 352
michael@0 353 // 2 floats
michael@0 354 case LOCAL_GL_DEPTH_RANGE:
michael@0 355 case LOCAL_GL_ALIASED_POINT_SIZE_RANGE:
michael@0 356 case LOCAL_GL_ALIASED_LINE_WIDTH_RANGE: {
michael@0 357 GLfloat fv[2] = { 0 };
michael@0 358 gl->fGetFloatv(pname, fv);
michael@0 359 JSObject* obj = Float32Array::Create(cx, this, 2, fv);
michael@0 360 if (!obj) {
michael@0 361 rv = NS_ERROR_OUT_OF_MEMORY;
michael@0 362 }
michael@0 363 return JS::ObjectOrNullValue(obj);
michael@0 364 }
michael@0 365
michael@0 366 // 4 floats
michael@0 367 case LOCAL_GL_COLOR_CLEAR_VALUE:
michael@0 368 case LOCAL_GL_BLEND_COLOR: {
michael@0 369 GLfloat fv[4] = { 0 };
michael@0 370 gl->fGetFloatv(pname, fv);
michael@0 371 JSObject* obj = Float32Array::Create(cx, this, 4, fv);
michael@0 372 if (!obj) {
michael@0 373 rv = NS_ERROR_OUT_OF_MEMORY;
michael@0 374 }
michael@0 375 return JS::ObjectOrNullValue(obj);
michael@0 376 }
michael@0 377
michael@0 378 // 2 ints
michael@0 379 case LOCAL_GL_MAX_VIEWPORT_DIMS: {
michael@0 380 GLint iv[2] = { 0 };
michael@0 381 gl->fGetIntegerv(pname, iv);
michael@0 382 JSObject* obj = Int32Array::Create(cx, this, 2, iv);
michael@0 383 if (!obj) {
michael@0 384 rv = NS_ERROR_OUT_OF_MEMORY;
michael@0 385 }
michael@0 386 return JS::ObjectOrNullValue(obj);
michael@0 387 }
michael@0 388
michael@0 389 // 4 ints
michael@0 390 case LOCAL_GL_SCISSOR_BOX:
michael@0 391 case LOCAL_GL_VIEWPORT: {
michael@0 392 GLint iv[4] = { 0 };
michael@0 393 gl->fGetIntegerv(pname, iv);
michael@0 394 JSObject* obj = Int32Array::Create(cx, this, 4, iv);
michael@0 395 if (!obj) {
michael@0 396 rv = NS_ERROR_OUT_OF_MEMORY;
michael@0 397 }
michael@0 398 return JS::ObjectOrNullValue(obj);
michael@0 399 }
michael@0 400
michael@0 401 // 4 bools
michael@0 402 case LOCAL_GL_COLOR_WRITEMASK: {
michael@0 403 realGLboolean gl_bv[4] = { 0 };
michael@0 404 gl->fGetBooleanv(pname, gl_bv);
michael@0 405 bool vals[4] = { bool(gl_bv[0]), bool(gl_bv[1]),
michael@0 406 bool(gl_bv[2]), bool(gl_bv[3]) };
michael@0 407 JS::Rooted<JS::Value> arr(cx);
michael@0 408 if (!ToJSValue(cx, vals, &arr)) {
michael@0 409 rv = NS_ERROR_OUT_OF_MEMORY;
michael@0 410 }
michael@0 411 return arr;
michael@0 412 }
michael@0 413
michael@0 414 case LOCAL_GL_ARRAY_BUFFER_BINDING: {
michael@0 415 return WebGLObjectAsJSValue(cx, mBoundArrayBuffer.get(), rv);
michael@0 416 }
michael@0 417
michael@0 418 case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: {
michael@0 419 if (!IsWebGL2()) {
michael@0 420 break;
michael@0 421 }
michael@0 422 return WebGLObjectAsJSValue(cx, mBoundTransformFeedbackBuffer.get(), rv);
michael@0 423 }
michael@0 424
michael@0 425 case LOCAL_GL_ELEMENT_ARRAY_BUFFER_BINDING: {
michael@0 426 return WebGLObjectAsJSValue(cx, mBoundVertexArray->mBoundElementArrayBuffer.get(), rv);
michael@0 427 }
michael@0 428
michael@0 429 case LOCAL_GL_RENDERBUFFER_BINDING: {
michael@0 430 return WebGLObjectAsJSValue(cx, mBoundRenderbuffer.get(), rv);
michael@0 431 }
michael@0 432
michael@0 433 case LOCAL_GL_FRAMEBUFFER_BINDING: {
michael@0 434 return WebGLObjectAsJSValue(cx, mBoundFramebuffer.get(), rv);
michael@0 435 }
michael@0 436
michael@0 437 case LOCAL_GL_CURRENT_PROGRAM: {
michael@0 438 return WebGLObjectAsJSValue(cx, mCurrentProgram.get(), rv);
michael@0 439 }
michael@0 440
michael@0 441 case LOCAL_GL_TEXTURE_BINDING_2D: {
michael@0 442 return WebGLObjectAsJSValue(cx, mBound2DTextures[mActiveTexture].get(), rv);
michael@0 443 }
michael@0 444
michael@0 445 case LOCAL_GL_TEXTURE_BINDING_CUBE_MAP: {
michael@0 446 return WebGLObjectAsJSValue(cx, mBoundCubeMapTextures[mActiveTexture].get(), rv);
michael@0 447 }
michael@0 448
michael@0 449 default:
michael@0 450 break;
michael@0 451 }
michael@0 452
michael@0 453 ErrorInvalidEnumInfo("getParameter: parameter", pname);
michael@0 454 return JS::NullValue();
michael@0 455 }
michael@0 456
michael@0 457 void
michael@0 458 WebGLContext::GetParameterIndexed(JSContext* cx, GLenum pname, GLuint index,
michael@0 459 JS::MutableHandle<JS::Value> retval)
michael@0 460 {
michael@0 461 if (IsContextLost()) {
michael@0 462 retval.setNull();
michael@0 463 return;
michael@0 464 }
michael@0 465
michael@0 466 MakeContextCurrent();
michael@0 467
michael@0 468 switch (pname) {
michael@0 469 case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
michael@0 470 {
michael@0 471 if (index >= mGLMaxTransformFeedbackSeparateAttribs) {
michael@0 472 ErrorInvalidValue("getParameterIndexed: index should be less than MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS", index);
michael@0 473 retval.setNull();
michael@0 474 return;
michael@0 475 }
michael@0 476 retval.setNull(); // See bug 903594
michael@0 477 return;
michael@0 478 }
michael@0 479
michael@0 480 default:
michael@0 481 break;
michael@0 482 }
michael@0 483
michael@0 484 ErrorInvalidEnumInfo("getParameterIndexed: parameter", pname);
michael@0 485 retval.setNull();
michael@0 486 }
michael@0 487
michael@0 488 bool
michael@0 489 WebGLContext::IsEnabled(GLenum cap)
michael@0 490 {
michael@0 491 if (IsContextLost())
michael@0 492 return false;
michael@0 493
michael@0 494 if (!ValidateCapabilityEnum(cap, "isEnabled"))
michael@0 495 return false;
michael@0 496
michael@0 497 MakeContextCurrent();
michael@0 498 return gl->fIsEnabled(cap);
michael@0 499 }
michael@0 500
michael@0 501 bool
michael@0 502 WebGLContext::ValidateCapabilityEnum(GLenum cap, const char* info)
michael@0 503 {
michael@0 504 switch (cap) {
michael@0 505 case LOCAL_GL_BLEND:
michael@0 506 case LOCAL_GL_CULL_FACE:
michael@0 507 case LOCAL_GL_DEPTH_TEST:
michael@0 508 case LOCAL_GL_DITHER:
michael@0 509 case LOCAL_GL_POLYGON_OFFSET_FILL:
michael@0 510 case LOCAL_GL_SAMPLE_ALPHA_TO_COVERAGE:
michael@0 511 case LOCAL_GL_SAMPLE_COVERAGE:
michael@0 512 case LOCAL_GL_SCISSOR_TEST:
michael@0 513 case LOCAL_GL_STENCIL_TEST:
michael@0 514 return true;
michael@0 515 case LOCAL_GL_RASTERIZER_DISCARD:
michael@0 516 return IsWebGL2();
michael@0 517 default:
michael@0 518 ErrorInvalidEnumInfo(info, cap);
michael@0 519 return false;
michael@0 520 }
michael@0 521 }
michael@0 522
michael@0 523 realGLboolean*
michael@0 524 WebGLContext::GetStateTrackingSlot(GLenum cap)
michael@0 525 {
michael@0 526 switch (cap) {
michael@0 527 case LOCAL_GL_SCISSOR_TEST:
michael@0 528 return &mScissorTestEnabled;
michael@0 529 case LOCAL_GL_DITHER:
michael@0 530 return &mDitherEnabled;
michael@0 531 case LOCAL_GL_RASTERIZER_DISCARD:
michael@0 532 return &mRasterizerDiscardEnabled;
michael@0 533 }
michael@0 534
michael@0 535 return nullptr;
michael@0 536 }

mercurial