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