From 89ad7f1be6a607b33ffb388516b5d0547b491c33 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Sat, 21 Jan 2017 14:10:15 -0800 Subject: [PATCH] i965: Combine the Gen6 SF and Clip viewport atoms. The next patch will make the guardband calculation dependent on the transformation matrix. Instead of computing it in both atoms, just combine them into a single atom. Cc: "17.0" Signed-off-by: Kenneth Graunke Reviewed-by: Topi Pohjolainen --- src/mesa/drivers/dri/i965/brw_state.h | 2 +- src/mesa/drivers/dri/i965/brw_state_upload.c | 3 +- .../drivers/dri/i965/gen6_viewport_state.c | 82 +++++++------------ 3 files changed, 30 insertions(+), 57 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index f2349d8c037..ec6006c3fc6 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -110,7 +110,7 @@ extern const struct brw_tracked_state gen7_cs_push_constants; extern const struct brw_tracked_state gen6_binding_table_pointers; extern const struct brw_tracked_state gen6_blend_state; extern const struct brw_tracked_state gen6_clip_state; -extern const struct brw_tracked_state gen6_clip_vp; +extern const struct brw_tracked_state gen6_sf_and_clip_viewports; extern const struct brw_tracked_state gen6_color_calc_state; extern const struct brw_tracked_state gen6_depth_stencil_state; extern const struct brw_tracked_state gen6_gs_state; diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index d0be6acaf0f..52b74a7c527 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -103,8 +103,7 @@ static const struct brw_tracked_state *gen4_atoms[] = static const struct brw_tracked_state *gen6_atoms[] = { - &gen6_clip_vp, - &gen6_sf_vp, + &gen6_sf_and_clip_viewports, /* Command packets: */ diff --git a/src/mesa/drivers/dri/i965/gen6_viewport_state.c b/src/mesa/drivers/dri/i965/gen6_viewport_state.c index ad1e72d0a50..2e08f1a1290 100644 --- a/src/mesa/drivers/dri/i965/gen6_viewport_state.c +++ b/src/mesa/drivers/dri/i965/gen6_viewport_state.c @@ -33,61 +33,12 @@ #include "main/framebuffer.h" #include "main/viewport.h" -/* The clip VP defines the guardband region where expensive clipping is skipped - * and fragments are allowed to be generated and clipped out cheaply by the SF. - */ -static void -gen6_upload_clip_vp(struct brw_context *brw) -{ - struct gl_context *ctx = &brw->ctx; - struct brw_clipper_viewport *vp; - - /* BRW_NEW_VIEWPORT_COUNT */ - const unsigned viewport_count = brw->clip.viewport_count; - - vp = brw_state_batch(brw, AUB_TRACE_CLIP_VP_STATE, - sizeof(*vp) * viewport_count, 32, &brw->clip.vp_offset); - - for (unsigned i = 0; i < viewport_count; i++) { - /* According to the "Vertex X,Y Clamping and Quantization" section of the - * Strips and Fans documentation, objects must not have a screen-space - * extents of over 8192 pixels, or they may be mis-rasterized. The maximum - * screen space coordinates of a small object may larger, but we have no - * way to enforce the object size other than through clipping. - * - * If you're surprised that we set clip to -gbx to +gbx and it seems like - * we'll end up with 16384 wide, note that for a 8192-wide render target, - * we'll end up with a normal (-1, 1) clip volume that just covers the - * drawable. - */ - const float maximum_post_clamp_delta = 8192; - float gbx = maximum_post_clamp_delta / ctx->ViewportArray[i].Width; - float gby = maximum_post_clamp_delta / ctx->ViewportArray[i].Height; - - vp[i].xmin = -gbx; - vp[i].xmax = gbx; - vp[i].ymin = -gby; - vp[i].ymax = gby; - } - - brw->ctx.NewDriverState |= BRW_NEW_CLIP_VP; -} - -const struct brw_tracked_state gen6_clip_vp = { - .dirty = { - .mesa = _NEW_VIEWPORT, - .brw = BRW_NEW_BATCH | - BRW_NEW_BLORP | - BRW_NEW_VIEWPORT_COUNT, - }, - .emit = gen6_upload_clip_vp, -}; - static void -gen6_upload_sf_vp(struct brw_context *brw) +gen6_upload_sf_and_clip_viewports(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; struct gen6_sf_viewport *sfv; + struct brw_clipper_viewport *clv; GLfloat y_scale, y_bias; const bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer); @@ -99,6 +50,10 @@ gen6_upload_sf_vp(struct brw_context *brw) 32, &brw->sf.vp_offset); memset(sfv, 0, sizeof(*sfv) * viewport_count); + clv = brw_state_batch(brw, AUB_TRACE_CLIP_VP_STATE, + sizeof(*clv) * viewport_count, + 32, &brw->clip.vp_offset); + /* _NEW_BUFFERS */ if (render_to_fbo) { y_scale = 1.0; @@ -120,12 +75,31 @@ gen6_upload_sf_vp(struct brw_context *brw) sfv[i].m31 = translate[1] * y_scale + y_bias; sfv[i].m32 = translate[2]; + /* According to the "Vertex X,Y Clamping and Quantization" section of the + * Strips and Fans documentation, objects must not have a screen-space + * extents of over 8192 pixels, or they may be mis-rasterized. The maximum + * screen space coordinates of a small object may larger, but we have no + * way to enforce the object size other than through clipping. + * + * If you're surprised that we set clip to -gbx to +gbx and it seems like + * we'll end up with 16384 wide, note that for a 8192-wide render target, + * we'll end up with a normal (-1, 1) clip volume that just covers the + * drawable. + */ + const float maximum_post_clamp_delta = 8192; + float gbx = maximum_post_clamp_delta / ctx->ViewportArray[i].Width; + float gby = maximum_post_clamp_delta / ctx->ViewportArray[i].Height; + + clv[i].xmin = -gbx; + clv[i].xmax = gbx; + clv[i].ymin = -gby; + clv[i].ymax = gby; } - brw->ctx.NewDriverState |= BRW_NEW_SF_VP; + brw->ctx.NewDriverState |= BRW_NEW_SF_VP | BRW_NEW_CLIP_VP; } -const struct brw_tracked_state gen6_sf_vp = { +const struct brw_tracked_state gen6_sf_and_clip_viewports = { .dirty = { .mesa = _NEW_BUFFERS | _NEW_VIEWPORT, @@ -133,7 +107,7 @@ const struct brw_tracked_state gen6_sf_vp = { BRW_NEW_BLORP | BRW_NEW_VIEWPORT_COUNT, }, - .emit = gen6_upload_sf_vp, + .emit = gen6_upload_sf_and_clip_viewports, }; static void upload_viewport_state_pointers(struct brw_context *brw) -- 2.30.2