crocus/gen8: add viewport support
authorDave Airlie <airlied@redhat.com>
Mon, 21 Jun 2021 19:19:38 +0000 (05:19 +1000)
committerMarge Bot <eric+marge@anholt.net>
Tue, 22 Jun 2021 18:56:21 +0000 (18:56 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11507>

src/gallium/drivers/crocus/crocus_state.c

index 57c079d..107e307 100644 (file)
@@ -3299,6 +3299,14 @@ crocus_set_stencil_ref(struct pipe_context *ctx,
    ice->state.dirty |= CROCUS_DIRTY_COLOR_CALC_STATE;
 }
 
+#if GFX_VER == 8
+static float
+viewport_extent(const struct pipe_viewport_state *state, int axis, float sign)
+{
+   return copysignf(state->scale[axis], sign) + state->translate[axis];
+}
+#endif
+
 /**
  * The pipe->set_viewport_states() driver hook.
  *
@@ -5856,7 +5864,7 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
 
    if (dirty & CROCUS_DIRTY_SF_CL_VIEWPORT) {
       struct pipe_framebuffer_state *cso_fb = &ice->state.framebuffer;
-#if GFX_VER == 7
+#if GFX_VER >= 7
       uint32_t sf_cl_vp_address;
       uint32_t *vp_map =
          stream_state(batch,
@@ -5877,11 +5885,17 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
          const struct pipe_viewport_state *state = &ice->state.viewports[i];
          float gb_xmin, gb_xmax, gb_ymin, gb_ymax;
 
+#if GFX_VER == 8
+         float vp_xmin = viewport_extent(state, 0, -1.0f);
+         float vp_xmax = viewport_extent(state, 0,  1.0f);
+         float vp_ymin = viewport_extent(state, 1, -1.0f);
+         float vp_ymax = viewport_extent(state, 1,  1.0f);
+#endif
          intel_calculate_guardband_size(cso_fb->width, cso_fb->height,
                                         state->scale[0], state->scale[1],
                                         state->translate[0], state->translate[1],
                                         &gb_xmin, &gb_xmax, &gb_ymin, &gb_ymax);
-#if GFX_VER == 7
+#if GFX_VER >= 7
          crocus_pack_state(GENX(SF_CLIP_VIEWPORT), vp_map, vp)
 #else
          crocus_pack_state(GENX(SF_VIEWPORT), vp_map, vp)
@@ -5902,12 +5916,18 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
             vp.ScissorRectangle.ScissorRectangleYMax = scissor.maxy;
 #endif
 
-#if GFX_VER == 7
+#if GFX_VER >= 7
             vp.XMinClipGuardband = gb_xmin;
             vp.XMaxClipGuardband = gb_xmax;
             vp.YMinClipGuardband = gb_ymin;
             vp.YMaxClipGuardband = gb_ymax;
 #endif
+#if GFX_VER == 8
+            vp.XMinViewPort = MAX2(vp_xmin, 0);
+            vp.XMaxViewPort = MIN2(vp_xmax, cso_fb->width) - 1;
+            vp.YMinViewPort = MAX2(vp_ymin, 0);
+            vp.YMaxViewPort = MIN2(vp_ymax, cso_fb->height) - 1;
+#endif
          }
 #if GFX_VER < 7
          crocus_pack_state(GENX(CLIP_VIEWPORT), clip_map, clip) {
@@ -5917,14 +5937,14 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
             clip.YMaxClipGuardband = gb_ymax;
          }
 #endif
-#if GFX_VER == 7
+#if GFX_VER >= 7
          vp_map += GENX(SF_CLIP_VIEWPORT_length);
 #else
          vp_map += GENX(SF_VIEWPORT_length);
          clip_map += GENX(CLIP_VIEWPORT_length);
 #endif
       }
-#if GFX_VER == 7
+#if GFX_VER >= 7
       crocus_emit_cmd(batch, GENX(3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP), ptr) {
          ptr.SFClipViewportPointer = sf_cl_vp_address;
       }