mesa: add begin_conditional_render() helper

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Samuel Pitoiset 2017-07-20 11:05:39 +02:00
parent 3f05193734
commit e1750e0a17

View file

@ -37,10 +37,76 @@
#include "queryobj.h"
static ALWAYS_INLINE void
begin_conditional_render(struct gl_context *ctx, GLuint queryId, GLenum mode,
bool no_error)
{
struct gl_query_object *q = NULL;
assert(ctx->Query.CondRenderMode == GL_NONE);
if (queryId != 0)
q = _mesa_lookup_query_object(ctx, queryId);
if (!no_error) {
/* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
*
* "The error INVALID_VALUE is generated if <id> is not the name of an
* existing query object query."
*/
if (!q) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glBeginConditionalRender(bad queryId=%u)", queryId);
return;
}
assert(q->Id == queryId);
switch (mode) {
case GL_QUERY_WAIT:
case GL_QUERY_NO_WAIT:
case GL_QUERY_BY_REGION_WAIT:
case GL_QUERY_BY_REGION_NO_WAIT:
break; /* OK */
case GL_QUERY_WAIT_INVERTED:
case GL_QUERY_NO_WAIT_INVERTED:
case GL_QUERY_BY_REGION_WAIT_INVERTED:
case GL_QUERY_BY_REGION_NO_WAIT_INVERTED:
if (ctx->Extensions.ARB_conditional_render_inverted)
break; /* OK */
/* fallthrough - invalid */
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glBeginConditionalRender(mode=%s)",
_mesa_enum_to_string(mode));
return;
}
/* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
*
* "The error INVALID_OPERATION is generated if <id> is the name of a
* query object with a target other than SAMPLES_PASSED, or <id> is
* the name of a query currently in progress."
*/
if ((q->Target != GL_SAMPLES_PASSED &&
q->Target != GL_ANY_SAMPLES_PASSED &&
q->Target != GL_ANY_SAMPLES_PASSED_CONSERVATIVE &&
q->Target != GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB &&
q->Target != GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB) || q->Active) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glBeginConditionalRender()");
return;
}
}
ctx->Query.CondRenderQuery = q;
ctx->Query.CondRenderMode = mode;
if (ctx->Driver.BeginConditionalRender)
ctx->Driver.BeginConditionalRender(ctx, q, mode);
}
void GLAPIENTRY
_mesa_BeginConditionalRender(GLuint queryId, GLenum mode)
{
struct gl_query_object *q = NULL;
GET_CURRENT_CONTEXT(ctx);
/* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
@ -55,62 +121,7 @@ _mesa_BeginConditionalRender(GLuint queryId, GLenum mode)
return;
}
assert(ctx->Query.CondRenderMode == GL_NONE);
/* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
*
* "The error INVALID_VALUE is generated if <id> is not the name of an
* existing query object query."
*/
if (queryId != 0)
q = _mesa_lookup_query_object(ctx, queryId);
if (!q) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glBeginConditionalRender(bad queryId=%u)", queryId);
return;
}
assert(q->Id == queryId);
switch (mode) {
case GL_QUERY_WAIT:
case GL_QUERY_NO_WAIT:
case GL_QUERY_BY_REGION_WAIT:
case GL_QUERY_BY_REGION_NO_WAIT:
break; /* OK */
case GL_QUERY_WAIT_INVERTED:
case GL_QUERY_NO_WAIT_INVERTED:
case GL_QUERY_BY_REGION_WAIT_INVERTED:
case GL_QUERY_BY_REGION_NO_WAIT_INVERTED:
if (ctx->Extensions.ARB_conditional_render_inverted)
break; /* OK */
/* fallthrough - invalid */
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glBeginConditionalRender(mode=%s)",
_mesa_enum_to_string(mode));
return;
}
/* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
*
* "The error INVALID_OPERATION is generated if <id> is the name of a
* query object with a target other than SAMPLES_PASSED, or <id> is the
* name of a query currently in progress."
*/
if ((q->Target != GL_SAMPLES_PASSED &&
q->Target != GL_ANY_SAMPLES_PASSED &&
q->Target != GL_ANY_SAMPLES_PASSED_CONSERVATIVE &&
q->Target != GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB &&
q->Target != GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB) || q->Active) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glBeginConditionalRender()");
return;
}
ctx->Query.CondRenderQuery = q;
ctx->Query.CondRenderMode = mode;
if (ctx->Driver.BeginConditionalRender)
ctx->Driver.BeginConditionalRender(ctx, q, mode);
begin_conditional_render(ctx, queryId, mode, false);
}