[Mesa-dev] [PATCH 13/14] mesa/vbo: add KHR_no_error support to DrawElements*() functions
Timothy Arceri
tarceri at itsqueeze.com
Wed Apr 19 00:37:30 UTC 2017
V2: move MESA_VERBOSE checks back into the common code path.
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
---
src/mesa/vbo/vbo_exec_array.c | 96 ++++++++++++++++++++++++++++++++-----------
1 file changed, 73 insertions(+), 23 deletions(-)
diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
index a78edd3..5b02e89 100644
--- a/src/mesa/vbo/vbo_exec_array.c
+++ b/src/mesa/vbo/vbo_exec_array.c
@@ -990,94 +990,123 @@ static void GLAPIENTRY
vbo_exec_DrawElements(GLenum mode, GLsizei count, GLenum type,
const GLvoid * indices)
{
GET_CURRENT_CONTEXT(ctx);
if (MESA_VERBOSE & VERBOSE_DRAW)
_mesa_debug(ctx, "glDrawElements(%s, %u, %s, %p)\n",
_mesa_enum_to_string(mode), count,
_mesa_enum_to_string(type), indices);
- if (!_mesa_validate_DrawElements(ctx, mode, count, type, indices))
- return;
+ if (_mesa_is_no_error_enabled(ctx)) {
+ FLUSH_CURRENT(ctx, 0);
+
+ if (ctx->NewState)
+ _mesa_update_state(ctx);
+ } else {
+ if (!_mesa_validate_DrawElements(ctx, mode, count, type, indices))
+ return;
+ }
vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
count, type, indices, 0, 1, 0);
}
/**
* Called by glDrawElementsBaseVertex() in immediate mode.
*/
static void GLAPIENTRY
vbo_exec_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type,
const GLvoid * indices, GLint basevertex)
{
GET_CURRENT_CONTEXT(ctx);
if (MESA_VERBOSE & VERBOSE_DRAW)
- _mesa_debug(ctx, "glDrawElementsBaseVertex(%s, %d, %s, %p, %d)\n",
+ _mesa_debug(ctx, "glDrawElements(%s, %u, %s, %p)\n",
_mesa_enum_to_string(mode), count,
- _mesa_enum_to_string(type), indices, basevertex);
+ _mesa_enum_to_string(type), indices);
- if (!_mesa_validate_DrawElements(ctx, mode, count, type, indices))
- return;
+ if (_mesa_is_no_error_enabled(ctx)) {
+ FLUSH_CURRENT(ctx, 0);
+
+ if (ctx->NewState)
+ _mesa_update_state(ctx);
+ } else {
+ if (!_mesa_validate_DrawElements(ctx, mode, count, type, indices))
+ return;
+ }
vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
count, type, indices, basevertex, 1, 0);
}
/**
* Called by glDrawElementsInstanced() in immediate mode.
*/
static void GLAPIENTRY
vbo_exec_DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type,
const GLvoid * indices, GLsizei numInstances)
{
GET_CURRENT_CONTEXT(ctx);
if (MESA_VERBOSE & VERBOSE_DRAW)
- _mesa_debug(ctx, "glDrawElementsInstanced(%s, %d, %s, %p, %d)\n",
+ _mesa_debug(ctx, "glDrawElements(%s, %u, %s, %p)\n",
_mesa_enum_to_string(mode), count,
- _mesa_enum_to_string(type), indices, numInstances);
+ _mesa_enum_to_string(type), indices);
- if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, indices,
- numInstances))
- return;
+ if (_mesa_is_no_error_enabled(ctx)) {
+ FLUSH_CURRENT(ctx, 0);
+
+ if (ctx->NewState)
+ _mesa_update_state(ctx);
+ } else {
+ if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type,
+ indices, numInstances))
+ return;
+ }
vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
count, type, indices, 0, numInstances, 0);
}
/**
* Called by glDrawElementsInstancedBaseVertex() in immediate mode.
*/
static void GLAPIENTRY
vbo_exec_DrawElementsInstancedBaseVertex(GLenum mode, GLsizei count,
GLenum type, const GLvoid * indices,
GLsizei numInstances,
GLint basevertex)
{
GET_CURRENT_CONTEXT(ctx);
if (MESA_VERBOSE & VERBOSE_DRAW)
_mesa_debug(ctx,
- "glDrawElementsInstancedBaseVertex(%s, %d, %s, %p, %d; %d)\n",
+ "glDrawElementsInstancedBaseVertex"
+ "(%s, %d, %s, %p, %d; %d)\n",
_mesa_enum_to_string(mode), count,
_mesa_enum_to_string(type), indices,
numInstances, basevertex);
- if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, indices,
- numInstances))
- return;
+ if (_mesa_is_no_error_enabled(ctx)) {
+ FLUSH_CURRENT(ctx, 0);
+
+ if (ctx->NewState)
+ _mesa_update_state(ctx);
+ } else {
+ if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type,
+ indices, numInstances))
+ return;
+ }
vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
count, type, indices,
basevertex, numInstances, 0);
}
/**
* Called by glDrawElementsInstancedBaseInstance() in immediate mode.
*/
@@ -1091,23 +1120,30 @@ vbo_exec_DrawElementsInstancedBaseInstance(GLenum mode, GLsizei count,
GET_CURRENT_CONTEXT(ctx);
if (MESA_VERBOSE & VERBOSE_DRAW)
_mesa_debug(ctx,
"glDrawElementsInstancedBaseInstance"
"(%s, %d, %s, %p, %d, %d)\n",
_mesa_enum_to_string(mode), count,
_mesa_enum_to_string(type), indices,
numInstances, baseInstance);
- if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, indices,
- numInstances))
- return;
+ if (_mesa_is_no_error_enabled(ctx)) {
+ FLUSH_CURRENT(ctx, 0);
+
+ if (ctx->NewState)
+ _mesa_update_state(ctx);
+ } else {
+ if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type,
+ indices, numInstances))
+ return;
+ }
vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
count, type, indices, 0, numInstances,
baseInstance);
}
/**
* Called by glDrawElementsInstancedBaseVertexBaseInstance() in immediate mode.
*/
@@ -1123,23 +1159,30 @@ vbo_exec_DrawElementsInstancedBaseVertexBaseInstance(GLenum mode,
GET_CURRENT_CONTEXT(ctx);
if (MESA_VERBOSE & VERBOSE_DRAW)
_mesa_debug(ctx,
"glDrawElementsInstancedBaseVertexBaseInstance"
"(%s, %d, %s, %p, %d, %d, %d)\n",
_mesa_enum_to_string(mode), count,
_mesa_enum_to_string(type), indices,
numInstances, basevertex, baseInstance);
- if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, indices,
- numInstances))
- return;
+ if (_mesa_is_no_error_enabled(ctx)) {
+ FLUSH_CURRENT(ctx, 0);
+
+ if (ctx->NewState)
+ _mesa_update_state(ctx);
+ } else {
+ if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type,
+ indices, numInstances))
+ return;
+ }
vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
count, type, indices, basevertex,
numInstances, baseInstance);
}
/**
* Inner support for both _mesa_MultiDrawElements() and
* _mesa_MultiDrawRangeElements().
@@ -1568,22 +1611,29 @@ vbo_exec_DrawArraysIndirect(GLenum mode, const GLvoid *indirect)
static void GLAPIENTRY
vbo_exec_DrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
{
GET_CURRENT_CONTEXT(ctx);
if (MESA_VERBOSE & VERBOSE_DRAW)
_mesa_debug(ctx, "glDrawElementsIndirect(%s, %s, %p)\n",
_mesa_enum_to_string(mode),
_mesa_enum_to_string(type), indirect);
- if (!_mesa_validate_DrawElementsIndirect(ctx, mode, type, indirect))
- return;
+ if (_mesa_is_no_error_enabled(ctx)) {
+ FLUSH_CURRENT(ctx, 0);
+
+ if (ctx->NewState)
+ _mesa_update_state(ctx);
+ } else {
+ if (!_mesa_validate_DrawElementsIndirect(ctx, mode, type, indirect))
+ return;
+ }
if (skip_validated_draw(ctx))
return;
vbo_validated_drawelementsindirect(ctx, mode, type, indirect);
}
static void GLAPIENTRY
vbo_exec_MultiDrawArraysIndirect(GLenum mode, const GLvoid *indirect,
--
2.9.3
More information about the mesa-dev
mailing list