mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
i965: Fix primitive restart on Haswell.
Haswell moved the "Cut Index Enable" bit from the INDEX_BUFFER packet to a new 3DSTATE_VF packet, so we need to emit that. Also, it requires us to specify the cut index rather than assuming it's 0xffffffff. This adds a new Haswell-specific tracked state atom to gen7_atoms. Normally, we would create a new generation-specific atom list, but since there's only one difference over Ivybridge so far, I chose to simply make it return without doing any work on non-Haswell systems. Fixes five piglit tests: - general/primitive-restart-DISABLE_VBO - general/primitive-restart-VBO_COMBINED_VERTEX_AND_INDEX - general/primitive-restart-VBO_INDEX_ONLY - general/primitive-restart-VBO_SEPARATE_VERTEX_AND_INDEX - general/primitive-restart-VBO_VERTEX_ONLY Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
parent
058fb00716
commit
815d9d405c
5 changed files with 43 additions and 1 deletions
|
|
@ -1037,6 +1037,9 @@ enum brw_message_target {
|
|||
# define GEN6_URB_GS_ENTRIES_SHIFT 8
|
||||
# define GEN6_URB_GS_SIZE_SHIFT 0
|
||||
|
||||
#define _3DSTATE_VF 0x780c /* GEN7.5+ */
|
||||
#define HSW_CUT_INDEX_ENABLE (1 << 8)
|
||||
|
||||
#define _3DSTATE_URB_VS 0x7830 /* GEN7+ */
|
||||
#define _3DSTATE_URB_HS 0x7831 /* GEN7+ */
|
||||
#define _3DSTATE_URB_DS 0x7832 /* GEN7+ */
|
||||
|
|
|
|||
|
|
@ -930,7 +930,7 @@ static void brw_emit_index_buffer(struct brw_context *brw)
|
|||
if (index_buffer == NULL)
|
||||
return;
|
||||
|
||||
if (brw->prim_restart.enable_cut_index) {
|
||||
if (brw->prim_restart.enable_cut_index && !intel->is_haswell) {
|
||||
cut_index_setting = BRW_CUT_INDEX_ENABLE;
|
||||
} else {
|
||||
cut_index_setting = 0;
|
||||
|
|
|
|||
|
|
@ -29,8 +29,11 @@
|
|||
#include "main/bufferobj.h"
|
||||
|
||||
#include "brw_context.h"
|
||||
#include "brw_defines.h"
|
||||
#include "brw_draw.h"
|
||||
|
||||
#include "intel_batchbuffer.h"
|
||||
|
||||
/**
|
||||
* Check if the hardware's cut index support can handle the primitive
|
||||
* restart index value.
|
||||
|
|
@ -39,6 +42,12 @@ static bool
|
|||
can_cut_index_handle_restart_index(struct gl_context *ctx,
|
||||
const struct _mesa_index_buffer *ib)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
|
||||
/* Haswell supports an arbitrary cut index. */
|
||||
if (intel->is_haswell)
|
||||
return true;
|
||||
|
||||
bool cut_index_will_work;
|
||||
|
||||
switch (ib->type) {
|
||||
|
|
@ -176,3 +185,30 @@ brw_handle_primitive_restart(struct gl_context *ctx,
|
|||
return GL_TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
haswell_upload_cut_index(struct brw_context *brw)
|
||||
{
|
||||
struct intel_context *intel = &brw->intel;
|
||||
struct gl_context *ctx = &intel->ctx;
|
||||
|
||||
/* Don't trigger on Ivybridge */
|
||||
if (!intel->is_haswell)
|
||||
return;
|
||||
|
||||
const unsigned cut_index_setting =
|
||||
ctx->Array.PrimitiveRestart ? HSW_CUT_INDEX_ENABLE : 0;
|
||||
|
||||
BEGIN_BATCH(2);
|
||||
OUT_BATCH(_3DSTATE_VF << 16 | cut_index_setting | (2 - 2));
|
||||
OUT_BATCH(ctx->Array.RestartIndex);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
const struct brw_tracked_state haswell_cut_index = {
|
||||
.dirty = {
|
||||
.mesa = _NEW_TRANSFORM,
|
||||
.brw = 0,
|
||||
.cache = 0,
|
||||
},
|
||||
.emit = haswell_upload_cut_index,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ extern const struct brw_tracked_state gen7_wm_constants;
|
|||
extern const struct brw_tracked_state gen7_wm_constant_surface;
|
||||
extern const struct brw_tracked_state gen7_wm_state;
|
||||
extern const struct brw_tracked_state gen7_wm_surfaces;
|
||||
extern const struct brw_tracked_state haswell_cut_index;
|
||||
|
||||
/* brw_misc_state.c */
|
||||
uint32_t
|
||||
|
|
|
|||
|
|
@ -246,6 +246,8 @@ const struct brw_tracked_state *gen7_atoms[] =
|
|||
&brw_indices,
|
||||
&brw_index_buffer,
|
||||
&brw_vertices,
|
||||
|
||||
&haswell_cut_index,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue