Minor nit: i965 in the subject. :) On 12/05/2016 10:16 AM, Rafael Antognolli wrote: > Enable getting the results of a transform feedback overflow query with a > buffer object. > > Signed-off-by: Rafael Antognolli <rafael.antogno...@intel.com> > --- > src/mesa/drivers/dri/i965/hsw_queryobj.c | 108 > +++++++++++++++++++++++++++++++ > 1 file changed, 108 insertions(+) > > diff --git a/src/mesa/drivers/dri/i965/hsw_queryobj.c > b/src/mesa/drivers/dri/i965/hsw_queryobj.c > index 0da2c3d..0c9dbdc 100644 > --- a/src/mesa/drivers/dri/i965/hsw_queryobj.c > +++ b/src/mesa/drivers/dri/i965/hsw_queryobj.c > @@ -187,6 +187,103 @@ gpr0_to_bool(struct brw_context *brw) > } > > static void > +load_gen_written_data_to_regs(struct brw_context *brw, > + struct brw_query_object *query, > + int idx) > +{ > + int offset = idx * sizeof(uint64_t) * 4; > + > + brw_load_register_mem64(brw, > + HSW_CS_GPR(1), > + query->bo, > + I915_GEM_DOMAIN_INSTRUCTION, > + I915_GEM_DOMAIN_INSTRUCTION, > + offset); > + > + offset += sizeof(uint64_t); > + brw_load_register_mem64(brw, > + HSW_CS_GPR(2), > + query->bo, > + I915_GEM_DOMAIN_INSTRUCTION, > + I915_GEM_DOMAIN_INSTRUCTION, > + offset); > + > + offset += sizeof(uint64_t); > + brw_load_register_mem64(brw, > + HSW_CS_GPR(3), > + query->bo, > + I915_GEM_DOMAIN_INSTRUCTION, > + I915_GEM_DOMAIN_INSTRUCTION, > + offset); > + > + offset += sizeof(uint64_t); > + brw_load_register_mem64(brw, > + HSW_CS_GPR(4), > + query->bo, > + I915_GEM_DOMAIN_INSTRUCTION, > + I915_GEM_DOMAIN_INSTRUCTION, > + offset); > +} > + > +/* > + * R3 = R4 - R3; > + * R1 = R2 - R1; > + * R1 = R3 - R1; > + * R0 = R0 | R1; > + */ > +static void > +calc_overflow_for_stream(struct brw_context *brw) > +{ > + static const uint32_t maths[] = { > + MI_MATH_ALU2(LOAD, SRCA, R4), > + MI_MATH_ALU2(LOAD, SRCB, R3), > + MI_MATH_ALU0(SUB), > + MI_MATH_ALU2(STORE, R3, ACCU), > + MI_MATH_ALU2(LOAD, SRCA, R2), > + MI_MATH_ALU2(LOAD, SRCB, R1), > + MI_MATH_ALU0(SUB), > + MI_MATH_ALU2(STORE, R1, ACCU), > + MI_MATH_ALU2(LOAD, SRCA, R3), > + MI_MATH_ALU2(LOAD, SRCB, R1), > + MI_MATH_ALU0(SUB), > + MI_MATH_ALU2(STORE, R1, ACCU), > + MI_MATH_ALU2(LOAD, SRCA, R1), > + MI_MATH_ALU2(LOAD, SRCB, R0), > + MI_MATH_ALU0(OR), > + MI_MATH_ALU2(STORE, R0, ACCU), > + }; > + > + BEGIN_BATCH(1 + ARRAY_SIZE(maths)); > + OUT_BATCH(HSW_MI_MATH | (1 + ARRAY_SIZE(maths) - 2)); > + > + for (int m = 0; m < ARRAY_SIZE(maths); m++) > + OUT_BATCH(maths[m]); > + > + ADVANCE_BATCH(); > +} > + > +static void > +calc_overflow_to_gpr0(struct brw_context *brw, struct brw_query_object > *query, > + int count) > +{ > + brw_load_register_imm64(brw, HSW_CS_GPR(0), 0ull); > + > + for (int i = 0; i < count; i++) { > + load_gen_written_data_to_regs(brw, query, i); > + calc_overflow_for_stream(brw); > + } > +} > + > +static void > +overflow_result_to_grp0(struct brw_context *brw, > + struct brw_query_object *query, > + int count) > +{ > + calc_overflow_to_gpr0(brw, query, count); > + gpr0_to_bool(brw); > +} > + > +static void > hsw_result_to_gpr0(struct gl_context *ctx, struct brw_query_object *query, > struct gl_buffer_object *buf, intptr_t offset, > GLenum pname, GLenum ptype) > @@ -223,6 +320,11 @@ hsw_result_to_gpr0(struct gl_context *ctx, struct > brw_query_object *query, > I915_GEM_DOMAIN_INSTRUCTION, > I915_GEM_DOMAIN_INSTRUCTION, > 0 * sizeof(uint64_t)); > + } else if (query->Base.Target == GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB > + || query->Base.Target == GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB) { > + /* Don't do anything in advance here, since the math for this is a > little > + * more complex. > + */ > } else { > brw_load_register_mem64(brw, > HSW_CS_GPR(1), > @@ -274,6 +376,12 @@ hsw_result_to_gpr0(struct gl_context *ctx, struct > brw_query_object *query, > case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: > gpr0_to_bool(brw); > break; > + case GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB: > + overflow_result_to_grp0(brw, query, 1); > + break; > + case GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB: > + overflow_result_to_grp0(brw, query, MAX_VERTEX_STREAMS); > + break; > } > } > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev