1303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König/*
2303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * Copyright 2012 Advanced Micro Devices, Inc.
3303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König *
4303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * Permission is hereby granted, free of charge, to any person obtaining a
5303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * copy of this software and associated documentation files (the "Software"),
6303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * to deal in the Software without restriction, including without limitation
7303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * on the rights to use, copy, modify, merge, publish, distribute, sub
8303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * license, and/or sell copies of the Software, and to permit persons to whom
9303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * the Software is furnished to do so, subject to the following conditions:
10303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König *
11303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * The above copyright notice and this permission notice (including the next
12303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * paragraph) shall be included in all copies or substantial portions of the
13303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * Software.
14303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König *
15303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * USE OR OTHER DEALINGS IN THE SOFTWARE.
22303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König *
23303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * Authors:
24303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König *      Christian König <christian.koenig@amd.com>
25303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König */
26303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
27303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#include "radeonsi_pipe.h"
28303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#include "si_state.h"
29303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
30303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König/*
31303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König * Stream out
32303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König */
33303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
34303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#if 0
35303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid si_context_streamout_begin(struct r600_context *ctx)
36303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König{
37303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct radeon_winsys_cs *cs = ctx->cs;
38303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct si_so_target **t = ctx->so_targets;
39303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	unsigned *strides = ctx->vs_shader_so_strides;
40303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	unsigned buffer_en, i;
41303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
42303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	buffer_en = (ctx->num_so_targets >= 1 && t[0] ? 1 : 0) |
43303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		    (ctx->num_so_targets >= 2 && t[1] ? 2 : 0) |
44303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		    (ctx->num_so_targets >= 3 && t[2] ? 4 : 0) |
45303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		    (ctx->num_so_targets >= 4 && t[3] ? 8 : 0);
46303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
47303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	ctx->num_cs_dw_streamout_end =
48303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		12 + /* flush_vgt_streamout */
49303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		util_bitcount(buffer_en) * 8 +
50303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		3;
51303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
52303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	si_need_cs_space(ctx,
53303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			   12 + /* flush_vgt_streamout */
54303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			   6 + /* enables */
55303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			   util_bitcount(buffer_en & ctx->streamout_append_bitmask) * 8 +
56303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			   util_bitcount(buffer_en & ~ctx->streamout_append_bitmask) * 6 +
57303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			   ctx->num_cs_dw_streamout_end, TRUE);
58303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
59303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	if (ctx->chip_class >= CAYMAN) {
60303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		evergreen_flush_vgt_streamout(ctx);
61303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		evergreen_set_streamout_enable(ctx, buffer_en);
62303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	}
63303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
64303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	for (i = 0; i < ctx->num_so_targets; i++) {
65303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#if 0
66303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		if (t[i]) {
67303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			t[i]->stride = strides[i];
68303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			t[i]->so_index = i;
69303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
70303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 3, 0);
71303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = (R_028AD0_VGT_STRMOUT_BUFFER_SIZE_0 +
72303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König							16*i - SI_CONTEXT_REG_OFFSET) >> 2;
73303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = (t[i]->b.buffer_offset +
74303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König							t[i]->b.buffer_size) >> 2; /* BUFFER_SIZE (in DW) */
75303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = strides[i] >> 2;		   /* VTX_STRIDE (in DW) */
76303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = 0;			   /* BUFFER_BASE */
77303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
78303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
79303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] =
80303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				si_context_bo_reloc(ctx, si_resource(t[i]->b.buffer),
81303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König						      RADEON_USAGE_WRITE);
82303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
83303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			if (ctx->streamout_append_bitmask & (1 << i)) {
84303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				/* Append. */
85303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = PKT3(PKT3_STRMOUT_BUFFER_UPDATE, 4, 0);
86303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = STRMOUT_SELECT_BUFFER(i) |
87303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König							       STRMOUT_OFFSET_SOURCE(STRMOUT_OFFSET_FROM_MEM); /* control */
88303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = 0; /* unused */
89303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = 0; /* unused */
90303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = 0; /* src address lo */
91303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = 0; /* src address hi */
92303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
93303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
94303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] =
95303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König					si_context_bo_reloc(ctx,  t[i]->filled_size,
96303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König							      RADEON_USAGE_READ);
97303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			} else {
98303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				/* Start from the beginning. */
99303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = PKT3(PKT3_STRMOUT_BUFFER_UPDATE, 4, 0);
100303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = STRMOUT_SELECT_BUFFER(i) |
101303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König							       STRMOUT_OFFSET_SOURCE(STRMOUT_OFFSET_FROM_PACKET); /* control */
102303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = 0; /* unused */
103303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = 0; /* unused */
104303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = t[i]->b.buffer_offset >> 2; /* buffer offset in DW */
105303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				cs->buf[cs->cdw++] = 0; /* unused */
106303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			}
107303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		}
108303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#endif
109303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	}
110303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König}
111303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
112303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid si_context_streamout_end(struct r600_context *ctx)
113303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König{
114303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct radeon_winsys_cs *cs = ctx->cs;
115303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct si_so_target **t = ctx->so_targets;
116303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	unsigned i, flush_flags = 0;
117303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
118303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	evergreen_flush_vgt_streamout(ctx);
119303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
120303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	for (i = 0; i < ctx->num_so_targets; i++) {
121303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#if 0
122303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		if (t[i]) {
123303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = PKT3(PKT3_STRMOUT_BUFFER_UPDATE, 4, 0);
124303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = STRMOUT_SELECT_BUFFER(i) |
125303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König						       STRMOUT_OFFSET_SOURCE(STRMOUT_OFFSET_NONE) |
126303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König						       STRMOUT_STORE_BUFFER_FILLED_SIZE; /* control */
127303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = 0; /* dst address lo */
128303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = 0; /* dst address hi */
129303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = 0; /* unused */
130303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = 0; /* unused */
131303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
132303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
133303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			cs->buf[cs->cdw++] =
134303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König				si_context_bo_reloc(ctx,  t[i]->filled_size,
135303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König						      RADEON_USAGE_WRITE);
136303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
137303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			flush_flags |= S_0085F0_SO0_DEST_BASE_ENA(1) << i;
138303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		}
139303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#endif
140303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	}
141303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
142303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	evergreen_set_streamout_enable(ctx, 0);
143303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
144303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	ctx->atom_surface_sync.flush_flags |= flush_flags;
145303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	si_atom_dirty(ctx, &ctx->atom_surface_sync.atom);
146303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
147303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	ctx->num_cs_dw_streamout_end = 0;
148303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
149303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	/* XXX print some debug info */
150303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	for (i = 0; i < ctx->num_so_targets; i++) {
151303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		if (!t[i])
152303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			continue;
153303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
154303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		uint32_t *ptr = ctx->ws->buffer_map(t[i]->filled_size->cs_buf, ctx->cs, RADEON_USAGE_READ);
155303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		printf("FILLED_SIZE%i: %u\n", i, *ptr);
156303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		ctx->ws->buffer_unmap(t[i]->filled_size->cs_buf);
157303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	}
158303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König}
159303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
160303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid evergreen_flush_vgt_streamout(struct si_context *ctx)
161303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König{
162303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct radeon_winsys_cs *cs = ctx->cs;
163303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
164303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONFIG_REG, 1, 0);
165303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = (R_0084FC_CP_STRMOUT_CNTL - SI_CONFIG_REG_OFFSET) >> 2;
166303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = 0;
167303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
168303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
169303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_SO_VGTSTREAMOUT_FLUSH) | EVENT_INDEX(0);
170303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
171303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = PKT3(PKT3_WAIT_REG_MEM, 5, 0);
172303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = WAIT_REG_MEM_EQUAL; /* wait until the register is equal to the reference value */
173303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = R_0084FC_CP_STRMOUT_CNTL >> 2;  /* register */
174303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = 0;
175303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = S_0084FC_OFFSET_UPDATE_DONE(1); /* reference value */
176303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = S_0084FC_OFFSET_UPDATE_DONE(1); /* mask */
177303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	cs->buf[cs->cdw++] = 4; /* poll interval */
178303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König}
179303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
180303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid evergreen_set_streamout_enable(struct si_context *ctx, unsigned buffer_enable_bit)
181303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König{
182303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct radeon_winsys_cs *cs = ctx->cs;
183303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
184303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	if (buffer_enable_bit) {
185303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 1, 0);
186303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		cs->buf[cs->cdw++] = (R_028B94_VGT_STRMOUT_CONFIG - SI_CONTEXT_REG_OFFSET) >> 2;
187303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		cs->buf[cs->cdw++] = S_028B94_STREAMOUT_0_EN(1);
188303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
189303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 1, 0);
190303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		cs->buf[cs->cdw++] = (R_028B98_VGT_STRMOUT_BUFFER_CONFIG - SI_CONTEXT_REG_OFFSET) >> 2;
191303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		cs->buf[cs->cdw++] = S_028B98_STREAM_0_BUFFER_EN(buffer_enable_bit);
192303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	} else {
193303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 1, 0);
194303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		cs->buf[cs->cdw++] = (R_028B94_VGT_STRMOUT_CONFIG - SI_CONTEXT_REG_OFFSET) >> 2;
195303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		cs->buf[cs->cdw++] = S_028B94_STREAMOUT_0_EN(0);
196303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	}
197303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König}
198303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
199303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#endif
200303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
201303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königstruct pipe_stream_output_target *
202303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königsi_create_so_target(struct pipe_context *ctx,
203303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		    struct pipe_resource *buffer,
204303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		    unsigned buffer_offset,
205303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		    unsigned buffer_size)
206303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König{
207303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#if 0
208303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct si_context *rctx = (struct r600_context *)ctx;
209303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct si_so_target *t;
210303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	void *ptr;
211303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
212303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	t = CALLOC_STRUCT(si_so_target);
213303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	if (!t) {
214303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		return NULL;
215303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	}
216303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
217303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	t->b.reference.count = 1;
218303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	t->b.context = ctx;
219303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	pipe_resource_reference(&t->b.buffer, buffer);
220303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	t->b.buffer_offset = buffer_offset;
221303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	t->b.buffer_size = buffer_size;
222303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
223303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	t->filled_size = si_resource_create_custom(ctx->screen, PIPE_USAGE_STATIC, 4);
224303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	ptr = rctx->ws->buffer_map(t->filled_size->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
225303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	memset(ptr, 0, t->filled_size->buf->size);
226303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	rctx->ws->buffer_unmap(t->filled_size->cs_buf);
227303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
228303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	return &t->b;
229303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#endif
230303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	return NULL;
231303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König}
232303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
233303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid si_so_target_destroy(struct pipe_context *ctx,
234303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König			  struct pipe_stream_output_target *target)
235303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König{
236303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#if 0
237303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct si_so_target *t = (struct r600_so_target*)target;
238303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	pipe_resource_reference(&t->b.buffer, NULL);
239303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	si_resource_reference(&t->filled_size, NULL);
240303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	FREE(t);
241303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#endif
242303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König}
243303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
244303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid si_set_so_targets(struct pipe_context *ctx,
245303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		       unsigned num_targets,
246303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		       struct pipe_stream_output_target **targets,
247303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		       unsigned append_bitmask)
248303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König{
249303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	assert(num_targets == 0);
250303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#if 0
251303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	struct si_context *rctx = (struct r600_context *)ctx;
252303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	unsigned i;
253303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
254303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	/* Stop streamout. */
255303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	if (rctx->num_so_targets) {
256303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		si_context_streamout_end(rctx);
257303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	}
258303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
259303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	/* Set the new targets. */
260303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	for (i = 0; i < num_targets; i++) {
261303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], targets[i]);
262303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	}
263303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	for (; i < rctx->num_so_targets; i++) {
264303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], NULL);
265303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	}
266303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König
267303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	rctx->num_so_targets = num_targets;
268303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	rctx->streamout_start = num_targets != 0;
269303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	rctx->streamout_append_bitmask = append_bitmask;
270303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#endif
271303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König}
272