struct brw_transform_feedback_object *brw_obj =
(struct brw_transform_feedback_object *) obj;
- assert(brw->gen == 7);
-
- /* We're about to lose the information needed to compute the number of
- * vertices written during the last Begin/EndTransformFeedback section,
- * so we can't delay it any further.
- */
- brw_compute_xfb_vertices_written(brw, brw_obj);
-
- /* No primitives have been generated yet. */
- for (int i = 0; i < BRW_MAX_XFB_STREAMS; i++) {
- brw_obj->prims_generated[i] = 0;
- }
+ assert(brw->screen->devinfo.gen == 7);
/* Store the starting value of the SO_NUM_PRIMS_WRITTEN counters. */
brw_save_primitives_written_counters(brw, brw_obj);
brw->batch.needs_sol_reset = true;
} else {
for (int i = 0; i < 4; i++) {
- BEGIN_BATCH(3);
- OUT_BATCH(MI_LOAD_REGISTER_IMM | (3 - 2));
- OUT_BATCH(GEN7_SO_WRITE_OFFSET(i));
- OUT_BATCH(0);
- ADVANCE_BATCH();
+ brw_load_register_imm32(brw, GEN7_SO_WRITE_OFFSET(i), 0);
}
}
if (!obj->Paused)
brw_save_primitives_written_counters(brw, brw_obj);
+ /* We've reached the end of a transform feedback begin/end block. This
+ * means that future DrawTransformFeedback() calls will need to pick up the
+ * results of the current counter, and that it's time to roll back the
+ * current primitive counter to zero.
+ */
+ brw_obj->previous_counter = brw_obj->counter;
+ brw_reset_transform_feedback_counter(&brw_obj->counter);
+
/* EndTransformFeedback() means that we need to update the number of
* vertices written. Since it's only necessary if DrawTransformFeedback()
* is called and it means mapping a buffer object, we delay computing it
/* Flush any drawing so that the counters have the right values. */
brw_emit_mi_flush(brw);
- assert(brw->gen == 7);
+ assert(brw->screen->devinfo.gen == 7);
/* Save the SOL buffer offset register values. */
for (int i = 0; i < 4; i++) {
BEGIN_BATCH(3);
OUT_BATCH(MI_STORE_REGISTER_MEM | (3 - 2));
OUT_BATCH(GEN7_SO_WRITE_OFFSET(i));
- OUT_RELOC(brw_obj->offset_bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- i * sizeof(uint32_t));
+ OUT_RELOC(brw_obj->offset_bo, RELOC_WRITE, i * sizeof(uint32_t));
ADVANCE_BATCH();
}
struct brw_transform_feedback_object *brw_obj =
(struct brw_transform_feedback_object *) obj;
- assert(brw->gen == 7);
+ assert(brw->screen->devinfo.gen == 7);
/* Reload the SOL buffer offset registers. */
for (int i = 0; i < 4; i++) {
BEGIN_BATCH(3);
OUT_BATCH(GEN7_MI_LOAD_REGISTER_MEM | (3 - 2));
OUT_BATCH(GEN7_SO_WRITE_OFFSET(i));
- OUT_RELOC(brw_obj->offset_bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- i * sizeof(uint32_t));
+ OUT_RELOC(brw_obj->offset_bo, RELOC_WRITE, i * sizeof(uint32_t));
ADVANCE_BATCH();
}