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