/** * BeginTransformFeedback() driver hook. */ void hsw_begin_transform_feedback(struct gl_context *ctx, GLenum mode, struct gl_transform_feedback_object *obj) { struct brw_context *brw = brw_context(ctx); struct brw_transform_feedback_object *brw_obj = (struct brw_transform_feedback_object *) obj; brw_obj->primitive_mode = mode; /* Reset the SO buffer offsets to 0. */ if (brw->gen >= 8) { brw_obj->zero_offsets = true; } else { BEGIN_BATCH(1 + 2 * BRW_MAX_XFB_STREAMS); OUT_BATCH(MI_LOAD_REGISTER_IMM | (1 + 2 * BRW_MAX_XFB_STREAMS - 2)); for (int i = 0; i < BRW_MAX_XFB_STREAMS; i++) { OUT_BATCH(GEN7_SO_WRITE_OFFSET(i)); OUT_BATCH(0); } ADVANCE_BATCH(); } /* Zero out the initial tallies */ brw_store_data_imm64(brw, brw_obj->prim_count_bo, TALLY_OFFSET, 0ull); brw_store_data_imm64(brw, brw_obj->prim_count_bo, TALLY_OFFSET + 8, 0ull); /* Store the new starting value of the SO_NUM_PRIMS_WRITTEN counters. */ save_prim_start_values(brw, brw_obj); }
/** * ResumeTransformFeedback() driver hook. */ void hsw_resume_transform_feedback(struct gl_context *ctx, struct gl_transform_feedback_object *obj) { struct brw_context *brw = brw_context(ctx); struct brw_transform_feedback_object *brw_obj = (struct brw_transform_feedback_object *) obj; if (brw->is_haswell) { /* Reload the SOL buffer offset registers. */ for (int i = 0; i < BRW_MAX_XFB_STREAMS; 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)); ADVANCE_BATCH(); } } /* Store the new starting value of the SO_NUM_PRIMS_WRITTEN counters. */ save_prim_start_values(brw, brw_obj); }
/** * PauseTransformFeedback() driver hook. */ void hsw_pause_transform_feedback(struct gl_context *ctx, struct gl_transform_feedback_object *obj) { struct brw_context *brw = brw_context(ctx); struct brw_transform_feedback_object *brw_obj = (struct brw_transform_feedback_object *) obj; if (brw->is_haswell) { /* Save the SOL buffer offset register values. */ for (int i = 0; i < BRW_MAX_XFB_STREAMS; 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)); ADVANCE_BATCH(); } } /* Add any primitives written to our tally */ tally_prims_written(brw, brw_obj, false); }
OACONTROL, /* Only allowed for LRI and SRM. See below. */ GEN7_3DPRIM_END_OFFSET, GEN7_3DPRIM_START_VERTEX, GEN7_3DPRIM_VERTEX_COUNT, GEN7_3DPRIM_INSTANCE_COUNT, GEN7_3DPRIM_START_INSTANCE, GEN7_3DPRIM_BASE_VERTEX, REG64(GEN7_SO_NUM_PRIMS_WRITTEN(0)), REG64(GEN7_SO_NUM_PRIMS_WRITTEN(1)), REG64(GEN7_SO_NUM_PRIMS_WRITTEN(2)), REG64(GEN7_SO_NUM_PRIMS_WRITTEN(3)), REG64(GEN7_SO_PRIM_STORAGE_NEEDED(0)), REG64(GEN7_SO_PRIM_STORAGE_NEEDED(1)), REG64(GEN7_SO_PRIM_STORAGE_NEEDED(2)), REG64(GEN7_SO_PRIM_STORAGE_NEEDED(3)), GEN7_SO_WRITE_OFFSET(0), GEN7_SO_WRITE_OFFSET(1), GEN7_SO_WRITE_OFFSET(2), GEN7_SO_WRITE_OFFSET(3), GEN7_L3SQCREG1, GEN7_L3CNTLREG2, GEN7_L3CNTLREG3, }; static const u32 gen7_blt_regs[] = { BCS_SWCTRL, }; static const u32 ivb_master_regs[] = { FORCEWAKE_MT, DERRMR,