diff options
author | Jordan Justen <[email protected]> | 2012-05-12 21:01:19 -0700 |
---|---|---|
committer | Jordan Justen <[email protected]> | 2012-05-23 15:19:09 -0700 |
commit | df7d1323de08274c816a8e5fab7e99b6f00f4fa3 (patch) | |
tree | 1fdb9012d258c421d40f5dea4cb7393b2e8729f0 /src/mesa/drivers/dri | |
parent | 9f6932cb83def5449a9293cb41238bbc492cb8c4 (diff) |
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 <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r-- | src/mesa/drivers/dri/i965/Makefile.sources | 1 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 5 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw.c | 6 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw.h | 7 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_primitive_restart.c | 87 | ||||
-rwxr-xr-x[-rw-r--r--] | src/mesa/drivers/dri/intel/intel_extensions.c | 4 |
7 files changed, 112 insertions, 0 deletions
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 <[email protected]> + * + */ + +#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 index 24778a474ce..b81770c067d 100644..100755 --- 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; + } } |