1769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg/*
2769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * Copyright © 2015 Intel Corporation
3769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg *
4769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * Permission is hereby granted, free of charge, to any person obtaining a
5769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * copy of this software and associated documentation files (the "Software"),
6769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * to deal in the Software without restriction, including without limitation
7769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * and/or sell copies of the Software, and to permit persons to whom the
9769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * Software is furnished to do so, subject to the following conditions:
10769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg *
11769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * The above copyright notice and this permission notice (including the next
12769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * paragraph) shall be included in all copies or substantial portions of the
13769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * Software.
14769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg *
15769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * IN THE SOFTWARE.
22769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg */
23769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg
24769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <assert.h>
25769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <stdbool.h>
26769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <string.h>
27769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <unistd.h>
28769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <fcntl.h>
29769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg
3039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg#include "util/mesa-sha1.h"
3142d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand#include "common/gen_l3_config.h"
322c2233e328341700b7bc5c574f9de21ab4e4116aChad Versace#include "anv_private.h"
33a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand#include "brw_nir.h"
34a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand#include "anv_nir.h"
35c34be07230ef98d5021f0bdc88c3b0bc804ee2ddJason Ekstrand#include "spirv/nir_spirv.h"
36a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
37a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand/* Needed for SWIZZLE macros */
38a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand#include "program/prog_instruction.h"
39769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg
40769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg// Shader functions
41769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg
425a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason EkstrandVkResult anv_CreateShaderModule(
435a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand    VkDevice                                    _device,
445a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand    const VkShaderModuleCreateInfo*             pCreateInfo,
45fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand    const VkAllocationCallbacks*                pAllocator,
467529e7ce860fc5dd64b93b53e5676136e0af3e4eChad Versace    VkShaderModule*                             pShaderModule)
475a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand{
485a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand   ANV_FROM_HANDLE(anv_device, device, _device);
495a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand   struct anv_shader_module *module;
505a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand
515a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand   assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO);
525a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand   assert(pCreateInfo->flags == 0);
535a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand
541ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie   module = vk_alloc2(&device->alloc, pAllocator,
55fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand                       sizeof(*module) + pCreateInfo->codeSize, 8,
56fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand                       VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
575a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand   if (module == NULL)
585a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand      return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
595a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand
605a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand   module->size = pCreateInfo->codeSize;
615a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand   memcpy(module->data, pCreateInfo->pCode, module->size);
625a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand
6339a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg   _mesa_sha1_compute(module->data, module->size, module->sha1);
6439a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg
656eb221c884a28786b68904faf950cf6f7881d9d9Jason Ekstrand   *pShaderModule = anv_shader_module_to_handle(module);
665a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand
675a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand   return VK_SUCCESS;
685a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand}
695a4ebf6bc12b01fdecdb04c1e4a1df573d75ce8aJason Ekstrand
7005a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroyShaderModule(
718ae8e14ba7e5628f4bf3e396fe48f3b46649107bChad Versace    VkDevice                                    _device,
72fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand    VkShaderModule                              _module,
73fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand    const VkAllocationCallbacks*                pAllocator)
748ae8e14ba7e5628f4bf3e396fe48f3b46649107bChad Versace{
758ae8e14ba7e5628f4bf3e396fe48f3b46649107bChad Versace   ANV_FROM_HANDLE(anv_device, device, _device);
768ae8e14ba7e5628f4bf3e396fe48f3b46649107bChad Versace   ANV_FROM_HANDLE(anv_shader_module, module, _module);
778ae8e14ba7e5628f4bf3e396fe48f3b46649107bChad Versace
7849f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand   if (!module)
7949f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand      return;
8049f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand
811ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie   vk_free2(&device->alloc, pAllocator, module);
828ae8e14ba7e5628f4bf3e396fe48f3b46649107bChad Versace}
838ae8e14ba7e5628f4bf3e396fe48f3b46649107bChad Versace
84a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand#define SPIR_V_MAGIC_NUMBER 0x07230203
85a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
86a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand/* Eventually, this will become part of anv_CreateShader.  Unfortunately,
87a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand * we can't do that yet because we don't have the ability to copy nir.
88a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand */
89a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic nir_shader *
90a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandanv_shader_compile_to_nir(struct anv_device *device,
91e10dc002e9544500a2247e49a132e18f994f34eeJason Ekstrand                          struct anv_shader_module *module,
92a5f19f64c3317c98b984010f144416ce768a3c0bJason Ekstrand                          const char *entrypoint_name,
939b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                          gl_shader_stage stage,
949b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                          const VkSpecializationInfo *spec_info)
95a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
96e10dc002e9544500a2247e49a132e18f994f34eeJason Ekstrand   if (strcmp(entrypoint_name, "main") != 0) {
97a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      anv_finishme("Multiple shaders per module not really supported");
98a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   }
99a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
100a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   const struct brw_compiler *compiler =
101a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      device->instance->physicalDevice.compiler;
102a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   const nir_shader_compiler_options *nir_options =
103a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      compiler->glsl_compiler_options[stage].NirOptions;
104a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
1057df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   uint32_t *spirv = (uint32_t *) module->data;
1067df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   assert(spirv[0] == SPIR_V_MAGIC_NUMBER);
1077df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   assert(module->size % 4 == 0);
1087df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand
1097df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   uint32_t num_spec_entries = 0;
1107df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   struct nir_spirv_specialization *spec_entries = NULL;
1117df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   if (spec_info && spec_info->mapEntryCount > 0) {
1127df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand      num_spec_entries = spec_info->mapEntryCount;
1137df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand      spec_entries = malloc(num_spec_entries * sizeof(*spec_entries));
1147df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand      for (uint32_t i = 0; i < num_spec_entries; i++) {
1157df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand         VkSpecializationMapEntry entry = spec_info->pMapEntries[i];
1167df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand         const void *data = spec_info->pData + entry.offset;
1177df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand         assert(data + entry.size <= spec_info->pData + spec_info->dataSize);
1187df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand
1197df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand         spec_entries[i].id = spec_info->pMapEntries[i].constantID;
120cc4ff6c2a01138c44e95af90ec9ddf0f772ca4dcSamuel Iglesias Gonsálvez         if (spec_info->dataSize == 8)
121cc4ff6c2a01138c44e95af90ec9ddf0f772ca4dcSamuel Iglesias Gonsálvez            spec_entries[i].data64 = *(const uint64_t *)data;
122cc4ff6c2a01138c44e95af90ec9ddf0f772ca4dcSamuel Iglesias Gonsálvez         else
123cc4ff6c2a01138c44e95af90ec9ddf0f772ca4dcSamuel Iglesias Gonsálvez            spec_entries[i].data32 = *(const uint32_t *)data;
1249b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand      }
1257df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   }
1269b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand
127465204695f99747174983c96d9e50e7c158fc22fSamuel Iglesias Gonsálvez   const struct nir_spirv_supported_extensions supported_ext = {
128465204695f99747174983c96d9e50e7c158fc22fSamuel Iglesias Gonsálvez      .float64 = device->instance->physicalDevice.info.gen >= 8,
12923a36c28118f6967654e963fc37c6b4c3b37db1bKenneth Graunke      .tessellation = true,
130465204695f99747174983c96d9e50e7c158fc22fSamuel Iglesias Gonsálvez   };
131465204695f99747174983c96d9e50e7c158fc22fSamuel Iglesias Gonsálvez
1327df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   nir_function *entry_point =
1337df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand      spirv_to_nir(spirv, module->size / 4,
1347df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand                   spec_entries, num_spec_entries,
135465204695f99747174983c96d9e50e7c158fc22fSamuel Iglesias Gonsálvez                   stage, entrypoint_name, &supported_ext, nir_options);
1367df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   nir_shader *nir = entry_point->shader;
1377df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   assert(nir->stage == stage);
1387df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   nir_validate_shader(nir);
1399b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand
1407df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   free(spec_entries);
141dac10e8a1390711f1f36f224644c4a33586cebe3Kenneth Graunke
142c5d664f9dc2d281c74844cef36ecb9f5862a8f6aJason Ekstrand   /* We have to lower away local constant initializers right before we
143c5d664f9dc2d281c74844cef36ecb9f5862a8f6aJason Ekstrand    * inline functions.  That way they get properly initialized at the top
144c5d664f9dc2d281c74844cef36ecb9f5862a8f6aJason Ekstrand    * of the function and not at the top of its caller.
145c5d664f9dc2d281c74844cef36ecb9f5862a8f6aJason Ekstrand    */
146faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, nir_lower_constant_initializers, nir_var_local);
147faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, nir_lower_returns);
148faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, nir_inline_functions);
149b8ec48ee76adda4b643fb153507ac72942ecbe26Jason Ekstrand
1507df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   /* Pick off the single entrypoint that we want */
1517df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   foreach_list_typed_safe(nir_function, func, node, &nir->functions) {
1527df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand      if (func != entry_point)
1537df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand         exec_node_remove(&func->node);
1547df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   }
1557df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   assert(exec_list_length(&nir->functions) == 1);
1567df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand   entry_point->name = ralloc_strdup(entry_point, "main");
157790565b06ec80de663820e136105ecb18125743fJason Ekstrand
158faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, nir_remove_dead_variables,
159faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand              nir_var_shader_in | nir_var_shader_out | nir_var_system_value);
160e6c2fe451962e364f30f689dc48c34e2b6161b25Jason Ekstrand
161fed4afc5bba9455e857407e10a4dce79ca8dfe2dKenneth Graunke   if (stage == MESA_SHADER_FRAGMENT)
162fed4afc5bba9455e857407e10a4dce79ca8dfe2dKenneth Graunke      NIR_PASS_V(nir, nir_lower_wpos_center);
163fed4afc5bba9455e857407e10a4dce79ca8dfe2dKenneth Graunke
164c5d664f9dc2d281c74844cef36ecb9f5862a8f6aJason Ekstrand   /* Now that we've deleted all but the main function, we can go ahead and
165c5d664f9dc2d281c74844cef36ecb9f5862a8f6aJason Ekstrand    * lower the rest of the constant initializers.
166c5d664f9dc2d281c74844cef36ecb9f5862a8f6aJason Ekstrand    */
167faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, nir_lower_constant_initializers, ~0);
168faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, nir_propagate_invariant);
169faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, nir_lower_io_to_temporaries,
170faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand              entry_point->impl, true, false);
171faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, nir_lower_system_values);
172a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
1738aba8cf513a0856415e2389b729b76417cd89584Jason Ekstrand   /* Vulkan uses the separate-shader linking model */
174e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri   nir->info->separate_shader = true;
1758aba8cf513a0856415e2389b729b76417cd89584Jason Ekstrand
17612f88ba32a14ea79134f4e995a55149f078a2f27Jason Ekstrand   nir = brw_preprocess_nir(compiler, nir);
177a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
178faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, nir_lower_clip_cull_distance_arrays);
179a9eabd539cf75f8e0e0c1c012a7f5e666304dd9eKenneth Graunke
180347f43c8ec54b1380d45a10c6ee38189ec6d73e9Jason Ekstrand   if (stage == MESA_SHADER_FRAGMENT)
181faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand      NIR_PASS_V(nir, anv_nir_lower_input_attachments);
182347f43c8ec54b1380d45a10c6ee38189ec6d73e9Jason Ekstrand
1830fe4580e64f01d86fb48cdba665ede4e54200658Jason Ekstrand   nir_shader_gather_info(nir, entry_point->impl);
184a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
185a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   return nir;
186a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
187cb57bff36c5b8f449f4f9738e71d5359d9090fc8Chad Versace
18805a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroyPipeline(
1896e5ab5cf1bdac9292b512bbbe10da44558fe1bc0Chad Versace    VkDevice                                    _device,
190fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand    VkPipeline                                  _pipeline,
191fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand    const VkAllocationCallbacks*                pAllocator)
1926e5ab5cf1bdac9292b512bbbe10da44558fe1bc0Chad Versace{
1936e5ab5cf1bdac9292b512bbbe10da44558fe1bc0Chad Versace   ANV_FROM_HANDLE(anv_device, device, _device);
1946e5ab5cf1bdac9292b512bbbe10da44558fe1bc0Chad Versace   ANV_FROM_HANDLE(anv_pipeline, pipeline, _pipeline);
1956e5ab5cf1bdac9292b512bbbe10da44558fe1bc0Chad Versace
19649f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand   if (!pipeline)
19749f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand      return;
19849f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand
199fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand   anv_reloc_list_finish(&pipeline->batch_relocs,
200fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand                         pAllocator ? pAllocator : &device->alloc);
20191bc4e7cec4098000f3d9a265e7db7907a686e5aJason Ekstrand   if (pipeline->blend_state.map)
20291bc4e7cec4098000f3d9a265e7db7907a686e5aJason Ekstrand      anv_state_pool_free(&device->dynamic_state_pool, pipeline->blend_state);
20310f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand
20410f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   for (unsigned s = 0; s < MESA_SHADER_STAGES; s++) {
20510f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      if (pipeline->shaders[s])
20610f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         anv_shader_bin_unref(device, pipeline->shaders[s]);
20710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   }
20810f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand
2091ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie   vk_free2(&device->alloc, pAllocator, pipeline);
2106e5ab5cf1bdac9292b512bbbe10da44558fe1bc0Chad Versace}
2116e5ab5cf1bdac9292b512bbbe10da44558fe1bc0Chad Versace
2129c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsbergstatic const uint32_t vk_to_gen_primitive_type[] = {
2136a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_POINT_LIST]                    = _3DPRIM_POINTLIST,
2146a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_LINE_LIST]                     = _3DPRIM_LINELIST,
2156a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_LINE_STRIP]                    = _3DPRIM_LINESTRIP,
2166a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST]                 = _3DPRIM_TRILIST,
2176a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP]                = _3DPRIM_TRISTRIP,
2186a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN]                  = _3DPRIM_TRIFAN,
2196a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY]      = _3DPRIM_LINELIST_ADJ,
2206a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY]     = _3DPRIM_LINESTRIP_ADJ,
2216a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY]  = _3DPRIM_TRILIST_ADJ,
2226a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand   [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY] = _3DPRIM_TRISTRIP_ADJ,
2239c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg};
2249c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg
2251a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrandstatic void
226527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrandpopulate_sampler_prog_key(const struct gen_device_info *devinfo,
227a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand                          struct brw_sampler_prog_key_data *key)
228a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
229a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* XXX: Handle texture swizzle on HSW- */
230a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   for (int i = 0; i < MAX_SAMPLERS; i++) {
231a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      /* Assume color sampler, no swizzling. (Works for BDW+) */
232a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      key->swizzles[i] = SWIZZLE_XYZW;
233a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   }
234a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
235a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
236a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic void
237527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrandpopulate_vs_prog_key(const struct gen_device_info *devinfo,
238a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand                     struct brw_vs_prog_key *key)
239a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
240a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   memset(key, 0, sizeof(*key));
241a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
242a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   populate_sampler_prog_key(devinfo, &key->tex);
243a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
244a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* XXX: Handle vertex input work-arounds */
245a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
246a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* XXX: Handle sampler_prog_key */
247a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
248a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
249a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic void
250527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrandpopulate_gs_prog_key(const struct gen_device_info *devinfo,
251d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand                     struct brw_gs_prog_key *key)
252d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand{
253d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand   memset(key, 0, sizeof(*key));
254d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
255d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand   populate_sampler_prog_key(devinfo, &key->tex);
256d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand}
257d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
258d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrandstatic void
259860d91ec5b1381b261e6776466154f375dfe125bLionel Landwerlinpopulate_wm_prog_key(const struct anv_pipeline *pipeline,
260a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand                     const VkGraphicsPipelineCreateInfo *info,
261a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand                     struct brw_wm_prog_key *key)
262a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
263860d91ec5b1381b261e6776466154f375dfe125bLionel Landwerlin   const struct gen_device_info *devinfo = &pipeline->device->info;
264a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   ANV_FROM_HANDLE(anv_render_pass, render_pass, info->renderPass);
265a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
266a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   memset(key, 0, sizeof(*key));
267a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
268a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   populate_sampler_prog_key(devinfo, &key->tex);
269a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
270860d91ec5b1381b261e6776466154f375dfe125bLionel Landwerlin   /* TODO: we could set this to 0 based on the information in nir_shader, but
271860d91ec5b1381b261e6776466154f375dfe125bLionel Landwerlin    * this function is called before spirv_to_nir. */
272860d91ec5b1381b261e6776466154f375dfe125bLionel Landwerlin   const struct brw_vue_map *vue_map =
27399d497c5b6912c5a8b2fec48084e3e00c7c80395Jason Ekstrand      &anv_pipeline_get_last_vue_prog_data(pipeline)->vue_map;
274860d91ec5b1381b261e6776466154f375dfe125bLionel Landwerlin   key->input_slots_valid = vue_map->slots_valid;
27537b6afb3d96a7bc68129a312c77dfaf94121a70fJason Ekstrand
276a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* Vulkan doesn't specify a default */
277a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   key->high_quality_derivatives = false;
278a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
279a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* XXX Vulkan doesn't appear to specify */
280a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   key->clamp_fragment_color = false;
281a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
282ac77528f7d383ee103ed702590f7bc9f05907b61Jason Ekstrand   key->nr_color_regions =
283ac77528f7d383ee103ed702590f7bc9f05907b61Jason Ekstrand      render_pass->subpasses[info->subpass].color_count;
284a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
285a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   key->replicate_alpha = key->nr_color_regions > 1 &&
2869fa6e328ebac4616148a23a7a4fbe7ed25ec315fJason Ekstrand                          info->pMultisampleState &&
2879fa6e328ebac4616148a23a7a4fbe7ed25ec315fJason Ekstrand                          info->pMultisampleState->alphaToCoverageEnable;
288a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
2897f2284063df569df40f68074833f1518005d348dJason Ekstrand   if (info->pMultisampleState && info->pMultisampleState->rasterizationSamples > 1) {
290a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      /* We should probably pull this out of the shader, but it's fairly
291a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand       * harmless to compute it and then let dead-code take care of it.
292a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand       */
293712a980adde0b14eee8b4accd02af9b9740091a2Jason Ekstrand      key->persample_interp =
294712a980adde0b14eee8b4accd02af9b9740091a2Jason Ekstrand         (info->pMultisampleState->minSampleShading *
295712a980adde0b14eee8b4accd02af9b9740091a2Jason Ekstrand          info->pMultisampleState->rasterizationSamples) > 1;
29681407531e0b8d2e6a7f9c39cb44ed6a72dc61e77Kenneth Graunke      key->multisample_fbo = true;
297a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   }
298a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
299a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
300a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic void
301527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrandpopulate_cs_prog_key(const struct gen_device_info *devinfo,
302a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand                     struct brw_cs_prog_key *key)
303a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
304a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   memset(key, 0, sizeof(*key));
305a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
306a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   populate_sampler_prog_key(devinfo, &key->tex);
307a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
308a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
309a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic nir_shader *
310a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandanv_pipeline_compile(struct anv_pipeline *pipeline,
311e10dc002e9544500a2247e49a132e18f994f34eeJason Ekstrand                     struct anv_shader_module *module,
312e10dc002e9544500a2247e49a132e18f994f34eeJason Ekstrand                     const char *entrypoint,
313a5f19f64c3317c98b984010f144416ce768a3c0bJason Ekstrand                     gl_shader_stage stage,
3149b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                     const VkSpecializationInfo *spec_info,
3156139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg                     struct brw_stage_prog_data *prog_data,
3166139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg                     struct anv_pipeline_bind_map *map)
317a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
318e10dc002e9544500a2247e49a132e18f994f34eeJason Ekstrand   nir_shader *nir = anv_shader_compile_to_nir(pipeline->device,
3199b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                                               module, entrypoint, stage,
3209b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                                               spec_info);
321a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   if (nir == NULL)
322a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      return NULL;
323a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
324faa1edeeb7bbe9321c79587e592dce812e8caa78Jason Ekstrand   NIR_PASS_V(nir, anv_nir_lower_push_constants);
325a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
326a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* Figure out the number of parameters */
327a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   prog_data->nr_params = 0;
328a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
3293883728730f293b763a5641560375b18d4f97782Jason Ekstrand   if (nir->num_uniforms > 0) {
330a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      /* If the shader uses any push constants at all, we'll just give
331a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand       * them the maximum possible number
332a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand       */
3331eed753ee8725baf41790d30f94bc3567653c28cJason Ekstrand      assert(nir->num_uniforms <= MAX_PUSH_CONSTANTS_SIZE);
334a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      prog_data->nr_params += MAX_PUSH_CONSTANTS_SIZE / sizeof(float);
335a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   }
336a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
337a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   if (pipeline->layout && pipeline->layout->stage[stage].has_dynamic_offsets)
338612e35b2c65c99773b73e53d0e6fd112b1a7431fJason Ekstrand      prog_data->nr_params += MAX_DYNAMIC_BUFFERS * 2;
339a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
340e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri   if (nir->info->num_images > 0) {
341e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri      prog_data->nr_params += nir->info->num_images * BRW_IMAGE_PARAM_SIZE;
3428ee31828c656d456bfe067cfae512b1fbbd0bbd6Jordan Justen      pipeline->needs_data_cache = true;
3438ee31828c656d456bfe067cfae512b1fbbd0bbd6Jordan Justen   }
3448ee31828c656d456bfe067cfae512b1fbbd0bbd6Jordan Justen
345fa279dfbf0fc89b07007141ad8850ac42206e397Jordan Justen   if (stage == MESA_SHADER_COMPUTE)
346fa279dfbf0fc89b07007141ad8850ac42206e397Jordan Justen      ((struct brw_cs_prog_data *)prog_data)->thread_local_id_index =
347fa279dfbf0fc89b07007141ad8850ac42206e397Jordan Justen         prog_data->nr_params++; /* The CS Thread ID uniform */
348fa279dfbf0fc89b07007141ad8850ac42206e397Jordan Justen
349e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri   if (nir->info->num_ssbos > 0)
3508ee31828c656d456bfe067cfae512b1fbbd0bbd6Jordan Justen      pipeline->needs_data_cache = true;
35143ac954e25f28d240da65ed816458d3529675a04Jason Ekstrand
352a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   if (prog_data->nr_params > 0) {
353fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand      /* XXX: I think we're leaking this */
354d5c9955d3eaa7311e2b2350b6964bae516c7b7b2Jason Ekstrand      prog_data->param = (const union gl_constant_value **)
355d5c9955d3eaa7311e2b2350b6964bae516c7b7b2Jason Ekstrand         malloc(prog_data->nr_params * sizeof(union gl_constant_value *));
356a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
357a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      /* We now set the param values to be offsets into a
358a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand       * anv_push_constant_data structure.  Since the compiler doesn't
359a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand       * actually dereference any of the gl_constant_value pointers in the
360a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand       * params array, it doesn't really matter what we put here.
361a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand       */
362a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      struct anv_push_constants *null_data = NULL;
3633883728730f293b763a5641560375b18d4f97782Jason Ekstrand      if (nir->num_uniforms > 0) {
364a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand         /* Fill out the push constants section of the param array */
365a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand         for (unsigned i = 0; i < MAX_PUSH_CONSTANTS_SIZE / sizeof(float); i++)
366d5c9955d3eaa7311e2b2350b6964bae516c7b7b2Jason Ekstrand            prog_data->param[i] = (const union gl_constant_value *)
367a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand               &null_data->client_data[i * sizeof(float)];
368a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      }
369a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   }
370a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
371a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* Set up dynamic offsets */
372a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   anv_nir_apply_dynamic_offsets(pipeline, nir, prog_data);
373a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
374a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* Apply the actual pipeline layout to UBOs, SSBOs, and textures */
375cd75ff5d1749b9a982546b54cd2655930d2a5402Jason Ekstrand   if (pipeline->layout)
3766139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      anv_nir_apply_pipeline_layout(pipeline, nir, prog_data, map);
377a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
378a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* nir_lower_io will only handle the push constants; we need to set this
379a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand    * to the full number of possible uniforms.
380a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand    */
381d5c9955d3eaa7311e2b2350b6964bae516c7b7b2Jason Ekstrand   nir->num_uniforms = prog_data->nr_params * 4;
382a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
383a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   return nir;
384a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
385a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
386a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic void
38775af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrandanv_fill_binding_table(struct brw_stage_prog_data *prog_data, unsigned bias)
38875af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand{
38975af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand   prog_data->binding_table.size_bytes = 0;
39075af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand   prog_data->binding_table.texture_start = bias;
3913c0077a6ec4c0ffd6e74e219c786d5d7f9217ce9Jason Ekstrand   prog_data->binding_table.gather_texture_start = bias;
39275af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand   prog_data->binding_table.ubo_start = bias;
39375af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand   prog_data->binding_table.ssbo_start = bias;
39475af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand   prog_data->binding_table.image_start = bias;
39575af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand}
39675af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand
39710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrandstatic struct anv_shader_bin *
39810f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrandanv_pipeline_upload_kernel(struct anv_pipeline *pipeline,
39910f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                           struct anv_pipeline_cache *cache,
40010f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                           const void *key_data, uint32_t key_size,
40110f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                           const void *kernel_data, uint32_t kernel_size,
402ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                           const struct brw_stage_prog_data *prog_data,
403ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                           uint32_t prog_data_size,
40410f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                           const struct anv_pipeline_bind_map *bind_map)
40510f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand{
40610f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   if (cache) {
40710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      return anv_pipeline_cache_upload_kernel(cache, key_data, key_size,
40810f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                                              kernel_data, kernel_size,
40910f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                                              prog_data, prog_data_size,
41010f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                                              bind_map);
41110f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   } else {
41210f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      return anv_shader_bin_create(pipeline->device, key_data, key_size,
41310f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                                   kernel_data, kernel_size,
41471cc1e188d52bebe86a1ac72fe90f4e2a7e76778Jason Ekstrand                                   prog_data, prog_data_size,
41571cc1e188d52bebe86a1ac72fe90f4e2a7e76778Jason Ekstrand                                   prog_data->param, bind_map);
41610f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   }
41710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand}
41810f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand
41910f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand
42075af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrandstatic void
421a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandanv_pipeline_add_compiled_stage(struct anv_pipeline *pipeline,
422a5f19f64c3317c98b984010f144416ce768a3c0bJason Ekstrand                                gl_shader_stage stage,
42310f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                                struct anv_shader_bin *shader)
424a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
42510f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   pipeline->shaders[stage] = shader;
426a5f19f64c3317c98b984010f144416ce768a3c0bJason Ekstrand   pipeline->active_stages |= mesa_to_vk_shader_stage(stage);
427a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
428a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
429a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic VkResult
430a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandanv_pipeline_compile_vs(struct anv_pipeline *pipeline,
43130521fb19e01b6e34cba4eaff40b9b782000b5dbKristian Høgsberg Kristensen                        struct anv_pipeline_cache *cache,
432a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand                        const VkGraphicsPipelineCreateInfo *info,
433e10dc002e9544500a2247e49a132e18f994f34eeJason Ekstrand                        struct anv_shader_module *module,
4349b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                        const char *entrypoint,
4359b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                        const VkSpecializationInfo *spec_info)
436a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
437a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   const struct brw_compiler *compiler =
438a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      pipeline->device->instance->physicalDevice.compiler;
4396139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg   struct anv_pipeline_bind_map map;
440a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   struct brw_vs_prog_key key;
44110f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   struct anv_shader_bin *bin = NULL;
44287967a2c854c200ba8a7cabe1fe3f7e19291f187Kristian Høgsberg   unsigned char sha1[20];
443a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
444a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   populate_vs_prog_key(&pipeline->device->info, &key);
445a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
44610f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   if (cache) {
4472301705dee6324634520559b27ac6728ebb02191Jason Ekstrand      anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint,
4482301705dee6324634520559b27ac6728ebb02191Jason Ekstrand                      pipeline->layout, spec_info);
44910f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      bin = anv_pipeline_cache_search(cache, sha1, 20);
45039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg   }
451a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
45210f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   if (bin == NULL) {
4532b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg      struct brw_vs_prog_data prog_data = { 0, };
4546139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      struct anv_pipeline_binding surface_to_descriptor[256];
4556139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      struct anv_pipeline_binding sampler_to_descriptor[256];
4566139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg
4576139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      map = (struct anv_pipeline_bind_map) {
4586139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg         .surface_to_descriptor = surface_to_descriptor,
4596139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg         .sampler_to_descriptor = sampler_to_descriptor
4606139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      };
461a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
46239a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      nir_shader *nir = anv_pipeline_compile(pipeline, module, entrypoint,
46339a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg                                             MESA_SHADER_VERTEX, spec_info,
4646139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg                                             &prog_data.base.base, &map);
46539a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      if (nir == NULL)
46639a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
46739a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg
46875af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand      anv_fill_binding_table(&prog_data.base.base, 0);
46975af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand
47039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      void *mem_ctx = ralloc_context(NULL);
471a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
4727df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand      ralloc_steal(mem_ctx, nir);
473a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
474e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri      prog_data.inputs_read = nir->info->inputs_read;
4751c9483f48e7ee7dd32847352e95c5151dfb0f3f2Juan A. Suarez Romero      prog_data.double_inputs_read = nir->info->double_inputs_read;
476a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
47739a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      brw_compute_vue_map(&pipeline->device->info,
4782b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg                          &prog_data.base.vue_map,
479e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri                          nir->info->outputs_written,
480e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri                          nir->info->separate_shader);
481a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
48239a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      unsigned code_size;
48339a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      const unsigned *shader_code =
4842b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg         brw_compile_vs(compiler, NULL, mem_ctx, &key, &prog_data, nir,
48539a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg                        NULL, false, -1, &code_size, NULL);
48639a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      if (shader_code == NULL) {
48739a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         ralloc_free(mem_ctx);
48839a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
48939a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      }
490a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
49110f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      bin = anv_pipeline_upload_kernel(pipeline, cache, sha1, 20,
49210f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                                       shader_code, code_size,
493ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                                       &prog_data.base.base, sizeof(prog_data),
494ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                                       &map);
49510f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      if (!bin) {
49610f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         ralloc_free(mem_ctx);
49710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
49810f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      }
49910f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand
500a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      ralloc_free(mem_ctx);
501a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   }
502a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
50310f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   anv_pipeline_add_compiled_stage(pipeline, MESA_SHADER_VERTEX, bin);
504a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
505a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   return VK_SUCCESS;
506a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
507a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
508e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunkestatic void
509e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunkemerge_tess_info(struct shader_info *tes_info,
510e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                const struct shader_info *tcs_info)
511e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke{
512e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   /* The Vulkan 1.0.38 spec, section 21.1 Tessellator says:
513e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    *
514e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    *    "PointMode. Controls generation of points rather than triangles
515e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    *     or lines. This functionality defaults to disabled, and is
516e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    *     enabled if either shader stage includes the execution mode.
517e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    *
518e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    * and about Triangles, Quads, IsoLines, VertexOrderCw, VertexOrderCcw,
519e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    * PointMode, SpacingEqual, SpacingFractionalEven, SpacingFractionalOdd,
520e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    * and OutputVertices, it says:
521e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    *
522e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    *    "One mode must be set in at least one of the tessellation
523e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    *     shader stages."
524e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    *
525e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    * So, the fields can be set in either the TCS or TES, but they must
526e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    * agree if set in both.  Our backend looks at TES, so bitwise-or in
527e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    * the values from the TCS.
528e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke    */
529e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   assert(tcs_info->tess.tcs_vertices_out == 0 ||
530e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke          tes_info->tess.tcs_vertices_out == 0 ||
531e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke          tcs_info->tess.tcs_vertices_out == tes_info->tess.tcs_vertices_out);
532e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   tes_info->tess.tcs_vertices_out |= tcs_info->tess.tcs_vertices_out;
533e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
534e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   assert(tcs_info->tess.spacing == TESS_SPACING_UNSPECIFIED ||
535e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke          tes_info->tess.spacing == TESS_SPACING_UNSPECIFIED ||
536e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke          tcs_info->tess.spacing == tes_info->tess.spacing);
537e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   tes_info->tess.spacing |= tcs_info->tess.spacing;
538e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
539e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   tes_info->tess.ccw |= tcs_info->tess.ccw;
540e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   tes_info->tess.point_mode |= tcs_info->tess.point_mode;
541e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke}
542e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
543e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunkestatic VkResult
544e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunkeanv_pipeline_compile_tcs_tes(struct anv_pipeline *pipeline,
545e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                             struct anv_pipeline_cache *cache,
546e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                             const VkGraphicsPipelineCreateInfo *info,
547e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                             struct anv_shader_module *tcs_module,
548e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                             const char *tcs_entrypoint,
549e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                             const VkSpecializationInfo *tcs_spec_info,
550e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                             struct anv_shader_module *tes_module,
551e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                             const char *tes_entrypoint,
552e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                             const VkSpecializationInfo *tes_spec_info)
553e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke{
554e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   const struct gen_device_info *devinfo = &pipeline->device->info;
555e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   const struct brw_compiler *compiler =
556e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      pipeline->device->instance->physicalDevice.compiler;
557e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   struct anv_pipeline_bind_map tcs_map;
558e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   struct anv_pipeline_bind_map tes_map;
559e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   struct brw_tcs_prog_key tcs_key = { 0, };
560e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   struct brw_tes_prog_key tes_key = { 0, };
561e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   struct anv_shader_bin *tcs_bin = NULL;
562e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   struct anv_shader_bin *tes_bin = NULL;
563e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   unsigned char tcs_sha1[40];
564e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   unsigned char tes_sha1[40];
565e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
566e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   populate_sampler_prog_key(&pipeline->device->info, &tcs_key.tex);
567e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   populate_sampler_prog_key(&pipeline->device->info, &tes_key.tex);
568e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   tcs_key.input_vertices = info->pTessellationState->patchControlPoints;
569e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
570e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   if (cache) {
571e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      anv_hash_shader(tcs_sha1, &tcs_key, sizeof(tcs_key), tcs_module,
572e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                      tcs_entrypoint, pipeline->layout, tcs_spec_info);
573e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      anv_hash_shader(tes_sha1, &tes_key, sizeof(tes_key), tes_module,
574e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                      tes_entrypoint, pipeline->layout, tes_spec_info);
575e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      memcpy(&tcs_sha1[20], tes_sha1, 20);
576e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      memcpy(&tes_sha1[20], tcs_sha1, 20);
577e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tcs_bin = anv_pipeline_cache_search(cache, tcs_sha1, sizeof(tcs_sha1));
578e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tes_bin = anv_pipeline_cache_search(cache, tes_sha1, sizeof(tes_sha1));
579e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   }
580e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
581e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   if (tcs_bin == NULL || tes_bin == NULL) {
582e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      struct brw_tcs_prog_data tcs_prog_data = { 0, };
583e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      struct brw_tes_prog_data tes_prog_data = { 0, };
584e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      struct anv_pipeline_binding tcs_surface_to_descriptor[256];
585e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      struct anv_pipeline_binding tcs_sampler_to_descriptor[256];
586e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      struct anv_pipeline_binding tes_surface_to_descriptor[256];
587e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      struct anv_pipeline_binding tes_sampler_to_descriptor[256];
588e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
589e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tcs_map = (struct anv_pipeline_bind_map) {
590e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         .surface_to_descriptor = tcs_surface_to_descriptor,
591e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         .sampler_to_descriptor = tcs_sampler_to_descriptor
592e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      };
593e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tes_map = (struct anv_pipeline_bind_map) {
594e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         .surface_to_descriptor = tes_surface_to_descriptor,
595e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         .sampler_to_descriptor = tes_sampler_to_descriptor
596e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      };
597e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
598e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      nir_shader *tcs_nir =
599e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         anv_pipeline_compile(pipeline, tcs_module, tcs_entrypoint,
600e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                              MESA_SHADER_TESS_CTRL, tcs_spec_info,
601e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                              &tcs_prog_data.base.base, &tcs_map);
602e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      nir_shader *tes_nir =
603e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         anv_pipeline_compile(pipeline, tes_module, tes_entrypoint,
604e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                              MESA_SHADER_TESS_EVAL, tes_spec_info,
605e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                              &tes_prog_data.base.base, &tes_map);
606e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      if (tcs_nir == NULL || tes_nir == NULL)
607e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
608e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
609e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      nir_lower_tes_patch_vertices(tes_nir,
610e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                   tcs_nir->info->tess.tcs_vertices_out);
611e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
612e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      /* Copy TCS info into the TES info */
613e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      merge_tess_info(tes_nir->info, tcs_nir->info);
614e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
615e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      anv_fill_binding_table(&tcs_prog_data.base.base, 0);
616e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      anv_fill_binding_table(&tes_prog_data.base.base, 0);
617e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
618e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      void *mem_ctx = ralloc_context(NULL);
619e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
620e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      ralloc_steal(mem_ctx, tcs_nir);
621e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      ralloc_steal(mem_ctx, tes_nir);
622e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
623e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      /* Whacking the key after cache lookup is a bit sketchy, but all of
624e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke       * this comes from the SPIR-V, which is part of the hash used for the
625e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke       * pipeline cache.  So it should be safe.
626e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke       */
627e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tcs_key.tes_primitive_mode = tes_nir->info->tess.primitive_mode;
628e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tcs_key.outputs_written = tcs_nir->info->outputs_written;
629e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tcs_key.patch_outputs_written = tcs_nir->info->patch_outputs_written;
630e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tcs_key.quads_workaround =
631e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         devinfo->gen < 9 &&
632e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         tes_nir->info->tess.primitive_mode == 7 /* GL_QUADS */ &&
633e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         tes_nir->info->tess.spacing == TESS_SPACING_EQUAL;
634e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
635e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tes_key.inputs_read = tcs_key.outputs_written;
636e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tes_key.patch_inputs_read = tcs_key.patch_outputs_written;
637e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
638e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      unsigned code_size;
639e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      const int shader_time_index = -1;
640e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      const unsigned *shader_code;
641e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
642e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      shader_code =
643e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         brw_compile_tcs(compiler, NULL, mem_ctx, &tcs_key, &tcs_prog_data,
644e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                         tcs_nir, shader_time_index, &code_size, NULL);
645e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      if (shader_code == NULL) {
646e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         ralloc_free(mem_ctx);
647e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
648e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      }
649e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
650e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tcs_bin = anv_pipeline_upload_kernel(pipeline, cache,
651e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           tcs_sha1, sizeof(tcs_sha1),
652e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           shader_code, code_size,
653e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           &tcs_prog_data.base.base,
654e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           sizeof(tcs_prog_data),
655e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           &tcs_map);
656e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      if (!tcs_bin) {
657e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         ralloc_free(mem_ctx);
658e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
659e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      }
660e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
661e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      shader_code =
662e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         brw_compile_tes(compiler, NULL, mem_ctx, &tes_key,
663e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                         &tcs_prog_data.base.vue_map, &tes_prog_data, tes_nir,
664e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                         NULL, shader_time_index, &code_size, NULL);
665e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      if (shader_code == NULL) {
666e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         ralloc_free(mem_ctx);
667e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
668e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      }
669e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
670e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      tes_bin = anv_pipeline_upload_kernel(pipeline, cache,
671e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           tes_sha1, sizeof(tes_sha1),
672e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           shader_code, code_size,
673e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           &tes_prog_data.base.base,
674e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           sizeof(tes_prog_data),
675e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                           &tes_map);
676e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      if (!tes_bin) {
677e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         ralloc_free(mem_ctx);
678e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
679e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      }
680e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
681e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      ralloc_free(mem_ctx);
682e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   }
683e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
684e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   anv_pipeline_add_compiled_stage(pipeline, MESA_SHADER_TESS_CTRL, tcs_bin);
685e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   anv_pipeline_add_compiled_stage(pipeline, MESA_SHADER_TESS_EVAL, tes_bin);
686e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
687e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   return VK_SUCCESS;
688e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke}
689e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke
690a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic VkResult
691d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrandanv_pipeline_compile_gs(struct anv_pipeline *pipeline,
69230521fb19e01b6e34cba4eaff40b9b782000b5dbKristian Høgsberg Kristensen                        struct anv_pipeline_cache *cache,
693d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand                        const VkGraphicsPipelineCreateInfo *info,
694e10dc002e9544500a2247e49a132e18f994f34eeJason Ekstrand                        struct anv_shader_module *module,
6959b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                        const char *entrypoint,
6969b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                        const VkSpecializationInfo *spec_info)
697d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand{
698d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand   const struct brw_compiler *compiler =
699d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand      pipeline->device->instance->physicalDevice.compiler;
7006139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg   struct anv_pipeline_bind_map map;
701d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand   struct brw_gs_prog_key key;
70210f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   struct anv_shader_bin *bin = NULL;
70387967a2c854c200ba8a7cabe1fe3f7e19291f187Kristian Høgsberg   unsigned char sha1[20];
704d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
705d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand   populate_gs_prog_key(&pipeline->device->info, &key);
706d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
70710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   if (cache) {
7082301705dee6324634520559b27ac6728ebb02191Jason Ekstrand      anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint,
7092301705dee6324634520559b27ac6728ebb02191Jason Ekstrand                      pipeline->layout, spec_info);
71010f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      bin = anv_pipeline_cache_search(cache, sha1, 20);
71139a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg   }
712d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
71310f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   if (bin == NULL) {
7142b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg      struct brw_gs_prog_data prog_data = { 0, };
7156139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      struct anv_pipeline_binding surface_to_descriptor[256];
7166139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      struct anv_pipeline_binding sampler_to_descriptor[256];
7176139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg
7186139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      map = (struct anv_pipeline_bind_map) {
7196139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg         .surface_to_descriptor = surface_to_descriptor,
7206139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg         .sampler_to_descriptor = sampler_to_descriptor
7216139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      };
722d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
72339a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      nir_shader *nir = anv_pipeline_compile(pipeline, module, entrypoint,
72439a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg                                             MESA_SHADER_GEOMETRY, spec_info,
7256139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg                                             &prog_data.base.base, &map);
72639a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      if (nir == NULL)
72739a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
72839a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg
72975af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand      anv_fill_binding_table(&prog_data.base.base, 0);
73075af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand
73139a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      void *mem_ctx = ralloc_context(NULL);
732d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
7337df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand      ralloc_steal(mem_ctx, nir);
734d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
73539a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      brw_compute_vue_map(&pipeline->device->info,
7362b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg                          &prog_data.base.vue_map,
737e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri                          nir->info->outputs_written,
738e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri                          nir->info->separate_shader);
7395e57a87dcfea5b1e363e96946c456651d43176c2Jason Ekstrand
74039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      unsigned code_size;
74139a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      const unsigned *shader_code =
7422b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg         brw_compile_gs(compiler, NULL, mem_ctx, &key, &prog_data, nir,
74339a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg                        NULL, -1, &code_size, NULL);
74439a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      if (shader_code == NULL) {
74539a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         ralloc_free(mem_ctx);
74639a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
74739a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      }
74839a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg
74939a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      /* TODO: SIMD8 GS */
75010f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      bin = anv_pipeline_upload_kernel(pipeline, cache, sha1, 20,
75110f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                                       shader_code, code_size,
752ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                                       &prog_data.base.base, sizeof(prog_data),
753ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                                       &map);
75410f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      if (!bin) {
75510f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         ralloc_free(mem_ctx);
75610f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
75710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      }
758d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
759d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand      ralloc_free(mem_ctx);
760d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand   }
761d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
76210f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   anv_pipeline_add_compiled_stage(pipeline, MESA_SHADER_GEOMETRY, bin);
763d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
764d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand   return VK_SUCCESS;
765d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand}
766d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrand
767d538fe849df0c3f80fea2765ff36dd2db5eab72bJason Ekstrandstatic VkResult
768a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandanv_pipeline_compile_fs(struct anv_pipeline *pipeline,
76930521fb19e01b6e34cba4eaff40b9b782000b5dbKristian Høgsberg Kristensen                        struct anv_pipeline_cache *cache,
770a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand                        const VkGraphicsPipelineCreateInfo *info,
771e10dc002e9544500a2247e49a132e18f994f34eeJason Ekstrand                        struct anv_shader_module *module,
7729b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                        const char *entrypoint,
7739b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                        const VkSpecializationInfo *spec_info)
774a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
775a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   const struct brw_compiler *compiler =
776a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      pipeline->device->instance->physicalDevice.compiler;
7776139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg   struct anv_pipeline_bind_map map;
778a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   struct brw_wm_prog_key key;
77910f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   struct anv_shader_bin *bin = NULL;
78087967a2c854c200ba8a7cabe1fe3f7e19291f187Kristian Høgsberg   unsigned char sha1[20];
781a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
782860d91ec5b1381b261e6776466154f375dfe125bLionel Landwerlin   populate_wm_prog_key(pipeline, info, &key);
783a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
78410f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   if (cache) {
7852301705dee6324634520559b27ac6728ebb02191Jason Ekstrand      anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint,
7862301705dee6324634520559b27ac6728ebb02191Jason Ekstrand                      pipeline->layout, spec_info);
78710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      bin = anv_pipeline_cache_search(cache, sha1, 20);
78839a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg   }
78939a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg
79010f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   if (bin == NULL) {
7912b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg      struct brw_wm_prog_data prog_data = { 0, };
7926139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      struct anv_pipeline_binding surface_to_descriptor[256];
7936139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      struct anv_pipeline_binding sampler_to_descriptor[256];
794a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
7956139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      map = (struct anv_pipeline_bind_map) {
796cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         .surface_to_descriptor = surface_to_descriptor + 8,
7976139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg         .sampler_to_descriptor = sampler_to_descriptor
7986139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      };
799a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
80039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      nir_shader *nir = anv_pipeline_compile(pipeline, module, entrypoint,
80139a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg                                             MESA_SHADER_FRAGMENT, spec_info,
8026139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg                                             &prog_data.base, &map);
80339a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      if (nir == NULL)
80439a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
805a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
806cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      unsigned num_rts = 0;
807cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      struct anv_pipeline_binding rt_bindings[8];
80893bfa1d7a2e70a72a01c48a04c208845c22f9376Kenneth Graunke      nir_function_impl *impl = nir_shader_get_entrypoint(nir);
809fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand      nir_foreach_variable_safe(var, &nir->outputs) {
810fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand         if (var->data.location < FRAG_RESULT_DATA0)
811fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand            continue;
812fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand
813fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand         unsigned rt = var->data.location - FRAG_RESULT_DATA0;
814fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand         if (rt >= key.nr_color_regions) {
815cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand            /* Out-of-bounds, throw it away */
816fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand            var->data.mode = nir_var_local;
817fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand            exec_node_remove(&var->node);
818fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand            exec_list_push_tail(&impl->locals, &var->node);
819cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand            continue;
820cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         }
821cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand
822cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         /* Give it a new, compacted, location */
823cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         var->data.location = FRAG_RESULT_DATA0 + num_rts;
824cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand
825cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         unsigned array_len =
826cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand            glsl_type_is_array(var->type) ? glsl_get_length(var->type) : 1;
827cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         assert(num_rts + array_len <= 8);
828cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand
829cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         for (unsigned i = 0; i < array_len; i++) {
8304200c2266e9c1f76e54d667e69a1a69516e6bf57Jason Ekstrand            rt_bindings[num_rts + i] = (struct anv_pipeline_binding) {
831cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand               .set = ANV_DESCRIPTOR_SET_COLOR_ATTACHMENTS,
832a1a25db69926604d579139d1d497f1566ec16ac7Jason Ekstrand               .binding = 0,
833a1a25db69926604d579139d1d497f1566ec16ac7Jason Ekstrand               .index = rt + i,
834cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand            };
835fed8b7f8177ed3e770df1989922ff5cc63eba895Jason Ekstrand         }
836cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand
837cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         num_rts += array_len;
838cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      }
839cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand
840cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      if (num_rts == 0) {
841cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         /* If we have no render targets, we need a null render target */
842cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         rt_bindings[0] = (struct anv_pipeline_binding) {
843cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand            .set = ANV_DESCRIPTOR_SET_COLOR_ATTACHMENTS,
844a1a25db69926604d579139d1d497f1566ec16ac7Jason Ekstrand            .binding = 0,
845c99a0a8bcece2870f3e93328ab520efc2c9f7983Chad Versace            .index = UINT8_MAX,
846cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         };
847cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand         num_rts = 1;
848cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      }
849cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand
850cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      assert(num_rts <= 8);
851cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      map.surface_to_descriptor -= num_rts;
852cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      map.surface_count += num_rts;
853cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      assert(map.surface_count <= 256);
854cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      memcpy(map.surface_to_descriptor, rt_bindings,
855cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand             num_rts * sizeof(*rt_bindings));
856cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand
857cce65471b8667e1752754c53361031cded5b39d1Jason Ekstrand      anv_fill_binding_table(&prog_data.base, num_rts);
85875af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand
85939a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      void *mem_ctx = ralloc_context(NULL);
86039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg
8617df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand      ralloc_steal(mem_ctx, nir);
862a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
86339a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      unsigned code_size;
86439a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      const unsigned *shader_code =
8652b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg         brw_compile_fs(compiler, NULL, mem_ctx, &key, &prog_data, nir,
86691d61fbf7cb61a44adcaae51ee08ad0dd6b2a03bTimothy Arceri                        NULL, -1, -1, true, false, NULL, &code_size, NULL);
86739a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      if (shader_code == NULL) {
86839a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         ralloc_free(mem_ctx);
86939a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
87039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      }
871a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
87210f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      bin = anv_pipeline_upload_kernel(pipeline, cache, sha1, 20,
87310f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                                       shader_code, code_size,
874ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                                       &prog_data.base, sizeof(prog_data),
875ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                                       &map);
87610f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      if (!bin) {
87710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         ralloc_free(mem_ctx);
87810f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
87910f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      }
880a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
881a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      ralloc_free(mem_ctx);
882a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   }
883a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
88410f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   anv_pipeline_add_compiled_stage(pipeline, MESA_SHADER_FRAGMENT, bin);
885a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
886a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   return VK_SUCCESS;
887a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
888a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
889a71e614d33e8d869bbaced8948349a7180783ab7Jason EkstrandVkResult
890a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandanv_pipeline_compile_cs(struct anv_pipeline *pipeline,
89130521fb19e01b6e34cba4eaff40b9b782000b5dbKristian Høgsberg Kristensen                        struct anv_pipeline_cache *cache,
892a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand                        const VkComputePipelineCreateInfo *info,
893e10dc002e9544500a2247e49a132e18f994f34eeJason Ekstrand                        struct anv_shader_module *module,
8949b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                        const char *entrypoint,
8959b7e08118b382b1a0d4915275c6a760a517cb878Jason Ekstrand                        const VkSpecializationInfo *spec_info)
896a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{
897a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   const struct brw_compiler *compiler =
898a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      pipeline->device->instance->physicalDevice.compiler;
8996139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg   struct anv_pipeline_bind_map map;
900a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   struct brw_cs_prog_key key;
90110f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   struct anv_shader_bin *bin = NULL;
90287967a2c854c200ba8a7cabe1fe3f7e19291f187Kristian Høgsberg   unsigned char sha1[20];
903a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
904a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   populate_cs_prog_key(&pipeline->device->info, &key);
905a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
90610f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   if (cache) {
9072301705dee6324634520559b27ac6728ebb02191Jason Ekstrand      anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint,
9082301705dee6324634520559b27ac6728ebb02191Jason Ekstrand                      pipeline->layout, spec_info);
90910f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      bin = anv_pipeline_cache_search(cache, sha1, 20);
91039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg   }
91139a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg
91210f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   if (bin == NULL) {
9132b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg      struct brw_cs_prog_data prog_data = { 0, };
9146139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      struct anv_pipeline_binding surface_to_descriptor[256];
9156139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      struct anv_pipeline_binding sampler_to_descriptor[256];
916a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
9176139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      map = (struct anv_pipeline_bind_map) {
9186139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg         .surface_to_descriptor = surface_to_descriptor,
9196139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg         .sampler_to_descriptor = sampler_to_descriptor
9206139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg      };
921a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
92239a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      nir_shader *nir = anv_pipeline_compile(pipeline, module, entrypoint,
92339a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg                                             MESA_SHADER_COMPUTE, spec_info,
9246139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg                                             &prog_data.base, &map);
92539a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      if (nir == NULL)
92639a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
9275e82a91324d13c9194416347521120a93beef133Jordan Justen
92875af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand      anv_fill_binding_table(&prog_data.base, 1);
92975af420cb1145f5fc34af6728047a2404b5f1addJason Ekstrand
93039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      void *mem_ctx = ralloc_context(NULL);
93197b09a92686d75ba2faca2fb20276c75f630f691Jordan Justen
9327df46b7533a0ff257dbdb1b844ce0f4fc1c266acJason Ekstrand      ralloc_steal(mem_ctx, nir);
933a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
93439a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      unsigned code_size;
93539a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      const unsigned *shader_code =
9362b29342fae14d8626ca58f8a7ec358b70886ced3Kristian Høgsberg         brw_compile_cs(compiler, NULL, mem_ctx, &key, &prog_data, nir,
93739a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg                        -1, &code_size, NULL);
93839a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      if (shader_code == NULL) {
93939a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         ralloc_free(mem_ctx);
94039a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
94139a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg      }
942a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
94310f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      bin = anv_pipeline_upload_kernel(pipeline, cache, sha1, 20,
94410f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand                                       shader_code, code_size,
945ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                                       &prog_data.base, sizeof(prog_data),
946ff3185e3ba85b3635a1f645e8e951954f4022afeJason Ekstrand                                       &map);
94710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      if (!bin) {
94810f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         ralloc_free(mem_ctx);
94910f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
95010f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      }
9516139fe9a7790e0946e465f275d3f530552edbcdcKristian Høgsberg
952a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand      ralloc_free(mem_ctx);
953a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   }
954a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
95510f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   anv_pipeline_add_compiled_stage(pipeline, MESA_SHADER_COMPUTE, bin);
956a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
957a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   return VK_SUCCESS;
958a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand}
959a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
960a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery/**
961a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery * Copy pipeline state not marked as dynamic.
962a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery * Dynamic state is pipeline state which hasn't been provided at pipeline
963a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery * creation time, but is dynamically provided afterwards using various
964a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery * vkCmdSet* functions.
965a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery *
966a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery * The set of state considered "non_dynamic" is determined by the pieces of
967a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery * state that have their corresponding VkDynamicState enums omitted from
968a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery * VkPipelineDynamicStateCreateInfo::pDynamicStates.
969a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery *
970a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery * @param[out] pipeline    Destination non_dynamic state.
971a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery * @param[in]  pCreateInfo Source of non_dynamic state to be copied.
972a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery */
973a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic void
974a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Cherycopy_non_dynamic_state(struct anv_pipeline *pipeline,
975a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery                       const VkGraphicsPipelineCreateInfo *pCreateInfo)
9761a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrand{
9774d4e559b6a26d2942c2a24cc81588adc2482f415Chad Versace   anv_cmd_dirty_mask_t states = ANV_CMD_DIRTY_DYNAMIC_ALL;
9782484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace   ANV_FROM_HANDLE(anv_render_pass, pass, pCreateInfo->renderPass);
9792484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace   struct anv_subpass *subpass = &pass->subpasses[pCreateInfo->subpass];
9802484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace
9812484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace   pipeline->dynamic_state = default_dynamic_state;
9821a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrand
983368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand   if (pCreateInfo->pDynamicState) {
984368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand      /* Remove all of the states that are marked as dynamic */
985368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand      uint32_t count = pCreateInfo->pDynamicState->dynamicStateCount;
986368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand      for (uint32_t s = 0; s < count; s++)
987368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand         states &= ~(1 << pCreateInfo->pDynamicState->pDynamicStates[s]);
988368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand   }
9891a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrand
9901a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrand   struct anv_dynamic_state *dynamic = &pipeline->dynamic_state;
9911a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrand
992a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery   /* Section 9.2 of the Vulkan 1.0.15 spec says:
993a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *
994a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *    pViewportState is [...] NULL if the pipeline
995a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *    has rasterization disabled.
996a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    */
997a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery   if (!pCreateInfo->pRasterizationState->rasterizerDiscardEnable) {
998a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      assert(pCreateInfo->pViewportState);
999a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery
1000a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      dynamic->viewport.count = pCreateInfo->pViewportState->viewportCount;
1001a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      if (states & (1 << VK_DYNAMIC_STATE_VIEWPORT)) {
1002a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery         typed_memcpy(dynamic->viewport.viewports,
1003a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery                     pCreateInfo->pViewportState->pViewports,
1004a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery                     pCreateInfo->pViewportState->viewportCount);
1005a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      }
1006368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand
1007a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      dynamic->scissor.count = pCreateInfo->pViewportState->scissorCount;
1008a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      if (states & (1 << VK_DYNAMIC_STATE_SCISSOR)) {
1009a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery         typed_memcpy(dynamic->scissor.scissors,
1010a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery                     pCreateInfo->pViewportState->pScissors,
1011a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery                     pCreateInfo->pViewportState->scissorCount);
1012a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      }
1013368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand   }
1014368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand
1015368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand   if (states & (1 << VK_DYNAMIC_STATE_LINE_WIDTH)) {
10167f2284063df569df40f68074833f1518005d348dJason Ekstrand      assert(pCreateInfo->pRasterizationState);
10177f2284063df569df40f68074833f1518005d348dJason Ekstrand      dynamic->line_width = pCreateInfo->pRasterizationState->lineWidth;
1018368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand   }
1019368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand
1020368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand   if (states & (1 << VK_DYNAMIC_STATE_DEPTH_BIAS)) {
10217f2284063df569df40f68074833f1518005d348dJason Ekstrand      assert(pCreateInfo->pRasterizationState);
10224ab9391fbb35e627f2033494f0440536bb3341a8Jason Ekstrand      dynamic->depth_bias.bias =
10237f2284063df569df40f68074833f1518005d348dJason Ekstrand         pCreateInfo->pRasterizationState->depthBiasConstantFactor;
10247f2284063df569df40f68074833f1518005d348dJason Ekstrand      dynamic->depth_bias.clamp =
10257f2284063df569df40f68074833f1518005d348dJason Ekstrand         pCreateInfo->pRasterizationState->depthBiasClamp;
10264ab9391fbb35e627f2033494f0440536bb3341a8Jason Ekstrand      dynamic->depth_bias.slope =
10277f2284063df569df40f68074833f1518005d348dJason Ekstrand         pCreateInfo->pRasterizationState->depthBiasSlopeFactor;
1028368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand   }
1029368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand
1030a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery   /* Section 9.2 of the Vulkan 1.0.15 spec says:
1031a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *
1032a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *    pColorBlendState is [...] NULL if the pipeline has rasterization
1033a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *    disabled or if the subpass of the render pass the pipeline is
1034a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *    created against does not use any color attachments.
1035a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    */
1036a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery   bool uses_color_att = false;
1037a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery   for (unsigned i = 0; i < subpass->color_count; ++i) {
1038a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      if (subpass->color_attachments[i] != VK_ATTACHMENT_UNUSED) {
1039a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery         uses_color_att = true;
1040a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery         break;
1041a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      }
1042a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery   }
1043a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery
1044a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery   if (uses_color_att &&
1045a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery       !pCreateInfo->pRasterizationState->rasterizerDiscardEnable) {
1046368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand      assert(pCreateInfo->pColorBlendState);
1047a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery
1048a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      if (states & (1 << VK_DYNAMIC_STATE_BLEND_CONSTANTS))
1049a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery         typed_memcpy(dynamic->blend_constants,
1050a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery                     pCreateInfo->pColorBlendState->blendConstants, 4);
10511a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrand   }
1052368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand
10532484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace   /* If there is no depthstencil attachment, then don't read
10542484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace    * pDepthStencilState. The Vulkan spec states that pDepthStencilState may
10552484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace    * be NULL in this case. Even if pDepthStencilState is non-NULL, there is
10562484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace    * no need to override the depthstencil defaults in
10572484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace    * anv_pipeline::dynamic_state when there is no depthstencil attachment.
10582484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace    *
1059a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    * Section 9.2 of the Vulkan 1.0.15 spec says:
10602484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace    *
1061a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *    pDepthStencilState is [...] NULL if the pipeline has rasterization
1062a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *    disabled or if the subpass of the render pass the pipeline is created
1063a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery    *    against does not use a depth/stencil attachment.
10642484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace    */
1065a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery   if (!pCreateInfo->pRasterizationState->rasterizerDiscardEnable &&
1066a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery       subpass->depth_stencil_attachment != VK_ATTACHMENT_UNUSED) {
1067a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery      assert(pCreateInfo->pDepthStencilState);
1068a4a59172482d50318a5ae7f99021bcf0125e0f53Nanley Chery
10692484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace      if (states & (1 << VK_DYNAMIC_STATE_DEPTH_BOUNDS)) {
10702484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace         dynamic->depth_bounds.min =
10712484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace            pCreateInfo->pDepthStencilState->minDepthBounds;
10722484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace         dynamic->depth_bounds.max =
10732484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace            pCreateInfo->pDepthStencilState->maxDepthBounds;
10742484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace      }
10752484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace
10762484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace      if (states & (1 << VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK)) {
10772484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace         dynamic->stencil_compare_mask.front =
10784ab9391fbb35e627f2033494f0440536bb3341a8Jason Ekstrand            pCreateInfo->pDepthStencilState->front.compareMask;
10792484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace         dynamic->stencil_compare_mask.back =
10804ab9391fbb35e627f2033494f0440536bb3341a8Jason Ekstrand            pCreateInfo->pDepthStencilState->back.compareMask;
10812484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace      }
10822484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace
10832484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace      if (states & (1 << VK_DYNAMIC_STATE_STENCIL_WRITE_MASK)) {
10842484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace         dynamic->stencil_write_mask.front =
10854ab9391fbb35e627f2033494f0440536bb3341a8Jason Ekstrand            pCreateInfo->pDepthStencilState->front.writeMask;
10862484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace         dynamic->stencil_write_mask.back =
10874ab9391fbb35e627f2033494f0440536bb3341a8Jason Ekstrand            pCreateInfo->pDepthStencilState->back.writeMask;
10882484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace      }
10892484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace
10902484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace      if (states & (1 << VK_DYNAMIC_STATE_STENCIL_REFERENCE)) {
10912484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace         dynamic->stencil_reference.front =
10924ab9391fbb35e627f2033494f0440536bb3341a8Jason Ekstrand            pCreateInfo->pDepthStencilState->front.reference;
10932484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace         dynamic->stencil_reference.back =
10944ab9391fbb35e627f2033494f0440536bb3341a8Jason Ekstrand            pCreateInfo->pDepthStencilState->back.reference;
10952484d1a01fff6127b45280ee9bfbd1bbfaa425dbChad Versace      }
1096368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand   }
1097368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand
1098368e703a01c631f04f2a2a1f5f62f61c06838faeJason Ekstrand   pipeline->dynamic_state_mask = states;
10991a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrand}
11001a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrand
1101b51468b519f447c8e0afd492ce09d7c9485e222bChad Versacestatic void
1102b51468b519f447c8e0afd492ce09d7c9485e222bChad Versaceanv_pipeline_validate_create_info(const VkGraphicsPipelineCreateInfo *info)
1103b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace{
1104b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   struct anv_render_pass *renderpass = NULL;
1105b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   struct anv_subpass *subpass = NULL;
1106b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace
1107b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   /* Assert that all required members of VkGraphicsPipelineCreateInfo are
1108ba38a9d3803cdd43573f1c68497c54d701e911b6Kenneth Graunke    * present.  See the Vulkan 1.0.28 spec, Section 9.2 Graphics Pipelines.
1109b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace    */
1110b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   assert(info->sType == VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO);
1111b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace
1112b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   renderpass = anv_render_pass_from_handle(info->renderPass);
1113b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   assert(renderpass);
1114b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace
1115dedc406ec8adc6a36eb2b37e3f565aaa1dce6e3fJason Ekstrand   assert(info->subpass < renderpass->subpass_count);
1116dedc406ec8adc6a36eb2b37e3f565aaa1dce6e3fJason Ekstrand   subpass = &renderpass->subpasses[info->subpass];
1117b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace
1118b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   assert(info->stageCount >= 1);
1119b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   assert(info->pVertexInputState);
1120b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   assert(info->pInputAssemblyState);
11217f2284063df569df40f68074833f1518005d348dJason Ekstrand   assert(info->pRasterizationState);
1122ba38a9d3803cdd43573f1c68497c54d701e911b6Kenneth Graunke   if (!info->pRasterizationState->rasterizerDiscardEnable) {
1123ba38a9d3803cdd43573f1c68497c54d701e911b6Kenneth Graunke      assert(info->pViewportState);
1124ba38a9d3803cdd43573f1c68497c54d701e911b6Kenneth Graunke      assert(info->pMultisampleState);
1125b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace
1126ba38a9d3803cdd43573f1c68497c54d701e911b6Kenneth Graunke      if (subpass && subpass->depth_stencil_attachment != VK_ATTACHMENT_UNUSED)
1127ba38a9d3803cdd43573f1c68497c54d701e911b6Kenneth Graunke         assert(info->pDepthStencilState);
1128b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace
1129ba38a9d3803cdd43573f1c68497c54d701e911b6Kenneth Graunke      if (subpass && subpass->color_count > 0)
1130ba38a9d3803cdd43573f1c68497c54d701e911b6Kenneth Graunke         assert(info->pColorBlendState);
1131ba38a9d3803cdd43573f1c68497c54d701e911b6Kenneth Graunke   }
1132b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace
1133b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   for (uint32_t i = 0; i < info->stageCount; ++i) {
1134b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace      switch (info->pStages[i].stage) {
1135a5f19f64c3317c98b984010f144416ce768a3c0bJason Ekstrand      case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
1136a5f19f64c3317c98b984010f144416ce768a3c0bJason Ekstrand      case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
1137b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace         assert(info->pTessellationState);
1138b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace         break;
1139b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace      default:
1140b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace         break;
1141b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace      }
1142b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   }
1143b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace}
1144b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace
114542d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand/**
114642d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand * Calculate the desired L3 partitioning based on the current state of the
114742d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand * pipeline.  For now this simply returns the conservative defaults calculated
114842d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand * by get_default_l3_weights(), but we could probably do better by gathering
114942d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand * more statistics from the pipeline state (e.g. guess of expected URB usage
115042d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand * and bound surfaces), or by using feed-back from performance counters.
115142d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand */
115242d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrandvoid
115342d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrandanv_pipeline_setup_l3_config(struct anv_pipeline *pipeline, bool needs_slm)
115442d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand{
115542d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand   const struct gen_device_info *devinfo = &pipeline->device->info;
115642d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand
115742d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand   const struct gen_l3_weights w =
115842d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand      gen_get_default_l3_weights(devinfo, pipeline->needs_data_cache, needs_slm);
115942d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand
116042d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand   pipeline->urb.l3_config = gen_get_l3_config(devinfo, w);
116142d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand   pipeline->urb.total_size =
116242d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand      gen_get_l3_config_urb_size(devinfo, pipeline->urb.l3_config);
116342d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand}
116442d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand
11659c752b5b38305acaf863fc0165565fcf6f8f390aKristian HøgsbergVkResult
116630521fb19e01b6e34cba4eaff40b9b782000b5dbKristian Høgsberg Kristensenanv_pipeline_init(struct anv_pipeline *pipeline,
116730521fb19e01b6e34cba4eaff40b9b782000b5dbKristian Høgsberg Kristensen                  struct anv_device *device,
116830521fb19e01b6e34cba4eaff40b9b782000b5dbKristian Høgsberg Kristensen                  struct anv_pipeline_cache *cache,
11699c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg                  const VkGraphicsPipelineCreateInfo *pCreateInfo,
1170fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand                  const VkAllocationCallbacks *alloc)
11719c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg{
1172b2ad2a20b67645ac37b5f35daa47bfe454286d90Kristian Høgsberg Kristensen   VkResult result;
1173b2ad2a20b67645ac37b5f35daa47bfe454286d90Kristian Høgsberg Kristensen
1174b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   anv_validate {
1175b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace      anv_pipeline_validate_create_info(pCreateInfo);
1176b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace   }
1177b51468b519f447c8e0afd492ce09d7c9485e222bChad Versace
1178fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand   if (alloc == NULL)
1179fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand      alloc = &device->alloc;
1180fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand
11819c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   pipeline->device = device;
11829c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   pipeline->layout = anv_pipeline_layout_from_handle(pCreateInfo->layout);
11839c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg
1184b2ad2a20b67645ac37b5f35daa47bfe454286d90Kristian Høgsberg Kristensen   result = anv_reloc_list_init(&pipeline->batch_relocs, alloc);
1185b2ad2a20b67645ac37b5f35daa47bfe454286d90Kristian Høgsberg Kristensen   if (result != VK_SUCCESS)
1186b2ad2a20b67645ac37b5f35daa47bfe454286d90Kristian Høgsberg Kristensen      return result;
1187fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand
1188fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand   pipeline->batch.alloc = alloc;
11899c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   pipeline->batch.next = pipeline->batch.start = pipeline->batch_data;
11909c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   pipeline->batch.end = pipeline->batch.start + sizeof(pipeline->batch_data);
11919c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   pipeline->batch.relocs = &pipeline->batch_relocs;
11929c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg
1193a0d84a9ef9df69606a928cf7dca8f2b80dea1c36Nanley Chery   copy_non_dynamic_state(pipeline, pCreateInfo);
1194eb6764c4a73006eee32e19e3afc6eab100a2ce16Jason Ekstrand   pipeline->depth_clamp_enable = pCreateInfo->pRasterizationState &&
1195eb6764c4a73006eee32e19e3afc6eab100a2ce16Jason Ekstrand                                  pCreateInfo->pRasterizationState->depthClampEnable;
11961a52bc30390d56493ea2d0a950d8b9f01519ed24Jason Ekstrand
11978ee31828c656d456bfe067cfae512b1fbbd0bbd6Jordan Justen   pipeline->needs_data_cache = false;
11988ee31828c656d456bfe067cfae512b1fbbd0bbd6Jordan Justen
1199a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   /* When we free the pipeline, we detect stages based on the NULL status
1200a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand    * of various prog_data pointers.  Make them NULL by default.
1201a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand    */
120210f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   memset(pipeline->shaders, 0, sizeof(pipeline->shaders));
12039c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg
1204a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   pipeline->active_stages = 0;
1205a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
1206623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke   const VkPipelineShaderStageCreateInfo *pStages[MESA_SHADER_STAGES] = { 0, };
1207623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke   struct anv_shader_module *modules[MESA_SHADER_STAGES] = { 0, };
1208a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand   for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
1209623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke      gl_shader_stage stage = ffs(pCreateInfo->pStages[i].stage) - 1;
1210623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke      pStages[stage] = &pCreateInfo->pStages[i];
1211623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke      modules[stage] = anv_shader_module_from_handle(pStages[stage]->module);
1212623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke   }
1213623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke
1214623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke   if (modules[MESA_SHADER_VERTEX]) {
1215d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand      result = anv_pipeline_compile_vs(pipeline, cache, pCreateInfo,
1216d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand                                       modules[MESA_SHADER_VERTEX],
1217d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand                                       pStages[MESA_SHADER_VERTEX]->pName,
1218d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand                                       pStages[MESA_SHADER_VERTEX]->pSpecializationInfo);
1219d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand      if (result != VK_SUCCESS)
1220d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand         goto compile_fail;
1221623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke   }
1222623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke
1223e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   if (modules[MESA_SHADER_TESS_EVAL]) {
1224e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke      anv_pipeline_compile_tcs_tes(pipeline, cache, pCreateInfo,
1225e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                   modules[MESA_SHADER_TESS_CTRL],
1226e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                   pStages[MESA_SHADER_TESS_CTRL]->pName,
1227e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                   pStages[MESA_SHADER_TESS_CTRL]->pSpecializationInfo,
1228e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                   modules[MESA_SHADER_TESS_EVAL],
1229e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                   pStages[MESA_SHADER_TESS_EVAL]->pName,
1230e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke                                   pStages[MESA_SHADER_TESS_EVAL]->pSpecializationInfo);
1231e50d4807a35e6798371e12f745f75419795d3564Kenneth Graunke   }
123232aa01663ff649a399480886106e203cc347c212Kristian Høgsberg
1233623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke   if (modules[MESA_SHADER_GEOMETRY]) {
1234d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand      result = anv_pipeline_compile_gs(pipeline, cache, pCreateInfo,
1235d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand                                       modules[MESA_SHADER_GEOMETRY],
1236d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand                                       pStages[MESA_SHADER_GEOMETRY]->pName,
1237d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand                                       pStages[MESA_SHADER_GEOMETRY]->pSpecializationInfo);
1238d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand      if (result != VK_SUCCESS)
1239d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand         goto compile_fail;
1240623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke   }
1241623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke
1242623ce595a97cc3ec47be042867e24047162cd371Kenneth Graunke   if (modules[MESA_SHADER_FRAGMENT]) {
1243ac77528f7d383ee103ed702590f7bc9f05907b61Jason Ekstrand      result = anv_pipeline_compile_fs(pipeline, cache, pCreateInfo,
1244d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand                                       modules[MESA_SHADER_FRAGMENT],
1245d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand                                       pStages[MESA_SHADER_FRAGMENT]->pName,
1246d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand                                       pStages[MESA_SHADER_FRAGMENT]->pSpecializationInfo);
1247d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand      if (result != VK_SUCCESS)
1248d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand         goto compile_fail;
12499c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   }
12509c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg
1251ac77528f7d383ee103ed702590f7bc9f05907b61Jason Ekstrand   assert(pipeline->active_stages & VK_SHADER_STAGE_VERTEX_BIT);
1252a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
125342d03c204c3a2aee2dd1d3736085b86627e9d46fJason Ekstrand   anv_pipeline_setup_l3_config(pipeline, false);
1254a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand
12559c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   const VkPipelineVertexInputStateCreateInfo *vi_info =
12569c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg      pCreateInfo->pVertexInputState;
1257e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand
1258ac77528f7d383ee103ed702590f7bc9f05907b61Jason Ekstrand   const uint64_t inputs_read = get_vs_prog_data(pipeline)->inputs_read;
1259e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand
12609c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   pipeline->vb_used = 0;
1261e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand   for (uint32_t i = 0; i < vi_info->vertexAttributeDescriptionCount; i++) {
1262e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand      const VkVertexInputAttributeDescription *desc =
1263e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand         &vi_info->pVertexAttributeDescriptions[i];
1264e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand
1265e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand      if (inputs_read & (1 << (VERT_ATTRIB_GENERIC0 + desc->location)))
1266e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand         pipeline->vb_used |= 1 << desc->binding;
1267e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand   }
1268e10b0e2b4985327a48434e7fec297d33b27bc47fJason Ekstrand
1269e673d642090e6a6fe339570726e52b9191b89d3eJason Ekstrand   for (uint32_t i = 0; i < vi_info->vertexBindingDescriptionCount; i++) {
12709c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg      const VkVertexInputBindingDescription *desc =
12719c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg         &vi_info->pVertexBindingDescriptions[i];
12729c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg
1273e673d642090e6a6fe339570726e52b9191b89d3eJason Ekstrand      pipeline->binding_stride[desc->binding] = desc->stride;
12749c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg
12759c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg      /* Step rate is programmed per vertex element (attribute), not
12769c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg       * binding. Set up a map of which bindings step per instance, for
12779c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg       * reference by vertex element setup. */
12789b1cb8fdbc7e3c2fb9b950a9844ef653761b7480Jason Ekstrand      switch (desc->inputRate) {
12799c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg      default:
12809b1cb8fdbc7e3c2fb9b950a9844ef653761b7480Jason Ekstrand      case VK_VERTEX_INPUT_RATE_VERTEX:
12819c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg         pipeline->instancing_enable[desc->binding] = false;
12829c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg         break;
12839b1cb8fdbc7e3c2fb9b950a9844ef653761b7480Jason Ekstrand      case VK_VERTEX_INPUT_RATE_INSTANCE:
12849c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg         pipeline->instancing_enable[desc->binding] = true;
12859c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg         break;
12869c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg      }
12879c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   }
12889c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg
12899c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   const VkPipelineInputAssemblyStateCreateInfo *ia_info =
12909c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg      pCreateInfo->pInputAssemblyState;
129108b5713068b9ce6c0a1670cf5f68ad94dfcf6100Kenneth Graunke   const VkPipelineTessellationStateCreateInfo *tess_info =
129208b5713068b9ce6c0a1670cf5f68ad94dfcf6100Kenneth Graunke      pCreateInfo->pTessellationState;
12939c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   pipeline->primitive_restart = ia_info->primitiveRestartEnable;
129408b5713068b9ce6c0a1670cf5f68ad94dfcf6100Kenneth Graunke
129508b5713068b9ce6c0a1670cf5f68ad94dfcf6100Kenneth Graunke   if (anv_pipeline_has_stage(pipeline, MESA_SHADER_TESS_EVAL))
129608b5713068b9ce6c0a1670cf5f68ad94dfcf6100Kenneth Graunke      pipeline->topology = _3DPRIM_PATCHLIST(tess_info->patchControlPoints);
129708b5713068b9ce6c0a1670cf5f68ad94dfcf6100Kenneth Graunke   else
129808b5713068b9ce6c0a1670cf5f68ad94dfcf6100Kenneth Graunke      pipeline->topology = vk_to_gen_primitive_type[ia_info->topology];
12999c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg
13009c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg   return VK_SUCCESS;
1301d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand
1302d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrandcompile_fail:
130310f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   for (unsigned s = 0; s < MESA_SHADER_STAGES; s++) {
130410f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand      if (pipeline->shaders[s])
130510f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand         anv_shader_bin_unref(device, pipeline->shaders[s]);
130610f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand   }
130710f9901bcef7724cb72fb2fe7e3dd8d6660d2f34Jason Ekstrand
1308d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand   anv_reloc_list_finish(&pipeline->batch_relocs, alloc);
1309d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand
1310d5945bec124ab21606d0d2719abbae8c44a70cf1Jason Ekstrand   return result;
13119c752b5b38305acaf863fc0165565fcf6f8f390aKristian Høgsberg}
1312