void
WebGL2Context::EndQuery(GLenum target)
{
    if (IsContextLost())
        return;

    if (!ValidateQueryTarget(target, "endQuery"))
        return;

    WebGLRefPtr<WebGLQuery>& querySlot = GetQuerySlotByTarget(target);
    WebGLQuery* activeQuery = querySlot.get();

    if (!activeQuery || target != activeQuery->mType)
    {
        /* From GLES's EXT_occlusion_query_boolean:
         *     marks the end of the sequence of commands to be tracked for the
         *     query type given by <target>. The active query object for
         *     <target> is updated to indicate that query results are not
         *     available, and the active query object name for <target> is reset
         *     to zero. When the commands issued prior to EndQueryEXT have
         *     completed and a final query result is available, the query object
         *     active when EndQueryEXT is called is updated by the GL. The query
         *     object is updated to indicate that the query results are
         *     available and to contain the query result. If the active query
         *     object name for <target> is zero when EndQueryEXT is called, the
         *     error INVALID_OPERATION is generated.
         */
        ErrorInvalidOperation("endQuery: There is no active query of type %s.",
                              GetQueryTargetEnumString(target));
        return;
    }

    MakeContextCurrent();

    if (target == LOCAL_GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN) {
        gl->fEndQuery(LOCAL_GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
    } else {
        gl->fEndQuery(SimulateOcclusionQueryTarget(gl, target));
    }

    UpdateBoundQuery(target, nullptr);
    NS_DispatchToCurrentThread(new WebGLQuery::AvailableRunnable(activeQuery));
}
Esempio n. 2
0
void
WebGL2Context::BeginQuery(GLenum target, WebGLQuery* query)
{
    if (IsContextLost())
        return;

    if (!ValidateQueryTarget(target, "beginQuery"))
        return;

    if (!query) {
        /* From GLES's EXT_occlusion_query_boolean:
         *     BeginQueryEXT sets the active query object name for the query
         *     type given by <target> to <id>. If BeginQueryEXT is called with
         *     an <id> of zero, if the active query object name for <target> is
         *     non-zero (for the targets ANY_SAMPLES_PASSED_EXT and
         *     ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, if the active query for
         *     either target is non-zero), if <id> is the name of an existing
         *     query object whose type does not match <target>, or if <id> is
         *     the active query object name for any query type, the error
         *     INVALID_OPERATION is generated.
         */
        ErrorInvalidOperation("beginQuery: Query should not be null.");
        return;
    }

    if (query->IsDeleted()) {
        /* From GLES's EXT_occlusion_query_boolean:
         *     BeginQueryEXT fails and an INVALID_OPERATION error is generated
         *     if <id> is not a name returned from a previous call to
         *     GenQueriesEXT, or if such a name has since been deleted with
         *     DeleteQueriesEXT.
         */
        ErrorInvalidOperation("beginQuery: Query has been deleted.");
        return;
    }

    if (query->HasEverBeenActive() &&
        query->mType != target)
    {
        ErrorInvalidOperation("beginQuery: Target doesn't match with the query"
                              " type.");
        return;
    }

    WebGLRefPtr<WebGLQuery>& querySlot = GetQuerySlotByTarget(target);
    WebGLQuery* activeQuery = querySlot.get();
    if (activeQuery)
        return ErrorInvalidOperation("beginQuery: An other query already active.");

    if (!query->HasEverBeenActive())
        query->mType = target;

    MakeContextCurrent();

    if (target == LOCAL_GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN) {
        gl->fBeginQuery(LOCAL_GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN,
                        query->mGLName);
    } else {
        gl->fBeginQuery(SimulateOcclusionQueryTarget(gl, target),
                        query->mGLName);
    }

    UpdateBoundQuery(target, query);
}