[Mesa-dev] [PATCH 2/6] i965: Combine brw_emit_prim and gen7_emit_prim.
Paul Berry
stereotype441 at gmail.com
Fri Aug 30 11:56:19 PDT 2013
On 28 August 2013 16:49, Kenneth Graunke <kenneth at whitecape.org> wrote:
> These functions have almost identical code; the only difference is that
> a few of the bits moved around. Adding a few trivial conditionals
> allows the same function to work on all generations, and the resulting
> code is still quite readable.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
>
Thanks for doing this! One minor comment below.
> ---
> src/mesa/drivers/dri/i965/brw_draw.c | 80
> ++++++++----------------------------
> 1 file changed, 17 insertions(+), 63 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c
> b/src/mesa/drivers/dri/i965/brw_draw.c
> index c7164ac..df9b750 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -171,11 +171,15 @@ static void brw_emit_prim(struct brw_context *brw,
> start_vertex_location = prim->start;
> base_vertex_location = prim->basevertex;
> if (prim->indexed) {
> - vertex_access_type = GEN4_3DPRIM_VERTEXBUFFER_ACCESS_RANDOM;
> + vertex_access_type = brw->gen >= 7 ?
> + GEN7_3DPRIM_VERTEXBUFFER_ACCESS_RANDOM :
> + GEN4_3DPRIM_VERTEXBUFFER_ACCESS_RANDOM;
> start_vertex_location += brw->ib.start_vertex_offset;
> base_vertex_location += brw->vb.start_vertex_bias;
> } else {
> - vertex_access_type = GEN4_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL;
> + vertex_access_type = brw->gen >= 7 ?
> + GEN7_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL :
> + GEN4_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL;
> start_vertex_location += brw->vb.start_vertex_bias;
> }
>
> @@ -198,65 +202,16 @@ static void brw_emit_prim(struct brw_context *brw,
> intel_batchbuffer_emit_mi_flush(brw);
> }
>
> - BEGIN_BATCH(6);
> - OUT_BATCH(CMD_3D_PRIM << 16 | (6 - 2) |
> - hw_prim << GEN4_3DPRIM_TOPOLOGY_TYPE_SHIFT |
> - vertex_access_type);
> - OUT_BATCH(verts_per_instance);
> - OUT_BATCH(start_vertex_location);
> - OUT_BATCH(prim->num_instances);
> - OUT_BATCH(prim->base_instance);
> - OUT_BATCH(base_vertex_location);
> - ADVANCE_BATCH();
> -
> - brw->batch.need_workaround_flush = true;
> -
> - if (brw->always_flush_cache) {
> - intel_batchbuffer_emit_mi_flush(brw);
> - }
> -}
> -
> -static void gen7_emit_prim(struct brw_context *brw,
> - const struct _mesa_prim *prim,
> - uint32_t hw_prim)
> -{
> - int verts_per_instance;
> - int vertex_access_type;
> - int start_vertex_location;
> - int base_vertex_location;
> -
> - DBG("PRIM: %s %d %d\n", _mesa_lookup_enum_by_nr(prim->mode),
> - prim->start, prim->count);
> -
> - start_vertex_location = prim->start;
> - base_vertex_location = prim->basevertex;
> - if (prim->indexed) {
> - vertex_access_type = GEN7_3DPRIM_VERTEXBUFFER_ACCESS_RANDOM;
> - start_vertex_location += brw->ib.start_vertex_offset;
> - base_vertex_location += brw->vb.start_vertex_bias;
> + if (brw->gen >= 7) {
> + BEGIN_BATCH(7);
> + OUT_BATCH(CMD_3D_PRIM << 16 | (7 - 2));
> + OUT_BATCH(hw_prim | vertex_access_type);
> } else {
> - vertex_access_type = GEN7_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL;
> - start_vertex_location += brw->vb.start_vertex_bias;
> + BEGIN_BATCH(6);
> + OUT_BATCH(CMD_3D_PRIM << 16 | (6 - 2) |
> + hw_prim << GEN4_3DPRIM_TOPOLOGY_TYPE_SHIFT |
> + vertex_access_type);
> }
> -
> - verts_per_instance = prim->count;
> -
> - /* If nothing to emit, just return. */
> - if (verts_per_instance == 0)
> - return;
> -
> - /* If we're set to always flush, do it before and after the primitive
> emit.
> - * We want to catch both missed flushes that hurt instruction/state
> cache
> - * and missed flushes of the render cache as it heads to other parts of
> - * the besides the draw code.
> - */
> - if (brw->always_flush_cache) {
> - intel_batchbuffer_emit_mi_flush(brw);
> - }
> -
> - BEGIN_BATCH(7);
> - OUT_BATCH(CMD_3D_PRIM << 16 | (7 - 2));
> - OUT_BATCH(hw_prim | vertex_access_type);
> OUT_BATCH(verts_per_instance);
> OUT_BATCH(start_vertex_location);
> OUT_BATCH(prim->num_instances);
> @@ -264,6 +219,8 @@ static void gen7_emit_prim(struct brw_context *brw,
> OUT_BATCH(base_vertex_location);
> ADVANCE_BATCH();
>
> + brw->batch.need_workaround_flush = true;
> +
>
It took a while for to me to figure out why this wasn't inside a
conditional (prior to this patch it only existed in brw_emit_prim).
It might be nice to add a comment either here or in the commit message
explaining that it is safe to set brw->batch.need_workaround_flush
unconditionally, since the boolean is only used on Gen6.
In any case, this patch is:
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
> if (brw->always_flush_cache) {
> intel_batchbuffer_emit_mi_flush(brw);
> }
> @@ -453,10 +410,7 @@ retry:
> brw_upload_state(brw);
> }
>
> - if (brw->gen >= 7)
> - gen7_emit_prim(brw, &prim[i], brw->primitive);
> - else
> - brw_emit_prim(brw, &prim[i], brw->primitive);
> + brw_emit_prim(brw, &prim[i], brw->primitive);
>
> brw->no_batch_wrap = false;
>
> --
> 1.8.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130830/9416abe7/attachment-0001.html>
More information about the mesa-dev
mailing list