X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_primitive_restart.c;h=a780df31809591790a49a0572e4557227a292192;hb=e5339fe4a47c242693962c9f90bbab8b74935cba;hp=f014b60bab67ac72954c6b308eceda330e86aa55;hpb=3953766e57f96be754229bb109ba5dfdcdbc8b50;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_primitive_restart.c b/src/mesa/drivers/dri/i965/brw_primitive_restart.c index f014b60bab6..a780df31809 100644 --- a/src/mesa/drivers/dri/i965/brw_primitive_restart.c +++ b/src/mesa/drivers/dri/i965/brw_primitive_restart.c @@ -25,9 +25,10 @@ * */ -#include "main/imports.h" +#include "util/imports.h" #include "main/bufferobj.h" #include "main/varray.h" +#include "vbo/vbo.h" #include "brw_context.h" #include "brw_defines.h" @@ -51,19 +52,18 @@ can_cut_index_handle_restart_index(struct gl_context *ctx, bool cut_index_will_work; - switch (ib->type) { - case GL_UNSIGNED_BYTE: + switch (ib->index_size_shift) { + case 0: cut_index_will_work = ctx->Array.RestartIndex == 0xff; break; - case GL_UNSIGNED_SHORT: + case 1: cut_index_will_work = ctx->Array.RestartIndex == 0xffff; break; - case GL_UNSIGNED_INT: + case 2: cut_index_will_work = ctx->Array.RestartIndex == 0xffffffff; break; default: - cut_index_will_work = false; - assert(0); + unreachable("not reached"); } return cut_index_will_work; @@ -80,9 +80,10 @@ can_cut_index_handle_prims(struct gl_context *ctx, const struct _mesa_index_buffer *ib) { struct brw_context *brw = brw_context(ctx); + const struct gen_device_info *devinfo = &brw->screen->devinfo; /* Otherwise Haswell can do it all. */ - if (brw->gen >= 8 || brw->is_haswell) + if (devinfo->gen >= 8 || devinfo->is_haswell) return true; if (!can_cut_index_handle_restart_index(ctx, ib)) { @@ -92,7 +93,7 @@ can_cut_index_handle_prims(struct gl_context *ctx, return false; } - for (int i = 0; i < nr_prims; i++) { + for (unsigned i = 0; i < nr_prims; i++) { switch (prim[i].mode) { case GL_POINTS: case GL_LINES: @@ -130,7 +131,7 @@ brw_handle_primitive_restart(struct gl_context *ctx, const struct _mesa_prim *prims, GLuint nr_prims, const struct _mesa_index_buffer *ib, - struct gl_buffer_object *indirect) + GLuint num_instances, GLuint base_instance) { struct brw_context *brw = brw_context(ctx); @@ -139,14 +140,6 @@ brw_handle_primitive_restart(struct gl_context *ctx, 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. */ @@ -170,13 +163,21 @@ brw_handle_primitive_restart(struct gl_context *ctx, /* Cut index should work for primitive restart, so use it */ brw->prim_restart.enable_cut_index = true; - brw_draw_prims(ctx, prims, nr_prims, ib, GL_FALSE, -1, -1, NULL, indirect); + brw_draw_prims(ctx, prims, nr_prims, ib, GL_FALSE, -1, -1, + num_instances, base_instance, NULL, 0); brw->prim_restart.enable_cut_index = false; } else { /* Not all the primitive draw modes are supported by the cut index, * so take the software path */ - vbo_sw_primitive_restart(ctx, prims, nr_prims, ib, indirect); + struct gl_buffer_object *indirect_data = brw->draw.draw_indirect_data; + + /* Clear this to make the draw direct. */ + brw->draw.draw_indirect_data = NULL; + + vbo_sw_primitive_restart(ctx, prims, nr_prims, ib, num_instances, + base_instance, indirect_data, + brw->draw.draw_indirect_offset); } brw->prim_restart.in_progress = false; @@ -184,43 +185,3 @@ brw_handle_primitive_restart(struct gl_context *ctx, /* The primitive restart draw was completed, so return true. */ return GL_TRUE; } - -static void -haswell_upload_cut_index(struct brw_context *brw) -{ - struct gl_context *ctx = &brw->ctx; - - /* Don't trigger on Ivybridge */ - if (!brw->is_haswell) - return; - - const unsigned cut_index_setting = - ctx->Array._PrimitiveRestart ? HSW_CUT_INDEX_ENABLE : 0; - - /* BRW_NEW_INDEX_BUFFER */ - unsigned cut_index; - if (brw->ib.ib) { - cut_index = _mesa_primitive_restart_index(ctx, brw->ib.type); - } else { - /* There's no index buffer, but primitive restart may still apply - * to glDrawArrays and such. FIXED_INDEX mode only applies to drawing - * operations that use an index buffer, so we can ignore it and use - * the GL restart index directly. - */ - cut_index = ctx->Array.RestartIndex; - } - - BEGIN_BATCH(2); - OUT_BATCH(_3DSTATE_VF << 16 | cut_index_setting | (2 - 2)); - OUT_BATCH(cut_index); - ADVANCE_BATCH(); -} - -const struct brw_tracked_state haswell_cut_index = { - .dirty = { - .mesa = _NEW_TRANSFORM, - .brw = BRW_NEW_INDEX_BUFFER, - .cache = 0, - }, - .emit = haswell_upload_cut_index, -};