On Sun, Jan 22, 2017 at 10:42:16PM -0800, Kenneth Graunke wrote: > 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. > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org>
Reviewed-by: Topi Pohjolainen <topi.pohjolai...@intel.com> > --- > src/mesa/drivers/dri/i965/brw_state.h | 2 +- > src/mesa/drivers/dri/i965/brw_state_upload.c | 3 +- > src/mesa/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.11.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev