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