13d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand/* 23d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * Copyright © 2016 Intel Corporation 33d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * 43d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * Permission is hereby granted, free of charge, to any person obtaining a 53d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * copy of this software and associated documentation files (the "Software"), 63d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * to deal in the Software without restriction, including without limitation 73d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * the rights to use, copy, modify, merge, publish, distribute, sublicense, 83d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * and/or sell copies of the Software, and to permit persons to whom the 93d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * Software is furnished to do so, subject to the following conditions: 103d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * 113d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * The above copyright notice and this permission notice (including the next 123d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * paragraph) shall be included in all copies or substantial portions of the 133d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * Software. 143d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * 153d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 163d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 173d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 183d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 193d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 203d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 213d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * IN THE SOFTWARE. 223d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand */ 233d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 243d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#include "anv_private.h" 253d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 263d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#include "genxml/gen_macros.h" 273d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#include "genxml/genX_pack.h" 283d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 293d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#include "common/gen_l3_config.h" 303d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 313d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand/** 323d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * This file implements some lightweight memcpy/memset operations on the GPU 333d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * using a vertex buffer and streamout. 343d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand */ 353d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 363d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand/** 373d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * Returns the greatest common divisor of a and b that is a power of two. 383d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand */ 393d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrandstatic inline uint64_t 403d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrandgcd_pow2_u64(uint64_t a, uint64_t b) 413d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand{ 423d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand assert(a > 0 || b > 0); 433d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 443d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand unsigned a_log2 = ffsll(a) - 1; 453d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand unsigned b_log2 = ffsll(b) - 1; 463d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 473d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand /* If either a or b is 0, then a_log2 or b_log2 will be UINT_MAX in which 483d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * case, the MIN2() will take the other one. If both are 0 then we will 493d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * hit the assert above. 503d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand */ 513d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand return 1 << MIN2(a_log2, b_log2); 523d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand} 533d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 543d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrandvoid 553d9747780bc2508f4474230a0998d9dba7b02d1eJason EkstrandgenX(cmd_buffer_gpu_memcpy)(struct anv_cmd_buffer *cmd_buffer, 563d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand struct anv_bo *dst, uint32_t dst_offset, 573d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand struct anv_bo *src, uint32_t src_offset, 583d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand uint32_t size) 593d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand{ 603d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand if (size == 0) 613d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand return; 623d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 633d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand assert(dst_offset + size <= dst->size); 643d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand assert(src_offset + size <= src->size); 653d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 663d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand /* The maximum copy block size is 4 32-bit components at a time. */ 673d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand unsigned bs = 16; 683d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand bs = gcd_pow2_u64(bs, src_offset); 693d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand bs = gcd_pow2_u64(bs, dst_offset); 703d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand bs = gcd_pow2_u64(bs, size); 713d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 723d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand enum isl_format format; 733d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand switch (bs) { 743d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand case 4: format = ISL_FORMAT_R32_UINT; break; 753d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand case 8: format = ISL_FORMAT_R32G32_UINT; break; 763d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand case 16: format = ISL_FORMAT_R32G32B32A32_UINT; break; 773d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand default: 783d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand unreachable("Invalid size"); 793d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand } 803d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 813d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand if (!cmd_buffer->state.current_l3_config) { 823d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand const struct gen_l3_config *cfg = 833d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand gen_get_default_l3_config(&cmd_buffer->device->info); 843d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand genX(cmd_buffer_config_l3)(cmd_buffer, cfg); 853d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand } 863d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 873d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer); 883d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 893d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand genX(flush_pipeline_select_3d)(cmd_buffer); 903d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 913d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand uint32_t *dw; 923d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand dw = anv_batch_emitn(&cmd_buffer->batch, 5, GENX(3DSTATE_VERTEX_BUFFERS)); 933d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand GENX(VERTEX_BUFFER_STATE_pack)(&cmd_buffer->batch, dw + 1, 943d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand &(struct GENX(VERTEX_BUFFER_STATE)) { 953d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .VertexBufferIndex = 32, /* Reserved for this */ 963d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .AddressModifyEnable = true, 973d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .BufferStartingAddress = { src, src_offset }, 983d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .BufferPitch = bs, 993d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#if (GEN_GEN >= 8) 1003d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .MemoryObjectControlState = GENX(MOCS), 1013d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .BufferSize = size, 1023d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#else 1033d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .VertexBufferMemoryObjectControlState = GENX(MOCS), 1043d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .EndAddress = { src, src_offset + size - 1 }, 1053d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#endif 1063d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand }); 1073d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1083d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand dw = anv_batch_emitn(&cmd_buffer->batch, 3, GENX(3DSTATE_VERTEX_ELEMENTS)); 1093d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand GENX(VERTEX_ELEMENT_STATE_pack)(&cmd_buffer->batch, dw + 1, 1103d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand &(struct GENX(VERTEX_ELEMENT_STATE)) { 1113d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .VertexBufferIndex = 32, 1123d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .Valid = true, 1133d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .SourceElementFormat = format, 1143d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .SourceElementOffset = 0, 1153d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .Component0Control = (bs >= 4) ? VFCOMP_STORE_SRC : VFCOMP_STORE_0, 1163d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .Component1Control = (bs >= 8) ? VFCOMP_STORE_SRC : VFCOMP_STORE_0, 1173d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .Component2Control = (bs >= 12) ? VFCOMP_STORE_SRC : VFCOMP_STORE_0, 1183d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .Component3Control = (bs >= 16) ? VFCOMP_STORE_SRC : VFCOMP_STORE_0, 1193d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand }); 1203d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1213d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#if GEN_GEN >= 8 1223d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_VF_SGVS), sgvs); 1233d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#endif 1243d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1253d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand /* Disable all shader stages */ 1263d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_VS), vs); 1273d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_HS), hs); 1283d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_TE), te); 1293d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DS), DS); 1303d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_GS), gs); 1313d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_PS), gs); 1323d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1333d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_SBE), sbe) { 1343d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sbe.VertexURBEntryReadOffset = 1; 1353d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sbe.NumberofSFOutputAttributes = 1; 1363d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sbe.VertexURBEntryReadLength = 1; 1373d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#if GEN_GEN >= 8 1383d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sbe.ForceVertexURBEntryReadLength = true; 1393d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sbe.ForceVertexURBEntryReadOffset = true; 1403d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#endif 1413d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1423d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#if GEN_GEN >= 9 1433d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand for (unsigned i = 0; i < 32; i++) 1443d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sbe.AttributeActiveComponentFormat[i] = ACF_XYZW; 1453d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#endif 1463d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand } 1473d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1483d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand /* Emit URB setup. We tell it that the VS is active because we want it to 1493d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * allocate space for the VS. Even though one isn't run, we need VUEs to 1503d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * store the data that VF is going to pass to SOL. 1513d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand */ 1529ef2b9277d3bead6dbfa47e95794ca61e8be4e84Kenneth Graunke const unsigned entry_size[4] = { DIV_ROUND_UP(32, 64), 1, 1, 1 }; 1539ef2b9277d3bead6dbfa47e95794ca61e8be4e84Kenneth Graunke 1543d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand genX(emit_urb_setup)(cmd_buffer->device, &cmd_buffer->batch, 1559ef2b9277d3bead6dbfa47e95794ca61e8be4e84Kenneth Graunke cmd_buffer->state.current_l3_config, 1569ef2b9277d3bead6dbfa47e95794ca61e8be4e84Kenneth Graunke VK_SHADER_STAGE_VERTEX_BIT, entry_size); 1573d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1583d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_SO_BUFFER), sob) { 1593d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.SOBufferIndex = 0; 1603d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.SOBufferObjectControlState = GENX(MOCS); 1613d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.SurfaceBaseAddress = (struct anv_address) { dst, dst_offset }; 1623d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1633d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#if GEN_GEN >= 8 1643d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.SOBufferEnable = true; 1653d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.SurfaceSize = size - 1; 1663d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#else 1673d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.SurfacePitch = bs; 1683d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.SurfaceEndAddress = sob.SurfaceBaseAddress; 1693d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.SurfaceEndAddress.offset += size; 1703d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#endif 1713d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1723d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#if GEN_GEN >= 8 1733d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand /* As SOL writes out data, it updates the SO_WRITE_OFFSET registers with 1743d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * the end position of the stream. We need to reset this value to 0 at 1753d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * the beginning of the run or else SOL will start at the offset from 1763d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand * the previous draw. 1773d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand */ 1783d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.StreamOffsetWriteEnable = true; 1793d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand sob.StreamOffset = 0; 1803d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#endif 1813d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand } 1823d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1833d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#if GEN_GEN <= 7 1843d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand /* The hardware can do this for us on BDW+ (see above) */ 1853d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(MI_LOAD_REGISTER_IMM), load) { 1863d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand load.RegisterOffset = GENX(SO_WRITE_OFFSET0_num); 1873d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand load.DataDWord = 0; 1883d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand } 1893d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#endif 1903d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 1913d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand dw = anv_batch_emitn(&cmd_buffer->batch, 5, GENX(3DSTATE_SO_DECL_LIST), 1923d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .StreamtoBufferSelects0 = (1 << 0), 1933d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .NumEntries0 = 1); 1943d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand GENX(SO_DECL_ENTRY_pack)(&cmd_buffer->batch, dw + 3, 1953d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand &(struct GENX(SO_DECL_ENTRY)) { 1963d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .Stream0Decl = { 1973d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .OutputBufferSlot = 0, 1983d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .RegisterIndex = 0, 1993d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand .ComponentMask = (1 << (bs / 4)) - 1, 2003d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand }, 2013d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand }); 2023d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 2033d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_STREAMOUT), so) { 2043d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand so.SOFunctionEnable = true; 2053d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand so.RenderingDisable = true; 2063d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand so.Stream0VertexReadOffset = 0; 2073d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand so.Stream0VertexReadLength = DIV_ROUND_UP(32, 64); 2083d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#if GEN_GEN >= 8 2093d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand so.Buffer0SurfacePitch = bs; 2103d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#else 2113d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand so.SOBufferEnable0 = true; 2123d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#endif 2133d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand } 2143d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 2153d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#if GEN_GEN >= 8 2163d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_VF_TOPOLOGY), topo) { 2173d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand topo.PrimitiveTopologyType = _3DPRIM_POINTLIST; 2183d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand } 2193d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand#endif 2203d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 2213d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) { 2223d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand prim.VertexAccessType = SEQUENTIAL; 2233d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand prim.PrimitiveTopologyType = _3DPRIM_POINTLIST; 2243d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand prim.VertexCountPerInstance = size / bs; 2253d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand prim.StartVertexLocation = 0; 2263d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand prim.InstanceCount = 1; 2273d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand prim.StartInstanceLocation = 0; 2283d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand prim.BaseVertexLocation = 0; 2293d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand } 2303d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand 2313d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand cmd_buffer->state.dirty |= ANV_CMD_DIRTY_PIPELINE; 2323d9747780bc2508f4474230a0998d9dba7b02d1eJason Ekstrand} 233