[Mesa-dev] [PATCH 3/7] i965: Use ctx->Const.MaxVertexStreams rather than BRW_XFB_MAX_STREAMS.
Kenneth Graunke
kenneth at whitecape.org
Fri Feb 17 09:56:17 UTC 2017
This way on Sandybridge we'll only do 1 stream worth of math, since
we only have one SO_NUM_PRIMS_WRITTEN counter.
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/mesa/drivers/dri/i965/gen6_sol.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/gen6_sol.c b/src/mesa/drivers/dri/i965/gen6_sol.c
index ca06194ba15..41158bd580c 100644
--- a/src/mesa/drivers/dri/i965/gen6_sol.c
+++ b/src/mesa/drivers/dri/i965/gen6_sol.c
@@ -230,11 +230,16 @@ brw_delete_transform_feedback(struct gl_context *ctx,
* For each stream, we subtract the pair of values (end - start) to get the
* number of primitives generated during one section. We accumulate these
* values, adding them up to get the total number of primitives generated.
+ *
+ * Note that we expose one stream pre-Gen7, so the above is just (start, end).
*/
static void
tally_prims_generated(struct brw_context *brw,
struct brw_transform_feedback_object *obj)
{
+ const struct gl_context *ctx = &brw->ctx;
+ const int streams = ctx->Const.MaxVertexStreams;
+
/* If the current batch is still contributing to the number of primitives
* generated, flush it now so the results will be present when mapped.
*/
@@ -247,15 +252,14 @@ tally_prims_generated(struct brw_context *brw,
drm_intel_bo_map(obj->prim_count_bo, false);
uint64_t *prim_counts = obj->prim_count_bo->virtual;
- assert(obj->prim_count_buffer_index % (2 * BRW_MAX_XFB_STREAMS) == 0);
- int pairs = obj->prim_count_buffer_index / (2 * BRW_MAX_XFB_STREAMS);
+ assert(obj->prim_count_buffer_index % (2 * streams) == 0);
+ int pairs = obj->prim_count_buffer_index / (2 * streams);
for (int i = 0; i < pairs; i++) {
- for (int s = 0; s < BRW_MAX_XFB_STREAMS; s++) {
- obj->prims_generated[s] +=
- prim_counts[BRW_MAX_XFB_STREAMS + s] - prim_counts[s];
+ for (int s = 0; s < streams; s++) {
+ obj->prims_generated[s] += prim_counts[streams + s] - prim_counts[s];
}
- prim_counts += 2 * BRW_MAX_XFB_STREAMS; /* move to the next pair */
+ prim_counts += 2 * streams; /* move to the next pair */
}
drm_intel_bo_unmap(obj->prim_count_bo);
@@ -279,7 +283,8 @@ void
brw_save_primitives_written_counters(struct brw_context *brw,
struct brw_transform_feedback_object *obj)
{
- const int streams = BRW_MAX_XFB_STREAMS;
+ const struct gl_context *ctx = &brw->ctx;
+ const int streams = ctx->Const.MaxVertexStreams;
/* Check if there's enough space for a new pair of four values. */
if (obj->prim_count_bo != NULL &&
@@ -310,6 +315,8 @@ void
brw_compute_xfb_vertices_written(struct brw_context *brw,
struct brw_transform_feedback_object *obj)
{
+ const struct gl_context *ctx = &brw->ctx;
+
if (obj->vertices_written_valid || !obj->base.EndedAnytime)
return;
@@ -332,7 +339,7 @@ brw_compute_xfb_vertices_written(struct brw_context *brw,
/* Get the number of primitives generated. */
tally_prims_generated(brw, obj);
- for (int i = 0; i < BRW_MAX_XFB_STREAMS; i++) {
+ for (int i = 0; i < ctx->Const.MaxVertexStreams; i++) {
obj->vertices_written[i] = vertices_per_prim * obj->prims_generated[i];
}
obj->vertices_written_valid = true;
@@ -354,7 +361,7 @@ brw_get_transform_feedback_vertex_count(struct gl_context *ctx,
(struct brw_transform_feedback_object *) obj;
assert(obj->EndedAnytime);
- assert(stream < BRW_MAX_XFB_STREAMS);
+ assert(stream < ctx->Const.MaxVertexStreams);
brw_compute_xfb_vertices_written(brw, brw_obj);
return brw_obj->vertices_written[stream];
--
2.11.1
More information about the mesa-dev
mailing list