[Mesa-dev] [v4 PATCH 06/10] i965: Use _mesa_geometry_ functions appropriately
Ian Romanick
idr at freedesktop.org
Tue Jun 9 15:05:47 PDT 2015
With the comment typo noticed by Ilia fixed (which I did not notice),
this patch is
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
On 05/27/2015 02:49 AM, Kevin Rogovin wrote:
> Change references to gl_framebuffer::Width, Height, MaxNumLayers
> and Visual::samples to use the _mesa_geometry_ convenience functions
> for those places where the geometry of the gl_framebuffer is needed
> (in contrast to the geometry of the intersection of the attachments
> of the gl_framebuffer).
>
> This patch is to pave the way to enable GL_ARB_framebuffer_no_attachments
> on Gen7 and higher in i965.
>
> v2:
> Remove changes that would only be active in Gen4/5.
> Type and casting changes for consistency and readability.
>
> v3:
> Updates for rebase against master.
>
> v4:
> Use unsigned int inplace of int and remove casts to int.
> Formatting fixes.
>
> Signed-off-by: Kevin Rogovin <kevin.rogovin at intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_clip_state.c | 9 ++++++---
> src/mesa/drivers/dri/i965/brw_misc_state.c | 9 ++++++---
> src/mesa/drivers/dri/i965/brw_sf_state.c | 6 ++++++
> src/mesa/drivers/dri/i965/brw_state_upload.c | 6 ++++--
> src/mesa/drivers/dri/i965/brw_wm.c | 7 ++++---
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 12 +++++++-----
> src/mesa/drivers/dri/i965/gen6_clip_state.c | 10 +++++++---
> src/mesa/drivers/dri/i965/gen6_multisample_state.c | 3 ++-
> src/mesa/drivers/dri/i965/gen6_scissor_state.c | 12 +++++++++---
> src/mesa/drivers/dri/i965/gen6_sf_state.c | 3 ++-
> src/mesa/drivers/dri/i965/gen6_viewport_state.c | 5 +++--
> src/mesa/drivers/dri/i965/gen6_wm_state.c | 3 ++-
> src/mesa/drivers/dri/i965/gen7_sf_state.c | 3 ++-
> src/mesa/drivers/dri/i965/gen7_viewport_state.c | 5 +++--
> src/mesa/drivers/dri/i965/gen7_wm_state.c | 3 ++-
> src/mesa/drivers/dri/i965/gen8_viewport_state.c | 8 +++++---
> 16 files changed, 70 insertions(+), 34 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_clip_state.c b/src/mesa/drivers/dri/i965/brw_clip_state.c
> index 3223834..dee74db 100644
> --- a/src/mesa/drivers/dri/i965/brw_clip_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_clip_state.c
> @@ -32,6 +32,7 @@
> #include "brw_context.h"
> #include "brw_state.h"
> #include "brw_defines.h"
> +#include "main/framebuffer.h"
>
> static void
> upload_clip_vp(struct brw_context *brw)
> @@ -59,7 +60,9 @@ brw_upload_clip_unit(struct brw_context *brw)
> struct brw_clip_unit_state *clip;
>
> /* _NEW_BUFFERS */
> - struct gl_framebuffer *fb = ctx->DrawBuffer;
> + const struct gl_framebuffer *fb = ctx->DrawBuffer;
> + const float fb_width = (float)_mesa_geometric_width(fb);
> + const float fb_height = (float)_mesa_geometric_height(fb);
>
> upload_clip_vp(brw);
>
> @@ -127,8 +130,8 @@ brw_upload_clip_unit(struct brw_context *brw)
> /* enable guardband clipping if we can */
> if (ctx->ViewportArray[0].X == 0 &&
> ctx->ViewportArray[0].Y == 0 &&
> - ctx->ViewportArray[0].Width == (float) fb->Width &&
> - ctx->ViewportArray[0].Height == (float) fb->Height)
> + ctx->ViewportArray[0].Width == fb_width &&
> + ctx->ViewportArray[0].Height == fb_height)
> {
> clip->clip5.guard_band_enable = 1;
> clip->clip6.clipper_viewport_state_ptr =
> diff --git a/src/mesa/drivers/dri/i965/brw_misc_state.c b/src/mesa/drivers/dri/i965/brw_misc_state.c
> index 67a693b..5a4515b 100644
> --- a/src/mesa/drivers/dri/i965/brw_misc_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_misc_state.c
> @@ -39,6 +39,7 @@
> #include "brw_state.h"
> #include "brw_defines.h"
>
> +#include "main/framebuffer.h"
> #include "main/fbobject.h"
> #include "main/glformats.h"
>
> @@ -46,12 +47,14 @@
> static void upload_drawing_rect(struct brw_context *brw)
> {
> struct gl_context *ctx = &brw->ctx;
> + const struct gl_framebuffer *fb = ctx->DrawBuffer;
> + const unsigned int fb_width = _mesa_geometric_width(fb);
> + const unsigned int fb_height = _mesa_geometric_height(fb);
>
> BEGIN_BATCH(4);
> OUT_BATCH(_3DSTATE_DRAWING_RECTANGLE << 16 | (4 - 2));
> OUT_BATCH(0); /* xmin, ymin */
> - OUT_BATCH(((ctx->DrawBuffer->Width - 1) & 0xffff) |
> - ((ctx->DrawBuffer->Height - 1) << 16));
> + OUT_BATCH(((fb_width - 1) & 0xffff) | ((fb_height - 1) << 16));
> OUT_BATCH(0);
> ADVANCE_BATCH();
> }
> @@ -767,7 +770,7 @@ static void upload_polygon_stipple_offset(struct brw_context *brw)
> * works just fine, and there's no window system to worry about.
> */
> if (_mesa_is_winsys_fbo(ctx->DrawBuffer))
> - OUT_BATCH((32 - (ctx->DrawBuffer->Height & 31)) & 31);
> + OUT_BATCH((32 - (_mesa_geometric_height(ctx->DrawBuffer) & 31)) & 31);
> else
> OUT_BATCH(0);
> ADVANCE_BATCH();
> diff --git a/src/mesa/drivers/dri/i965/brw_sf_state.c b/src/mesa/drivers/dri/i965/brw_sf_state.c
> index 014b434..5d98922 100644
> --- a/src/mesa/drivers/dri/i965/brw_sf_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_sf_state.c
> @@ -52,6 +52,12 @@ static void upload_sf_vp(struct brw_context *brw)
> sizeof(*sfv), 32, &brw->sf.vp_offset);
> memset(sfv, 0, sizeof(*sfv));
>
> + /* Accessing the fields Width and Height of gl_framebuffer to produce the
> + * values to program the viewport and scissor is fine as long as the
> + * gl_framebuffer has atleast one attachment.
> + */
> + assert(ctx->DrawBuffer->_HasAttachments);
> +
> if (render_to_fbo) {
> y_scale = 1.0;
> y_bias = 0;
> diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c
> index 84b0861..08d1ac2 100644
> --- a/src/mesa/drivers/dri/i965/brw_state_upload.c
> +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
> @@ -41,6 +41,7 @@
> #include "brw_gs.h"
> #include "brw_wm.h"
> #include "brw_cs.h"
> +#include "main/framebuffer.h"
>
> static const struct brw_tracked_state *gen4_atoms[] =
> {
> @@ -660,6 +661,7 @@ brw_upload_pipeline_state(struct brw_context *brw,
> int i;
> static int dirty_count = 0;
> struct brw_state_flags state = brw->state.pipelines[pipeline];
> + unsigned int fb_samples = _mesa_geometric_samples(ctx->DrawBuffer);
>
> brw_select_pipeline(brw, pipeline);
>
> @@ -696,8 +698,8 @@ brw_upload_pipeline_state(struct brw_context *brw,
> brw->ctx.NewDriverState |= BRW_NEW_META_IN_PROGRESS;
> }
>
> - if (brw->num_samples != ctx->DrawBuffer->Visual.samples) {
> - brw->num_samples = ctx->DrawBuffer->Visual.samples;
> + if (brw->num_samples != fb_samples) {
> + brw->num_samples = fb_samples;
> brw->ctx.NewDriverState |= BRW_NEW_NUM_SAMPLES;
> }
>
> diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
> index 45a03bb..592a729 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm.c
> @@ -36,6 +36,7 @@
> #include "main/formats.h"
> #include "main/fbobject.h"
> #include "main/samplerobj.h"
> +#include "main/framebuffer.h"
> #include "program/prog_parameter.h"
> #include "program/program.h"
> #include "intel_mipmap_tree.h"
> @@ -462,7 +463,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
> GLuint lookup = 0;
> GLuint line_aa;
> bool program_uses_dfdy = fp->program.UsesDFdy;
> - bool multisample_fbo = ctx->DrawBuffer->Visual.samples > 1;
> + const bool multisample_fbo = _mesa_geometric_samples(ctx->DrawBuffer) > 1;
>
> memset(key, 0, sizeof(*key));
>
> @@ -561,7 +562,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
> * drawable height in order to invert the Y axis.
> */
> if (fp->program.Base.InputsRead & VARYING_BIT_POS) {
> - key->drawable_height = ctx->DrawBuffer->Height;
> + key->drawable_height = _mesa_geometric_height(ctx->DrawBuffer);
> }
>
> if ((fp->program.Base.InputsRead & VARYING_BIT_POS) || program_uses_dfdy) {
> @@ -580,7 +581,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
> key->persample_shading =
> _mesa_get_min_invocations_per_fragment(ctx, &fp->program, true) > 1;
> if (key->persample_shading)
> - key->persample_2x = ctx->DrawBuffer->Visual.samples == 2;
> + key->persample_2x = _mesa_geometric_samples(ctx->DrawBuffer) == 2;
>
> key->compute_pos_offset =
> _mesa_get_min_invocations_per_fragment(ctx, &fp->program, false) > 1 &&
> diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> index 160dd2f..72aad96 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -35,6 +35,7 @@
> #include "main/mtypes.h"
> #include "main/samplerobj.h"
> #include "program/prog_parameter.h"
> +#include "main/framebuffer.h"
>
> #include "intel_mipmap_tree.h"
> #include "intel_batchbuffer.h"
> @@ -738,6 +739,9 @@ brw_update_renderbuffer_surfaces(struct brw_context *brw,
> uint32_t *surf_offset)
> {
> GLuint i;
> + const unsigned int w = _mesa_geometric_width(fb);
> + const unsigned int h = _mesa_geometric_height(fb);
> + const unsigned int s = _mesa_geometric_samples(fb);
>
> /* Update surfaces for drawing buffers */
> if (fb->_NumColorDrawBuffers >= 1) {
> @@ -748,17 +752,15 @@ brw_update_renderbuffer_surfaces(struct brw_context *brw,
> surf_offset[surf_index] =
> brw->vtbl.update_renderbuffer_surface(
> brw, fb->_ColorDrawBuffers[i],
> - fb->MaxNumLayers > 0, i, surf_index);
> + _mesa_geometric_layers(fb) > 0, i, surf_index);
> } else {
> - brw->vtbl.emit_null_surface_state(
> - brw, fb->Width, fb->Height, fb->Visual.samples,
> + brw->vtbl.emit_null_surface_state(brw, w, h, s,
> &surf_offset[surf_index]);
> }
> }
> } else {
> const uint32_t surf_index = render_target_start;
> - brw->vtbl.emit_null_surface_state(
> - brw, fb->Width, fb->Height, fb->Visual.samples,
> + brw->vtbl.emit_null_surface_state(brw, w, h, s,
> &surf_offset[surf_index]);
> }
> }
> diff --git a/src/mesa/drivers/dri/i965/gen6_clip_state.c b/src/mesa/drivers/dri/i965/gen6_clip_state.c
> index aaf90df..9a29366 100644
> --- a/src/mesa/drivers/dri/i965/gen6_clip_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_clip_state.c
> @@ -31,6 +31,7 @@
> #include "brw_util.h"
> #include "intel_batchbuffer.h"
> #include "main/fbobject.h"
> +#include "main/framebuffer.h"
>
> static void
> upload_clip_state(struct brw_context *brw)
> @@ -145,11 +146,14 @@ upload_clip_state(struct brw_context *brw)
> * the viewport, so we can ignore this restriction.
> */
> if (brw->gen < 8) {
> + const float fb_width = (float)_mesa_geometric_width(fb);
> + const float fb_height = (float)_mesa_geometric_height(fb);
> +
> for (unsigned i = 0; i < ctx->Const.MaxViewports; i++) {
> if (ctx->ViewportArray[i].X != 0 ||
> ctx->ViewportArray[i].Y != 0 ||
> - ctx->ViewportArray[i].Width != (float) fb->Width ||
> - ctx->ViewportArray[i].Height != (float) fb->Height) {
> + ctx->ViewportArray[i].Width != fb_width ||
> + ctx->ViewportArray[i].Height != fb_height) {
> dw2 &= ~GEN6_CLIP_GB_TEST;
> break;
> }
> @@ -179,7 +183,7 @@ upload_clip_state(struct brw_context *brw)
> dw2);
> OUT_BATCH(U_FIXED(0.125, 3) << GEN6_CLIP_MIN_POINT_WIDTH_SHIFT |
> U_FIXED(255.875, 3) << GEN6_CLIP_MAX_POINT_WIDTH_SHIFT |
> - (fb->MaxNumLayers > 0 ? 0 : GEN6_CLIP_FORCE_ZERO_RTAINDEX) |
> + (_mesa_geometric_layers(fb) > 0 ? 0 : GEN6_CLIP_FORCE_ZERO_RTAINDEX) |
> ((ctx->Const.MaxViewports - 1) & GEN6_CLIP_MAX_VP_INDEX_MASK));
> ADVANCE_BATCH();
> }
> diff --git a/src/mesa/drivers/dri/i965/gen6_multisample_state.c b/src/mesa/drivers/dri/i965/gen6_multisample_state.c
> index ec46479..36734f5 100644
> --- a/src/mesa/drivers/dri/i965/gen6_multisample_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_multisample_state.c
> @@ -26,6 +26,7 @@
> #include "brw_context.h"
> #include "brw_defines.h"
> #include "brw_multisample_state.h"
> +#include "main/framebuffer.h"
>
> void
> gen6_get_sample_position(struct gl_context *ctx,
> @@ -34,7 +35,7 @@ gen6_get_sample_position(struct gl_context *ctx,
> {
> uint8_t bits;
>
> - switch (fb->Visual.samples) {
> + switch (_mesa_geometric_samples(fb)) {
> case 1:
> result[0] = result[1] = 0.5f;
> return;
> diff --git a/src/mesa/drivers/dri/i965/gen6_scissor_state.c b/src/mesa/drivers/dri/i965/gen6_scissor_state.c
> index 0111f15..17b4a7f 100644
> --- a/src/mesa/drivers/dri/i965/gen6_scissor_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_scissor_state.c
> @@ -39,6 +39,8 @@ gen6_upload_scissor_state(struct brw_context *brw)
> const bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
> struct gen6_scissor_rect *scissor;
> uint32_t scissor_state_offset;
> + const unsigned int fb_width= _mesa_geometric_width(ctx->DrawBuffer);
> + const unsigned int fb_height = _mesa_geometric_height(ctx->DrawBuffer);
>
> scissor = brw_state_batch(brw, AUB_TRACE_SCISSOR_STATE,
> sizeof(*scissor) * ctx->Const.MaxViewports, 32,
> @@ -56,7 +58,11 @@ gen6_upload_scissor_state(struct brw_context *brw)
> for (unsigned i = 0; i < ctx->Const.MaxViewports; i++) {
> int bbox[4];
>
> - _mesa_scissor_bounding_box(ctx, ctx->DrawBuffer, i, bbox);
> + bbox[0] = 0;
> + bbox[1] = fb_width;
> + bbox[2] = 0;
> + bbox[3] = fb_height;
> + _mesa_intersect_scissor_bounding_box(ctx, i, bbox);
>
> if (bbox[0] == bbox[1] || bbox[2] == bbox[3]) {
> /* If the scissor was out of bounds and got clamped to 0 width/height
> @@ -80,8 +86,8 @@ gen6_upload_scissor_state(struct brw_context *brw)
> /* memory: Y=0=top */
> scissor[i].xmin = bbox[0];
> scissor[i].xmax = bbox[1] - 1;
> - scissor[i].ymin = ctx->DrawBuffer->Height - bbox[3];
> - scissor[i].ymax = ctx->DrawBuffer->Height - bbox[2] - 1;
> + scissor[i].ymin = fb_height - bbox[3];
> + scissor[i].ymax = fb_height - bbox[2] - 1;
> }
> }
> BEGIN_BATCH(2);
> diff --git a/src/mesa/drivers/dri/i965/gen6_sf_state.c b/src/mesa/drivers/dri/i965/gen6_sf_state.c
> index e445ce2..834213e 100644
> --- a/src/mesa/drivers/dri/i965/gen6_sf_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_sf_state.c
> @@ -31,6 +31,7 @@
> #include "brw_util.h"
> #include "main/macros.h"
> #include "main/fbobject.h"
> +#include "main/framebuffer.h"
> #include "intel_batchbuffer.h"
>
> /**
> @@ -273,7 +274,7 @@ upload_sf_state(struct brw_context *brw)
> int i;
> /* _NEW_BUFFER */
> bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
> - bool multisampled_fbo = ctx->DrawBuffer->Visual.samples > 1;
> + const bool multisampled_fbo = _mesa_geometric_samples(ctx->DrawBuffer) > 1;
>
> const int urb_entry_read_offset = BRW_SF_URB_ENTRY_READ_OFFSET;
> float point_size;
> diff --git a/src/mesa/drivers/dri/i965/gen6_viewport_state.c b/src/mesa/drivers/dri/i965/gen6_viewport_state.c
> index 2fb0182..7c8d884 100644
> --- a/src/mesa/drivers/dri/i965/gen6_viewport_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_viewport_state.c
> @@ -30,6 +30,7 @@
> #include "brw_defines.h"
> #include "intel_batchbuffer.h"
> #include "main/fbobject.h"
> +#include "main/framebuffer.h"
> #include "main/viewport.h"
>
> /* The clip VP defines the guardband region where expensive clipping is skipped
> @@ -93,10 +94,10 @@ gen6_upload_sf_vp(struct brw_context *brw)
> /* _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);
> }
>
> for (unsigned i = 0; i < ctx->Const.MaxViewports; i++) {
> diff --git a/src/mesa/drivers/dri/i965/gen6_wm_state.c b/src/mesa/drivers/dri/i965/gen6_wm_state.c
> index 7081eb7..d1748ba 100644
> --- a/src/mesa/drivers/dri/i965/gen6_wm_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_wm_state.c
> @@ -33,6 +33,7 @@
> #include "program/program.h"
> #include "program/prog_parameter.h"
> #include "program/prog_statevars.h"
> +#include "main/framebuffer.h"
> #include "intel_batchbuffer.h"
>
> static void
> @@ -284,7 +285,7 @@ upload_wm_state(struct brw_context *brw)
> const struct brw_wm_prog_data *prog_data = brw->wm.prog_data;
>
> /* _NEW_BUFFERS */
> - const bool multisampled_fbo = ctx->DrawBuffer->Visual.samples > 1;
> + const bool multisampled_fbo = _mesa_geometric_samples(ctx->DrawBuffer) > 1;
>
> /* In case of non 1x per sample shading, only one of SIMD8 and SIMD16
> * should be enabled. We do 'SIMD16 only' dispatch if a SIMD16 shader
> diff --git a/src/mesa/drivers/dri/i965/gen7_sf_state.c b/src/mesa/drivers/dri/i965/gen7_sf_state.c
> index 58e3337..60f6efa 100644
> --- a/src/mesa/drivers/dri/i965/gen7_sf_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_sf_state.c
> @@ -27,6 +27,7 @@
> #include "brw_util.h"
> #include "main/macros.h"
> #include "main/fbobject.h"
> +#include "main/framebuffer.h"
> #include "intel_batchbuffer.h"
>
> static void
> @@ -109,7 +110,7 @@ upload_sf_state(struct brw_context *brw)
> float point_size;
> /* _NEW_BUFFERS */
> bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
> - bool multisampled_fbo = ctx->DrawBuffer->Visual.samples > 1;
> + const bool multisampled_fbo = _mesa_geometric_samples(ctx->DrawBuffer) > 1;
>
> dw1 = GEN6_SF_STATISTICS_ENABLE;
>
> diff --git a/src/mesa/drivers/dri/i965/gen7_viewport_state.c b/src/mesa/drivers/dri/i965/gen7_viewport_state.c
> index eb59684..b655205 100644
> --- a/src/mesa/drivers/dri/i965/gen7_viewport_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_viewport_state.c
> @@ -26,6 +26,7 @@
> #include "brw_defines.h"
> #include "intel_batchbuffer.h"
> #include "main/fbobject.h"
> +#include "main/framebuffer.h"
> #include "main/viewport.h"
>
> static void
> @@ -45,10 +46,10 @@ gen7_upload_sf_clip_viewport(struct brw_context *brw)
> /* _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);
> }
>
> for (unsigned i = 0; i < ctx->Const.MaxViewports; i++) {
> diff --git a/src/mesa/drivers/dri/i965/gen7_wm_state.c b/src/mesa/drivers/dri/i965/gen7_wm_state.c
> index b918275..1c47076 100644
> --- a/src/mesa/drivers/dri/i965/gen7_wm_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_wm_state.c
> @@ -30,6 +30,7 @@
> #include "program/program.h"
> #include "program/prog_parameter.h"
> #include "program/prog_statevars.h"
> +#include "main/framebuffer.h"
> #include "intel_batchbuffer.h"
>
> static void
> @@ -45,7 +46,7 @@ upload_wm_state(struct brw_context *brw)
> uint32_t dw1, dw2;
>
> /* _NEW_BUFFERS */
> - bool multisampled_fbo = ctx->DrawBuffer->Visual.samples > 1;
> + const bool multisampled_fbo = _mesa_geometric_samples(ctx->DrawBuffer) > 1;
>
> dw1 = dw2 = 0;
> dw1 |= GEN7_WM_STATISTICS_ENABLE;
> diff --git a/src/mesa/drivers/dri/i965/gen8_viewport_state.c b/src/mesa/drivers/dri/i965/gen8_viewport_state.c
> index 322e466..2d8eeb1 100644
> --- a/src/mesa/drivers/dri/i965/gen8_viewport_state.c
> +++ b/src/mesa/drivers/dri/i965/gen8_viewport_state.c
> @@ -26,6 +26,7 @@
> #include "brw_defines.h"
> #include "intel_batchbuffer.h"
> #include "main/fbobject.h"
> +#include "main/framebuffer.h"
> #include "main/viewport.h"
>
> static void
> @@ -33,6 +34,7 @@ gen8_upload_sf_clip_viewport(struct brw_context *brw)
> {
> struct gl_context *ctx = &brw->ctx;
> float y_scale, y_bias;
> + const float fb_height = (float)_mesa_geometric_height(ctx->DrawBuffer);
> const bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
>
> float *vp = brw_state_batch(brw, AUB_TRACE_SF_VP_STATE,
> @@ -47,7 +49,7 @@ gen8_upload_sf_clip_viewport(struct brw_context *brw)
> y_bias = 0;
> } else {
> y_scale = -1.0;
> - y_bias = ctx->DrawBuffer->Height;
> + y_bias = fb_height;
> }
>
> for (unsigned i = 0; i < ctx->Const.MaxViewports; i++) {
> @@ -116,8 +118,8 @@ gen8_upload_sf_clip_viewport(struct brw_context *brw)
> } else {
> vp[12] = ctx->ViewportArray[i].X;
> vp[13] = viewport_Xmax - 1;
> - vp[14] = ctx->DrawBuffer->Height - viewport_Ymax;
> - vp[15] = ctx->DrawBuffer->Height - ctx->ViewportArray[i].Y - 1;
> + vp[14] = fb_height - viewport_Ymax;
> + vp[15] = fb_height - ctx->ViewportArray[i].Y - 1;
> }
>
> vp += 16;
>
More information about the mesa-dev
mailing list