[Mesa-dev] [PATCH 27/37] i965/gen6/gs: Add an additional parameter to the FF_SYNC opcode.
Iago Toral Quiroga
itoral at igalia.com
Thu Aug 14 04:11:59 PDT 2014
From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
We will use this parameter in later patches to provide information relevant
to transform feedback that needs to be set as part of the FF_SYNC message.
Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
---
src/mesa/drivers/dri/i965/brw_defines.h | 4 ++++
src/mesa/drivers/dri/i965/brw_vec4.h | 3 ++-
src/mesa/drivers/dri/i965/brw_vec4_generator.cpp | 16 +++++++++++++---
src/mesa/drivers/dri/i965/gen6_gs_visitor.cpp | 3 ++-
4 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
index 6e8b998..b0d6d9f 100644
--- a/src/mesa/drivers/dri/i965/brw_defines.h
+++ b/src/mesa/drivers/dri/i965/brw_defines.h
@@ -1030,6 +1030,10 @@ enum opcode {
* FF_SYNC operation.
*
* - src1 is the number of primitives written.
+ *
+ * - src2 is the value to hold in M0.0: number of SO vertices to write
+ * and number of SO primitives needed. Its value will be overwritten
+ * with the SVBI values if transform feedback is enabled.
*/
GS_OPCODE_FF_SYNC,
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
index 763cb23..58a5aac 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h
@@ -679,7 +679,8 @@ private:
struct brw_reg src2);
void generate_gs_ff_sync(struct brw_reg dst,
struct brw_reg src0,
- struct brw_reg src1);
+ struct brw_reg src1,
+ struct brw_reg src2);
void generate_gs_set_primitive_id(struct brw_reg dst);
void generate_oword_dual_block_offsets(struct brw_reg m1,
struct brw_reg index);
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
index d4554f5..c69b305 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
@@ -734,7 +734,8 @@ vec4_generator::generate_gs_ff_sync_set_primitives(struct brw_reg dst,
void
vec4_generator::generate_gs_ff_sync(struct brw_reg dst,
struct brw_reg src0,
- struct brw_reg src1)
+ struct brw_reg src1,
+ struct brw_reg src2)
{
/* We use dst to setup the ff_sync header, so we expect it to be
* initialized to R0 by the caller. Here we overwrite dword 0 (cleared
@@ -744,7 +745,7 @@ vec4_generator::generate_gs_ff_sync(struct brw_reg dst,
brw_push_insn_state(p);
brw_set_default_mask_control(p, BRW_MASK_DISABLE);
brw_set_default_access_mode(p, BRW_ALIGN_1);
- brw_MOV(p, get_element_ud(dst, 0), brw_imm_ud(0));
+ brw_MOV(p, get_element_ud(dst, 0), get_element_ud(src2, 0));
brw_MOV(p, get_element_ud(dst, 1), get_element_ud(src1, 0));
brw_set_default_access_mode(p, BRW_ALIGN_16);
brw_pop_insn_state(p);
@@ -763,6 +764,15 @@ vec4_generator::generate_gs_ff_sync(struct brw_reg dst,
brw_set_default_access_mode(p, BRW_ALIGN_1);
brw_set_default_mask_control(p, BRW_MASK_DISABLE);
brw_MOV(p, get_element_ud(dst, 0), get_element_ud(src0, 0));
+
+ /* src2 is not an immediate when we use transform feedback */
+ if (src2.file != BRW_IMMEDIATE_VALUE) {
+ brw_MOV(p, suboffset(vec1(src2), 0), suboffset(vec1(src0), 1));
+ brw_MOV(p, suboffset(vec1(src2), 1), suboffset(vec1(src0), 2));
+ brw_MOV(p, suboffset(vec1(src2), 2), suboffset(vec1(src0), 3));
+ brw_MOV(p, suboffset(vec1(src2), 3), suboffset(vec1(src0), 4));
+ }
+
brw_set_default_access_mode(p, BRW_ALIGN_16);
brw_pop_insn_state(p);
}
@@ -1374,7 +1384,7 @@ vec4_generator::generate_vec4_instruction(vec4_instruction *instruction,
break;
case GS_OPCODE_FF_SYNC:
- generate_gs_ff_sync(dst, src[0], src[1]);
+ generate_gs_ff_sync(dst, src[0], src[1], src[2]);
break;
case GS_OPCODE_FF_SYNC_SET_PRIMITIVES:
diff --git a/src/mesa/drivers/dri/i965/gen6_gs_visitor.cpp b/src/mesa/drivers/dri/i965/gen6_gs_visitor.cpp
index b45c381..c1cfe75 100644
--- a/src/mesa/drivers/dri/i965/gen6_gs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/gen6_gs_visitor.cpp
@@ -331,7 +331,8 @@ gen6_gs_visitor::emit_thread_end()
{
this->current_annotation = "gen6 thread end: ff_sync";
emit(GS_OPCODE_FF_SYNC,
- dst_reg(MRF, base_mrf), this->temp, this->prim_count);
+ dst_reg(MRF, base_mrf), this->temp, this->prim_count,
+ brw_imm_ud(0u));
/* Loop over all buffered vertices and emit URB write messages */
this->current_annotation = "gen6 thread end: urb writes init";
--
1.9.1
More information about the mesa-dev
mailing list