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