freedreno: Clamp TF prims written to buffer size pre-a6xx.

I thought based on some previous debug this was going to fix a pile of
dEQPs, but no luck.  Still, one less TODO in the driver.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9687>
This commit is contained in:
Eric Anholt 2021-03-17 16:13:41 -07:00 committed by Marge Bot
parent 538e5059d0
commit 9be24c89c8
4 changed files with 25 additions and 14 deletions

View File

@ -255,16 +255,13 @@ spec@ext_texture_snorm@fbo-blending-formats,Fail
spec@ext_transform_feedback2@draw-auto,Fail
spec@ext_transform_feedback@change-size base-shrink,Fail
spec@ext_transform_feedback@change-size offset-shrink,Fail
spec@ext_transform_feedback@change-size range-grow,Fail
spec@ext_transform_feedback@change-size range-shrink,Fail
spec@ext_transform_feedback@discard-copypixels,Fail
spec@ext_transform_feedback@generatemipmap prims_generated,Fail
spec@ext_transform_feedback@immediate-reuse,Fail
spec@ext_transform_feedback@immediate-reuse-index-buffer,Fail
spec@ext_transform_feedback@immediate-reuse-uniform-buffer,Fail
spec@ext_transform_feedback@intervening-read prims_written,Fail
spec@ext_transform_feedback@overflow-edge-cases,Fail
spec@ext_transform_feedback@query-primitives_written-bufferrange,Fail
spec@ext_transform_feedback@query-primitives_written-bufferrange-discard,Fail
spec@ext_transform_feedback@tessellation line_loop flat_first,Fail
spec@ext_transform_feedback@tessellation line_loop flat_last,Fail

View File

@ -117,6 +117,11 @@ struct fd_streamout_stateobj {
* queries are used.
*/
unsigned max_tf_vtx;
/* Pre-a6xx, the number of verts written to the buffers since the last
* Begin. Used for overflow checking for SW queries.
*/
unsigned verts_written;
};
#define MAX_GLOBAL_BUFFERS 16

View File

@ -245,17 +245,21 @@ update_draw_stats(struct fd_context *ctx, const struct pipe_draw_info *info,
}
}
/* TODO prims_emitted should be clipped when the stream-out buffer is
* not large enough. See max_tf_vtx().. probably need to move that
* into common code. Although a bit more annoying since a2xx doesn't
* use ir3 so no common way to get at the pipe_stream_output_info
* which is needed for this calculation.
*/
if (ctx->streamout.num_targets > 0) {
assert(ctx->active_queries);
ctx->stats.prims_emitted += prims;
}
ctx->stats.prims_generated += prims;
if (ctx->streamout.num_targets > 0) {
/* Clip the prims we're writing to the size of the SO buffers. */
enum pipe_prim_type tf_prim = u_decomposed_prim(info->mode);
unsigned verts_written = u_vertices_for_prims(tf_prim, prims);
unsigned remaining_vert_space = ctx->streamout.max_tf_vtx - ctx->streamout.verts_written;
if (verts_written > remaining_vert_space) {
verts_written = remaining_vert_space;
u_trim_pipe_prim(tf_prim, &remaining_vert_space);
}
ctx->streamout.verts_written += verts_written;
ctx->stats.prims_emitted += u_reduced_prims_for_vertices(tf_prim, verts_written);
}
}
}

View File

@ -600,8 +600,13 @@ fd_set_stream_output_targets(struct pipe_context *pctx,
if (!changed && !reset)
continue;
if (reset)
/* Note that all SO targets will be reset at once at a
* BeginTransformFeedback().
*/
if (reset) {
so->offsets[i] = offsets[i];
ctx->streamout.verts_written = 0;
}
pipe_so_target_reference(&so->targets[i], targets[i]);
}