iris: Don't bother packing 3DSTATE_SO_BUFFER at create time
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 5 Dec 2018 08:55:45 +0000 (00:55 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:10 +0000 (10:26 -0800)
We have to do half the packet late anyway, we may as well just do it
all at set time.  This also lets us move the struct def out of genxml

src/gallium/drivers/iris/iris_state.c

index ef133c59740904a07a7f1af3c798210173713f91..cf90cf7f81225d9090128702a3dd281e24e0e15a 100644 (file)
@@ -2508,8 +2508,6 @@ iris_bind_vertex_elements_state(struct pipe_context *ctx, void *state)
 struct iris_stream_output_target {
    struct pipe_stream_output_target base;
 
-   uint32_t so_buffer[GENX(3DSTATE_SO_BUFFER_length)];
-
    /** Storage holding the offset where we're writing in the buffer */
    struct iris_state_ref offset;
 };
@@ -2543,21 +2541,6 @@ iris_create_stream_output_target(struct pipe_context *ctx,
 
    upload_state(ctx->stream_uploader, &cso->offset, 4 * sizeof(uint32_t), 4);
 
-   iris_pack_command(GENX(3DSTATE_SO_BUFFER), cso->so_buffer, sob) {
-      sob.SurfaceBaseAddress =
-         rw_bo(NULL, res->bo->gtt_offset + buffer_offset);
-      sob.SOBufferEnable = true;
-      sob.StreamOffsetWriteEnable = true;
-      sob.StreamOutputBufferOffsetAddressEnable = true;
-      sob.MOCS = MOCS_WB; // XXX: MOCS
-
-      sob.SurfaceSize = MAX2(buffer_size / 4, 1) - 1;
-
-      /* .SOBufferIndex, .StreamOffset, and .StreamOutputBufferOffsetAddress
-       * are filled in later when we have stream IDs.
-       */
-   }
-
    return &cso->base;
 }
 
@@ -2623,6 +2606,7 @@ iris_set_stream_output_targets(struct pipe_context *ctx,
       }
 
       struct iris_stream_output_target *tgt = (void *) targets[i];
+      struct iris_resource *res = (void *) tgt->base.buffer;
 
       /* Note that offsets[i] will either be 0, causing us to zero
        * the value in the buffer, or 0xFFFFFFFF, which happens to mean
@@ -2630,16 +2614,21 @@ iris_set_stream_output_targets(struct pipe_context *ctx,
        */
       assert(offsets[i] == 0 || offsets[i] == 0xFFFFFFFF);
 
-      uint32_t dynamic[GENX(3DSTATE_SO_BUFFER_length)];
-      iris_pack_state(GENX(3DSTATE_SO_BUFFER), dynamic, dyns) {
-         dyns.SOBufferIndex = i;
-         dyns.StreamOffset = offsets[i];
-         dyns.StreamOutputBufferOffsetAddress =
-            rw_bo(NULL, iris_resource_bo(tgt->offset.res)->gtt_offset + tgt->offset.offset + i * sizeof(uint32_t));
-      }
-
-      for (uint32_t j = 0; j < GENX(3DSTATE_SO_BUFFER_length); j++) {
-         so_buffers[j] = tgt->so_buffer[j] | dynamic[j];
+      iris_pack_command(GENX(3DSTATE_SO_BUFFER), so_buffers, sob) {
+         sob.SurfaceBaseAddress =
+            rw_bo(NULL, res->bo->gtt_offset + tgt->base.buffer_offset);
+         sob.SOBufferEnable = true;
+         sob.StreamOffsetWriteEnable = true;
+         sob.StreamOutputBufferOffsetAddressEnable = true;
+         sob.MOCS = MOCS_WB; // XXX: MOCS
+
+         sob.SurfaceSize = MAX2(tgt->base.buffer_size / 4, 1) - 1;
+
+         sob.SOBufferIndex = i;
+         sob.StreamOffset = offsets[i];
+         sob.StreamOutputBufferOffsetAddress =
+            rw_bo(NULL, iris_resource_bo(tgt->offset.res)->gtt_offset +
+                        tgt->offset.offset + i * sizeof(uint32_t));
       }
    }