assert(brw->screen->devinfo.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;
- }
-
/* 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