1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2012 Advanced Micro Devices, Inc.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *      Christian König <christian.koenig@amd.com>
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeonsi_pipe.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "si_state.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Stream out
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid si_context_streamout_begin(struct r600_context *ctx)
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = ctx->cs;
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_so_target **t = ctx->so_targets;
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned *strides = ctx->vs_shader_so_strides;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned buffer_en, i;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer_en = (ctx->num_so_targets >= 1 && t[0] ? 1 : 0) |
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    (ctx->num_so_targets >= 2 && t[1] ? 2 : 0) |
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    (ctx->num_so_targets >= 3 && t[2] ? 4 : 0) |
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    (ctx->num_so_targets >= 4 && t[3] ? 8 : 0);
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->num_cs_dw_streamout_end =
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		12 + /* flush_vgt_streamout */
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		util_bitcount(buffer_en) * 8 +
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		3;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_need_cs_space(ctx,
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   12 + /* flush_vgt_streamout */
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   6 + /* enables */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   util_bitcount(buffer_en & ctx->streamout_append_bitmask) * 8 +
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   util_bitcount(buffer_en & ~ctx->streamout_append_bitmask) * 6 +
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   ctx->num_cs_dw_streamout_end, TRUE);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->chip_class >= CAYMAN) {
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		evergreen_flush_vgt_streamout(ctx);
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		evergreen_set_streamout_enable(ctx, buffer_en);
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < ctx->num_so_targets; i++) {
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (t[i]) {
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			t[i]->stride = strides[i];
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			t[i]->so_index = i;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 3, 0);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = (R_028AD0_VGT_STRMOUT_BUFFER_SIZE_0 +
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							16*i - SI_CONTEXT_REG_OFFSET) >> 2;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = (t[i]->b.buffer_offset +
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							t[i]->b.buffer_size) >> 2; /* BUFFER_SIZE (in DW) */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = strides[i] >> 2;		   /* VTX_STRIDE (in DW) */
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = 0;			   /* BUFFER_BASE */
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] =
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				si_context_bo_reloc(ctx, si_resource(t[i]->b.buffer),
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						      RADEON_USAGE_WRITE);
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (ctx->streamout_append_bitmask & (1 << i)) {
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* Append. */
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = PKT3(PKT3_STRMOUT_BUFFER_UPDATE, 4, 0);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = STRMOUT_SELECT_BUFFER(i) |
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							       STRMOUT_OFFSET_SOURCE(STRMOUT_OFFSET_FROM_MEM); /* control */
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = 0; /* unused */
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = 0; /* unused */
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = 0; /* src address lo */
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = 0; /* src address hi */
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] =
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					si_context_bo_reloc(ctx,  t[i]->filled_size,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							      RADEON_USAGE_READ);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* Start from the beginning. */
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = PKT3(PKT3_STRMOUT_BUFFER_UPDATE, 4, 0);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = STRMOUT_SELECT_BUFFER(i) |
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							       STRMOUT_OFFSET_SOURCE(STRMOUT_OFFSET_FROM_PACKET); /* control */
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = 0; /* unused */
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = 0; /* unused */
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = t[i]->b.buffer_offset >> 2; /* buffer offset in DW */
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				cs->buf[cs->cdw++] = 0; /* unused */
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid si_context_streamout_end(struct r600_context *ctx)
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = ctx->cs;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_so_target **t = ctx->so_targets;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i, flush_flags = 0;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	evergreen_flush_vgt_streamout(ctx);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < ctx->num_so_targets; i++) {
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (t[i]) {
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = PKT3(PKT3_STRMOUT_BUFFER_UPDATE, 4, 0);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = STRMOUT_SELECT_BUFFER(i) |
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						       STRMOUT_OFFSET_SOURCE(STRMOUT_OFFSET_NONE) |
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						       STRMOUT_STORE_BUFFER_FILLED_SIZE; /* control */
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = 0; /* dst address lo */
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = 0; /* dst address hi */
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = 0; /* unused */
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = 0; /* unused */
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			cs->buf[cs->cdw++] =
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				si_context_bo_reloc(ctx,  t[i]->filled_size,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						      RADEON_USAGE_WRITE);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			flush_flags |= S_0085F0_SO0_DEST_BASE_ENA(1) << i;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	evergreen_set_streamout_enable(ctx, 0);
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->atom_surface_sync.flush_flags |= flush_flags;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_atom_dirty(ctx, &ctx->atom_surface_sync.atom);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->num_cs_dw_streamout_end = 0;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* XXX print some debug info */
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < ctx->num_so_targets; i++) {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!t[i])
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t *ptr = ctx->ws->buffer_map(t[i]->filled_size->cs_buf, ctx->cs, RADEON_USAGE_READ);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		printf("FILLED_SIZE%i: %u\n", i, *ptr);
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->ws->buffer_unmap(t[i]->filled_size->cs_buf);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid evergreen_flush_vgt_streamout(struct si_context *ctx)
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = ctx->cs;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONFIG_REG, 1, 0);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = (R_0084FC_CP_STRMOUT_CNTL - SI_CONFIG_REG_OFFSET) >> 2;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = 0;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_SO_VGTSTREAMOUT_FLUSH) | EVENT_INDEX(0);
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = PKT3(PKT3_WAIT_REG_MEM, 5, 0);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = WAIT_REG_MEM_EQUAL; /* wait until the register is equal to the reference value */
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = R_0084FC_CP_STRMOUT_CNTL >> 2;  /* register */
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = 0;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = S_0084FC_OFFSET_UPDATE_DONE(1); /* reference value */
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = S_0084FC_OFFSET_UPDATE_DONE(1); /* mask */
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cs->buf[cs->cdw++] = 4; /* poll interval */
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid evergreen_set_streamout_enable(struct si_context *ctx, unsigned buffer_enable_bit)
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = ctx->cs;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (buffer_enable_bit) {
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 1, 0);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cs->buf[cs->cdw++] = (R_028B94_VGT_STRMOUT_CONFIG - SI_CONTEXT_REG_OFFSET) >> 2;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cs->buf[cs->cdw++] = S_028B94_STREAMOUT_0_EN(1);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 1, 0);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cs->buf[cs->cdw++] = (R_028B98_VGT_STRMOUT_BUFFER_CONFIG - SI_CONTEXT_REG_OFFSET) >> 2;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cs->buf[cs->cdw++] = S_028B98_STREAM_0_BUFFER_EN(buffer_enable_bit);
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 1, 0);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cs->buf[cs->cdw++] = (R_028B94_VGT_STRMOUT_CONFIG - SI_CONTEXT_REG_OFFSET) >> 2;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cs->buf[cs->cdw++] = S_028B94_STREAMOUT_0_EN(0);
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_stream_output_target *
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsi_create_so_target(struct pipe_context *ctx,
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct pipe_resource *buffer,
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    unsigned buffer_offset,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    unsigned buffer_size)
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_context *rctx = (struct r600_context *)ctx;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_so_target *t;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	void *ptr;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	t = CALLOC_STRUCT(si_so_target);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!t) {
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	t->b.reference.count = 1;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	t->b.context = ctx;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_resource_reference(&t->b.buffer, buffer);
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	t->b.buffer_offset = buffer_offset;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	t->b.buffer_size = buffer_size;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	t->filled_size = si_resource_create_custom(ctx->screen, PIPE_USAGE_STATIC, 4);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ptr = rctx->ws->buffer_map(t->filled_size->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(ptr, 0, t->filled_size->buf->size);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->ws->buffer_unmap(t->filled_size->cs_buf);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return &t->b;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return NULL;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid si_so_target_destroy(struct pipe_context *ctx,
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  struct pipe_stream_output_target *target)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_so_target *t = (struct r600_so_target*)target;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_resource_reference(&t->b.buffer, NULL);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_resource_reference(&t->filled_size, NULL);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	FREE(t);
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid si_set_so_targets(struct pipe_context *ctx,
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       unsigned num_targets,
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       struct pipe_stream_output_target **targets,
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       unsigned append_bitmask)
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(num_targets == 0);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_context *rctx = (struct r600_context *)ctx;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Stop streamout. */
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->num_so_targets) {
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_context_streamout_end(rctx);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Set the new targets. */
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < num_targets; i++) {
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], targets[i]);
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (; i < rctx->num_so_targets; i++) {
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], NULL);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->num_so_targets = num_targets;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->streamout_start = num_targets != 0;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->streamout_append_bitmask = append_bitmask;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
272