# 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+ */
#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.
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) {
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,
+};
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