void WebGLContext::GetQuery(JSContext* cx, GLenum target, GLenum pname, JS::MutableHandleValue retval) { const FuncScope funcScope(*this, "getQuery"); retval.setNull(); if (IsContextLost()) return; switch (pname) { case LOCAL_GL_CURRENT_QUERY_EXT: { if (IsExtensionEnabled(WebGLExtensionID::EXT_disjoint_timer_query) && target == LOCAL_GL_TIMESTAMP) { // Doesn't seem illegal to ask about, but is always null. // TIMESTAMP has no slot, so ValidateQuerySlotByTarget would generate // INVALID_ENUM. return; } const auto& slot = ValidateQuerySlotByTarget(target); if (!slot || !*slot) return; const auto& query = *slot; if (target != query->Target()) return; JS::Rooted<JS::Value> v(cx); dom::GetOrCreateDOMReflector(cx, slot->get(), &v); retval.set(v); } return; case LOCAL_GL_QUERY_COUNTER_BITS_EXT: if (!IsExtensionEnabled(WebGLExtensionID::EXT_disjoint_timer_query)) break; if (target != LOCAL_GL_TIME_ELAPSED_EXT && target != LOCAL_GL_TIMESTAMP_EXT) { ErrorInvalidEnumInfo("target", target); return; } { GLint bits = 0; gl->fGetQueryiv(target, pname, &bits); if (!Has64BitTimestamps() && bits > 32) { bits = 32; } retval.set(JS::Int32Value(bits)); } return; default: break; } ErrorInvalidEnumInfo("pname", pname); }
void WebGLContext::EndQuery(GLenum target) { const FuncScope funcScope(*this, "endQuery"); if (IsContextLost()) return; const auto& slot = ValidateQuerySlotByTarget(target); if (!slot) return; const auto& query = *slot; if (!query) return ErrorInvalidOperation("Query target not active."); query->EndQuery(); }
void WebGLContext::BeginQuery(GLenum target, WebGLQuery& query) { const FuncScope funcScope(*this, "beginQuery"); if (IsContextLost()) return; if (!ValidateObject("query", query)) return; const auto& slot = ValidateQuerySlotByTarget(target); if (!slot) return; if (*slot) return ErrorInvalidOperation("Query target already active."); //// query.BeginQuery(target, *slot); }
void WebGLContext::EndQuery(GLenum target, const char* funcName) { if (!funcName) { funcName = "endQuery"; } if (IsContextLost()) return; const auto& slot = ValidateQuerySlotByTarget(funcName, target); if (!slot) return; const auto& query = *slot; if (!query) return ErrorInvalidOperation("%s: Query target not active.", funcName); query->EndQuery(); }
void WebGLContext::BeginQuery(GLenum target, WebGLQuery& query, const char* funcName) { if (!funcName) { funcName = "beginQuery"; } if (IsContextLost()) return; if (!ValidateObject(funcName, query)) return; const auto& slot = ValidateQuerySlotByTarget(funcName, target); if (!slot) return; if (*slot) return ErrorInvalidOperation("%s: Query target already active.", funcName); //// query.BeginQuery(target, *slot); }