i965/gs: Add GS_OPCODE_SET_DWORD_2_IMMED.
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
@@ -843,6 +843,13 @@ enum opcode {
|
||||
* - src0.x is the vertex count. The upper 16 bits will be ignored.
|
||||
*/
|
||||
GS_OPCODE_SET_VERTEX_COUNT,
|
||||
|
||||
/**
|
||||
* Set DWORD 2 of dst to the immediate value in src. Used by geometry
|
||||
* shaders to initialize DWORD 2 of R0, which needs to be 0 in order for
|
||||
* scratch reads and writes to operate correctly.
|
||||
*/
|
||||
GS_OPCODE_SET_DWORD_2_IMMED,
|
||||
};
|
||||
|
||||
#define BRW_PREDICATE_NONE 0
|
||||
|
||||
@@ -505,6 +505,8 @@ brw_instruction_name(enum opcode op)
|
||||
return "set_write_offset";
|
||||
case GS_OPCODE_SET_VERTEX_COUNT:
|
||||
return "set_vertex_count";
|
||||
case GS_OPCODE_SET_DWORD_2_IMMED:
|
||||
return "set_dword_2_immed";
|
||||
|
||||
default:
|
||||
/* Yes, this leaks. It's in debug code, it should never occur, and if
|
||||
|
||||
@@ -635,6 +635,7 @@ private:
|
||||
struct brw_reg src1);
|
||||
void generate_gs_set_vertex_count(struct brw_reg dst,
|
||||
struct brw_reg src);
|
||||
void generate_gs_set_dword_2_immed(struct brw_reg dst, struct brw_reg src);
|
||||
void generate_oword_dual_block_offsets(struct brw_reg m1,
|
||||
struct brw_reg index);
|
||||
void generate_scratch_write(vec4_instruction *inst,
|
||||
|
||||
@@ -501,6 +501,20 @@ vec4_generator::generate_gs_set_vertex_count(struct brw_reg dst,
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
|
||||
void
|
||||
vec4_generator::generate_gs_set_dword_2_immed(struct brw_reg dst,
|
||||
struct brw_reg src)
|
||||
{
|
||||
assert(src.file == BRW_IMMEDIATE_VALUE);
|
||||
|
||||
brw_push_insn_state(p);
|
||||
brw_set_access_mode(p, BRW_ALIGN_1);
|
||||
brw_set_mask_control(p, BRW_MASK_DISABLE);
|
||||
brw_MOV(p, suboffset(vec1(dst), 2), src);
|
||||
brw_set_access_mode(p, BRW_ALIGN_16);
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
|
||||
void
|
||||
vec4_generator::generate_oword_dual_block_offsets(struct brw_reg m1,
|
||||
struct brw_reg index)
|
||||
@@ -985,6 +999,10 @@ vec4_generator::generate_vec4_instruction(vec4_instruction *instruction,
|
||||
generate_gs_set_vertex_count(dst, src[0]);
|
||||
break;
|
||||
|
||||
case GS_OPCODE_SET_DWORD_2_IMMED:
|
||||
generate_gs_set_dword_2_immed(dst, src[0]);
|
||||
break;
|
||||
|
||||
case SHADER_OPCODE_SHADER_TIME_ADD:
|
||||
brw_shader_time_add(p, src[0], SURF_INDEX_VS_SHADER_TIME);
|
||||
mark_surface_used(SURF_INDEX_VS_SHADER_TIME);
|
||||
|
||||
Reference in New Issue
Block a user