X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fgen7_viewport_state.c;h=34f93afdef647ec132556dbdbc5dd67851d6e01c;hb=ed65e6ef49e17e9cae93a8f98e2968346de2bc6e;hp=e9aacd56317f6db659976ab0ccf2e9f43bfe2ee2;hpb=4683529048ee133481b2d8f1cae1685aa1736f9a;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/gen7_viewport_state.c b/src/mesa/drivers/dri/i965/gen7_viewport_state.c index e9aacd56317..34f93afdef6 100644 --- a/src/mesa/drivers/dri/i965/gen7_viewport_state.c +++ b/src/mesa/drivers/dri/i965/gen7_viewport_state.c @@ -25,49 +25,66 @@ #include "brw_state.h" #include "brw_defines.h" #include "intel_batchbuffer.h" +#include "main/fbobject.h" +#include "main/framebuffer.h" +#include "main/viewport.h" static void -prepare_sf_clip_viewport(struct brw_context *brw) +gen7_upload_sf_clip_viewport(struct brw_context *brw) { - struct gl_context *ctx = &brw->intel.ctx; - const GLfloat depth_scale = 1.0F / ctx->DrawBuffer->_DepthMaxF; + struct gl_context *ctx = &brw->ctx; GLfloat y_scale, y_bias; - const GLboolean render_to_fbo = (ctx->DrawBuffer->Name != 0); - const GLfloat *v = ctx->Viewport._WindowMap.m; + const bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer); struct gen7_sf_clip_viewport *vp; vp = brw_state_batch(brw, AUB_TRACE_SF_VP_STATE, - sizeof(vp), 64, &brw->sf.vp_offset); + sizeof(*vp) * ctx->Const.MaxViewports, 64, + &brw->sf.vp_offset); /* Also assign to clip.vp_offset in case something uses it. */ brw->clip.vp_offset = brw->sf.vp_offset; - /* Disable guardband clipping (see gen6_viewport_state.c for rationale). */ - vp->guardband.xmin = -1.0; - vp->guardband.xmax = 1.0; - vp->guardband.ymin = -1.0; - vp->guardband.ymax = 1.0; - /* _NEW_BUFFERS */ if (render_to_fbo) { y_scale = 1.0; - y_bias = 0; + y_bias = 0.0; } else { y_scale = -1.0; - y_bias = ctx->DrawBuffer->Height; + y_bias = (float)_mesa_geometric_height(ctx->DrawBuffer); } - /* _NEW_VIEWPORT */ - vp->viewport.m00 = v[MAT_SX]; - vp->viewport.m11 = v[MAT_SY] * y_scale; - vp->viewport.m22 = v[MAT_SZ] * depth_scale; - vp->viewport.m30 = v[MAT_TX]; - vp->viewport.m31 = v[MAT_TY] * y_scale + y_bias; - vp->viewport.m32 = v[MAT_TZ] * depth_scale; -} + for (unsigned i = 0; i < ctx->Const.MaxViewports; i++) { + float scale[3], translate[3]; + _mesa_get_viewport_xform(ctx, i, scale, translate); -static void upload_sf_clip_viewport_state_pointer(struct brw_context *brw) -{ - struct intel_context *intel = &brw->intel; + /* 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_guardband_extent = 8192; + const float gbx = maximum_guardband_extent / ctx->ViewportArray[i].Width; + const float gby = maximum_guardband_extent / ctx->ViewportArray[i].Height; + + vp[i].guardband.xmin = -gbx; + vp[i].guardband.xmax = gbx; + vp[i].guardband.ymin = -gby; + vp[i].guardband.ymax = gby; + + /* _NEW_VIEWPORT */ + vp[i].viewport.m00 = scale[0]; + vp[i].viewport.m11 = scale[1] * y_scale; + vp[i].viewport.m22 = scale[2]; + vp[i].viewport.m30 = translate[0]; + vp[i].viewport.m31 = translate[1] * y_scale + y_bias; + vp[i].viewport.m32 = translate[2]; + } BEGIN_BATCH(2); OUT_BATCH(_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CL << 16 | (2 - 2)); @@ -77,31 +94,10 @@ static void upload_sf_clip_viewport_state_pointer(struct brw_context *brw) const struct brw_tracked_state gen7_sf_clip_viewport = { .dirty = { - .mesa = _NEW_VIEWPORT | _NEW_BUFFERS, - .brw = BRW_NEW_BATCH, - .cache = 0, - }, - .prepare = prepare_sf_clip_viewport, - .emit = upload_sf_clip_viewport_state_pointer, -}; - -/* ----------------------------------------------------- */ - -static void upload_cc_viewport_state_pointer(struct brw_context *brw) -{ - struct intel_context *intel = &brw->intel; - - BEGIN_BATCH(2); - OUT_BATCH(_3DSTATE_VIEWPORT_STATE_POINTERS_CC << 16 | (2 - 2)); - OUT_BATCH(brw->cc.vp_offset); - ADVANCE_BATCH(); -} - -const struct brw_tracked_state gen7_cc_viewport_state_pointer = { - .dirty = { - .mesa = 0, - .brw = BRW_NEW_BATCH, - .cache = CACHE_NEW_CC_VP + .mesa = _NEW_BUFFERS | + _NEW_VIEWPORT, + .brw = BRW_NEW_BATCH | + BRW_NEW_BLORP, }, - .emit = upload_cc_viewport_state_pointer, + .emit = gen7_upload_sf_clip_viewport, };