genX_cmd_buffer.c revision b548fdbed5c16f5c0dfc26f65b0037a85c567735
16f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand/* 26f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Copyright © 2015 Intel Corporation 36f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 46f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Permission is hereby granted, free of charge, to any person obtaining a 56f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * copy of this software and associated documentation files (the "Software"), 66f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * to deal in the Software without restriction, including without limitation 76f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * the rights to use, copy, modify, merge, publish, distribute, sublicense, 86f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * and/or sell copies of the Software, and to permit persons to whom the 96f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Software is furnished to do so, subject to the following conditions: 106f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 116f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * The above copyright notice and this permission notice (including the next 126f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * paragraph) shall be included in all copies or substantial portions of the 136f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Software. 146f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 156f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 166f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 176f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 186f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 196f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 206f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 216f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * IN THE SOFTWARE. 226f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand */ 236f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 246f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand#include <assert.h> 256f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand#include <stdbool.h> 266f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 276f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand#include "anv_private.h" 286f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 297e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#include "common/gen_l3_config.h" 30371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#include "genxml/gen_macros.h" 31371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#include "genxml/genX_pack.h" 326f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 3317968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrandstatic void 3417968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrandemit_lrm(struct anv_batch *batch, 3517968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand uint32_t reg, struct anv_bo *bo, uint32_t offset) 3617968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand{ 3717968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_MEM), lrm) { 3817968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand lrm.RegisterAddress = reg; 3917968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand lrm.MemoryAddress = (struct anv_address) { bo, offset }; 4017968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand } 4117968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand} 4217968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand 4317968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrandstatic void 4417968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrandemit_lri(struct anv_batch *batch, uint32_t reg, uint32_t imm) 4517968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand{ 4617968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_IMM), lri) { 4717968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand lri.RegisterOffset = reg; 4817968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand lri.DataDWord = imm; 4917968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand } 5017968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand} 5117968e2dfd8bd362404e9bdd34188d473edd471fJason Ekstrand 526f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrandvoid 536f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason EkstrandgenX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) 546f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand{ 556f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand struct anv_device *device = cmd_buffer->device; 566f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 576f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand/* XXX: Do we need this on more than just BDW? */ 58371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if (GEN_GEN >= 8) 596f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand /* Emit a render target cache flush. 606f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 616f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * This isn't documented anywhere in the PRM. However, it seems to be 626f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * necessary prior to changing the surface state base adress. Without 636f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * this, we get GPU hangs when using multi-level command buffers which 646f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * clear depth, reset state base address, and then go render stuff. 656f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand */ 6650018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 6756453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.RenderTargetCacheFlushEnable = true; 6856453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 696f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand#endif 706f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 7150018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(STATE_BASE_ADDRESS), sba) { 72c2f2c8e407207c31c29aab5570d23cd6e98d287aJason Ekstrand sba.GeneralStateBaseAddress = (struct anv_address) { NULL, 0 }; 7356453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.GeneralStateMemoryObjectControlState = GENX(MOCS); 7456453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.GeneralStateBaseAddressModifyEnable = true; 756f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 7656453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.SurfaceStateBaseAddress = 7756453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand anv_cmd_buffer_surface_base_address(cmd_buffer); 7856453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.SurfaceStateMemoryObjectControlState = GENX(MOCS); 7956453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.SurfaceStateBaseAddressModifyEnable = true; 806f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 8156453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.DynamicStateBaseAddress = 8256453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand (struct anv_address) { &device->dynamic_state_block_pool.bo, 0 }; 8356453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.DynamicStateMemoryObjectControlState = GENX(MOCS), 8456453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.DynamicStateBaseAddressModifyEnable = true, 856f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 8656453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.IndirectObjectBaseAddress = (struct anv_address) { NULL, 0 }; 8756453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.IndirectObjectMemoryObjectControlState = GENX(MOCS); 8856453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.IndirectObjectBaseAddressModifyEnable = true; 896f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 9056453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.InstructionBaseAddress = 9156453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand (struct anv_address) { &device->instruction_block_pool.bo, 0 }; 9256453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.InstructionMemoryObjectControlState = GENX(MOCS); 9356453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.InstructionBaseAddressModifyEnable = true; 946f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 95371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand# if (GEN_GEN >= 8) 966f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand /* Broadwell requires that we specify a buffer size for a bunch of 976f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * these fields. However, since we will be growing the BO's live, we 986f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * just set them all to the maximum. 996f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand */ 10056453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.GeneralStateBufferSize = 0xfffff; 10156453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.GeneralStateBufferSizeModifyEnable = true; 10256453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.DynamicStateBufferSize = 0xfffff; 10356453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.DynamicStateBufferSizeModifyEnable = true; 10456453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.IndirectObjectBufferSize = 0xfffff; 10556453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.IndirectObjectBufferSizeModifyEnable = true; 10656453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.InstructionBufferSize = 0xfffff; 10756453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand sba.InstructionBuffersizeModifyEnable = true; 1086f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand# endif 10956453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 1106f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 1116f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand /* After re-setting the surface state base address, we have to do some 1126f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * cache flusing so that the sampler engine will pick up the new 1136f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * SURFACE_STATE objects and binding tables. From the Broadwell PRM, 1146f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Shared Function > 3D Sampler > State > State Caching (page 96): 1156f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1166f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Coherency with system memory in the state cache, like the texture 1176f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * cache is handled partially by software. It is expected that the 1186f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * command stream or shader will issue Cache Flush operation or 1196f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Cache_Flush sampler message to ensure that the L1 cache remains 1206f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * coherent with system memory. 1216f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1226f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * [...] 1236f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1246f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Whenever the value of the Dynamic_State_Base_Addr, 1256f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Surface_State_Base_Addr are altered, the L1 state cache must be 1266f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * invalidated to ensure the new surface or sampler state is fetched 1276f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * from system memory. 1286f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1296f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * The PIPE_CONTROL command has a "State Cache Invalidation Enable" bit 1306f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * which, according the PIPE_CONTROL instruction documentation in the 1316f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Broadwell PRM: 1326f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1336f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Setting this bit is independent of any other bit in this packet. 1346f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * This bit controls the invalidation of the L1 and L2 state caches 1356f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * at the top of the pipe i.e. at the parsing time. 1366f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1376f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Unfortunately, experimentation seems to indicate that state cache 1386f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * invalidation through a PIPE_CONTROL does nothing whatsoever in 1396f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * regards to surface state and binding tables. In stead, it seems that 1406f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * invalidating the texture cache is what is actually needed. 1416f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1426f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * XXX: As far as we have been able to determine through 1436f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * experimentation, shows that flush the texture cache appears to be 1446f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * sufficient. The theory here is that all of the sampling/rendering 1456f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * units cache the binding table in the texture cache. However, we have 1466f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * yet to be able to actually confirm this. 1476f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand */ 14850018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 14956453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.TextureCacheInvalidationEnable = true; 15056453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 1516f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand} 1526f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 1537e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#define IVB_L3SQCREG1_SQGHPCI_DEFAULT 0x00730000 1547e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#define VLV_L3SQCREG1_SQGHPCI_DEFAULT 0x00d30000 1557e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#define HSW_L3SQCREG1_SQGHPCI_DEFAULT 0x00610000 1567e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 1577e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand/** 1587e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * Program the hardware to use the specified L3 configuration. 1597e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand */ 1607e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrandvoid 1617e891f90c701aa1c851f1846857daa75bbb65876Jason EkstrandgenX(cmd_buffer_config_l3)(struct anv_cmd_buffer *cmd_buffer, 1627e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand const struct gen_l3_config *cfg) 1637e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand{ 1647e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand assert(cfg); 1657e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand if (cfg == cmd_buffer->state.current_l3_config) 1667e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand return; 1677e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 1687e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand if (unlikely(INTEL_DEBUG & DEBUG_L3)) { 1697e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand fprintf(stderr, "L3 config transition: "); 1707e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand gen_dump_l3_config(cfg, stderr); 1717e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand } 1727e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 1737e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand const bool has_slm = cfg->n[GEN_L3P_SLM]; 1747e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 1757e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand /* According to the hardware docs, the L3 partitioning can only be changed 1767e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * while the pipeline is completely drained and the caches are flushed, 1777e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * which involves a first PIPE_CONTROL flush which stalls the pipeline... 1787e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand */ 1797e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 1807e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.DCFlushEnable = true; 1817e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.PostSyncOperation = NoWrite; 1827e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.CommandStreamerStallEnable = true; 1837e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand } 1847e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 1857e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand /* ...followed by a second pipelined PIPE_CONTROL that initiates 1867e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * invalidation of the relevant caches. Note that because RO invalidation 1877e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * happens at the top of the pipeline (i.e. right away as the PIPE_CONTROL 1887e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * command is processed by the CS) we cannot combine it with the previous 1897e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * stalling flush as the hardware documentation suggests, because that 1907e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * would cause the CS to stall on previous rendering *after* RO 1917e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * invalidation and wouldn't prevent the RO caches from being polluted by 1927e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * concurrent rendering before the stall completes. This intentionally 1937e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * doesn't implement the SKL+ hardware workaround suggesting to enable CS 1947e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * stall on PIPE_CONTROLs with the texture cache invalidation bit set for 1957e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * GPGPU workloads because the previous and subsequent PIPE_CONTROLs 1967e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * already guarantee that there is no concurrent GPGPU kernel execution 1977e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * (see SKL HSD 2132585). 1987e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand */ 1997e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 2007e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.TextureCacheInvalidationEnable = true; 2017e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.ConstantCacheInvalidationEnable = true; 2027e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.InstructionCacheInvalidateEnable = true; 2037e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.StateCacheInvalidationEnable = true; 2047e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.PostSyncOperation = NoWrite; 2057e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand } 2067e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2077e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand /* Now send a third stalling flush to make sure that invalidation is 2087e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * complete when the L3 configuration registers are modified. 2097e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand */ 2107e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 2117e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.DCFlushEnable = true; 2127e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.PostSyncOperation = NoWrite; 2137e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand pc.CommandStreamerStallEnable = true; 2147e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand } 2157e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2167e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#if GEN_GEN >= 8 2177e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2187e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand assert(!cfg->n[GEN_L3P_IS] && !cfg->n[GEN_L3P_C] && !cfg->n[GEN_L3P_T]); 2197e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2207e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand uint32_t l3cr; 2217e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand anv_pack_struct(&l3cr, GENX(L3CNTLREG), 2227e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .SLMEnable = has_slm, 2237e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .URBAllocation = cfg->n[GEN_L3P_URB], 2247e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .ROAllocation = cfg->n[GEN_L3P_RO], 2257e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .DCAllocation = cfg->n[GEN_L3P_DC], 2267e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .AllAllocation = cfg->n[GEN_L3P_ALL]); 2277e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2287e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand /* Set up the L3 partitioning. */ 2297e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand emit_lri(&cmd_buffer->batch, GENX(L3CNTLREG_num), l3cr); 2307e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2317e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#else 2327e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2337e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand const bool has_dc = cfg->n[GEN_L3P_DC] || cfg->n[GEN_L3P_ALL]; 2347e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand const bool has_is = cfg->n[GEN_L3P_IS] || cfg->n[GEN_L3P_RO] || 2357e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand cfg->n[GEN_L3P_ALL]; 2367e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand const bool has_c = cfg->n[GEN_L3P_C] || cfg->n[GEN_L3P_RO] || 2377e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand cfg->n[GEN_L3P_ALL]; 2387e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand const bool has_t = cfg->n[GEN_L3P_T] || cfg->n[GEN_L3P_RO] || 2397e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand cfg->n[GEN_L3P_ALL]; 2407e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2417e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand assert(!cfg->n[GEN_L3P_ALL]); 2427e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2437e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand /* When enabled SLM only uses a portion of the L3 on half of the banks, 2447e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * the matching space on the remaining banks has to be allocated to a 2457e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * client (URB for all validated configurations) set to the 2467e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * lower-bandwidth 2-bank address hashing mode. 2477e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand */ 2487e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand const struct gen_device_info *devinfo = &cmd_buffer->device->info; 2497e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand const bool urb_low_bw = has_slm && !devinfo->is_baytrail; 2507e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand assert(!urb_low_bw || cfg->n[GEN_L3P_URB] == cfg->n[GEN_L3P_SLM]); 2517e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2527e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand /* Minimum number of ways that can be allocated to the URB. */ 2537e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand const unsigned n0_urb = (devinfo->is_baytrail ? 32 : 0); 2547e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand assert(cfg->n[GEN_L3P_URB] >= n0_urb); 2557e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2567e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand uint32_t l3sqcr1, l3cr2, l3cr3; 2577e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand anv_pack_struct(&l3sqcr1, GENX(L3SQCREG1), 2587e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .ConvertDC_UC = !has_dc, 2597e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .ConvertIS_UC = !has_is, 2607e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .ConvertC_UC = !has_c, 2617e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .ConvertT_UC = !has_t); 2627e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand l3sqcr1 |= 2637e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand GEN_IS_HASWELL ? HSW_L3SQCREG1_SQGHPCI_DEFAULT : 2647e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand devinfo->is_baytrail ? VLV_L3SQCREG1_SQGHPCI_DEFAULT : 2657e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand IVB_L3SQCREG1_SQGHPCI_DEFAULT; 2667e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2677e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand anv_pack_struct(&l3cr2, GENX(L3CNTLREG2), 2687e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .SLMEnable = has_slm, 2697e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .URBLowBandwidth = urb_low_bw, 2707e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .URBAllocation = cfg->n[GEN_L3P_URB], 2717e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#if !GEN_IS_HASWELL 2727e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .ALLAllocation = cfg->n[GEN_L3P_ALL], 2737e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#endif 2747e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .ROAllocation = cfg->n[GEN_L3P_RO], 2757e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .DCAllocation = cfg->n[GEN_L3P_DC]); 2767e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2777e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand anv_pack_struct(&l3cr3, GENX(L3CNTLREG3), 2787e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .ISAllocation = cfg->n[GEN_L3P_IS], 2797e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .ISLowBandwidth = 0, 2807e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .CAllocation = cfg->n[GEN_L3P_C], 2817e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .CLowBandwidth = 0, 2827e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .TAllocation = cfg->n[GEN_L3P_T], 2837e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .TLowBandwidth = 0); 2847e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2857e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand /* Set up the L3 partitioning. */ 2867e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand emit_lri(&cmd_buffer->batch, GENX(L3SQCREG1_num), l3sqcr1); 2877e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand emit_lri(&cmd_buffer->batch, GENX(L3CNTLREG2_num), l3cr2); 2887e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand emit_lri(&cmd_buffer->batch, GENX(L3CNTLREG3_num), l3cr3); 2897e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 2907e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#if GEN_IS_HASWELL 2917e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand if (cmd_buffer->device->instance->physicalDevice.cmd_parser_version >= 4) { 2927e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand /* Enable L3 atomics on HSW if we have a DC partition, otherwise keep 2937e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand * them disabled to avoid crashing the system hard. 2947e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand */ 2957e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand uint32_t scratch1, chicken3; 2967e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand anv_pack_struct(&scratch1, GENX(SCRATCH1), 2977e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .L3AtomicDisable = !has_dc); 2987e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand anv_pack_struct(&chicken3, GENX(CHICKEN3), 29989a96c8f43370cc84adf92ab32e3de302a1fa1d0Jason Ekstrand .L3AtomicDisableMask = true, 3007e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand .L3AtomicDisable = !has_dc); 3017e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand emit_lri(&cmd_buffer->batch, GENX(SCRATCH1_num), scratch1); 3027e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand emit_lri(&cmd_buffer->batch, GENX(CHICKEN3_num), chicken3); 3037e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand } 3047e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#endif 3057e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 3067e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand#endif 3077e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 3087e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand cmd_buffer->state.current_l3_config = cfg; 3097e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand} 3107e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand 3113a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrandvoid 3123a83c176eab8c513eb723554a240af1a7308d701Jason EkstrandgenX(cmd_buffer_apply_pipe_flushes)(struct anv_cmd_buffer *cmd_buffer) 3133a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand{ 3143a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand enum anv_pipe_bits bits = cmd_buffer->state.pending_pipe_bits; 3153a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3163a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand /* Flushes are pipelined while invalidations are handled immediately. 3173a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * Therefore, if we're flushing anything then we need to schedule a stall 3183a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * before any invalidations can happen. 3193a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand */ 3203a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand if (bits & ANV_PIPE_FLUSH_BITS) 3213a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits |= ANV_PIPE_NEEDS_CS_STALL_BIT; 3223a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3233a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand /* If we're going to do an invalidate and we have a pending CS stall that 3243a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * has yet to be resolved, we do the CS stall now. 3253a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand */ 3263a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand if ((bits & ANV_PIPE_INVALIDATE_BITS) && 3273a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand (bits & ANV_PIPE_NEEDS_CS_STALL_BIT)) { 3283a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits |= ANV_PIPE_CS_STALL_BIT; 3293a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits &= ~ANV_PIPE_NEEDS_CS_STALL_BIT; 3303a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand } 3313a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3323a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand if (bits & (ANV_PIPE_FLUSH_BITS | ANV_PIPE_CS_STALL_BIT)) { 3333a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pipe) { 3343a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.DepthCacheFlushEnable = bits & ANV_PIPE_DEPTH_CACHE_FLUSH_BIT; 3353a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.DCFlushEnable = bits & ANV_PIPE_DATA_CACHE_FLUSH_BIT; 3363a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.RenderTargetCacheFlushEnable = 3373a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits & ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; 3383a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3393a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.DepthStallEnable = bits & ANV_PIPE_DEPTH_STALL_BIT; 3403a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.CommandStreamerStallEnable = bits & ANV_PIPE_CS_STALL_BIT; 3413a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.StallAtPixelScoreboard = bits & ANV_PIPE_STALL_AT_SCOREBOARD_BIT; 3423a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3433a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand /* 3443a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * According to the Broadwell documentation, any PIPE_CONTROL with the 3453a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * "Command Streamer Stall" bit set must also have another bit set, 3463a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * with five different options: 3473a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * 3483a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * - Render Target Cache Flush 3493a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * - Depth Cache Flush 3503a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * - Stall at Pixel Scoreboard 3513a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * - Post-Sync Operation 3523a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * - Depth Stall 3533a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * - DC Flush Enable 3543a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * 3553a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * I chose "Stall at Pixel Scoreboard" since that's what we use in 3563a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand * mesa and it seems to work fine. The choice is fairly arbitrary. 3573a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand */ 3583a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand if ((bits & ANV_PIPE_CS_STALL_BIT) && 3593a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand !(bits & (ANV_PIPE_FLUSH_BITS | ANV_PIPE_DEPTH_STALL_BIT | 3603a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand ANV_PIPE_STALL_AT_SCOREBOARD_BIT))) 3613a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.StallAtPixelScoreboard = true; 3623a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand } 3633a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3643a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits &= ~(ANV_PIPE_FLUSH_BITS | ANV_PIPE_CS_STALL_BIT); 3653a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand } 3663a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3673a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand if (bits & ANV_PIPE_INVALIDATE_BITS) { 3683a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pipe) { 3693a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.StateCacheInvalidationEnable = 3703a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits & ANV_PIPE_STATE_CACHE_INVALIDATE_BIT; 3713a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.ConstantCacheInvalidationEnable = 3723a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits & ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT; 3733a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.VFCacheInvalidationEnable = 3743a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits & ANV_PIPE_VF_CACHE_INVALIDATE_BIT; 3753a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.TextureCacheInvalidationEnable = 3763a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits & ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT; 3773a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe.InstructionCacheInvalidateEnable = 3783a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits & ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT; 3793a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand } 3803a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3813a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand bits &= ~ANV_PIPE_INVALIDATE_BITS; 3823a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand } 3833a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3843a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand cmd_buffer->state.pending_pipe_bits = bits; 3853a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand} 3863a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 3876f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrandvoid genX(CmdPipelineBarrier)( 388a89a485e79ad40793a85979d86d45760362be21aJason Ekstrand VkCommandBuffer commandBuffer, 3896f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand VkPipelineStageFlags srcStageMask, 3906f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand VkPipelineStageFlags destStageMask, 3916f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand VkBool32 byRegion, 392c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand uint32_t memoryBarrierCount, 393c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand const VkMemoryBarrier* pMemoryBarriers, 394c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand uint32_t bufferMemoryBarrierCount, 395c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand const VkBufferMemoryBarrier* pBufferMemoryBarriers, 396c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand uint32_t imageMemoryBarrierCount, 397c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand const VkImageMemoryBarrier* pImageMemoryBarriers) 3986f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand{ 399a89a485e79ad40793a85979d86d45760362be21aJason Ekstrand ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 4003a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand uint32_t b; 4016f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 4026f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand /* XXX: Right now, we're really dumb and just flush whatever categories 4036f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * the app asks for. One of these days we may make this a bit better 4046f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * but right now that's all the hardware allows for in most areas. 4056f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand */ 406b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand VkAccessFlags src_flags = 0; 407b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand VkAccessFlags dst_flags = 0; 4086f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 409c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand for (uint32_t i = 0; i < memoryBarrierCount; i++) { 410c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand src_flags |= pMemoryBarriers[i].srcAccessMask; 411c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand dst_flags |= pMemoryBarriers[i].dstAccessMask; 412c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand } 413c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand 414c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand for (uint32_t i = 0; i < bufferMemoryBarrierCount; i++) { 415c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand src_flags |= pBufferMemoryBarriers[i].srcAccessMask; 416c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand dst_flags |= pBufferMemoryBarriers[i].dstAccessMask; 417c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand } 418c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand 419c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) { 420c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand src_flags |= pImageMemoryBarriers[i].srcAccessMask; 421c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand dst_flags |= pImageMemoryBarriers[i].dstAccessMask; 4226f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 4236f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 4243a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand enum anv_pipe_bits pipe_bits = 0; 4255e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 426924fbfc9a1fc46a3698fa23649e6dccc3e3e6782Jason Ekstrand for_each_bit(b, src_flags) { 427b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand switch ((VkAccessFlagBits)(1 << b)) { 428b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_SHADER_WRITE_BIT: 4293a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe_bits |= ANV_PIPE_DATA_CACHE_FLUSH_BIT; 4306f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 431b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT: 4323a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe_bits |= ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; 4336f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 434b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT: 4353a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe_bits |= ANV_PIPE_DEPTH_CACHE_FLUSH_BIT; 4366f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 437b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_TRANSFER_WRITE_BIT: 4383a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe_bits |= ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; 4393a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe_bits |= ANV_PIPE_DEPTH_CACHE_FLUSH_BIT; 4406f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 4416f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand default: 4423a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand break; /* Nothing to do */ 4436f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 4446f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 4456f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 446924fbfc9a1fc46a3698fa23649e6dccc3e3e6782Jason Ekstrand for_each_bit(b, dst_flags) { 447b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand switch ((VkAccessFlagBits)(1 << b)) { 448b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_INDIRECT_COMMAND_READ_BIT: 449b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_INDEX_READ_BIT: 450b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT: 4513a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe_bits |= ANV_PIPE_VF_CACHE_INVALIDATE_BIT; 4526f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 453b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_UNIFORM_READ_BIT: 4543a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe_bits |= ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT; 4553a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe_bits |= ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT; 4566f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 4573a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand case VK_ACCESS_SHADER_READ_BIT: 458b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_COLOR_ATTACHMENT_READ_BIT: 459b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_TRANSFER_READ_BIT: 4603a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand pipe_bits |= ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT; 461b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand break; 462b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand default: 4633a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand break; /* Nothing to do */ 4646f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 4656f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 4666f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 4673a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand cmd_buffer->state.pending_pipe_bits |= pipe_bits; 4686f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand} 469bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 47054324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrandstatic void 47154324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrandcmd_buffer_alloc_push_constants(struct anv_cmd_buffer *cmd_buffer) 47254324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand{ 47354324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand VkShaderStageFlags stages = cmd_buffer->state.pipeline->active_stages; 47454324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 47554324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand /* In order to avoid thrash, we assume that vertex and fragment stages 47654324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * always exist. In the rare case where one is missing *and* the other 47754324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * uses push concstants, this may be suboptimal. However, avoiding stalls 47854324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * seems more important. 47954324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand */ 48054324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand stages |= VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_VERTEX_BIT; 48154324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 48254324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand if (stages == cmd_buffer->state.push_constant_stages) 48354324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand return; 48454324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 48554324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand#if GEN_GEN >= 8 48654324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand const unsigned push_constant_kb = 32; 48754324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand#elif GEN_IS_HASWELL 48854324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand const unsigned push_constant_kb = cmd_buffer->device->info.gt == 3 ? 32 : 16; 48954324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand#else 49054324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand const unsigned push_constant_kb = 16; 49154324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand#endif 49254324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 49354324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand const unsigned num_stages = 49454324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand _mesa_bitcount(stages & VK_SHADER_STAGE_ALL_GRAPHICS); 49554324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand unsigned size_per_stage = push_constant_kb / num_stages; 49654324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 49754324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand /* Broadwell+ and Haswell gt3 require that the push constant sizes be in 49854324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * units of 2KB. Incidentally, these are the same platforms that have 49954324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * 32KB worth of push constant space. 50054324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand */ 50154324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand if (push_constant_kb == 32) 50254324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand size_per_stage &= ~1u; 50354324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 50454324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand uint32_t kb_used = 0; 50554324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand for (int i = MESA_SHADER_VERTEX; i < MESA_SHADER_FRAGMENT; i++) { 50654324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand unsigned push_size = (stages & (1 << i)) ? size_per_stage : 0; 50754324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, 50854324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand GENX(3DSTATE_PUSH_CONSTANT_ALLOC_VS), alloc) { 50954324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand alloc._3DCommandSubOpcode = 18 + i; 51054324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand alloc.ConstantBufferOffset = (push_size > 0) ? kb_used : 0; 51154324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand alloc.ConstantBufferSize = push_size; 51254324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand } 51354324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand kb_used += push_size; 51454324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand } 51554324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 51654324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, 51754324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand GENX(3DSTATE_PUSH_CONSTANT_ALLOC_PS), alloc) { 51854324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand alloc.ConstantBufferOffset = kb_used; 51954324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand alloc.ConstantBufferSize = push_constant_kb - kb_used; 52054324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand } 52154324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 52254324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand cmd_buffer->state.push_constant_stages = stages; 52354324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 52454324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand /* From the BDW PRM for 3DSTATE_PUSH_CONSTANT_ALLOC_VS: 52554324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * 52654324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * "The 3DSTATE_CONSTANT_VS must be reprogrammed prior to 52754324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * the next 3DPRIMITIVE command after programming the 52854324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * 3DSTATE_PUSH_CONSTANT_ALLOC_VS" 52954324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * 53054324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * Since 3DSTATE_PUSH_CONSTANT_ALLOC_VS is programmed as part of 53154324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * pipeline setup, we need to dirty push constants. 53254324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand */ 53354324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand cmd_buffer->state.push_constants_dirty |= VK_SHADER_STAGE_ALL_GRAPHICS; 53454324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand} 53554324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand 5362bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrandstatic void 5372bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrandcmd_buffer_emit_descriptor_pointers(struct anv_cmd_buffer *cmd_buffer, 5382bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand uint32_t stages) 5392bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand{ 5402bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand static const uint32_t sampler_state_opcodes[] = { 5412bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_VERTEX] = 43, 5422bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_TESS_CTRL] = 44, /* HS */ 5432bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_TESS_EVAL] = 45, /* DS */ 5442bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_GEOMETRY] = 46, 5452bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_FRAGMENT] = 47, 5462bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_COMPUTE] = 0, 5472bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand }; 5482bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand 5492bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand static const uint32_t binding_table_opcodes[] = { 5502bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_VERTEX] = 38, 5512bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_TESS_CTRL] = 39, 5522bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_TESS_EVAL] = 40, 5532bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_GEOMETRY] = 41, 5542bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_FRAGMENT] = 42, 5552bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand [MESA_SHADER_COMPUTE] = 0, 5562bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand }; 5572bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand 5582bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand anv_foreach_stage(s, stages) { 5592bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand if (cmd_buffer->state.samplers[s].alloc_size > 0) { 5602bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, 5612bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand GENX(3DSTATE_SAMPLER_STATE_POINTERS_VS), ssp) { 5622bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand ssp._3DCommandSubOpcode = sampler_state_opcodes[s]; 5632bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand ssp.PointertoVSSamplerState = cmd_buffer->state.samplers[s].offset; 5642bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand } 5652bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand } 5662bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand 5672bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand /* Always emit binding table pointers if we're asked to, since on SKL 5682bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand * this is what flushes push constants. */ 5692bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand anv_batch_emit(&cmd_buffer->batch, 5702bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand GENX(3DSTATE_BINDING_TABLE_POINTERS_VS), btp) { 5712bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand btp._3DCommandSubOpcode = binding_table_opcodes[s]; 5722bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand btp.PointertoVSBindingTable = cmd_buffer->state.binding_tables[s].offset; 5732bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand } 5742bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand } 5752bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand} 5762bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand 577248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrandstatic uint32_t 578248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrandcmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer) 579248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand{ 580248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand static const uint32_t push_constant_opcodes[] = { 581248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand [MESA_SHADER_VERTEX] = 21, 582248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand [MESA_SHADER_TESS_CTRL] = 25, /* HS */ 583248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand [MESA_SHADER_TESS_EVAL] = 26, /* DS */ 584248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand [MESA_SHADER_GEOMETRY] = 22, 585248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand [MESA_SHADER_FRAGMENT] = 23, 586248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand [MESA_SHADER_COMPUTE] = 0, 587248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand }; 588248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 589248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand VkShaderStageFlags flushed = 0; 590248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 591248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand anv_foreach_stage(stage, cmd_buffer->state.push_constants_dirty) { 592248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand if (stage == MESA_SHADER_COMPUTE) 593248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand continue; 594248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 595248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand struct anv_state state = anv_cmd_buffer_push_constants(cmd_buffer, stage); 596248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 597248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand if (state.offset == 0) { 59850018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_CONSTANT_VS), c) 59906fc7fa6842a5b36ed2a16d5a7ca72e516d5b245Jason Ekstrand c._3DCommandSubOpcode = push_constant_opcodes[stage]; 600248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand } else { 60150018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_CONSTANT_VS), c) { 60206fc7fa6842a5b36ed2a16d5a7ca72e516d5b245Jason Ekstrand c._3DCommandSubOpcode = push_constant_opcodes[stage], 60306fc7fa6842a5b36ed2a16d5a7ca72e516d5b245Jason Ekstrand c.ConstantBody = (struct GENX(3DSTATE_CONSTANT_BODY)) { 604248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#if GEN_GEN >= 9 60506fc7fa6842a5b36ed2a16d5a7ca72e516d5b245Jason Ekstrand .PointerToConstantBuffer2 = { &cmd_buffer->device->dynamic_state_block_pool.bo, state.offset }, 60606fc7fa6842a5b36ed2a16d5a7ca72e516d5b245Jason Ekstrand .ConstantBuffer2ReadLength = DIV_ROUND_UP(state.alloc_size, 32), 607248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#else 60806fc7fa6842a5b36ed2a16d5a7ca72e516d5b245Jason Ekstrand .PointerToConstantBuffer0 = { .offset = state.offset }, 60906fc7fa6842a5b36ed2a16d5a7ca72e516d5b245Jason Ekstrand .ConstantBuffer0ReadLength = DIV_ROUND_UP(state.alloc_size, 32), 610248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#endif 61106fc7fa6842a5b36ed2a16d5a7ca72e516d5b245Jason Ekstrand }; 61206fc7fa6842a5b36ed2a16d5a7ca72e516d5b245Jason Ekstrand } 613248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand } 614248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 615248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand flushed |= mesa_to_vk_shader_stage(stage); 616248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand } 617248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 618248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand cmd_buffer->state.push_constants_dirty &= ~VK_SHADER_STAGE_ALL_GRAPHICS; 619248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 620248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand return flushed; 621248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand} 622248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 623248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrandvoid 624248ab61740c4082517424f5aa94b2f4e7b210d76Jason EkstrandgenX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer) 625248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand{ 626248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand struct anv_pipeline *pipeline = cmd_buffer->state.pipeline; 627248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand uint32_t *p; 628248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 629248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand uint32_t vb_emit = cmd_buffer->state.vb_dirty & pipeline->vb_used; 630248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 631248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand assert((pipeline->active_stages & VK_SHADER_STAGE_COMPUTE_BIT) == 0); 632248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 6337e891f90c701aa1c851f1846857daa75bbb65876Jason Ekstrand genX(cmd_buffer_config_l3)(cmd_buffer, pipeline->urb.l3_config); 634248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 635248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand genX(flush_pipeline_select_3d)(cmd_buffer); 636248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 637248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand if (vb_emit) { 638248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand const uint32_t num_buffers = __builtin_popcount(vb_emit); 639248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand const uint32_t num_dwords = 1 + num_buffers * 4; 640248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 641248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand p = anv_batch_emitn(&cmd_buffer->batch, num_dwords, 642248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand GENX(3DSTATE_VERTEX_BUFFERS)); 643248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand uint32_t vb, i = 0; 644248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand for_each_bit(vb, vb_emit) { 645248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand struct anv_buffer *buffer = cmd_buffer->state.vertex_bindings[vb].buffer; 646248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand uint32_t offset = cmd_buffer->state.vertex_bindings[vb].offset; 647248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 648248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand struct GENX(VERTEX_BUFFER_STATE) state = { 649248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .VertexBufferIndex = vb, 650248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 651248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#if GEN_GEN >= 8 652248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .MemoryObjectControlState = GENX(MOCS), 653248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#else 654248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .BufferAccessType = pipeline->instancing_enable[vb] ? INSTANCEDATA : VERTEXDATA, 655248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .InstanceDataStepRate = 1, 656248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .VertexBufferMemoryObjectControlState = GENX(MOCS), 657248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#endif 658248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 659248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .AddressModifyEnable = true, 660248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .BufferPitch = pipeline->binding_stride[vb], 661248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .BufferStartingAddress = { buffer->bo, buffer->offset + offset }, 662248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 663248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#if GEN_GEN >= 8 664248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .BufferSize = buffer->size - offset 665248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#else 666248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand .EndAddress = { buffer->bo, buffer->offset + buffer->size - 1}, 667248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#endif 668248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand }; 669248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 670248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand GENX(VERTEX_BUFFER_STATE_pack)(&cmd_buffer->batch, &p[1 + i * 4], &state); 671248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand i++; 672248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand } 673248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand } 674248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 675248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand cmd_buffer->state.vb_dirty &= ~vb_emit; 676248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 677248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand if (cmd_buffer->state.dirty & ANV_CMD_DIRTY_PIPELINE) { 678248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand anv_batch_emit_batch(&cmd_buffer->batch, &pipeline->batch); 679248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 68035b53c8d47d3a0b53ee2549d73296d5db8e3cca0Jason Ekstrand /* The exact descriptor layout is pulled from the pipeline, so we need 68135b53c8d47d3a0b53ee2549d73296d5db8e3cca0Jason Ekstrand * to re-emit binding tables on every pipeline change. 68235b53c8d47d3a0b53ee2549d73296d5db8e3cca0Jason Ekstrand */ 68335b53c8d47d3a0b53ee2549d73296d5db8e3cca0Jason Ekstrand cmd_buffer->state.descriptors_dirty |= 68435b53c8d47d3a0b53ee2549d73296d5db8e3cca0Jason Ekstrand cmd_buffer->state.pipeline->active_stages; 68535b53c8d47d3a0b53ee2549d73296d5db8e3cca0Jason Ekstrand 68654324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand /* If the pipeline changed, we may need to re-allocate push constant 68754324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand * space in the URB. 688248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand */ 68954324877926caa28b8ebd89d95b4e7c2447d17b8Jason Ekstrand cmd_buffer_alloc_push_constants(cmd_buffer); 690248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand } 691248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 692248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#if GEN_GEN <= 7 693248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand if (cmd_buffer->state.descriptors_dirty & VK_SHADER_STAGE_VERTEX_BIT || 694248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand cmd_buffer->state.push_constants_dirty & VK_SHADER_STAGE_VERTEX_BIT) { 695248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand /* From the IVB PRM Vol. 2, Part 1, Section 3.2.1: 696248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * 697248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * "A PIPE_CONTROL with Post-Sync Operation set to 1h and a depth 698248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * stall needs to be sent just prior to any 3DSTATE_VS, 699248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * 3DSTATE_URB_VS, 3DSTATE_CONSTANT_VS, 700248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * 3DSTATE_BINDING_TABLE_POINTER_VS, 701248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * 3DSTATE_SAMPLER_STATE_POINTER_VS command. Only one 702248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * PIPE_CONTROL needs to be sent before any combination of VS 703248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * associated 3DSTATE." 704248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand */ 70550018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 70656453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.DepthStallEnable = true; 70756453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.PostSyncOperation = WriteImmediateData; 70856453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.Address = 70956453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand (struct anv_address) { &cmd_buffer->device->workaround_bo, 0 }; 71056453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 711248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand } 712248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#endif 713248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 714fe4e276b02615b5db8acbf4c65fcfa68982e2e0fJason Ekstrand /* Render targets live in the same binding table as fragment descriptors */ 715fe4e276b02615b5db8acbf4c65fcfa68982e2e0fJason Ekstrand if (cmd_buffer->state.dirty & ANV_CMD_DIRTY_RENDER_TARGETS) 716fe4e276b02615b5db8acbf4c65fcfa68982e2e0fJason Ekstrand cmd_buffer->state.descriptors_dirty |= VK_SHADER_STAGE_FRAGMENT_BIT; 717fe4e276b02615b5db8acbf4c65fcfa68982e2e0fJason Ekstrand 718248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand /* We emit the binding tables and sampler tables first, then emit push 719248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * constants and then finally emit binding table and sampler table 720248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * pointers. It has to happen in this order, since emitting the binding 721248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * tables may change the push constants (in case of storage images). After 722248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * emitting push constants, on SKL+ we have to emit the corresponding 723248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * 3DSTATE_BINDING_TABLE_POINTER_* for the push constants to take effect. 724248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand */ 725248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand uint32_t dirty = 0; 726248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand if (cmd_buffer->state.descriptors_dirty) 7279df4d6bb36268d5dd248b872611e3787de9608beJason Ekstrand dirty = anv_cmd_buffer_flush_descriptor_sets(cmd_buffer); 728248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 729248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand if (cmd_buffer->state.push_constants_dirty) { 730248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#if GEN_GEN >= 9 731248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand /* On Sky Lake and later, the binding table pointers commands are 732248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * what actually flush the changes to push constant state so we need 733248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand * to dirty them so they get re-emitted below. 734248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand */ 735248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand dirty |= cmd_buffer_flush_push_constants(cmd_buffer); 736248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#else 737248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand cmd_buffer_flush_push_constants(cmd_buffer); 738248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand#endif 739248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand } 740248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 741248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand if (dirty) 7422bfe0c33748b9fd96d48cb93656b6dc643bf024eJason Ekstrand cmd_buffer_emit_descriptor_pointers(cmd_buffer, dirty); 743248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 744eb6764c4a73006eee32e19e3afc6eab100a2ce16Jason Ekstrand if (cmd_buffer->state.dirty & ANV_CMD_DIRTY_DYNAMIC_VIEWPORT) 745248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand gen8_cmd_buffer_emit_viewport(cmd_buffer); 746eb6764c4a73006eee32e19e3afc6eab100a2ce16Jason Ekstrand 747eb6764c4a73006eee32e19e3afc6eab100a2ce16Jason Ekstrand if (cmd_buffer->state.dirty & (ANV_CMD_DIRTY_DYNAMIC_VIEWPORT | 748eb6764c4a73006eee32e19e3afc6eab100a2ce16Jason Ekstrand ANV_CMD_DIRTY_PIPELINE)) { 749eb6764c4a73006eee32e19e3afc6eab100a2ce16Jason Ekstrand gen8_cmd_buffer_emit_depth_viewport(cmd_buffer, 750eb6764c4a73006eee32e19e3afc6eab100a2ce16Jason Ekstrand pipeline->depth_clamp_enable); 7518a46b505cb2c7255ad430b56c1ce0dfa9c13c559Jason Ekstrand } 752248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 753248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand if (cmd_buffer->state.dirty & ANV_CMD_DIRTY_DYNAMIC_SCISSOR) 754248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand gen7_cmd_buffer_emit_scissor(cmd_buffer); 755248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 756248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand genX(cmd_buffer_flush_dynamic_state)(cmd_buffer); 7573a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand 7583a83c176eab8c513eb723554a240af1a7308d701Jason Ekstrand genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer); 759248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand} 760248ab61740c4082517424f5aa94b2f4e7b210d76Jason Ekstrand 761bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergstatic void 762bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergemit_base_vertex_instance_bo(struct anv_cmd_buffer *cmd_buffer, 763bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_bo *bo, uint32_t offset) 764bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 765bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t *p = anv_batch_emitn(&cmd_buffer->batch, 5, 766bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg GENX(3DSTATE_VERTEX_BUFFERS)); 767bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 768bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg GENX(VERTEX_BUFFER_STATE_pack)(&cmd_buffer->batch, p + 1, 769bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg &(struct GENX(VERTEX_BUFFER_STATE)) { 770bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexBufferIndex = 32, /* Reserved for this */ 771bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .AddressModifyEnable = true, 772bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BufferPitch = 0, 773371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if (GEN_GEN >= 8) 774bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .MemoryObjectControlState = GENX(MOCS), 775bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BufferStartingAddress = { bo, offset }, 776bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BufferSize = 8 777bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#else 778bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexBufferMemoryObjectControlState = GENX(MOCS), 779bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BufferStartingAddress = { bo, offset }, 780bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .EndAddress = { bo, offset + 8 }, 781bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#endif 782bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg }); 783bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 784bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 785bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergstatic void 786bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergemit_base_vertex_instance(struct anv_cmd_buffer *cmd_buffer, 787bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t base_vertex, uint32_t base_instance) 788bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 789bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_state id_state = 790bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, 8, 4); 791bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 792bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ((uint32_t *)id_state.map)[0] = base_vertex; 793bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ((uint32_t *)id_state.map)[1] = base_instance; 794bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 795bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg if (!cmd_buffer->device->info.has_llc) 796bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_state_clflush(id_state); 797bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 798bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance_bo(cmd_buffer, 799bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg &cmd_buffer->device->dynamic_state_block_pool.bo, id_state.offset); 800bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 801bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 802bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergvoid genX(CmdDraw)( 803bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkCommandBuffer commandBuffer, 804bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t vertexCount, 805bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t instanceCount, 806bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t firstVertex, 807bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t firstInstance) 808bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 809bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 810bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.pipeline; 8112b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg const struct brw_vs_prog_data *vs_prog_data = get_vs_prog_data(pipeline); 812bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 813bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg genX(cmd_buffer_flush_state)(cmd_buffer); 814bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 8152b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance) 816bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance(cmd_buffer, firstVertex, firstInstance); 817bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 81850018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) { 8191d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.VertexAccessType = SEQUENTIAL; 8201d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.PrimitiveTopologyType = pipeline->topology; 8211d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.VertexCountPerInstance = vertexCount; 8221d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.StartVertexLocation = firstVertex; 8231d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.InstanceCount = instanceCount; 8241d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.StartInstanceLocation = firstInstance; 8251d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.BaseVertexLocation = 0; 8261d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand } 827bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 828bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 829bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergvoid genX(CmdDrawIndexed)( 830bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkCommandBuffer commandBuffer, 831bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t indexCount, 832bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t instanceCount, 833bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t firstIndex, 834bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg int32_t vertexOffset, 835bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t firstInstance) 836bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 837bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 838bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.pipeline; 8392b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg const struct brw_vs_prog_data *vs_prog_data = get_vs_prog_data(pipeline); 840bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 841bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg genX(cmd_buffer_flush_state)(cmd_buffer); 842bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 8432b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance) 844bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance(cmd_buffer, vertexOffset, firstInstance); 845bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 84650018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) { 8471d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.VertexAccessType = RANDOM; 8481d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.PrimitiveTopologyType = pipeline->topology; 8491d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.VertexCountPerInstance = indexCount; 8501d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.StartVertexLocation = firstIndex; 8511d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.InstanceCount = instanceCount; 8521d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.StartInstanceLocation = firstInstance; 8531d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.BaseVertexLocation = vertexOffset; 8541d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand } 855bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 856bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 857bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg/* Auto-Draw / Indirect Registers */ 858bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_END_OFFSET 0x2420 859bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_START_VERTEX 0x2430 860bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_VERTEX_COUNT 0x2434 861bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_INSTANCE_COUNT 0x2438 862bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_START_INSTANCE 0x243C 863bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_BASE_VERTEX 0x2440 864bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 865bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergvoid genX(CmdDrawIndirect)( 866bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkCommandBuffer commandBuffer, 867bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkBuffer _buffer, 868bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkDeviceSize offset, 869bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t drawCount, 870bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t stride) 871bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 872bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 873bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); 874bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.pipeline; 8752b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg const struct brw_vs_prog_data *vs_prog_data = get_vs_prog_data(pipeline); 876bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_bo *bo = buffer->bo; 877bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t bo_offset = buffer->offset + offset; 878bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 879bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg genX(cmd_buffer_flush_state)(cmd_buffer); 880bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 8812b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance) 882bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 8); 883bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 884bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_VERTEX_COUNT, bo, bo_offset); 885bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_INSTANCE_COUNT, bo, bo_offset + 4); 886bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_START_VERTEX, bo, bo_offset + 8); 887bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_START_INSTANCE, bo, bo_offset + 12); 888bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lri(&cmd_buffer->batch, GEN7_3DPRIM_BASE_VERTEX, 0); 889bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 89050018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) { 8911d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.IndirectParameterEnable = true; 8921d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.VertexAccessType = SEQUENTIAL; 8931d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.PrimitiveTopologyType = pipeline->topology; 8941d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand } 895bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 896bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 897bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergvoid genX(CmdDrawIndexedIndirect)( 898bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkCommandBuffer commandBuffer, 899bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkBuffer _buffer, 900bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkDeviceSize offset, 901bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t drawCount, 902bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t stride) 903bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 904bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 905bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); 906bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.pipeline; 9072b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg const struct brw_vs_prog_data *vs_prog_data = get_vs_prog_data(pipeline); 908bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_bo *bo = buffer->bo; 909bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t bo_offset = buffer->offset + offset; 910bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 911bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg genX(cmd_buffer_flush_state)(cmd_buffer); 912bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 913bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg /* TODO: We need to stomp base vertex to 0 somehow */ 9142b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg if (vs_prog_data->uses_basevertex || vs_prog_data->uses_baseinstance) 915bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 12); 916bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 917bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_VERTEX_COUNT, bo, bo_offset); 918bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_INSTANCE_COUNT, bo, bo_offset + 4); 919bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_START_VERTEX, bo, bo_offset + 8); 920bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_BASE_VERTEX, bo, bo_offset + 12); 921bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_START_INSTANCE, bo, bo_offset + 16); 922bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 92350018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) { 9241d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.IndirectParameterEnable = true; 9251d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.VertexAccessType = RANDOM; 9261d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand prim.PrimitiveTopologyType = pipeline->topology; 9271d4d6852b469c5e726137953ce47d2ee6ed60bdaJason Ekstrand } 928bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 9296c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 9308dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen#if GEN_GEN == 7 9318dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen 9328dbfa265a439904628c2d875885e80bc45a90a05Jordan Justenstatic bool 9338dbfa265a439904628c2d875885e80bc45a90a05Jordan Justenverify_cmd_parser(const struct anv_device *device, 9348dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen int required_version, 9358dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen const char *function) 9368dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen{ 9378dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen if (device->instance->physicalDevice.cmd_parser_version < required_version) { 9388dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen vk_errorf(VK_ERROR_FEATURE_NOT_PRESENT, 9398dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen "cmd parser version %d is required for %s", 9408dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen required_version, function); 9418dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen return false; 9428dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen } else { 9438dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen return true; 9448dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen } 9458dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen} 9468dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen 9478dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen#endif 9486c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 9496c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsbergvoid genX(CmdDispatch)( 9506c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg VkCommandBuffer commandBuffer, 9516c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t x, 9526c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t y, 9536c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t z) 9546c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg{ 9556c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 9566c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.compute_pipeline; 9572b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg const struct brw_cs_prog_data *prog_data = get_cs_prog_data(pipeline); 9586c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 9596c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg if (prog_data->uses_num_work_groups) { 9606c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct anv_state state = 9616c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, 12, 4); 9626c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t *sizes = state.map; 9636c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg sizes[0] = x; 9646c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg sizes[1] = y; 9656c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg sizes[2] = z; 9666c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg if (!cmd_buffer->device->info.has_llc) 9676c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg anv_state_clflush(state); 9686c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg cmd_buffer->state.num_workgroups_offset = state.offset; 9696c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg cmd_buffer->state.num_workgroups_bo = 9706c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg &cmd_buffer->device->dynamic_state_block_pool.bo; 9716c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg } 9726c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 9736c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg genX(cmd_buffer_flush_compute_state)(cmd_buffer); 9746c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 97550018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(GPGPU_WALKER), ggw) { 976deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.SIMDSize = prog_data->simd_size / 16; 977deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.ThreadDepthCounterMaximum = 0; 978deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.ThreadHeightCounterMaximum = 0; 9791b79e7ebbd77a7e714fafadd91459059aacf2407Jordan Justen ggw.ThreadWidthCounterMaximum = prog_data->threads - 1; 980deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.ThreadGroupIDXDimension = x; 981deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.ThreadGroupIDYDimension = y; 982deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.ThreadGroupIDZDimension = z; 983deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.RightExecutionMask = pipeline->cs_right_mask; 984deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.BottomExecutionMask = 0xffffffff; 985deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand } 986deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand 98750018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(MEDIA_STATE_FLUSH), msf); 9886c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg} 9896c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 9906c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg#define GPGPU_DISPATCHDIMX 0x2500 9916c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg#define GPGPU_DISPATCHDIMY 0x2504 9926c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg#define GPGPU_DISPATCHDIMZ 0x2508 9936c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 99498cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#define MI_PREDICATE_SRC0 0x2400 99598cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#define MI_PREDICATE_SRC1 0x2408 99698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 9976c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsbergvoid genX(CmdDispatchIndirect)( 9986c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg VkCommandBuffer commandBuffer, 9996c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg VkBuffer _buffer, 10006c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg VkDeviceSize offset) 10016c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg{ 10026c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 10036c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); 10046c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.compute_pipeline; 10052b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg const struct brw_cs_prog_data *prog_data = get_cs_prog_data(pipeline); 10066c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct anv_bo *bo = buffer->bo; 10076c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t bo_offset = buffer->offset + offset; 1008da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen struct anv_batch *batch = &cmd_buffer->batch; 10096c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 10108dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen#if GEN_GEN == 7 10118dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen /* Linux 4.4 added command parser version 5 which allows the GPGPU 10128dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen * indirect dispatch registers to be written. 10138dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen */ 1014f56f538ce4753a6fdd969b610f35433fd657e4eeJordan Justen if (!verify_cmd_parser(cmd_buffer->device, 5, "vkCmdDispatchIndirect")) 10158dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen return; 10168dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen#endif 10178dbfa265a439904628c2d875885e80bc45a90a05Jordan Justen 10186c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg if (prog_data->uses_num_work_groups) { 10196c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg cmd_buffer->state.num_workgroups_offset = bo_offset; 10206c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg cmd_buffer->state.num_workgroups_bo = bo; 10216c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg } 10226c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 10236c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg genX(cmd_buffer_flush_compute_state)(cmd_buffer); 10246c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 1025da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen emit_lrm(batch, GPGPU_DISPATCHDIMX, bo, bo_offset); 1026da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen emit_lrm(batch, GPGPU_DISPATCHDIMY, bo, bo_offset + 4); 1027da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen emit_lrm(batch, GPGPU_DISPATCHDIMZ, bo, bo_offset + 8); 10286c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 102998cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#if GEN_GEN <= 7 103098cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* Clear upper 32-bits of SRC0 and all 64-bits of SRC1 */ 103198cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lri(batch, MI_PREDICATE_SRC0 + 4, 0); 103298cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lri(batch, MI_PREDICATE_SRC1 + 0, 0); 103398cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lri(batch, MI_PREDICATE_SRC1 + 4, 0); 103498cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 103598cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* Load compute_dispatch_indirect_x_size into SRC0 */ 103698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lrm(batch, MI_PREDICATE_SRC0, bo, bo_offset + 0); 103798cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 103898cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* predicate = (compute_dispatch_indirect_x_size == 0); */ 103950018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(MI_PREDICATE), mip) { 1040deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.LoadOperation = LOAD_LOAD; 1041deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.CombineOperation = COMBINE_SET; 1042deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.CompareOperation = COMPARE_SRCS_EQUAL; 1043deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand } 104498cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 104598cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* Load compute_dispatch_indirect_y_size into SRC0 */ 104698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lrm(batch, MI_PREDICATE_SRC0, bo, bo_offset + 4); 104798cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 104898cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* predicate |= (compute_dispatch_indirect_y_size == 0); */ 104950018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(MI_PREDICATE), mip) { 1050deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.LoadOperation = LOAD_LOAD; 1051deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.CombineOperation = COMBINE_OR; 1052deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.CompareOperation = COMPARE_SRCS_EQUAL; 1053deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand } 105498cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 105598cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* Load compute_dispatch_indirect_z_size into SRC0 */ 105698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lrm(batch, MI_PREDICATE_SRC0, bo, bo_offset + 8); 105798cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 105898cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* predicate |= (compute_dispatch_indirect_z_size == 0); */ 105950018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(MI_PREDICATE), mip) { 1060deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.LoadOperation = LOAD_LOAD; 1061deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.CombineOperation = COMBINE_OR; 1062deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.CompareOperation = COMPARE_SRCS_EQUAL; 1063deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand } 106498cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 106598cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* predicate = !predicate; */ 106698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#define COMPARE_FALSE 1 106750018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(MI_PREDICATE), mip) { 1068deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.LoadOperation = LOAD_LOADINV; 1069deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.CombineOperation = COMBINE_OR; 1070deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand mip.CompareOperation = COMPARE_FALSE; 1071deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand } 107298cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#endif 107398cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 107450018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(GPGPU_WALKER), ggw) { 1075deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.IndirectParameterEnable = true; 1076deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.PredicateEnable = GEN_GEN <= 7; 1077deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.SIMDSize = prog_data->simd_size / 16; 1078deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.ThreadDepthCounterMaximum = 0; 1079deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.ThreadHeightCounterMaximum = 0; 10801b79e7ebbd77a7e714fafadd91459059aacf2407Jordan Justen ggw.ThreadWidthCounterMaximum = prog_data->threads - 1; 1081deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.RightExecutionMask = pipeline->cs_right_mask; 1082deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ggw.BottomExecutionMask = 0xffffffff; 1083deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand } 1084deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand 108550018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(MEDIA_STATE_FLUSH), msf); 10866c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg} 1087832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg 1088c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justenstatic void 1089c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justenflush_pipeline_before_pipeline_select(struct anv_cmd_buffer *cmd_buffer, 1090c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen uint32_t pipeline) 1091c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen{ 1092c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen#if GEN_GEN >= 8 && GEN_GEN < 10 1093c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen /* From the Broadwell PRM, Volume 2a: Instructions, PIPELINE_SELECT: 1094c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen * 1095c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen * Software must clear the COLOR_CALC_STATE Valid field in 1096c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen * 3DSTATE_CC_STATE_POINTERS command prior to send a PIPELINE_SELECT 1097c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen * with Pipeline Select set to GPGPU. 1098c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen * 1099c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen * The internal hardware docs recommend the same workaround for Gen9 1100c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen * hardware too. 1101c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen */ 1102c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen if (pipeline == GPGPU) 110350018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_CC_STATE_POINTERS), t); 1104b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen#elif GEN_GEN <= 7 1105b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen /* From "BXML » GT » MI » vol1a GPU Overview » [Instruction] 1106b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen * PIPELINE_SELECT [DevBWR+]": 1107b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen * 1108b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen * Project: DEVSNB+ 1109b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen * 1110b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen * Software must ensure all the write caches are flushed through a 1111b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen * stalling PIPE_CONTROL command followed by another PIPE_CONTROL 1112b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen * command to invalidate read only caches prior to programming 1113b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen * MI_PIPELINE_SELECT command to change the Pipeline Select Mode. 1114b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen */ 111550018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 111656453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.RenderTargetCacheFlushEnable = true; 111756453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.DepthCacheFlushEnable = true; 111856453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.DCFlushEnable = true; 111956453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.PostSyncOperation = NoWrite; 112056453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.CommandStreamerStallEnable = true; 112156453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 1122b83785d86d2c7f07323920615c72a9f09695a9a7Jordan Justen 112350018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 112456453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.TextureCacheInvalidationEnable = true; 112556453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.ConstantCacheInvalidationEnable = true; 112656453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.StateCacheInvalidationEnable = true; 112756453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.InstructionCacheInvalidateEnable = true; 112856453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.PostSyncOperation = NoWrite; 112956453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 1130c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen#endif 1131c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen} 1132c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen 1133832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsbergvoid 1134832f73f512e9e6c21d495d7b07e229482371ef2fKristian HøgsberggenX(flush_pipeline_select_3d)(struct anv_cmd_buffer *cmd_buffer) 1135832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg{ 1136832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg if (cmd_buffer->state.current_pipeline != _3D) { 1137c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen flush_pipeline_before_pipeline_select(cmd_buffer, _3D); 1138c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen 113950018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT), ps) { 1140371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if GEN_GEN >= 9 1141deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ps.MaskBits = 3; 1142832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg#endif 1143deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ps.PipelineSelection = _3D; 1144deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand } 1145deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand 1146832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg cmd_buffer->state.current_pipeline = _3D; 1147832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg } 1148832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg} 114985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 11501b126305ded36f6b416ada08e29ff84faeafef99Jordan Justenvoid 11511b126305ded36f6b416ada08e29ff84faeafef99Jordan JustengenX(flush_pipeline_select_gpgpu)(struct anv_cmd_buffer *cmd_buffer) 11521b126305ded36f6b416ada08e29ff84faeafef99Jordan Justen{ 11531b126305ded36f6b416ada08e29ff84faeafef99Jordan Justen if (cmd_buffer->state.current_pipeline != GPGPU) { 1154c8ec65a1f5a85dbef3210dc49684fcfed49b7ea2Jordan Justen flush_pipeline_before_pipeline_select(cmd_buffer, GPGPU); 11551b126305ded36f6b416ada08e29ff84faeafef99Jordan Justen 115650018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT), ps) { 11571b126305ded36f6b416ada08e29ff84faeafef99Jordan Justen#if GEN_GEN >= 9 1158deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ps.MaskBits = 3; 11591b126305ded36f6b416ada08e29ff84faeafef99Jordan Justen#endif 1160deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand ps.PipelineSelection = GPGPU; 1161deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand } 1162deb13870d8a8e107efb636618ccb94edff0f60bfJason Ekstrand 11631b126305ded36f6b416ada08e29ff84faeafef99Jordan Justen cmd_buffer->state.current_pipeline = GPGPU; 11641b126305ded36f6b416ada08e29ff84faeafef99Jordan Justen } 11651b126305ded36f6b416ada08e29ff84faeafef99Jordan Justen} 11661b126305ded36f6b416ada08e29ff84faeafef99Jordan Justen 116721ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrandstruct anv_state 116821ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason EkstrandgenX(cmd_buffer_alloc_null_surface_state)(struct anv_cmd_buffer *cmd_buffer, 116921ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand struct anv_framebuffer *fb) 117021ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand{ 117121ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand struct anv_state state = 117221ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand anv_state_stream_alloc(&cmd_buffer->surface_state_stream, 64, 64); 117321ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand 117421ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand struct GENX(RENDER_SURFACE_STATE) null_ss = { 117521ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand .SurfaceType = SURFTYPE_NULL, 117621ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand .SurfaceArray = fb->layers > 0, 117721ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand .SurfaceFormat = ISL_FORMAT_R8G8B8A8_UNORM, 117821ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand#if GEN_GEN >= 8 117921ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand .TileMode = YMAJOR, 118021ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand#else 118121ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand .TiledSurface = true, 118221ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand#endif 118321ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand .Width = fb->width - 1, 118421ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand .Height = fb->height - 1, 118521ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand .Depth = fb->layers - 1, 118621ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand .RenderTargetViewExtent = fb->layers - 1, 118721ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand }; 118821ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand 118921ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand GENX(RENDER_SURFACE_STATE_pack)(NULL, state.map, &null_ss); 119021ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand 119121ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand if (!cmd_buffer->device->info.has_llc) 119221ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand anv_state_clflush(state); 119321ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand 119421ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand return state; 119521ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand} 119621ee5fd3263e034a54d7a37d9e5b6e6f9ef49f54Jason Ekstrand 119785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergstatic void 119885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergcmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer) 119985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 120085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg struct anv_device *device = cmd_buffer->device; 120185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const struct anv_framebuffer *fb = cmd_buffer->state.framebuffer; 120285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const struct anv_image_view *iview = 120385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_get_depth_stencil_view(cmd_buffer); 120485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const struct anv_image *image = iview ? iview->image : NULL; 1205234ecf26c65a8909e91313a8b35e2a8a8bbfc0efJason Ekstrand const bool has_depth = image && (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT); 1206234ecf26c65a8909e91313a8b35e2a8a8bbfc0efJason Ekstrand const bool has_stencil = 1207234ecf26c65a8909e91313a8b35e2a8a8bbfc0efJason Ekstrand image && (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT); 120885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 120985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* FIXME: Implement the PMA stall W/A */ 121085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* FIXME: Width and Height are wrong */ 121185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 121285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Emit 3DSTATE_DEPTH_BUFFER */ 121385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg if (has_depth) { 121450018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER), db) { 1215a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.SurfaceType = SURFTYPE_2D; 1216a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.DepthWriteEnable = true; 1217a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.StencilWriteEnable = has_stencil; 1218a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.HierarchicalDepthBufferEnable = false; 1219a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand 1220a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.SurfaceFormat = isl_surf_get_depth_format(&device->isl_dev, 1221a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand &image->depth_surface.isl); 1222a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand 1223a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.SurfaceBaseAddress = (struct anv_address) { 122485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .bo = image->bo, 122522d8666d74f6fa6de53366f76a56277976eced21Kristian Høgsberg .offset = image->offset + image->depth_surface.offset, 1226a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand }; 1227a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.DepthBufferObjectControlState = GENX(MOCS), 1228a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand 1229a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.SurfacePitch = image->depth_surface.isl.row_pitch - 1; 123020e95a746df34923eb4aac5e7f1ab6d722432d89Jason Ekstrand db.Height = image->extent.height - 1; 123120e95a746df34923eb4aac5e7f1ab6d722432d89Jason Ekstrand db.Width = image->extent.width - 1; 123220e95a746df34923eb4aac5e7f1ab6d722432d89Jason Ekstrand db.LOD = iview->base_mip; 123320e95a746df34923eb4aac5e7f1ab6d722432d89Jason Ekstrand db.Depth = image->array_size - 1; /* FIXME: 3-D */ 123420e95a746df34923eb4aac5e7f1ab6d722432d89Jason Ekstrand db.MinimumArrayElement = iview->base_layer; 1235a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand 1236371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if GEN_GEN >= 8 1237a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.SurfaceQPitch = 1238a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand isl_surf_get_array_pitch_el_rows(&image->depth_surface.isl) >> 2, 123985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg#endif 1240a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.RenderTargetViewExtent = 1 - 1; 1241a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand } 124285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg } else { 124385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Even when no depth buffer is present, the hardware requires that 124485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH_BUFFER be programmed correctly. The Broadwell PRM says: 124585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 124685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * If a null depth buffer is bound, the driver must instead bind depth as: 124785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.SurfaceType = SURFTYPE_2D 124885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.Width = 1 124985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.Height = 1 125085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.SuraceFormat = D16_UNORM 125185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.SurfaceBaseAddress = 0 125285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.HierarchicalDepthBufferEnable = 0 125385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_WM_DEPTH_STENCIL.DepthTestEnable = 0 125485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_WM_DEPTH_STENCIL.DepthBufferWriteEnable = 0 125585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 125685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * The PRM is wrong, though. The width and height must be programmed to 125785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * actual framebuffer's width and height, even when neither depth buffer 12587c1660aa14094e40fba9f39ce194cb6238311b65Jason Ekstrand * nor stencil buffer is present. Also, D16_UNORM is not allowed to 12597c1660aa14094e40fba9f39ce194cb6238311b65Jason Ekstrand * be combined with a stencil buffer so we use D32_FLOAT instead. 126085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg */ 126150018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER), db) { 1262a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.SurfaceType = SURFTYPE_2D; 1263a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.SurfaceFormat = D32_FLOAT; 1264a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.Width = fb->width - 1; 1265a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.Height = fb->height - 1; 1266a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand db.StencilWriteEnable = has_stencil; 1267a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand } 126885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg } 126985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 127085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Emit 3DSTATE_STENCIL_BUFFER */ 127185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg if (has_stencil) { 127250018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_STENCIL_BUFFER), sb) { 1273371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if GEN_GEN >= 8 || GEN_IS_HASWELL 1274a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand sb.StencilBufferEnable = true, 127585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg#endif 1276a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand sb.StencilBufferObjectControlState = GENX(MOCS), 127785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 12780bd3a7e931b0cfd5aa81f37c43c330d6ae656a49Jason Ekstrand sb.SurfacePitch = image->stencil_surface.isl.row_pitch - 1, 127985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 1280371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if GEN_GEN >= 8 1281a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand sb.SurfaceQPitch = isl_surf_get_array_pitch_el_rows(&image->stencil_surface.isl) >> 2, 128285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg#endif 1283a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand sb.SurfaceBaseAddress = (struct anv_address) { 128485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .bo = image->bo, 128585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .offset = image->offset + image->stencil_surface.offset, 1286a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand }; 1287a71ded0e1847d9d20c11de2fbaea271724170dc8Jason Ekstrand } 128885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg } else { 128950018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_STENCIL_BUFFER), sb); 129085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg } 129185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 129285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Disable hierarchial depth buffers. */ 129350018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_HIER_DEPTH_BUFFER), hz); 129485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 129585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Clear the clear params. */ 129650018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_CLEAR_PARAMS), cp); 129785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 129885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 1299b548fdbed5c16f5c0dfc26f65b0037a85c567735Jason Ekstrandstatic void 130085f67cf16e9823c858215e8a7359d18762c2653cKristian HøgsberggenX(cmd_buffer_set_subpass)(struct anv_cmd_buffer *cmd_buffer, 130185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg struct anv_subpass *subpass) 130285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 130385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg cmd_buffer->state.subpass = subpass; 130485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 1305fe4e276b02615b5db8acbf4c65fcfa68982e2e0fJason Ekstrand cmd_buffer->state.dirty |= ANV_CMD_DIRTY_RENDER_TARGETS; 130685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 130785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg cmd_buffer_emit_depth_stencil(cmd_buffer); 130885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 130985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 131085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergvoid genX(CmdBeginRenderPass)( 131185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkCommandBuffer commandBuffer, 131285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const VkRenderPassBeginInfo* pRenderPassBegin, 131385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkSubpassContents contents) 131485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 131585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 131685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_render_pass, pass, pRenderPassBegin->renderPass); 131785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_framebuffer, framebuffer, pRenderPassBegin->framebuffer); 131885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 131985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg cmd_buffer->state.framebuffer = framebuffer; 132085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg cmd_buffer->state.pass = pass; 1321b26bd6790dd1b09e377bd926e9145ec20ce6ac3fJason Ekstrand cmd_buffer->state.render_area = pRenderPassBegin->renderArea; 132285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_state_setup_attachments(cmd_buffer, pRenderPassBegin); 132385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 132485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg genX(flush_pipeline_select_3d)(cmd_buffer); 132585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 132685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg genX(cmd_buffer_set_subpass)(cmd_buffer, pass->subpasses); 132785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_clear_subpass(cmd_buffer); 132885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 132985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 133085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergvoid genX(CmdNextSubpass)( 133185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkCommandBuffer commandBuffer, 133285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkSubpassContents contents) 133385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 133485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 133585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 133685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg assert(cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY); 133785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 133885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_resolve_subpass(cmd_buffer); 133985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg genX(cmd_buffer_set_subpass)(cmd_buffer, cmd_buffer->state.subpass + 1); 134085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_clear_subpass(cmd_buffer); 134185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 134285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 134385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergvoid genX(CmdEndRenderPass)( 134485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkCommandBuffer commandBuffer) 134585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 134685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 134785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 134885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_resolve_subpass(cmd_buffer); 1349ac7eeebce4ae9107863623321b74b1c08389f180Jason Ekstrand 1350ac7eeebce4ae9107863623321b74b1c08389f180Jason Ekstrand#ifndef NDEBUG 1351ac7eeebce4ae9107863623321b74b1c08389f180Jason Ekstrand anv_dump_add_framebuffer(cmd_buffer, cmd_buffer->state.framebuffer); 1352ac7eeebce4ae9107863623321b74b1c08389f180Jason Ekstrand#endif 135385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 135481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 135581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenstatic void 135681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenemit_ps_depth_count(struct anv_batch *batch, 135781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen struct anv_bo *bo, uint32_t offset) 135881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen{ 135950018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(PIPE_CONTROL), pc) { 136056453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.DestinationAddressType = DAT_PPGTT; 136156453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.PostSyncOperation = WritePSDepthCount; 136256453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.DepthStallEnable = true; 136356453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.Address = (struct anv_address) { bo, offset }; 136456453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 136581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen} 136681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 136781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenstatic void 136881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenemit_query_availability(struct anv_batch *batch, 136981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen struct anv_bo *bo, uint32_t offset) 137081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen{ 137150018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(PIPE_CONTROL), pc) { 137256453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.DestinationAddressType = DAT_PPGTT; 137356453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.PostSyncOperation = WriteImmediateData; 137456453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.Address = (struct anv_address) { bo, offset }; 137556453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.ImmediateData = 1; 137656453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 137781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen} 137881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 137981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenvoid genX(CmdBeginQuery)( 138081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkCommandBuffer commandBuffer, 138181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkQueryPool queryPool, 138281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen uint32_t query, 138381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkQueryControlFlags flags) 138481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen{ 138581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 138681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen ANV_FROM_HANDLE(anv_query_pool, pool, queryPool); 138781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 138881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen /* Workaround: When meta uses the pipeline with the VS disabled, it seems 138981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen * that the pipelining of the depth write breaks. What we see is that 139081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen * samples from the render pass clear leaks into the first query 139181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen * immediately after the clear. Doing a pipecontrol with a post-sync 139281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen * operation and DepthStallEnable seems to work around the issue. 139381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen */ 139481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen if (cmd_buffer->state.need_query_wa) { 139581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen cmd_buffer->state.need_query_wa = false; 139650018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 139756453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.DepthCacheFlushEnable = true; 139856453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.DepthStallEnable = true; 139956453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 140081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen } 140181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 140281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen switch (pool->type) { 140381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen case VK_QUERY_TYPE_OCCLUSION: 140481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen emit_ps_depth_count(&cmd_buffer->batch, &pool->bo, 140581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen query * sizeof(struct anv_query_pool_slot)); 140681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen break; 140781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 140881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen case VK_QUERY_TYPE_PIPELINE_STATISTICS: 140981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen default: 141081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen unreachable(""); 141181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen } 141281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen} 141381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 141481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenvoid genX(CmdEndQuery)( 141581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkCommandBuffer commandBuffer, 141681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkQueryPool queryPool, 141781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen uint32_t query) 141881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen{ 141981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 142081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen ANV_FROM_HANDLE(anv_query_pool, pool, queryPool); 142181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 142281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen switch (pool->type) { 142381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen case VK_QUERY_TYPE_OCCLUSION: 142481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen emit_ps_depth_count(&cmd_buffer->batch, &pool->bo, 142581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen query * sizeof(struct anv_query_pool_slot) + 8); 142681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 142781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen emit_query_availability(&cmd_buffer->batch, &pool->bo, 142881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen query * sizeof(struct anv_query_pool_slot) + 16); 142981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen break; 143081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 143181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen case VK_QUERY_TYPE_PIPELINE_STATISTICS: 143281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen default: 143381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen unreachable(""); 143481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen } 143581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen} 143681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 143781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define TIMESTAMP 0x2358 143881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 143981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenvoid genX(CmdWriteTimestamp)( 144081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkCommandBuffer commandBuffer, 144181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkPipelineStageFlagBits pipelineStage, 144281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkQueryPool queryPool, 144381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen uint32_t query) 144481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen{ 144581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 144681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen ANV_FROM_HANDLE(anv_query_pool, pool, queryPool); 144781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen uint32_t offset = query * sizeof(struct anv_query_pool_slot); 144881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 144981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen assert(pool->type == VK_QUERY_TYPE_TIMESTAMP); 145081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 145181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen switch (pipelineStage) { 145281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen case VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT: 145350018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_REGISTER_MEM), srm) { 14548a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand srm.RegisterAddress = TIMESTAMP; 14558a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand srm.MemoryAddress = (struct anv_address) { &pool->bo, offset }; 14568a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand } 145750018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_REGISTER_MEM), srm) { 14588a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand srm.RegisterAddress = TIMESTAMP + 4; 14598a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand srm.MemoryAddress = (struct anv_address) { &pool->bo, offset + 4 }; 14608a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand } 146181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen break; 146281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 146381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen default: 146481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen /* Everything else is bottom-of-pipe */ 146550018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 14668a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand pc.DestinationAddressType = DAT_PPGTT, 14678a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand pc.PostSyncOperation = WriteTimestamp, 14688a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand pc.Address = (struct anv_address) { &pool->bo, offset }; 14698a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand } 147081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen break; 147181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen } 147281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 147381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen emit_query_availability(&cmd_buffer->batch, &pool->bo, query + 16); 147481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen} 147581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 147681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#if GEN_GEN > 7 || GEN_IS_HASWELL 147781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 147881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define alu_opcode(v) __gen_uint((v), 20, 31) 147981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define alu_operand1(v) __gen_uint((v), 10, 19) 148081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define alu_operand2(v) __gen_uint((v), 0, 9) 148181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define alu(opcode, operand1, operand2) \ 148281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen alu_opcode(opcode) | alu_operand1(operand1) | alu_operand2(operand2) 148381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 148481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_NOOP 0x000 148581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_LOAD 0x080 148681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_LOADINV 0x480 148781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_LOAD0 0x081 148881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_LOAD1 0x481 148981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_ADD 0x100 149081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_SUB 0x101 149181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_AND 0x102 149281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_OR 0x103 149381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_XOR 0x104 149481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_STORE 0x180 149581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPCODE_STOREINV 0x580 149681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 149781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_R0 0x00 149881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_R1 0x01 149981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_R2 0x02 150081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_R3 0x03 150181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_R4 0x04 150281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_SRCA 0x20 150381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_SRCB 0x21 150481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_ACCU 0x31 150581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_ZF 0x32 150681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define OPERAND_CF 0x33 150781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 150881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#define CS_GPR(n) (0x2600 + (n) * 8) 150981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 151081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenstatic void 151181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenemit_load_alu_reg_u64(struct anv_batch *batch, uint32_t reg, 151281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen struct anv_bo *bo, uint32_t offset) 151381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen{ 151450018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_MEM), lrm) { 15158a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand lrm.RegisterAddress = reg, 15168a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand lrm.MemoryAddress = (struct anv_address) { bo, offset }; 15178a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand } 151850018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_MEM), lrm) { 15198a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand lrm.RegisterAddress = reg + 4; 15208a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand lrm.MemoryAddress = (struct anv_address) { bo, offset + 4 }; 15218a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand } 152281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen} 152381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 152481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenstatic void 152581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenstore_query_result(struct anv_batch *batch, uint32_t reg, 152681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen struct anv_bo *bo, uint32_t offset, VkQueryResultFlags flags) 152781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen{ 152850018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(MI_STORE_REGISTER_MEM), srm) { 15298a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand srm.RegisterAddress = reg; 15308a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand srm.MemoryAddress = (struct anv_address) { bo, offset }; 15318a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand } 15328a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand 15338a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand if (flags & VK_QUERY_RESULT_64_BIT) { 153450018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(batch, GENX(MI_STORE_REGISTER_MEM), srm) { 15358a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand srm.RegisterAddress = reg + 4; 15368a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand srm.MemoryAddress = (struct anv_address) { bo, offset + 4 }; 15378a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand } 15388a6ced83e9e936c4c29854148940025c20cd831eJason Ekstrand } 153981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen} 154081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 154181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justenvoid genX(CmdCopyQueryPoolResults)( 154281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkCommandBuffer commandBuffer, 154381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkQueryPool queryPool, 154481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen uint32_t firstQuery, 154581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen uint32_t queryCount, 154681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkBuffer destBuffer, 154781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkDeviceSize destOffset, 154881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkDeviceSize destStride, 154981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen VkQueryResultFlags flags) 155081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen{ 155181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 155281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen ANV_FROM_HANDLE(anv_query_pool, pool, queryPool); 155381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen ANV_FROM_HANDLE(anv_buffer, buffer, destBuffer); 155481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen uint32_t slot_offset, dst_offset; 155581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 155656453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand if (flags & VK_QUERY_RESULT_WAIT_BIT) { 155750018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) { 155856453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.CommandStreamerStallEnable = true; 155956453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand pc.StallAtPixelScoreboard = true; 156056453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 156156453eeaff92fdd39cc0818afd96a373899d58f8Jason Ekstrand } 156281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 156381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen dst_offset = buffer->offset + destOffset; 156481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen for (uint32_t i = 0; i < queryCount; i++) { 156581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 156681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen slot_offset = (firstQuery + i) * sizeof(struct anv_query_pool_slot); 156781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen switch (pool->type) { 156881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen case VK_QUERY_TYPE_OCCLUSION: 156981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen emit_load_alu_reg_u64(&cmd_buffer->batch, 157081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen CS_GPR(0), &pool->bo, slot_offset); 157181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen emit_load_alu_reg_u64(&cmd_buffer->batch, 157281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen CS_GPR(1), &pool->bo, slot_offset + 8); 157381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 157481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen /* FIXME: We need to clamp the result for 32 bit. */ 157581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 157681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen uint32_t *dw = anv_batch_emitn(&cmd_buffer->batch, 5, GENX(MI_MATH)); 157781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen dw[1] = alu(OPCODE_LOAD, OPERAND_SRCA, OPERAND_R1); 157881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen dw[2] = alu(OPCODE_LOAD, OPERAND_SRCB, OPERAND_R0); 157981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen dw[3] = alu(OPCODE_SUB, 0, 0); 158081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen dw[4] = alu(OPCODE_STORE, OPERAND_R2, OPERAND_ACCU); 158181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen break; 158281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 158381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen case VK_QUERY_TYPE_TIMESTAMP: 158481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen emit_load_alu_reg_u64(&cmd_buffer->batch, 158581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen CS_GPR(2), &pool->bo, slot_offset); 158681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen break; 158781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 158881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen default: 158981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen unreachable("unhandled query type"); 159081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen } 159181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 159281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen store_query_result(&cmd_buffer->batch, 159381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen CS_GPR(2), buffer->bo, dst_offset, flags); 159481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 159581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen if (flags & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) { 159681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen emit_load_alu_reg_u64(&cmd_buffer->batch, CS_GPR(0), 159781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen &pool->bo, slot_offset + 16); 159881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen if (flags & VK_QUERY_RESULT_64_BIT) 159981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen store_query_result(&cmd_buffer->batch, 160081f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen CS_GPR(0), buffer->bo, dst_offset + 8, flags); 160181f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen else 160281f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen store_query_result(&cmd_buffer->batch, 160381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen CS_GPR(0), buffer->bo, dst_offset + 4, flags); 160481f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen } 160581f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 160681f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen dst_offset += destStride; 160781f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen } 160881f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen} 160981f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen 1610b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand#else 1611b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrandvoid genX(CmdCopyQueryPoolResults)( 1612b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand VkCommandBuffer commandBuffer, 1613b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand VkQueryPool queryPool, 1614b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand uint32_t firstQuery, 1615b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand uint32_t queryCount, 1616b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand VkBuffer destBuffer, 1617b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand VkDeviceSize destOffset, 1618b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand VkDeviceSize destStride, 1619b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand VkQueryResultFlags flags) 1620b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand{ 1621b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand anv_finishme("Queries not yet supported on Ivy Bridge"); 1622b9e99282a6e1b3b2b01645e37bf4b735aace677bJason Ekstrand} 162381f30e2f509b4fcd79376ff02363aba831918ac6Jordan Justen#endif 1624