summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2017-01-21 14:10:15 -0800
committerEmil Velikov <emil.l.velikov@gmail.com>2017-03-14 00:13:15 +0000
commit66964e9f7e67180609412b66aaa68499f7721ef3 (patch)
tree3cc61164494f2df39b6fdd051997666ea5a9821b /src
parent9851e392a0e4cf8888203775b943571ab56cefb6 (diff)
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" <mesa-stable@lists.freedesktop.org> Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com> (cherry picked from commit 89ad7f1be6a607b33ffb388516b5d0547b491c33)
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_state.h2
-rw-r--r--src/mesa/drivers/dri/i965/brw_state_upload.c3
-rw-r--r--src/mesa/drivers/dri/i965/gen6_viewport_state.c82
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 e409668aecd..614a49b4be3 100644
--- a/src/mesa/drivers/dri/i965/brw_state.h
+++ b/src/mesa/drivers/dri/i965/brw_state.h
@@ -111,7 +111,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 17d1b2df599..065ff23a7a7 100644
--- a/src/mesa/drivers/dri/i965/brw_state_upload.c
+++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
@@ -104,8 +104,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)