For newer hardware we disable the VBO module's software handling of primitive restart. We now handle primitive restarts in brw_handle_primitive_restart.
The initial version of brw_handle_primitive_restart simply calls vbo_sw_primitive_restart, and therefore still uses the VBO module software primitive restart support. Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> --- docs/GL3.txt | 2 +- src/mesa/drivers/dri/i965/Makefile.sources | 1 + src/mesa/drivers/dri/i965/brw_context.c | 2 + src/mesa/drivers/dri/i965/brw_context.h | 5 ++ src/mesa/drivers/dri/i965/brw_draw.c | 6 ++ src/mesa/drivers/dri/i965/brw_draw.h | 7 ++ src/mesa/drivers/dri/i965/brw_primitive_restart.c | 87 +++++++++++++++++++++ src/mesa/drivers/dri/intel/intel_extensions.c | 4 + 8 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/mesa/drivers/dri/i965/brw_primitive_restart.c mode change 100644 => 100755 src/mesa/drivers/dri/intel/intel_extensions.c diff --git a/docs/GL3.txt b/docs/GL3.txt index 5fc6c69..5651d6e 100644 --- a/docs/GL3.txt +++ b/docs/GL3.txt @@ -46,7 +46,7 @@ GLSL 1.40 missing: UBOS, inverse(), highp change Instanced drawing (GL_ARB_draw_instanced) DONE (i965, gallium, swrast) Buffer copying (GL_ARB_copy_buffer) DONE (i965, r300, r600, swrast) -Primitive restart (GL_NV_primitive_restart) DONE (r600) +Primitive restart (GL_NV_primitive_restart) DONE (i965, r600) 16 vertex texture image units DONE Texture buffer objs (GL_ARB_texture_buffer_object) needs GL3.1 enabling (i965) Rectangular textures (GL_ARB_texture_rectangle) DONE (i965, r300, r600, swrast) diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources index 3847f91..f09c296 100644 --- a/src/mesa/drivers/dri/i965/Makefile.sources +++ b/src/mesa/drivers/dri/i965/Makefile.sources @@ -55,6 +55,7 @@ i965_C_FILES = \ brw_misc_state.c \ brw_optimize.c \ brw_program.c \ + brw_primitive_restart.c \ brw_queryobj.c \ brw_sf.c \ brw_sf_emit.c \ diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 65de260..3ef5a57 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -295,6 +295,8 @@ brwCreateContext(int api, brw->has_negative_rhw_bug = true; } + brw->prim_restart.in_progress = false; + brw_init_state( brw ); brw->curbe.last_buf = calloc(1, 4096); diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index a768416..920fdaa 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1001,6 +1001,11 @@ struct brw_context uint32_t render_target_format[MESA_FORMAT_COUNT]; bool format_supported_as_render_target[MESA_FORMAT_COUNT]; + + /* PrimitiveRestart */ + struct { + bool in_progress; + } prim_restart; }; diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index 813f7c8..16ce994 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -545,6 +545,12 @@ void brw_draw_prims( struct gl_context *ctx, if (!_mesa_check_conditional_render(ctx)) return; + /* Handle primitive restart if needed */ + if (brw_handle_primitive_restart(ctx, prim, nr_prims, ib)) { + /* The draw was handled, so we can exit now */ + return; + } + if (!vbo_all_varyings_in_vbos(arrays)) { if (!index_bounds_valid) vbo_get_minmax_indices(ctx, prim, ib, &min_index, &max_index, nr_prims); diff --git a/src/mesa/drivers/dri/i965/brw_draw.h b/src/mesa/drivers/dri/i965/brw_draw.h index 2cc4cb3..d86a9e7 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.h +++ b/src/mesa/drivers/dri/i965/brw_draw.h @@ -51,4 +51,11 @@ void brw_draw_destroy( struct brw_context *brw ); void brw_init_current_values(struct gl_context *ctx, struct gl_client_array *arrays); +/* brw_primitive_restart.c */ +GLboolean +brw_handle_primitive_restart(struct gl_context *ctx, + const struct _mesa_prim *prim, + GLuint nr_prims, + const struct _mesa_index_buffer *ib); + #endif diff --git a/src/mesa/drivers/dri/i965/brw_primitive_restart.c b/src/mesa/drivers/dri/i965/brw_primitive_restart.c new file mode 100644 index 0000000..d7136ed --- /dev/null +++ b/src/mesa/drivers/dri/i965/brw_primitive_restart.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Jordan Justen <jordan.l.jus...@intel.com> + * + */ + +#include "main/imports.h" +#include "main/bufferobj.h" + +#include "brw_context.h" +#include "brw_draw.h" + +/** + * Check if primitive restart is enabled, and if so, handle it properly. + * + * In some cases the support will be handled in software. When available + * hardware will handle primitive restart. + */ +GLboolean +brw_handle_primitive_restart(struct gl_context *ctx, + const struct _mesa_prim *prim, + GLuint nr_prims, + const struct _mesa_index_buffer *ib) +{ + struct brw_context *brw = brw_context(ctx); + + /* We only need to handle cases where there is an index buffer. */ + if (ib == NULL) { + return GL_FALSE; + } + + /* If the driver has requested software handling of primitive restarts, + * then the VBO module has already taken care of things, and we can + * just draw as normal. + */ + if (ctx->Const.PrimitiveRestartInSoftware) { + return GL_FALSE; + } + + /* If we have set the in_progress flag, then we are in the middle + * of handling the primitive restart draw. + */ + if (brw->prim_restart.in_progress) { + return GL_FALSE; + } + + /* If PrimitiveRestart is not enabled, then we aren't concerned about + * handling this draw. + */ + if (!(ctx->Array.PrimitiveRestart)) { + return GL_FALSE; + } + + /* Signal that we are in the process of handling the + * primitive restart draw + */ + brw->prim_restart.in_progress = true; + + vbo_sw_primitive_restart(ctx, prim, nr_prims, ib); + + brw->prim_restart.in_progress = false; + + /* The primitive restart draw was completed, so return true. */ + return GL_TRUE; +} + diff --git a/src/mesa/drivers/dri/intel/intel_extensions.c b/src/mesa/drivers/dri/intel/intel_extensions.c old mode 100644 new mode 100755 index d4713c9..1710c6d --- a/src/mesa/drivers/dri/intel/intel_extensions.c +++ b/src/mesa/drivers/dri/intel/intel_extensions.c @@ -167,4 +167,8 @@ intelInitExtensions(struct gl_context *ctx) else if (driQueryOptionb(&intel->optionCache, "force_s3tc_enable")) { ctx->Extensions.EXT_texture_compression_s3tc = true; } + + if (intel->gen >= 4) { + ctx->Extensions.NV_primitive_restart = true; + } } -- 1.7.9.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev