genX_cmd_buffer.c revision 98cdce1ce4737cf09c5d9613a85bb118f0f1757b
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 29371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#include "genxml/gen_macros.h" 30371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#include "genxml/genX_pack.h" 316f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 326f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrandvoid 336f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason EkstrandgenX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) 346f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand{ 356f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand struct anv_device *device = cmd_buffer->device; 366f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand struct anv_bo *scratch_bo = NULL; 376f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 386f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand cmd_buffer->state.scratch_size = 396f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand anv_block_pool_size(&device->scratch_block_pool); 406f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand if (cmd_buffer->state.scratch_size > 0) 416f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand scratch_bo = &device->scratch_block_pool.bo; 426f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 436f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand/* XXX: Do we need this on more than just BDW? */ 44371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if (GEN_GEN >= 8) 456f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand /* Emit a render target cache flush. 466f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 476f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * This isn't documented anywhere in the PRM. However, it seems to be 486f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * necessary prior to changing the surface state base adress. Without 496f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * this, we get GPU hangs when using multi-level command buffers which 506f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * clear depth, reset state base address, and then go render stuff. 516f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand */ 52ac60e98a582737897b6e1f858023eba0543d10f3Kristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), 536f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .RenderTargetCacheFlushEnable = true); 546f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand#endif 556f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 566f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(STATE_BASE_ADDRESS), 576f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .GeneralStateBaseAddress = { scratch_bo, 0 }, 586f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .GeneralStateMemoryObjectControlState = GENX(MOCS), 596f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .GeneralStateBaseAddressModifyEnable = true, 606f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 616f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .SurfaceStateBaseAddress = anv_cmd_buffer_surface_base_address(cmd_buffer), 626f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .SurfaceStateMemoryObjectControlState = GENX(MOCS), 636f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .SurfaceStateBaseAddressModifyEnable = true, 646f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 656f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .DynamicStateBaseAddress = { &device->dynamic_state_block_pool.bo, 0 }, 666f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .DynamicStateMemoryObjectControlState = GENX(MOCS), 676f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .DynamicStateBaseAddressModifyEnable = true, 686f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 696f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .IndirectObjectBaseAddress = { NULL, 0 }, 706f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .IndirectObjectMemoryObjectControlState = GENX(MOCS), 716f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .IndirectObjectBaseAddressModifyEnable = true, 726f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 736f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .InstructionBaseAddress = { &device->instruction_block_pool.bo, 0 }, 746f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .InstructionMemoryObjectControlState = GENX(MOCS), 756f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .InstructionBaseAddressModifyEnable = true, 766f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 77371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand# if (GEN_GEN >= 8) 786f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand /* Broadwell requires that we specify a buffer size for a bunch of 796f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * these fields. However, since we will be growing the BO's live, we 806f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * just set them all to the maximum. 816f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand */ 826f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .GeneralStateBufferSize = 0xfffff, 836f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .GeneralStateBufferSizeModifyEnable = true, 846f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .DynamicStateBufferSize = 0xfffff, 856f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .DynamicStateBufferSizeModifyEnable = true, 866f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .IndirectObjectBufferSize = 0xfffff, 876f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .IndirectObjectBufferSizeModifyEnable = true, 886f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .InstructionBufferSize = 0xfffff, 896f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .InstructionBuffersizeModifyEnable = true, 906f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand# endif 916f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand ); 926f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 936f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand /* After re-setting the surface state base address, we have to do some 946f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * cache flusing so that the sampler engine will pick up the new 956f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * SURFACE_STATE objects and binding tables. From the Broadwell PRM, 966f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Shared Function > 3D Sampler > State > State Caching (page 96): 976f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 986f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Coherency with system memory in the state cache, like the texture 996f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * cache is handled partially by software. It is expected that the 1006f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * command stream or shader will issue Cache Flush operation or 1016f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Cache_Flush sampler message to ensure that the L1 cache remains 1026f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * coherent with system memory. 1036f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1046f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * [...] 1056f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1066f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Whenever the value of the Dynamic_State_Base_Addr, 1076f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Surface_State_Base_Addr are altered, the L1 state cache must be 1086f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * invalidated to ensure the new surface or sampler state is fetched 1096f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * from system memory. 1106f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1116f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * The PIPE_CONTROL command has a "State Cache Invalidation Enable" bit 1126f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * which, according the PIPE_CONTROL instruction documentation in the 1136f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Broadwell PRM: 1146f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1156f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Setting this bit is independent of any other bit in this packet. 1166f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * This bit controls the invalidation of the L1 and L2 state caches 1176f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * at the top of the pipe i.e. at the parsing time. 1186f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1196f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * Unfortunately, experimentation seems to indicate that state cache 1206f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * invalidation through a PIPE_CONTROL does nothing whatsoever in 1216f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * regards to surface state and binding tables. In stead, it seems that 1226f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * invalidating the texture cache is what is actually needed. 1236f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * 1246f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * XXX: As far as we have been able to determine through 1256f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * experimentation, shows that flush the texture cache appears to be 1266f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * sufficient. The theory here is that all of the sampling/rendering 1276f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * units cache the binding table in the texture cache. However, we have 1286f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * yet to be able to actually confirm this. 1296f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand */ 1306f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), 1316f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand .TextureCacheInvalidationEnable = true); 1326f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand} 1336f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 1346f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrandvoid genX(CmdPipelineBarrier)( 135a89a485e79ad40793a85979d86d45760362be21aJason Ekstrand VkCommandBuffer commandBuffer, 1366f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand VkPipelineStageFlags srcStageMask, 1376f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand VkPipelineStageFlags destStageMask, 1386f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand VkBool32 byRegion, 139c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand uint32_t memoryBarrierCount, 140c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand const VkMemoryBarrier* pMemoryBarriers, 141c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand uint32_t bufferMemoryBarrierCount, 142c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand const VkBufferMemoryBarrier* pBufferMemoryBarriers, 143c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand uint32_t imageMemoryBarrierCount, 144c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand const VkImageMemoryBarrier* pImageMemoryBarriers) 1456f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand{ 146a89a485e79ad40793a85979d86d45760362be21aJason Ekstrand ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 1476f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand uint32_t b, *dw; 1486f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 1496f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand /* XXX: Right now, we're really dumb and just flush whatever categories 1506f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * the app asks for. One of these days we may make this a bit better 1516f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand * but right now that's all the hardware allows for in most areas. 1526f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand */ 153b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand VkAccessFlags src_flags = 0; 154b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand VkAccessFlags dst_flags = 0; 1556f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 156c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand for (uint32_t i = 0; i < memoryBarrierCount; i++) { 157c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand src_flags |= pMemoryBarriers[i].srcAccessMask; 158c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand dst_flags |= pMemoryBarriers[i].dstAccessMask; 159c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand } 160c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand 161c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand for (uint32_t i = 0; i < bufferMemoryBarrierCount; i++) { 162c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand src_flags |= pBufferMemoryBarriers[i].srcAccessMask; 163c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand dst_flags |= pBufferMemoryBarriers[i].dstAccessMask; 164c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand } 165c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand 166c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) { 167c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand src_flags |= pImageMemoryBarriers[i].srcAccessMask; 168c310fb032d406984e72895b6c94e2f96bff8e70dJason Ekstrand dst_flags |= pImageMemoryBarriers[i].dstAccessMask; 1696f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 1706f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 1715e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg /* Mask out the Source access flags we care about */ 1725e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg const uint32_t src_mask = 1735e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_SHADER_WRITE_BIT | 1745e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | 1755e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | 1765e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_TRANSFER_WRITE_BIT; 1775e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 1785e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg src_flags = src_flags & src_mask; 1795e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 1805e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg /* Mask out the destination access flags we care about */ 1815e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg const uint32_t dst_mask = 1825e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_INDIRECT_COMMAND_READ_BIT | 1835e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_INDEX_READ_BIT | 1845e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | 1855e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_UNIFORM_READ_BIT | 1865e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_SHADER_READ_BIT | 1875e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | 1885e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg VK_ACCESS_TRANSFER_READ_BIT; 1895e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 1905e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg dst_flags = dst_flags & dst_mask; 1915e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 192924fbfc9a1fc46a3698fa23649e6dccc3e3e6782Jason Ekstrand /* The src flags represent how things were used previously. This is 193924fbfc9a1fc46a3698fa23649e6dccc3e3e6782Jason Ekstrand * what we use for doing flushes. 194924fbfc9a1fc46a3698fa23649e6dccc3e3e6782Jason Ekstrand */ 1955e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg struct GENX(PIPE_CONTROL) flush_cmd = { 1965e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg GENX(PIPE_CONTROL_header), 1975e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg .PostSyncOperation = NoWrite, 1985e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg }; 1995e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 200924fbfc9a1fc46a3698fa23649e6dccc3e3e6782Jason Ekstrand for_each_bit(b, src_flags) { 201b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand switch ((VkAccessFlagBits)(1 << b)) { 202b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_SHADER_WRITE_BIT: 2035e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg flush_cmd.DCFlushEnable = true; 2046f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 205b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT: 2065e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg flush_cmd.RenderTargetCacheFlushEnable = true; 2076f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 208b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT: 2095e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg flush_cmd.DepthCacheFlushEnable = true; 2106f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 211b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_TRANSFER_WRITE_BIT: 2125e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg flush_cmd.RenderTargetCacheFlushEnable = true; 2135e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg flush_cmd.DepthCacheFlushEnable = true; 2146f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 2156f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand default: 2165e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg unreachable("should've masked this out by now"); 2176f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 2186f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 2196f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 2205e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg /* If we end up doing two PIPE_CONTROLs, the first, flusing one also has to 2215e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg * stall and wait for the flushing to finish, so we don't re-dirty the 2225e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg * caches with in-flight rendering after the second PIPE_CONTROL 2235e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg * invalidates. 2245e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg */ 2255e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 2265e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg if (dst_flags) 2275e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg flush_cmd.CommandStreamerStallEnable = true; 2285e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 2295e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg if (src_flags && dst_flags) { 2305e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg dw = anv_batch_emit_dwords(&cmd_buffer->batch, GENX(PIPE_CONTROL_length)); 2315e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg GENX(PIPE_CONTROL_pack)(&cmd_buffer->batch, dw, &flush_cmd); 2325e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg } 2335e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 2345e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg /* The dst flags represent how things will be used in the future. This 235924fbfc9a1fc46a3698fa23649e6dccc3e3e6782Jason Ekstrand * is what we use for doing cache invalidations. 236924fbfc9a1fc46a3698fa23649e6dccc3e3e6782Jason Ekstrand */ 2375e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg struct GENX(PIPE_CONTROL) invalidate_cmd = { 2385e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg GENX(PIPE_CONTROL_header), 2395e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg .PostSyncOperation = NoWrite, 2405e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg }; 2415e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg 242924fbfc9a1fc46a3698fa23649e6dccc3e3e6782Jason Ekstrand for_each_bit(b, dst_flags) { 243b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand switch ((VkAccessFlagBits)(1 << b)) { 244b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_INDIRECT_COMMAND_READ_BIT: 245b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_INDEX_READ_BIT: 246b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT: 2475e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg invalidate_cmd.VFCacheInvalidationEnable = true; 2486f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 249b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_UNIFORM_READ_BIT: 2505e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg invalidate_cmd.ConstantCacheInvalidationEnable = true; 2516f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand /* fallthrough */ 252b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_SHADER_READ_BIT: 2535e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg invalidate_cmd.TextureCacheInvalidationEnable = true; 2546f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 255b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_COLOR_ATTACHMENT_READ_BIT: 2565e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg invalidate_cmd.TextureCacheInvalidationEnable = true; 2576f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand break; 258b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand case VK_ACCESS_TRANSFER_READ_BIT: 2595e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg invalidate_cmd.TextureCacheInvalidationEnable = true; 260b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand break; 261b1cd025b88e3651fac8dd2f7861516f653422ee4Jason Ekstrand default: 2625e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg unreachable("should've masked this out by now"); 2636f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 2646f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand } 2656f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand 2665e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg if (dst_flags) { 2675e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg dw = anv_batch_emit_dwords(&cmd_buffer->batch, GENX(PIPE_CONTROL_length)); 2685e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg GENX(PIPE_CONTROL_pack)(&cmd_buffer->batch, dw, &invalidate_cmd); 2695e92e91c6177bfe31214b8a0ebd0d4c47969b61dKristian Høgsberg } 2706f613abc2bf8fc3cf70c51a1d569bc4eb9dd18afJason Ekstrand} 271bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 272bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergstatic void 273bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergemit_base_vertex_instance_bo(struct anv_cmd_buffer *cmd_buffer, 274bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_bo *bo, uint32_t offset) 275bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 276bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t *p = anv_batch_emitn(&cmd_buffer->batch, 5, 277bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg GENX(3DSTATE_VERTEX_BUFFERS)); 278bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 279bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg GENX(VERTEX_BUFFER_STATE_pack)(&cmd_buffer->batch, p + 1, 280bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg &(struct GENX(VERTEX_BUFFER_STATE)) { 281bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexBufferIndex = 32, /* Reserved for this */ 282bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .AddressModifyEnable = true, 283bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BufferPitch = 0, 284371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if (GEN_GEN >= 8) 285bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .MemoryObjectControlState = GENX(MOCS), 286bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BufferStartingAddress = { bo, offset }, 287bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BufferSize = 8 288bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#else 289bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexBufferMemoryObjectControlState = GENX(MOCS), 290bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BufferStartingAddress = { bo, offset }, 291bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .EndAddress = { bo, offset + 8 }, 292bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#endif 293bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg }); 294bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 295bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 296bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergstatic void 297bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergemit_base_vertex_instance(struct anv_cmd_buffer *cmd_buffer, 298bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t base_vertex, uint32_t base_instance) 299bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 300bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_state id_state = 301bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, 8, 4); 302bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 303bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ((uint32_t *)id_state.map)[0] = base_vertex; 304bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ((uint32_t *)id_state.map)[1] = base_instance; 305bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 306bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg if (!cmd_buffer->device->info.has_llc) 307bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_state_clflush(id_state); 308bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 309bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance_bo(cmd_buffer, 310bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg &cmd_buffer->device->dynamic_state_block_pool.bo, id_state.offset); 311bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 312bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 313bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergvoid genX(CmdDraw)( 314bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkCommandBuffer commandBuffer, 315bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t vertexCount, 316bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t instanceCount, 317bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t firstVertex, 318bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t firstInstance) 319bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 320bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 321bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.pipeline; 322bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 323bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg genX(cmd_buffer_flush_state)(cmd_buffer); 324bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 325bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg if (cmd_buffer->state.pipeline->vs_prog_data.uses_basevertex || 326bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg cmd_buffer->state.pipeline->vs_prog_data.uses_baseinstance) 327bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance(cmd_buffer, firstVertex, firstInstance); 328bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 329bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), 330bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexAccessType = SEQUENTIAL, 331bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .PrimitiveTopologyType = pipeline->topology, 332bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexCountPerInstance = vertexCount, 333bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .StartVertexLocation = firstVertex, 334bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .InstanceCount = instanceCount, 335bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .StartInstanceLocation = firstInstance, 336bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BaseVertexLocation = 0); 337bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 338bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 339bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergvoid genX(CmdDrawIndexed)( 340bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkCommandBuffer commandBuffer, 341bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t indexCount, 342bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t instanceCount, 343bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t firstIndex, 344bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg int32_t vertexOffset, 345bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t firstInstance) 346bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 347bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 348bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.pipeline; 349bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 350bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg genX(cmd_buffer_flush_state)(cmd_buffer); 351bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 352bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg if (cmd_buffer->state.pipeline->vs_prog_data.uses_basevertex || 353bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg cmd_buffer->state.pipeline->vs_prog_data.uses_baseinstance) 354bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance(cmd_buffer, vertexOffset, firstInstance); 355bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 356bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), 357bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexAccessType = RANDOM, 358bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .PrimitiveTopologyType = pipeline->topology, 359bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexCountPerInstance = indexCount, 360bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .StartVertexLocation = firstIndex, 361bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .InstanceCount = instanceCount, 362bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .StartInstanceLocation = firstInstance, 363bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .BaseVertexLocation = vertexOffset); 364bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 365bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 366bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg/* Auto-Draw / Indirect Registers */ 367bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_END_OFFSET 0x2420 368bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_START_VERTEX 0x2430 369bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_VERTEX_COUNT 0x2434 370bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_INSTANCE_COUNT 0x2438 371bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_START_INSTANCE 0x243C 372bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg#define GEN7_3DPRIM_BASE_VERTEX 0x2440 373bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 374bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergstatic void 375bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergemit_lrm(struct anv_batch *batch, 376bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t reg, struct anv_bo *bo, uint32_t offset) 377bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 378bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_MEM), 379bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .RegisterAddress = reg, 380bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .MemoryAddress = { bo, offset }); 381bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 382bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 383bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergstatic void 384bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergemit_lri(struct anv_batch *batch, uint32_t reg, uint32_t imm) 385bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 386bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_IMM), 387bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .RegisterOffset = reg, 388bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .DataDWord = imm); 389bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 390bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 391bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergvoid genX(CmdDrawIndirect)( 392bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkCommandBuffer commandBuffer, 393bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkBuffer _buffer, 394bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkDeviceSize offset, 395bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t drawCount, 396bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t stride) 397bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 398bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 399bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); 400bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.pipeline; 401bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_bo *bo = buffer->bo; 402bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t bo_offset = buffer->offset + offset; 403bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 404bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg genX(cmd_buffer_flush_state)(cmd_buffer); 405bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 406bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg if (cmd_buffer->state.pipeline->vs_prog_data.uses_basevertex || 407bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg cmd_buffer->state.pipeline->vs_prog_data.uses_baseinstance) 408bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 8); 409bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 410bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_VERTEX_COUNT, bo, bo_offset); 411bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_INSTANCE_COUNT, bo, bo_offset + 4); 412bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_START_VERTEX, bo, bo_offset + 8); 413bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_START_INSTANCE, bo, bo_offset + 12); 414bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lri(&cmd_buffer->batch, GEN7_3DPRIM_BASE_VERTEX, 0); 415bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 416bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), 417bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .IndirectParameterEnable = true, 418bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexAccessType = SEQUENTIAL, 419bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .PrimitiveTopologyType = pipeline->topology); 420bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 421bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 422bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsbergvoid genX(CmdDrawIndexedIndirect)( 423bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkCommandBuffer commandBuffer, 424bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkBuffer _buffer, 425bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg VkDeviceSize offset, 426bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t drawCount, 427bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t stride) 428bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg{ 429bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 430bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); 431bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.pipeline; 432bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg struct anv_bo *bo = buffer->bo; 433bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg uint32_t bo_offset = buffer->offset + offset; 434bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 435bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg genX(cmd_buffer_flush_state)(cmd_buffer); 436bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 437bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg /* TODO: We need to stomp base vertex to 0 somehow */ 438bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg if (cmd_buffer->state.pipeline->vs_prog_data.uses_basevertex || 439bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg cmd_buffer->state.pipeline->vs_prog_data.uses_baseinstance) 440bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 12); 441bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 442bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_VERTEX_COUNT, bo, bo_offset); 443bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_INSTANCE_COUNT, bo, bo_offset + 4); 444bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_START_VERTEX, bo, bo_offset + 8); 445bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_BASE_VERTEX, bo, bo_offset + 12); 446bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg emit_lrm(&cmd_buffer->batch, GEN7_3DPRIM_START_INSTANCE, bo, bo_offset + 16); 447bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg 448bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), 449bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .IndirectParameterEnable = true, 450bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .VertexAccessType = RANDOM, 451bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg .PrimitiveTopologyType = pipeline->topology); 452bdefaae2b92c15af4f2bff41b0e689325e762dc7Kristian Høgsberg} 4536c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 4546c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 4556c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsbergvoid genX(CmdDispatch)( 4566c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg VkCommandBuffer commandBuffer, 4576c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t x, 4586c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t y, 4596c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t z) 4606c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg{ 4616c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 4626c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.compute_pipeline; 4636c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct brw_cs_prog_data *prog_data = &pipeline->cs_prog_data; 4646c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 4656c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg if (prog_data->uses_num_work_groups) { 4666c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct anv_state state = 4676c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, 12, 4); 4686c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t *sizes = state.map; 4696c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg sizes[0] = x; 4706c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg sizes[1] = y; 4716c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg sizes[2] = z; 4726c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg if (!cmd_buffer->device->info.has_llc) 4736c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg anv_state_clflush(state); 4746c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg cmd_buffer->state.num_workgroups_offset = state.offset; 4756c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg cmd_buffer->state.num_workgroups_bo = 4766c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg &cmd_buffer->device->dynamic_state_block_pool.bo; 4776c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg } 4786c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 4796c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg genX(cmd_buffer_flush_compute_state)(cmd_buffer); 4806c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 4816c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(GPGPU_WALKER), 4826c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .SIMDSize = prog_data->simd_size / 16, 4836c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .ThreadDepthCounterMaximum = 0, 4846c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .ThreadHeightCounterMaximum = 0, 4856c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .ThreadWidthCounterMaximum = pipeline->cs_thread_width_max - 1, 4866c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .ThreadGroupIDXDimension = x, 4876c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .ThreadGroupIDYDimension = y, 4886c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .ThreadGroupIDZDimension = z, 4896c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .RightExecutionMask = pipeline->cs_right_mask, 4906c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .BottomExecutionMask = 0xffffffff); 4916c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 4926c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(MEDIA_STATE_FLUSH)); 4936c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg} 4946c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 4956c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg#define GPGPU_DISPATCHDIMX 0x2500 4966c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg#define GPGPU_DISPATCHDIMY 0x2504 4976c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg#define GPGPU_DISPATCHDIMZ 0x2508 4986c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 49998cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#define MI_PREDICATE_SRC0 0x2400 50098cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#define MI_PREDICATE_SRC1 0x2408 50198cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 5026c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsbergvoid genX(CmdDispatchIndirect)( 5036c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg VkCommandBuffer commandBuffer, 5046c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg VkBuffer _buffer, 5056c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg VkDeviceSize offset) 5066c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg{ 5076c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 5086c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); 5096c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct anv_pipeline *pipeline = cmd_buffer->state.compute_pipeline; 5106c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct brw_cs_prog_data *prog_data = &pipeline->cs_prog_data; 5116c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg struct anv_bo *bo = buffer->bo; 5126c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg uint32_t bo_offset = buffer->offset + offset; 513da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen struct anv_batch *batch = &cmd_buffer->batch; 5146c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 5156c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg if (prog_data->uses_num_work_groups) { 5166c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg cmd_buffer->state.num_workgroups_offset = bo_offset; 5176c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg cmd_buffer->state.num_workgroups_bo = bo; 5186c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg } 5196c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 5206c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg genX(cmd_buffer_flush_compute_state)(cmd_buffer); 5216c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 522da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen emit_lrm(batch, GPGPU_DISPATCHDIMX, bo, bo_offset); 523da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen emit_lrm(batch, GPGPU_DISPATCHDIMY, bo, bo_offset + 4); 524da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen emit_lrm(batch, GPGPU_DISPATCHDIMZ, bo, bo_offset + 8); 5256c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 52698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#if GEN_GEN <= 7 52798cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* Clear upper 32-bits of SRC0 and all 64-bits of SRC1 */ 52898cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lri(batch, MI_PREDICATE_SRC0 + 4, 0); 52998cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lri(batch, MI_PREDICATE_SRC1 + 0, 0); 53098cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lri(batch, MI_PREDICATE_SRC1 + 4, 0); 53198cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 53298cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* Load compute_dispatch_indirect_x_size into SRC0 */ 53398cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lrm(batch, MI_PREDICATE_SRC0, bo, bo_offset + 0); 53498cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 53598cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* predicate = (compute_dispatch_indirect_x_size == 0); */ 53698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen anv_batch_emit(batch, GENX(MI_PREDICATE), 53798cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .LoadOperation = LOAD_LOAD, 53898cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .CombineOperation = COMBINE_SET, 53998cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .CompareOperation = COMPARE_SRCS_EQUAL); 54098cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 54198cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* Load compute_dispatch_indirect_y_size into SRC0 */ 54298cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lrm(batch, MI_PREDICATE_SRC0, bo, bo_offset + 4); 54398cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 54498cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* predicate |= (compute_dispatch_indirect_y_size == 0); */ 54598cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen anv_batch_emit(batch, GENX(MI_PREDICATE), 54698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .LoadOperation = LOAD_LOAD, 54798cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .CombineOperation = COMBINE_OR, 54898cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .CompareOperation = COMPARE_SRCS_EQUAL); 54998cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 55098cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* Load compute_dispatch_indirect_z_size into SRC0 */ 55198cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen emit_lrm(batch, MI_PREDICATE_SRC0, bo, bo_offset + 8); 55298cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 55398cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* predicate |= (compute_dispatch_indirect_z_size == 0); */ 55498cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen anv_batch_emit(batch, GENX(MI_PREDICATE), 55598cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .LoadOperation = LOAD_LOAD, 55698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .CombineOperation = COMBINE_OR, 55798cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .CompareOperation = COMPARE_SRCS_EQUAL); 55898cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 55998cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen /* predicate = !predicate; */ 56098cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#define COMPARE_FALSE 1 56198cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen anv_batch_emit(batch, GENX(MI_PREDICATE), 56298cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .LoadOperation = LOAD_LOADINV, 56398cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .CombineOperation = COMBINE_OR, 56498cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .CompareOperation = COMPARE_FALSE); 56598cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen#endif 56698cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen 567da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen anv_batch_emit(batch, GENX(GPGPU_WALKER), 5686c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .IndirectParameterEnable = true, 56998cdce1ce4737cf09c5d9613a85bb118f0f1757bJordan Justen .PredicateEnable = GEN_GEN <= 7, 5706c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .SIMDSize = prog_data->simd_size / 16, 5716c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .ThreadDepthCounterMaximum = 0, 5726c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .ThreadHeightCounterMaximum = 0, 5736c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .ThreadWidthCounterMaximum = pipeline->cs_thread_width_max - 1, 5746c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .RightExecutionMask = pipeline->cs_right_mask, 5756c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg .BottomExecutionMask = 0xffffffff); 5766c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg 577da4745104cc02fc0052a2e05e37c69a4dce76eefJordan Justen anv_batch_emit(batch, GENX(MEDIA_STATE_FLUSH)); 5786c4c04690f30af655ad675b590836d3a84440c3aKristian Høgsberg} 579832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg 580832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsbergvoid 581832f73f512e9e6c21d495d7b07e229482371ef2fKristian HøgsberggenX(flush_pipeline_select_3d)(struct anv_cmd_buffer *cmd_buffer) 582832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg{ 583832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg if (cmd_buffer->state.current_pipeline != _3D) { 584832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT), 585371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if GEN_GEN >= 9 586832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg .MaskBits = 3, 587832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg#endif 588832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg .PipelineSelection = _3D); 589832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg cmd_buffer->state.current_pipeline = _3D; 590832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg } 591832f73f512e9e6c21d495d7b07e229482371ef2fKristian Høgsberg} 59285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 59385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergstatic void 59485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergcmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer) 59585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 59685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg struct anv_device *device = cmd_buffer->device; 59785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const struct anv_framebuffer *fb = cmd_buffer->state.framebuffer; 59885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const struct anv_image_view *iview = 59985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_get_depth_stencil_view(cmd_buffer); 60085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const struct anv_image *image = iview ? iview->image : NULL; 60185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const struct anv_format *anv_format = 60285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg iview ? anv_format_for_vk_format(iview->vk_format) : NULL; 60385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const bool has_depth = iview && anv_format->has_depth; 60485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const bool has_stencil = iview && anv_format->has_stencil; 60585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 60685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* FIXME: Implement the PMA stall W/A */ 60785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* FIXME: Width and Height are wrong */ 60885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 60985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Emit 3DSTATE_DEPTH_BUFFER */ 61085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg if (has_depth) { 61185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER), 61285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfaceType = SURFTYPE_2D, 61385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .DepthWriteEnable = true, 61485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .StencilWriteEnable = has_stencil, 61585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .HierarchicalDepthBufferEnable = false, 61685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfaceFormat = isl_surf_get_depth_format(&device->isl_dev, 61785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg &image->depth_surface.isl), 61885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfacePitch = image->depth_surface.isl.row_pitch - 1, 61985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfaceBaseAddress = { 62085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .bo = image->bo, 62122d8666d74f6fa6de53366f76a56277976eced21Kristian Høgsberg .offset = image->offset + image->depth_surface.offset, 62285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg }, 62385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .Height = fb->height - 1, 62485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .Width = fb->width - 1, 62585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .LOD = 0, 62685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .Depth = 1 - 1, 62785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .MinimumArrayElement = 0, 62885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .DepthBufferObjectControlState = GENX(MOCS), 629371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if GEN_GEN >= 8 63085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfaceQPitch = isl_surf_get_array_pitch_el_rows(&image->depth_surface.isl) >> 2, 63185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg#endif 63285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .RenderTargetViewExtent = 1 - 1); 63385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg } else { 63485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Even when no depth buffer is present, the hardware requires that 63585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH_BUFFER be programmed correctly. The Broadwell PRM says: 63685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 63785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * If a null depth buffer is bound, the driver must instead bind depth as: 63885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.SurfaceType = SURFTYPE_2D 63985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.Width = 1 64085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.Height = 1 64185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.SuraceFormat = D16_UNORM 64285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.SurfaceBaseAddress = 0 64385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_DEPTH.HierarchicalDepthBufferEnable = 0 64485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_WM_DEPTH_STENCIL.DepthTestEnable = 0 64585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 3DSTATE_WM_DEPTH_STENCIL.DepthBufferWriteEnable = 0 64685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 64785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * The PRM is wrong, though. The width and height must be programmed to 64885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * actual framebuffer's width and height, even when neither depth buffer 64985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * nor stencil buffer is present. 65085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg */ 65185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER), 65285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfaceType = SURFTYPE_2D, 65385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfaceFormat = D16_UNORM, 65485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .Width = fb->width - 1, 65585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .Height = fb->height - 1, 65685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .StencilWriteEnable = has_stencil); 65785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg } 65885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 65985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Emit 3DSTATE_STENCIL_BUFFER */ 66085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg if (has_stencil) { 66185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_STENCIL_BUFFER), 662371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if GEN_GEN >= 8 || GEN_IS_HASWELL 66385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .StencilBufferEnable = true, 66485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg#endif 66585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .StencilBufferObjectControlState = GENX(MOCS), 66685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 66785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Stencil buffers have strange pitch. The PRM says: 66885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * 66985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * The pitch must be set to 2x the value computed based on width, 67085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * as the stencil buffer is stored with two rows interleaved. 67185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg */ 67285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfacePitch = 2 * image->stencil_surface.isl.row_pitch - 1, 67385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 674371b4a5b33a13f35fa7783510d2d90685a9a2e8aJason Ekstrand#if GEN_GEN >= 8 67585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfaceQPitch = isl_surf_get_array_pitch_el_rows(&image->stencil_surface.isl) >> 2, 67685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg#endif 67785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .SurfaceBaseAddress = { 67885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .bo = image->bo, 67985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .offset = image->offset + image->stencil_surface.offset, 68085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg }); 68185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg } else { 68285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_STENCIL_BUFFER)); 68385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg } 68485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 68585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Disable hierarchial depth buffers. */ 68685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_HIER_DEPTH_BUFFER)); 68785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 68885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg /* Clear the clear params. */ 68985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_CLEAR_PARAMS)); 69085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 69185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 69285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg/** 69385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg * @see anv_cmd_buffer_set_subpass() 69485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg */ 69585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergvoid 69685f67cf16e9823c858215e8a7359d18762c2653cKristian HøgsberggenX(cmd_buffer_set_subpass)(struct anv_cmd_buffer *cmd_buffer, 69785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg struct anv_subpass *subpass) 69885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 69985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg cmd_buffer->state.subpass = subpass; 70085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 70185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg cmd_buffer->state.descriptors_dirty |= VK_SHADER_STAGE_FRAGMENT_BIT; 70285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 70385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg cmd_buffer_emit_depth_stencil(cmd_buffer); 70485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 70585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 70685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergvoid genX(CmdBeginRenderPass)( 70785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkCommandBuffer commandBuffer, 70885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const VkRenderPassBeginInfo* pRenderPassBegin, 70985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkSubpassContents contents) 71085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 71185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 71285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_render_pass, pass, pRenderPassBegin->renderPass); 71385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_framebuffer, framebuffer, pRenderPassBegin->framebuffer); 71485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 71585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg cmd_buffer->state.framebuffer = framebuffer; 71685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg cmd_buffer->state.pass = pass; 71785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_state_setup_attachments(cmd_buffer, pRenderPassBegin); 71885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 71985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg genX(flush_pipeline_select_3d)(cmd_buffer); 72085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 72185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg const VkRect2D *render_area = &pRenderPassBegin->renderArea; 72285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 72385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DRAWING_RECTANGLE), 72485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .ClippedDrawingRectangleYMin = render_area->offset.y, 72585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .ClippedDrawingRectangleXMin = render_area->offset.x, 72685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .ClippedDrawingRectangleYMax = 72785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg render_area->offset.y + render_area->extent.height - 1, 72885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .ClippedDrawingRectangleXMax = 72985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg render_area->offset.x + render_area->extent.width - 1, 73085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .DrawingRectangleOriginY = 0, 73185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg .DrawingRectangleOriginX = 0); 73285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 73385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg genX(cmd_buffer_set_subpass)(cmd_buffer, pass->subpasses); 73485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_clear_subpass(cmd_buffer); 73585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 73685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 73785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergvoid genX(CmdNextSubpass)( 73885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkCommandBuffer commandBuffer, 73985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkSubpassContents contents) 74085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 74185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 74285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 74385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg assert(cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY); 74485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 74585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_resolve_subpass(cmd_buffer); 74685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg genX(cmd_buffer_set_subpass)(cmd_buffer, cmd_buffer->state.subpass + 1); 74785f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_clear_subpass(cmd_buffer); 74885f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 74985f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 75085f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsbergvoid genX(CmdEndRenderPass)( 75185f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg VkCommandBuffer commandBuffer) 75285f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg{ 75385f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); 75485f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg 75585f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg anv_cmd_buffer_resolve_subpass(cmd_buffer); 75685f67cf16e9823c858215e8a7359d18762c2653cKristian Høgsberg} 757