From df7d1323de08274c816a8e5fab7e99b6f00f4fa3 Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Sat, 12 May 2012 21:01:19 -0700 Subject: [PATCH] i965: create code path to handle primitive restart in hardware 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 Reviewed-by: Kenneth Graunke Reviewed-by: Ian Romanick --- 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 ++ .../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 d6dc822e50a..17136de316c 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 2f70ee2d824..5cc720bcc82 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 26f0d54466c..4078e484827 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -296,6 +296,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 5baffabae86..2a9de745c14 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1040,6 +1040,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 813f7c8e570..16ce9949779 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 2cc4cb38379..d86a9e72cbb 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 00000000000..d7136ed6fb9 --- /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 + * + */ + +#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 24778a474ce..b81770c067d --- a/src/mesa/drivers/dri/intel/intel_extensions.c +++ b/src/mesa/drivers/dri/intel/intel_extensions.c @@ -168,4 +168,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; + } } -- 2.30.2