iris: SF_CLIP_VIEWPORT
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 9 Jan 2018 19:58:28 +0000 (11:58 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:04 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_state.c

index 95353c8cea922e01b625d98d789f16b3f9fc66b3..184639275c7bee0861fb6ee09eb1e75ded7d7b30 100644 (file)
@@ -58,10 +58,12 @@ struct iris_context {
 
    struct {
       uint64_t dirty;
+      unsigned num_viewports; // XXX: can viewports + scissors be different?
       unsigned num_scissors;
       struct iris_blend_state *cso_blend;
       struct iris_rasterizer_state *cso_rast;
       struct iris_depth_stencil_alpha_state *cso_zsa;
+      struct iris_viewport_state *cso_vp;
       struct pipe_blend_color blend_color;
       struct pipe_poly_stipple poly_stipple;
       struct pipe_scissor_state scissors[IRIS_MAX_VIEWPORTS];
index a3540a2a6df424f5d25b348db058f9594bf4ccb7..19e25da0fd7081362aa968087f94f3eda3860395 100644 (file)
@@ -742,6 +742,7 @@ iris_set_scissor_states(struct pipe_context *ctx,
 {
    struct iris_context *ice = (struct iris_context *) ctx;
 
+   // XXX: start_slot
    ice->state.num_scissors = num_scissors;
 
    for (unsigned i = start_slot; i < start_slot + num_scissors; i++) {
@@ -859,6 +860,7 @@ iris_set_viewport_states(struct pipe_context *ctx,
                          unsigned num_viewports,
                          const struct pipe_viewport_state *state)
 {
+   struct iris_context *ice = (struct iris_context *) ctx;
    struct iris_viewport_state *cso =
       malloc(sizeof(struct iris_viewport_state));
 
@@ -886,6 +888,11 @@ iris_set_viewport_states(struct pipe_context *ctx,
          vp.YMaxViewPort =  y_extent;
       }
    }
+
+   ice->state.cso_vp = cso;
+   // XXX: start_slot
+   ice->state.num_viewports = num_viewports;
+   ice->state.dirty |= IRIS_DIRTY_SF_CL_VIEWPORT;
 }
 
 static void
@@ -1095,10 +1102,10 @@ iris_upload_render_state(struct iris_context *ice, struct iris_batch *batch)
    }
 
    if (dirty & IRIS_DIRTY_SF_CL_VIEWPORT) {
-      struct iris_depth_stencil_alpha_state *cso = ice->state.cso_zsa;
-      iris_emit_cmd(batch, GENX(3DSTATE_VIEWPORT_STATE_POINTERS_CC), ptr) {
-         ptr.CCViewportPointer =
-            iris_emit_state(batch, cso->cc_vp, sizeof(cso->cc_vp), 32);
+      struct iris_viewport_state *cso = ice->state.cso_vp;
+      iris_emit_cmd(batch, GENX(3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP), ptr) {
+         ptr.SFClipViewportPointer =
+            iris_emit_state(batch, cso->sf_cl_vp, sizeof(cso->sf_cl_vp), 64);
       }
    }
 
@@ -1133,10 +1140,6 @@ iris_upload_render_state(struct iris_context *ice, struct iris_batch *batch)
 #if 0
    l3 configuration
 
-   3DSTATE_VIEWPORT_STATE_POINTERS_SF_CL - SF_CLIP_VIEWPORT
-     -> pipe_viewport_state for matrix elements, guardband is calculated
-        from those.  can calculate screen space from matrix apparently...
-
    3DSTATE_PUSH_CONSTANT_ALLOC_*
    3DSTATE_URB_*
      -> TODO