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 2483548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov#include <dlfcn.h> 25769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <assert.h> 26769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <stdbool.h> 27769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <string.h> 28920f34a2d9f14f023aee5203baa110c971519ee8Jason Ekstrand#include <sys/mman.h> 2983548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov#include <sys/stat.h> 30769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <unistd.h> 31769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg#include <fcntl.h> 32769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 332c2233e328341700b7bc5c574f9de21ab4e4116aChad Versace#include "anv_private.h" 346a7ca4ef2cd3f39d3b5e77051cb3f3175e9e60dfJason Ekstrand#include "util/strtod.h" 35e45748badea913b90a51744ee1d8a509a3ae8165Jason Ekstrand#include "util/debug.h" 36769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 37f6d95876888c81559d4ba773e4e6c82b184e708eJason Ekstrand#include "genxml/gen7_pack.h" 38de54b4b18fea9358cc6f0e7dc9f64256be00be06Jason Ekstrand 39a95f51c1d79848941dae2965dc0d2db4d1fd3d18Jason Ekstrandstruct anv_dispatch_table dtable; 40a95f51c1d79848941dae2965dc0d2db4d1fd3d18Jason Ekstrand 41a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic void 42a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandcompiler_debug_log(void *data, const char *fmt, ...) 43a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{ } 44a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand 45a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandstatic void 46a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrandcompiler_perf_log(void *data, const char *fmt, ...) 47a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand{ 48a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand va_list args; 49a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand va_start(args, fmt); 50a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand 51a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand if (unlikely(INTEL_DEBUG & DEBUG_PERF)) 52a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand vfprintf(stderr, fmt, args); 53a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand 54a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand va_end(args); 55a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand} 56a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand 5783548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikovstatic bool 5883548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikovanv_get_function_timestamp(void *ptr, uint32_t* timestamp) 5983548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov{ 6083548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov Dl_info info; 6183548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov struct stat st; 6283548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov if (!dladdr(ptr, &info) || !info.dli_fname) 6383548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov return false; 6483548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov 6583548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov if (stat(info.dli_fname, &st)) 6683548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov return false; 6783548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov 6883548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov *timestamp = st.st_mtim.tv_sec; 6983548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov return true; 7083548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov} 7183548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov 7283548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikovstatic bool 73de138e9cede4b1996fac9256d894c80e7b48a6d7Emil Velikovanv_device_get_cache_uuid(void *uuid) 74de138e9cede4b1996fac9256d894c80e7b48a6d7Emil Velikov{ 7583548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov uint32_t timestamp; 7683548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov 77de138e9cede4b1996fac9256d894c80e7b48a6d7Emil Velikov memset(uuid, 0, VK_UUID_SIZE); 7815d3fc167a6eebc6df50c603275288cc496d6689Kenneth Graunke if (!anv_get_function_timestamp(anv_device_get_cache_uuid, ×tamp)) 7915d3fc167a6eebc6df50c603275288cc496d6689Kenneth Graunke return false; 8083548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov 8183548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov snprintf(uuid, VK_UUID_SIZE, "anv-%d", timestamp); 8283548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov return true; 83de138e9cede4b1996fac9256d894c80e7b48a6d7Emil Velikov} 84de138e9cede4b1996fac9256d894c80e7b48a6d7Emil Velikov 85769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsbergstatic VkResult 864422bd4cf61c4f05f853dc790c03ab04c138d7b0Chad Versaceanv_physical_device_init(struct anv_physical_device *device, 874422bd4cf61c4f05f853dc790c03ab04c138d7b0Chad Versace struct anv_instance *instance, 884422bd4cf61c4f05f853dc790c03ab04c138d7b0Chad Versace const char *path) 89769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 90c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg VkResult result; 919564dd37a00f642d2637ffa15c2f27fb8992aa50Kristian Høgsberg int fd; 929564dd37a00f642d2637ffa15c2f27fb8992aa50Kristian Høgsberg 939564dd37a00f642d2637ffa15c2f27fb8992aa50Kristian Høgsberg fd = open(path, O_RDWR | O_CLOEXEC); 949564dd37a00f642d2637ffa15c2f27fb8992aa50Kristian Høgsberg if (fd < 0) 9534ff4fbba658dbdfb2b0c852b07a0ee2db549d2eJason Ekstrand return vk_error(VK_ERROR_INCOMPATIBLE_DRIVER); 96769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 9739cd3783a42926c0c4570d6e5576e2e88baece4fJason Ekstrand device->_loader_data.loaderMagic = ICD_LOADER_MAGIC; 98769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg device->instance = instance; 99e023c104f738d030c21a519e805705961e4ccf46Jason Ekstrand 100e023c104f738d030c21a519e805705961e4ccf46Jason Ekstrand assert(strlen(path) < ARRAY_SIZE(device->path)); 101e023c104f738d030c21a519e805705961e4ccf46Jason Ekstrand strncpy(device->path, path, ARRAY_SIZE(device->path)); 102f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace 103aac6f7c3bb4630c57bed25f3777bf81140206aadKristian Høgsberg device->chipset_id = anv_gem_get_param(fd, I915_PARAM_CHIPSET_ID); 104c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg if (!device->chipset_id) { 10534ff4fbba658dbdfb2b0c852b07a0ee2db549d2eJason Ekstrand result = vk_error(VK_ERROR_INCOMPATIBLE_DRIVER); 106769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg goto fail; 107c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg } 108769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 109979d0aca6277975986f5f278cad0f37616c9d91fJason Ekstrand device->name = gen_get_device_name(device->chipset_id); 110bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin if (!gen_get_device_info(device->chipset_id, &device->info)) { 11134ff4fbba658dbdfb2b0c852b07a0ee2db549d2eJason Ekstrand result = vk_error(VK_ERROR_INCOMPATIBLE_DRIVER); 112769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg goto fail; 113c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg } 114584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand 115bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin if (device->info.is_haswell) { 116f0390bcad6b5e1f1e94bbf762ccc98bf499c022bJason Ekstrand fprintf(stderr, "WARNING: Haswell Vulkan support is incomplete\n"); 117bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin } else if (device->info.gen == 7 && !device->info.is_baytrail) { 118862da6a891ecf570ab02ce9f07d1d22fff04b7efJason Ekstrand fprintf(stderr, "WARNING: Ivy Bridge Vulkan support is incomplete\n"); 119bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin } else if (device->info.gen == 7 && device->info.is_baytrail) { 120dac57750db6779b3280fca3b7a375243b4aea623Kristian Høgsberg fprintf(stderr, "WARNING: Bay Trail Vulkan support is incomplete\n"); 121bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin } else if (device->info.gen >= 8) { 1227c5e1fd9984614ff3952bbabf946dac0e2a0c2b6Kristian Høgsberg /* Broadwell, Cherryview, Skylake, Broxton, Kabylake is as fully 1237c5e1fd9984614ff3952bbabf946dac0e2a0c2b6Kristian Høgsberg * supported as anything */ 124584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand } else { 125fed3586f34ce701b0f6464c54456122e096c0beeJason Ekstrand result = vk_errorf(VK_ERROR_INCOMPATIBLE_DRIVER, 126584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand "Vulkan not yet supported on %s", device->name); 127584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand goto fail; 128584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand } 129584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand 1301a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen device->cmd_parser_version = -1; 131bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin if (device->info.gen == 7) { 1321a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen device->cmd_parser_version = 1331a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen anv_gem_get_param(fd, I915_PARAM_CMD_PARSER_VERSION); 1341a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen if (device->cmd_parser_version == -1) { 1351a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, 1361a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen "failed to get command parser version"); 1371a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen goto fail; 1381a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen } 1391a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen } 1401a3adae84aa16247cba0e3619d54e6d8d543fcf1Jordan Justen 141c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg if (anv_gem_get_aperture(fd, &device->aperture_size) == -1) { 142f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, 143f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace "failed to get aperture size: %m"); 1449564dd37a00f642d2637ffa15c2f27fb8992aa50Kristian Høgsberg goto fail; 145c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg } 1469564dd37a00f642d2637ffa15c2f27fb8992aa50Kristian Høgsberg 147c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg if (!anv_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT)) { 148f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, 149f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace "kernel missing gem wait"); 150769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg goto fail; 151c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg } 152769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 153c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2)) { 154f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, 155f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace "kernel missing execbuf2"); 156769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg goto fail; 157c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg } 158769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 159bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin if (!device->info.has_llc && 160220ac9337b24c7099ac3534ba14c61592e1266aeKristian Høgsberg anv_gem_get_param(fd, I915_PARAM_MMAP_VERSION) < 1) { 161bbb6875f35c783d4f350dc9fbf2e2904b3d47a5aKristian Høgsberg result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, 162bbb6875f35c783d4f350dc9fbf2e2904b3d47a5aKristian Høgsberg "kernel missing wc mmap"); 163bbb6875f35c783d4f350dc9fbf2e2904b3d47a5aKristian Høgsberg goto fail; 164bbb6875f35c783d4f350dc9fbf2e2904b3d47a5aKristian Høgsberg } 165bbb6875f35c783d4f350dc9fbf2e2904b3d47a5aKristian Høgsberg 16683548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov if (!anv_device_get_cache_uuid(device->uuid)) { 16783548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED, 16883548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov "cannot generate UUID"); 16983548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov goto fail; 17083548e12921b5724aa6c78c2b1efc9ff774fd7a2Emil Velikov } 171580b2e85e48dbb82d168192c9f085d1c70355795Jason Ekstrand bool swizzled = anv_gem_get_bit6_swizzle(fd, I915_TILING_X); 172580b2e85e48dbb82d168192c9f085d1c70355795Jason Ekstrand 17309394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin /* GENs prior to 8 do not support EU/Subslice info */ 174bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin if (device->info.gen >= 8) { 17509394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin device->subslice_total = anv_gem_get_param(fd, I915_PARAM_SUBSLICE_TOTAL); 17609394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin device->eu_total = anv_gem_get_param(fd, I915_PARAM_EU_TOTAL); 17709394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin 17809394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin /* Without this information, we cannot get the right Braswell 17909394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin * brandstrings, and we have to use conservative numbers for GPGPU on 18009394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin * many platforms, but otherwise, things will just work. 18109394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin */ 18209394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin if (device->subslice_total < 1 || device->eu_total < 1) { 18309394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin fprintf(stderr, "WARNING: Kernel 4.1 required to properly" 18409394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin " query GPU properties.\n"); 18509394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin } 186bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin } else if (device->info.gen == 7) { 187bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin device->subslice_total = 1 << (device->info.gt - 1); 18809394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin } 18909394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin 190bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin if (device->info.is_cherryview && 19109394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin device->subslice_total > 0 && device->eu_total > 0) { 19209394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin /* Logical CS threads = EUs per subslice * 7 threads per EU */ 1936b21728c4a4f89754a79fe754e0c8496c25d9b66Lionel Landwerlin uint32_t max_cs_threads = device->eu_total / device->subslice_total * 7; 19409394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin 19509394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin /* Fuse configurations may give more threads than expected, never less. */ 1966b21728c4a4f89754a79fe754e0c8496c25d9b66Lionel Landwerlin if (max_cs_threads > device->info.max_cs_threads) 1976b21728c4a4f89754a79fe754e0c8496c25d9b66Lionel Landwerlin device->info.max_cs_threads = max_cs_threads; 19809394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin } 19909394ee6cfe9df2c99373963794c60678da08b39Lionel Landwerlin 200a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand brw_process_intel_debug_variable(); 201a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand 202bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin device->compiler = brw_compiler_create(NULL, &device->info); 2036fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrand if (device->compiler == NULL) { 2046fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrand result = vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); 2056fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrand goto fail; 2066fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrand } 207a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand device->compiler->shader_debug_log = compiler_debug_log; 208a71e614d33e8d869bbaced8948349a7180783ab7Jason Ekstrand device->compiler->shader_perf_log = compiler_perf_log; 2096fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrand 210ace54034536936c176270afc087675390072b17cEmil Velikov result = anv_init_wsi(device); 211a1cf494f7740c2afb851ffc3248e2cfa54d74eadEmil Velikov if (result != VK_SUCCESS) { 212a1cf494f7740c2afb851ffc3248e2cfa54d74eadEmil Velikov ralloc_free(device->compiler); 213a1cf494f7740c2afb851ffc3248e2cfa54d74eadEmil Velikov goto fail; 214a1cf494f7740c2afb851ffc3248e2cfa54d74eadEmil Velikov } 215eb6baa31746b55d48892b0c57f0e0076b91efdebJason Ekstrand 216bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin isl_device_init(&device->isl_dev, &device->info, swizzled); 217af392916ff3856c8e606212914c1623674c49affChad Versace 2183af81715470f8d656fe8b8e35475ed2b5fc766daEmil Velikov close(fd); 219769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return VK_SUCCESS; 220477383e9ac2fd43f8b2176c13da7116f5d20b959Chad Versace 2218cda3e9b1bc0df5b2acfb8e3afac854a8d0defe7Chad Versacefail: 2229564dd37a00f642d2637ffa15c2f27fb8992aa50Kristian Høgsberg close(fd); 223c4b30e7885f1d47e57753db49d232669d87a88e5Kristian Høgsberg return result; 224769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 225769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 2266fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrandstatic void 2276fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrandanv_physical_device_finish(struct anv_physical_device *device) 2286fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrand{ 229eb6baa31746b55d48892b0c57f0e0076b91efdebJason Ekstrand anv_finish_wsi(device); 2306fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrand ralloc_free(device->compiler); 2316fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrand} 2326fb4469588ba37ace4794b354c9fd30d18b5c9ffJason Ekstrand 233b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrandstatic const VkExtensionProperties global_extensions[] = { 234b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand { 235d666487dc6c46ea6ad7ca71fd0b0b1e099e5da0fJason Ekstrand .extensionName = VK_KHR_SURFACE_EXTENSION_NAME, 236c688e4db11ce0f55e7ce1f3335b0ecd9e74cd4b5Jason Ekstrand .specVersion = 25, 237b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand }, 2386dc169e18f6991836be5172adae7c5766cda3366Emil Velikov#ifdef VK_USE_PLATFORM_XCB_KHR 239d666487dc6c46ea6ad7ca71fd0b0b1e099e5da0fJason Ekstrand { 240d666487dc6c46ea6ad7ca71fd0b0b1e099e5da0fJason Ekstrand .extensionName = VK_KHR_XCB_SURFACE_EXTENSION_NAME, 241f373a91a5264bb93b31b5be9f9714da856383ed1Emil Velikov .specVersion = 6, 242d666487dc6c46ea6ad7ca71fd0b0b1e099e5da0fJason Ekstrand }, 2436dc169e18f6991836be5172adae7c5766cda3366Emil Velikov#endif 24471258e9462c9cfb4c8b567713af5018928ef744dKevin Strasser#ifdef VK_USE_PLATFORM_XLIB_KHR 24571258e9462c9cfb4c8b567713af5018928ef744dKevin Strasser { 24671258e9462c9cfb4c8b567713af5018928ef744dKevin Strasser .extensionName = VK_KHR_XLIB_SURFACE_EXTENSION_NAME, 247f373a91a5264bb93b31b5be9f9714da856383ed1Emil Velikov .specVersion = 6, 24871258e9462c9cfb4c8b567713af5018928ef744dKevin Strasser }, 24971258e9462c9cfb4c8b567713af5018928ef744dKevin Strasser#endif 250cbc4837b83157fd990ac5960badaba342be6cb33Emil Velikov#ifdef VK_USE_PLATFORM_WAYLAND_KHR 251d666487dc6c46ea6ad7ca71fd0b0b1e099e5da0fJason Ekstrand { 252d666487dc6c46ea6ad7ca71fd0b0b1e099e5da0fJason Ekstrand .extensionName = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, 253f373a91a5264bb93b31b5be9f9714da856383ed1Emil Velikov .specVersion = 5, 254d666487dc6c46ea6ad7ca71fd0b0b1e099e5da0fJason Ekstrand }, 255d666487dc6c46ea6ad7ca71fd0b0b1e099e5da0fJason Ekstrand#endif 256b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand}; 257b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand 258b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrandstatic const VkExtensionProperties device_extensions[] = { 259b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand { 260d666487dc6c46ea6ad7ca71fd0b0b1e099e5da0fJason Ekstrand .extensionName = VK_KHR_SWAPCHAIN_EXTENSION_NAME, 261f373a91a5264bb93b31b5be9f9714da856383ed1Emil Velikov .specVersion = 68, 262b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand }, 263fda1d0187d2e9ea2aa9e1f4afd3c4ebccf74f668Ilia Mirkin { 264fda1d0187d2e9ea2aa9e1f4afd3c4ebccf74f668Ilia Mirkin .extensionName = VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 265fda1d0187d2e9ea2aa9e1f4afd3c4ebccf74f668Ilia Mirkin .specVersion = 1, 266fda1d0187d2e9ea2aa9e1f4afd3c4ebccf74f668Ilia Mirkin } 267b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand}; 268b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand 269fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrandstatic void * 270bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlindefault_alloc_func(void *pUserData, size_t size, size_t align, 271fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VkSystemAllocationScope allocationScope) 272fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand{ 273fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand return malloc(size); 274fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand} 275fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand 276fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrandstatic void * 277fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstranddefault_realloc_func(void *pUserData, void *pOriginal, size_t size, 278fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand size_t align, VkSystemAllocationScope allocationScope) 279fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand{ 280fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand return realloc(pOriginal, size); 281fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand} 282fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand 283fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrandstatic void 284fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstranddefault_free_func(void *pUserData, void *pMemory) 285fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand{ 286fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand free(pMemory); 287fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand} 288fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand 289fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrandstatic const VkAllocationCallbacks default_alloc = { 290fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand .pUserData = NULL, 291fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand .pfnAllocation = default_alloc_func, 292fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand .pfnReallocation = default_realloc_func, 293fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand .pfnFree = default_free_func, 294fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand}; 295fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand 296454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_CreateInstance( 297769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg const VkInstanceCreateInfo* pCreateInfo, 298fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator, 299769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkInstance* pInstance) 300769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 301769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg struct anv_instance *instance; 302769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 303769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO); 304769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 305c32273d246e8bf46924d8852d1b3fd1d34194df2Jason Ekstrand uint32_t client_version; 306c32273d246e8bf46924d8852d1b3fd1d34194df2Jason Ekstrand if (pCreateInfo->pApplicationInfo && 307c32273d246e8bf46924d8852d1b3fd1d34194df2Jason Ekstrand pCreateInfo->pApplicationInfo->apiVersion != 0) { 308c32273d246e8bf46924d8852d1b3fd1d34194df2Jason Ekstrand client_version = pCreateInfo->pApplicationInfo->apiVersion; 309c32273d246e8bf46924d8852d1b3fd1d34194df2Jason Ekstrand } else { 310c32273d246e8bf46924d8852d1b3fd1d34194df2Jason Ekstrand client_version = VK_MAKE_VERSION(1, 0, 0); 311c32273d246e8bf46924d8852d1b3fd1d34194df2Jason Ekstrand } 312c32273d246e8bf46924d8852d1b3fd1d34194df2Jason Ekstrand 313a19ceee46c553821332aca2ea0dff40fc83794b3Jason Ekstrand if (VK_MAKE_VERSION(1, 0, 0) > client_version || 314204d937ac2623b230260f60d2d7c5d7233d697fbJason Ekstrand client_version > VK_MAKE_VERSION(1, 0, 0xfff)) { 315fd99f3d65856288aaea8076cbff56f76bfb7cfa1Jason Ekstrand return vk_errorf(VK_ERROR_INCOMPATIBLE_DRIVER, 316fd99f3d65856288aaea8076cbff56f76bfb7cfa1Jason Ekstrand "Client requested version %d.%d.%d", 317fd99f3d65856288aaea8076cbff56f76bfb7cfa1Jason Ekstrand VK_VERSION_MAJOR(client_version), 318fd99f3d65856288aaea8076cbff56f76bfb7cfa1Jason Ekstrand VK_VERSION_MINOR(client_version), 319fd99f3d65856288aaea8076cbff56f76bfb7cfa1Jason Ekstrand VK_VERSION_PATCH(client_version)); 320608b411e9f69f5e1b39233c1dd4d7a69f49d782cJason Ekstrand } 321e21ecb841c7a2c5653ec86922b4e08006645ae8dJason Ekstrand 322aab9517f3dc5a2f28eaae4a2fa64cb0ad82bb4f7Jason Ekstrand for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { 323b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand bool found = false; 324b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand for (uint32_t j = 0; j < ARRAY_SIZE(global_extensions); j++) { 325b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 326aadb7dce9b5dfc16878638580dc80759a45ca773Jason Ekstrand global_extensions[j].extensionName) == 0) { 327b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand found = true; 328b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand break; 329b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand } 330b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand } 331b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand if (!found) 332f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT); 333b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand } 334b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand 3351ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie instance = vk_alloc2(&default_alloc, pAllocator, sizeof(*instance), 8, 33645d17fcf9bd41dfcd34f01bf62b031d8ca071eddJason Ekstrand VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); 337769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg if (!instance) 338769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); 339769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 34039cd3783a42926c0c4570d6e5576e2e88baece4fJason Ekstrand instance->_loader_data.loaderMagic = ICD_LOADER_MAGIC; 341fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand 342fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand if (pAllocator) 343fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand instance->alloc = *pAllocator; 344fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand else 345fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand instance->alloc = default_alloc; 346fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand 347ecd1d94d1c74be6481ebc6adde01fe73c7d41331Philipp Zabel instance->apiVersion = client_version; 348584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand instance->physicalDeviceCount = -1; 349769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 3506a7ca4ef2cd3f39d3b5e77051cb3f3175e9e60dfJason Ekstrand _mesa_locale_init(); 3516a7ca4ef2cd3f39d3b5e77051cb3f3175e9e60dfJason Ekstrand 352930598ad567155a7c35e7c5758844253232015a1Jason Ekstrand VG(VALGRIND_CREATE_MEMPOOL(instance, 0, false)); 353930598ad567155a7c35e7c5758844253232015a1Jason Ekstrand 354098209eedf9532bb442caee7c28cb57f6b959004Jason Ekstrand *pInstance = anv_instance_to_handle(instance); 355769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 356769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return VK_SUCCESS; 357769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 358769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 35905a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroyInstance( 360fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VkInstance _instance, 361fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator) 362769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 36373f9187e33582613fd1f255321891578cd9b97b0Jason Ekstrand ANV_FROM_HANDLE(anv_instance, instance, _instance); 364769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 365d1f01d89e177ec51056b819c0aa71d49443e9fb8Jason Ekstrand if (!instance) 366d1f01d89e177ec51056b819c0aa71d49443e9fb8Jason Ekstrand return; 367d1f01d89e177ec51056b819c0aa71d49443e9fb8Jason Ekstrand 3680ab926dfbf56ad6482b875d980ae95c533b765f9Chad Versace if (instance->physicalDeviceCount > 0) { 3690ab926dfbf56ad6482b875d980ae95c533b765f9Chad Versace /* We support at most one physical device. */ 3700ab926dfbf56ad6482b875d980ae95c533b765f9Chad Versace assert(instance->physicalDeviceCount == 1); 3710ab926dfbf56ad6482b875d980ae95c533b765f9Chad Versace anv_physical_device_finish(&instance->physicalDevice); 3720ab926dfbf56ad6482b875d980ae95c533b765f9Chad Versace } 3730ab926dfbf56ad6482b875d980ae95c533b765f9Chad Versace 374930598ad567155a7c35e7c5758844253232015a1Jason Ekstrand VG(VALGRIND_DESTROY_MEMPOOL(instance)); 375930598ad567155a7c35e7c5758844253232015a1Jason Ekstrand 3766a7ca4ef2cd3f39d3b5e77051cb3f3175e9e60dfJason Ekstrand _mesa_locale_fini(); 3776a7ca4ef2cd3f39d3b5e77051cb3f3175e9e60dfJason Ekstrand 3781ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie vk_free(&instance->alloc, instance); 379e40bdcef1fb6127545999a0b671b49fa393652b4Jason Ekstrand} 380e40bdcef1fb6127545999a0b671b49fa393652b4Jason Ekstrand 381454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_EnumeratePhysicalDevices( 382769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkInstance _instance, 383769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg uint32_t* pPhysicalDeviceCount, 384769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkPhysicalDevice* pPhysicalDevices) 385769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 38673f9187e33582613fd1f255321891578cd9b97b0Jason Ekstrand ANV_FROM_HANDLE(anv_instance, instance, _instance); 387fa915b661d4159014c0ed3c593505ddf57f27ee5Chad Versace VkResult result; 388fa915b661d4159014c0ed3c593505ddf57f27ee5Chad Versace 389584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand if (instance->physicalDeviceCount < 0) { 390b93b5935a71279a4b9dc58b01eab8a49e91b815bJason Ekstrand char path[20]; 391b93b5935a71279a4b9dc58b01eab8a49e91b815bJason Ekstrand for (unsigned i = 0; i < 8; i++) { 392b93b5935a71279a4b9dc58b01eab8a49e91b815bJason Ekstrand snprintf(path, sizeof(path), "/dev/dri/renderD%d", 128 + i); 393b93b5935a71279a4b9dc58b01eab8a49e91b815bJason Ekstrand result = anv_physical_device_init(&instance->physicalDevice, 394b93b5935a71279a4b9dc58b01eab8a49e91b815bJason Ekstrand instance, path); 395a5f8ff6ca18c38a7c4b5b37a4d5b14ca01e71b1eJason Ekstrand if (result != VK_ERROR_INCOMPATIBLE_DRIVER) 396b93b5935a71279a4b9dc58b01eab8a49e91b815bJason Ekstrand break; 397b93b5935a71279a4b9dc58b01eab8a49e91b815bJason Ekstrand } 398b93b5935a71279a4b9dc58b01eab8a49e91b815bJason Ekstrand 399fed3586f34ce701b0f6464c54456122e096c0beeJason Ekstrand if (result == VK_ERROR_INCOMPATIBLE_DRIVER) { 400584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand instance->physicalDeviceCount = 0; 401584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand } else if (result == VK_SUCCESS) { 402584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand instance->physicalDeviceCount = 1; 403584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand } else { 404fa915b661d4159014c0ed3c593505ddf57f27ee5Chad Versace return result; 405584f9d444238baaaacc138c81c46c88af98438f9Jason Ekstrand } 406fa915b661d4159014c0ed3c593505ddf57f27ee5Chad Versace } 407769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 4085b75dffd040210aa6968e4543b15162869d0127dChad Versace /* pPhysicalDeviceCount is an out parameter if pPhysicalDevices is NULL; 4095b75dffd040210aa6968e4543b15162869d0127dChad Versace * otherwise it's an inout parameter. 4105b75dffd040210aa6968e4543b15162869d0127dChad Versace * 4115b75dffd040210aa6968e4543b15162869d0127dChad Versace * The Vulkan spec (git aaed022) says: 4125b75dffd040210aa6968e4543b15162869d0127dChad Versace * 4135b75dffd040210aa6968e4543b15162869d0127dChad Versace * pPhysicalDeviceCount is a pointer to an unsigned integer variable 4145b75dffd040210aa6968e4543b15162869d0127dChad Versace * that is initialized with the number of devices the application is 4155b75dffd040210aa6968e4543b15162869d0127dChad Versace * prepared to receive handles to. pname:pPhysicalDevices is pointer to 4165b75dffd040210aa6968e4543b15162869d0127dChad Versace * an array of at least this many VkPhysicalDevice handles [...]. 4175b75dffd040210aa6968e4543b15162869d0127dChad Versace * 4185b75dffd040210aa6968e4543b15162869d0127dChad Versace * Upon success, if pPhysicalDevices is NULL, vkEnumeratePhysicalDevices 4195b75dffd040210aa6968e4543b15162869d0127dChad Versace * overwrites the contents of the variable pointed to by 4205b75dffd040210aa6968e4543b15162869d0127dChad Versace * pPhysicalDeviceCount with the number of physical devices in in the 4215b75dffd040210aa6968e4543b15162869d0127dChad Versace * instance; otherwise, vkEnumeratePhysicalDevices overwrites 4225b75dffd040210aa6968e4543b15162869d0127dChad Versace * pPhysicalDeviceCount with the number of physical handles written to 4235b75dffd040210aa6968e4543b15162869d0127dChad Versace * pPhysicalDevices. 4245b75dffd040210aa6968e4543b15162869d0127dChad Versace */ 4255b75dffd040210aa6968e4543b15162869d0127dChad Versace if (!pPhysicalDevices) { 4265b75dffd040210aa6968e4543b15162869d0127dChad Versace *pPhysicalDeviceCount = instance->physicalDeviceCount; 4275b75dffd040210aa6968e4543b15162869d0127dChad Versace } else if (*pPhysicalDeviceCount >= 1) { 428098209eedf9532bb442caee7c28cb57f6b959004Jason Ekstrand pPhysicalDevices[0] = anv_physical_device_to_handle(&instance->physicalDevice); 4295b75dffd040210aa6968e4543b15162869d0127dChad Versace *pPhysicalDeviceCount = 1; 430fd27d5fd92b0ea42854edc59768e2e04709e179aNicolas Koch } else if (*pPhysicalDeviceCount < instance->physicalDeviceCount) { 431fd27d5fd92b0ea42854edc59768e2e04709e179aNicolas Koch return VK_INCOMPLETE; 4325b75dffd040210aa6968e4543b15162869d0127dChad Versace } else { 4335b75dffd040210aa6968e4543b15162869d0127dChad Versace *pPhysicalDeviceCount = 0; 4345b75dffd040210aa6968e4543b15162869d0127dChad Versace } 435769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 436769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return VK_SUCCESS; 437769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 438769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 439f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrandvoid anv_GetPhysicalDeviceFeatures( 440f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand VkPhysicalDevice physicalDevice, 441f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand VkPhysicalDeviceFeatures* pFeatures) 442f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand{ 4434a2d17f60652f5a57a34d0b099dea95fcda2b362Kristian Høgsberg ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice); 444f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand 445f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand *pFeatures = (VkPhysicalDeviceFeatures) { 446dc5fdcd6b7463955ba4733a27791cf85008f5e7aKristian Høgsberg .robustBufferAccess = true, 4474a2d17f60652f5a57a34d0b099dea95fcda2b362Kristian Høgsberg .fullDrawIndexUint32 = true, 448a34f89c5e6cb78cbec940e5d8d186141f19ccfe7Ilia Mirkin .imageCubeArray = true, 449f124f4a394680f8a1847339770c8d245282bbe01Jason Ekstrand .independentBlend = true, 450f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .geometryShader = true, 45123a36c28118f6967654e963fc37c6b4c3b37db1bKenneth Graunke .tessellationShader = true, 452c4cd0e8ecd6ab9fc427d26ba7a9a360590291d24Anuj Phogat .sampleRateShading = true, 453d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .dualSrcBlend = true, 454f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .logicOp = true, 455802f00219addb31d6e8b73c818c42212406993ebJason Ekstrand .multiDrawIndirect = false, 456e6847f24f032b094b5a40012968ca79a5fdc67b4Ilia Mirkin .drawIndirectFirstInstance = true, 457eb6764c4a73006eee32e19e3afc6eab100a2ce16Jason Ekstrand .depthClamp = true, 458d2280a007a0425726c941e8794004f2f5ba98839Ilia Mirkin .depthBiasClamp = true, 459f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .fillModeNonSolid = true, 460f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .depthBounds = false, 461f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .wideLines = true, 462f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .largePoints = true, 463d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .alphaToOne = true, 464d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .multiViewport = true, 465014bd4acb8b130fb31ec00f6125b8a91881bebdfLionel Landwerlin .samplerAnisotropy = true, 466bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin .textureCompressionETC2 = pdevice->info.gen >= 8 || 467bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin pdevice->info.is_baytrail, 468bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin .textureCompressionASTC_LDR = pdevice->info.gen >= 9, /* FINISHME CHV */ 469f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .textureCompressionBC = true, 4704a2d17f60652f5a57a34d0b099dea95fcda2b362Kristian Høgsberg .occlusionQueryPrecise = true, 4719d8bae613779e0cc7382c9252ccd7f5e7cd5cadaKristian Høgsberg .pipelineStatisticsQuery = false, 472d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .fragmentStoresAndAtomics = true, 473d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .shaderTessellationAndGeometryPointSize = true, 474c633f228b482f21b7646728569f807bb452fddfbIlia Mirkin .shaderImageGatherExtended = true, 47576b97d544e642b10d049fad1a6ccd122e482c50aIlia Mirkin .shaderStorageImageExtendedFormats = true, 476f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .shaderStorageImageMultisample = false, 477be92b3f49d77e9318c822577323fec5a738e7c54Ilia Mirkin .shaderStorageImageReadWithoutFormat = false, 4781f13cb8b153b92bf1da8caa62c9176b875fe7e0fIlia Mirkin .shaderStorageImageWriteWithoutFormat = false, 479f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .shaderUniformBufferArrayDynamicIndexing = true, 4804a2d17f60652f5a57a34d0b099dea95fcda2b362Kristian Høgsberg .shaderSampledImageArrayDynamicIndexing = true, 4814a2d17f60652f5a57a34d0b099dea95fcda2b362Kristian Høgsberg .shaderStorageBufferArrayDynamicIndexing = true, 4824a2d17f60652f5a57a34d0b099dea95fcda2b362Kristian Høgsberg .shaderStorageImageArrayDynamicIndexing = true, 483a4d7a5bd1eb4cc11024697cf309df390fbd97624Kenneth Graunke .shaderClipDistance = true, 484a4d7a5bd1eb4cc11024697cf309df390fbd97624Kenneth Graunke .shaderCullDistance = true, 4850449c93638e74cc0d04986664c0b8b7ec2615893Samuel Iglesias Gonsálvez .shaderFloat64 = pdevice->info.gen >= 8, 486f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .shaderInt64 = false, 487f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand .shaderInt16 = false, 488be92b3f49d77e9318c822577323fec5a738e7c54Ilia Mirkin .shaderResourceMinLod = false, 489d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .variableMultisampleRate = false, 490802f00219addb31d6e8b73c818c42212406993ebJason Ekstrand .inheritedQueries = false, 491f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand }; 4925ec4ecce44cfcce67391a25884bd0ef665957398Jason Ekstrand 4935ec4ecce44cfcce67391a25884bd0ef665957398Jason Ekstrand /* We can't do image stores in vec4 shaders */ 4945ec4ecce44cfcce67391a25884bd0ef665957398Jason Ekstrand pFeatures->vertexPipelineStoresAndAtomics = 49593db828e426b663cb7b1a01f87368a27d2b9377eJason Ekstrand pdevice->compiler->scalar_stage[MESA_SHADER_VERTEX] && 49693db828e426b663cb7b1a01f87368a27d2b9377eJason Ekstrand pdevice->compiler->scalar_stage[MESA_SHADER_GEOMETRY]; 497f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand} 498f6d51f3fd3c2677418de677897c724f1bae12d3aJason Ekstrand 499f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrandvoid anv_GetPhysicalDeviceProperties( 50065e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand VkPhysicalDevice physicalDevice, 501d48e71ce55cd63735bedb41c9754b30571a06e8fChad Versace VkPhysicalDeviceProperties* pProperties) 50265e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand{ 503d48e71ce55cd63735bedb41c9754b30571a06e8fChad Versace ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice); 504bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin const struct gen_device_info *devinfo = &pdevice->info; 50565e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand 506dae800daa80c24022085cc691ca61e2dc1e6a600Kristian Høgsberg const float time_stamp_base = devinfo->gen >= 9 ? 83.333 : 80.0; 507dae800daa80c24022085cc691ca61e2dc1e6a600Kristian Høgsberg 508a5748cb9204f872cbaa6764b95a33ef20c4dd5daNanley Chery /* See assertions made when programming the buffer surface state. */ 509a5748cb9204f872cbaa6764b95a33ef20c4dd5daNanley Chery const uint32_t max_raw_buffer_sz = devinfo->gen >= 7 ? 510a5748cb9204f872cbaa6764b95a33ef20c4dd5daNanley Chery (1ul << 30) : (1ul << 27); 511a5748cb9204f872cbaa6764b95a33ef20c4dd5daNanley Chery 512d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand VkSampleCountFlags sample_counts = 5131c5d7b38e288314d1affbf75887b40de6596ca4dChad Versace isl_device_get_sample_counts(&pdevice->isl_dev); 514d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand 515d48e71ce55cd63735bedb41c9754b30571a06e8fChad Versace VkPhysicalDeviceLimits limits = { 51665e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxImageDimension1D = (1 << 14), 51765e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxImageDimension2D = (1 << 14), 518181b142fbd176f24a73cabf209000a9187f275e8Nanley Chery .maxImageDimension3D = (1 << 11), 51965e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxImageDimensionCube = (1 << 14), 520181b142fbd176f24a73cabf209000a9187f275e8Nanley Chery .maxImageArrayLayers = (1 << 11), 52138a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxTexelBufferElements = 128 * 1024 * 1024, 522a5748cb9204f872cbaa6764b95a33ef20c4dd5daNanley Chery .maxUniformBufferRange = (1ul << 27), 523a5748cb9204f872cbaa6764b95a33ef20c4dd5daNanley Chery .maxStorageBufferRange = max_raw_buffer_sz, 5245446bf352e130ed4c61c33bddf2de7cf7899a5d7Jason Ekstrand .maxPushConstantsSize = MAX_PUSH_CONSTANTS_SIZE, 52565e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxMemoryAllocationCount = UINT32_MAX, 5267b7a7c2bfcf9f5cd51e8937125e736af6a21cab0Kristian Høgsberg .maxSamplerAllocationCount = 64 * 1024, 527e5db209d54c313965b50fbe7403e0df8df551109Jason Ekstrand .bufferImageGranularity = 64, /* A cache line */ 528033a37f5913ec453a9e007075913fecc4868dad5Chad Versace .sparseAddressSpaceSize = 0, 52965e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxBoundDescriptorSets = MAX_SETS, 53065e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxPerStageDescriptorSamplers = 64, 53165e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxPerStageDescriptorUniformBuffers = 64, 53265e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxPerStageDescriptorStorageBuffers = 64, 53365e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxPerStageDescriptorSampledImages = 64, 53465e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxPerStageDescriptorStorageImages = 64, 535d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .maxPerStageDescriptorInputAttachments = 64, 536d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .maxPerStageResources = 128, 53765e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxDescriptorSetSamplers = 256, 53865e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxDescriptorSetUniformBuffers = 256, 5392349a9e207e20c0350a217f16db61ceffa24c787Jason Ekstrand .maxDescriptorSetUniformBuffersDynamic = MAX_DYNAMIC_BUFFERS / 2, 54065e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxDescriptorSetStorageBuffers = 256, 5412349a9e207e20c0350a217f16db61ceffa24c787Jason Ekstrand .maxDescriptorSetStorageBuffersDynamic = MAX_DYNAMIC_BUFFERS / 2, 54265e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxDescriptorSetSampledImages = 256, 54365e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxDescriptorSetStorageImages = 256, 544d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .maxDescriptorSetInputAttachments = 256, 54565e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxVertexInputAttributes = 32, 546033a37f5913ec453a9e007075913fecc4868dad5Chad Versace .maxVertexInputBindings = 32, 54738a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxVertexInputAttributeOffset = 2047, 54838a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxVertexInputBindingStride = 2048, 54938a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxVertexOutputComponents = 128, 550ebd88b5aa341e996ad75a10651b3420b1f43ca05Kenneth Graunke .maxTessellationGenerationLevel = 64, 551ebd88b5aa341e996ad75a10651b3420b1f43ca05Kenneth Graunke .maxTessellationPatchSize = 32, 552ebd88b5aa341e996ad75a10651b3420b1f43ca05Kenneth Graunke .maxTessellationControlPerVertexInputComponents = 128, 553ebd88b5aa341e996ad75a10651b3420b1f43ca05Kenneth Graunke .maxTessellationControlPerVertexOutputComponents = 128, 554ebd88b5aa341e996ad75a10651b3420b1f43ca05Kenneth Graunke .maxTessellationControlPerPatchOutputComponents = 128, 555ebd88b5aa341e996ad75a10651b3420b1f43ca05Kenneth Graunke .maxTessellationControlTotalOutputComponents = 2048, 556ebd88b5aa341e996ad75a10651b3420b1f43ca05Kenneth Graunke .maxTessellationEvaluationInputComponents = 128, 557ebd88b5aa341e996ad75a10651b3420b1f43ca05Kenneth Graunke .maxTessellationEvaluationOutputComponents = 128, 55838a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxGeometryShaderInvocations = 32, 55938a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxGeometryInputComponents = 64, 56038a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxGeometryOutputComponents = 128, 56138a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxGeometryOutputVertices = 256, 56238a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxGeometryTotalOutputComponents = 1024, 56338a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxFragmentInputComponents = 128, 564d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .maxFragmentOutputAttachments = 8, 565eaf0768b8f9a9fd76b44a4d60826ef1f42fc6a46Dave Airlie .maxFragmentDualSrcAttachments = 1, 56665e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxFragmentCombinedOutputResources = 8, 56738a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxComputeSharedMemorySize = 32768, 56838a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxComputeWorkGroupCount = { 65535, 65535, 65535 }, 5696b21728c4a4f89754a79fe754e0c8496c25d9b66Lionel Landwerlin .maxComputeWorkGroupInvocations = 16 * devinfo->max_cs_threads, 57065e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxComputeWorkGroupSize = { 5716b21728c4a4f89754a79fe754e0c8496c25d9b66Lionel Landwerlin 16 * devinfo->max_cs_threads, 5726b21728c4a4f89754a79fe754e0c8496c25d9b66Lionel Landwerlin 16 * devinfo->max_cs_threads, 5736b21728c4a4f89754a79fe754e0c8496c25d9b66Lionel Landwerlin 16 * devinfo->max_cs_threads, 57465e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand }, 57565e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .subPixelPrecisionBits = 4 /* FIXME */, 57665e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .subTexelPrecisionBits = 4 /* FIXME */, 57765e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .mipmapPrecisionBits = 4 /* FIXME */, 57865e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxDrawIndexedIndexValue = UINT32_MAX, 579d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .maxDrawIndirectCount = UINT32_MAX, 58065e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxSamplerLodBias = 16, 58165e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxSamplerAnisotropy = 16, 582daf68a9465050c798012125e7150017c09576e0fJason Ekstrand .maxViewports = MAX_VIEWPORTS, 58365e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxViewportDimensions = { (1 << 14), (1 << 14) }, 5847ac08adfb4af3157171a565e353f608365c5dde5Nanley Chery .viewportBoundsRange = { INT16_MIN, INT16_MAX }, 58565e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .viewportSubPixelBits = 13, /* We take a float? */ 586f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand .minMemoryMapAlignment = 4096, /* A page */ 58765e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .minTexelBufferOffsetAlignment = 1, 58879d08ed3d21bef21881303f320706ebb2098a50aFrancisco Jerez .minUniformBufferOffsetAlignment = 16, 58979d08ed3d21bef21881303f320706ebb2098a50aFrancisco Jerez .minStorageBufferOffsetAlignment = 4, 59038a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .minTexelOffset = -8, 59138a3a535eb395dc3a7718cea1bc135f0d94a6dadKenneth Graunke .maxTexelOffset = 7, 5927a8def8c18b38e629401f70328e387b48440da3aIlia Mirkin .minTexelGatherOffset = -32, 5937a8def8c18b38e629401f70328e387b48440da3aIlia Mirkin .maxTexelGatherOffset = 31, 5940bf531aee6a2e6556a6c54f55c2ad23298677adbAnuj Phogat .minInterpolationOffset = -0.5, 5950bf531aee6a2e6556a6c54f55c2ad23298677adbAnuj Phogat .maxInterpolationOffset = 0.4375, 5960bf531aee6a2e6556a6c54f55c2ad23298677adbAnuj Phogat .subPixelInterpolationOffsetBits = 4, 59765e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxFramebufferWidth = (1 << 14), 59865e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxFramebufferHeight = (1 << 14), 599e2c669a56bedc25656600aef12a6174f6cc90315Ilia Mirkin .maxFramebufferLayers = (1 << 11), 600d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .framebufferColorSampleCounts = sample_counts, 601d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .framebufferDepthSampleCounts = sample_counts, 602d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .framebufferStencilSampleCounts = sample_counts, 603d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .framebufferNoAttachmentsSampleCounts = sample_counts, 60465e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxColorAttachments = MAX_RTS, 605d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .sampledImageColorSampleCounts = sample_counts, 606d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .sampledImageIntegerSampleCounts = VK_SAMPLE_COUNT_1_BIT, 607d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .sampledImageDepthSampleCounts = sample_counts, 608d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .sampledImageStencilSampleCounts = sample_counts, 609d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .storageImageSampleCounts = VK_SAMPLE_COUNT_1_BIT, 61065e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .maxSampleMaskWords = 1, 611802f00219addb31d6e8b73c818c42212406993ebJason Ekstrand .timestampComputeAndGraphics = false, 6120408d50f43d8520d9feb3faef6e6f31871d18a74Philipp Zabel .timestampPeriod = time_stamp_base, 613a4d7a5bd1eb4cc11024697cf309df390fbd97624Kenneth Graunke .maxClipDistances = 8, 614a4d7a5bd1eb4cc11024697cf309df390fbd97624Kenneth Graunke .maxCullDistances = 8, 615a4d7a5bd1eb4cc11024697cf309df390fbd97624Kenneth Graunke .maxCombinedClipAndCullDistances = 8, 616d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .discreteQueuePriorities = 1, 61765e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .pointSizeRange = { 0.125, 255.875 }, 61865e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .lineWidthRange = { 0.0, 7.9921875 }, 61965e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .pointSizeGranularity = (1.0 / 8.0), 62065e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand .lineWidthGranularity = (1.0 / 128.0), 621d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .strictLines = false, /* FINISHME */ 6228cc6f058ce30d77e45bc26d4769a7adde46deb11Chad Versace .standardSampleLocations = true, 623d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .optimalBufferCopyOffsetAlignment = 128, 624d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .optimalBufferCopyRowPitchAlignment = 128, 625d6897453037111d654b1e58dd6e74aac6aa21134Jason Ekstrand .nonCoherentAtomSize = 64, 62665e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand }; 62765e0b304b6ccd0ac516fe12b2bc3f2a1cbc0926aJason Ekstrand 628977a469bce41df42508121433c6e2b86534ec362Jason Ekstrand *pProperties = (VkPhysicalDeviceProperties) { 62920417b2cb05ff0f710eb6b6fbd9299ba915f8fc1Jason Ekstrand .apiVersion = VK_MAKE_VERSION(1, 0, 5), 630977a469bce41df42508121433c6e2b86534ec362Jason Ekstrand .driverVersion = 1, 631aadb7dce9b5dfc16878638580dc80759a45ca773Jason Ekstrand .vendorID = 0x8086, 632aadb7dce9b5dfc16878638580dc80759a45ca773Jason Ekstrand .deviceID = pdevice->chipset_id, 633977a469bce41df42508121433c6e2b86534ec362Jason Ekstrand .deviceType = VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU, 634d48e71ce55cd63735bedb41c9754b30571a06e8fChad Versace .limits = limits, 635d48e71ce55cd63735bedb41c9754b30571a06e8fChad Versace .sparseProperties = {0}, /* Broadwell doesn't do sparse. */ 636977a469bce41df42508121433c6e2b86534ec362Jason Ekstrand }; 637977a469bce41df42508121433c6e2b86534ec362Jason Ekstrand 638977a469bce41df42508121433c6e2b86534ec362Jason Ekstrand strcpy(pProperties->deviceName, pdevice->name); 639de138e9cede4b1996fac9256d894c80e7b48a6d7Emil Velikov memcpy(pProperties->pipelineCacheUUID, pdevice->uuid, VK_UUID_SIZE); 640977a469bce41df42508121433c6e2b86534ec362Jason Ekstrand} 641977a469bce41df42508121433c6e2b86534ec362Jason Ekstrand 642f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrandvoid anv_GetPhysicalDeviceQueueFamilyProperties( 6431f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand VkPhysicalDevice physicalDevice, 644a6eba403e2a2274c8aca62a59a206fc583134b4dJason Ekstrand uint32_t* pCount, 645a6eba403e2a2274c8aca62a59a206fc583134b4dJason Ekstrand VkQueueFamilyProperties* pQueueFamilyProperties) 6461f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand{ 647a6eba403e2a2274c8aca62a59a206fc583134b4dJason Ekstrand if (pQueueFamilyProperties == NULL) { 648a6eba403e2a2274c8aca62a59a206fc583134b4dJason Ekstrand *pCount = 1; 649f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrand return; 650a6eba403e2a2274c8aca62a59a206fc583134b4dJason Ekstrand } 6511f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand 652d6545f234593fb00d02fdc07f9b2a803d2b569f6Chad Versace /* The spec implicitly allows the incoming count to be 0. From the Vulkan 653d6545f234593fb00d02fdc07f9b2a803d2b569f6Chad Versace * 1.0.38 spec, Section 4.1 Physical Devices: 654d6545f234593fb00d02fdc07f9b2a803d2b569f6Chad Versace * 655d6545f234593fb00d02fdc07f9b2a803d2b569f6Chad Versace * If the value referenced by pQueueFamilyPropertyCount is not 0 [then 656d6545f234593fb00d02fdc07f9b2a803d2b569f6Chad Versace * do stuff]. 657d6545f234593fb00d02fdc07f9b2a803d2b569f6Chad Versace */ 658d6545f234593fb00d02fdc07f9b2a803d2b569f6Chad Versace if (*pCount == 0) 659d6545f234593fb00d02fdc07f9b2a803d2b569f6Chad Versace return; 6601f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand 661a6eba403e2a2274c8aca62a59a206fc583134b4dJason Ekstrand *pQueueFamilyProperties = (VkQueueFamilyProperties) { 6621f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand .queueFlags = VK_QUEUE_GRAPHICS_BIT | 6631f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand VK_QUEUE_COMPUTE_BIT | 6646a8a542610243f32ee20989778af06d66d7b5b1aJason Ekstrand VK_QUEUE_TRANSFER_BIT, 6651f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand .queueCount = 1, 666925ad847008f12b888b9949fffa8df23347f0d13Kristian Høgsberg .timestampValidBits = 36, /* XXX: Real value here */ 66774c4c4acb60c9a9dc50bd573fbe3f5a3f7b10719Jason Ekstrand .minImageTransferGranularity = (VkExtent3D) { 1, 1, 1 }, 6681f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand }; 66975252826e82ffa9c091ebe5bcf303c9d7569c3a3Damien Grassart 67075252826e82ffa9c091ebe5bcf303c9d7569c3a3Damien Grassart *pCount = 1; 6711f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand} 6721f907011a344d7e05fa54933cb17942ecd990602Jason Ekstrand 673f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrandvoid anv_GetPhysicalDeviceMemoryProperties( 674df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace VkPhysicalDevice physicalDevice, 675df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace VkPhysicalDeviceMemoryProperties* pMemoryProperties) 676df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace{ 677df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice); 6789564dd37a00f642d2637ffa15c2f27fb8992aa50Kristian Høgsberg VkDeviceSize heap_size; 679df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace 680df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace /* Reserve some wiggle room for the driver by exposing only 75% of the 681df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace * aperture to the heap. 682df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace */ 6839564dd37a00f642d2637ffa15c2f27fb8992aa50Kristian Høgsberg heap_size = 3 * physical_device->aperture_size / 4; 684df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace 685bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin if (physical_device->info.has_llc) { 686c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg /* Big core GPUs share LLC with the CPU and thus one memory type can be 687c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg * both cached and coherent at the same time. 688c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg */ 689c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg pMemoryProperties->memoryTypeCount = 1; 690c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg pMemoryProperties->memoryTypes[0] = (VkMemoryType) { 691c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg .propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | 692c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | 693c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | 694c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg VK_MEMORY_PROPERTY_HOST_CACHED_BIT, 6953421ba1843e67109daf17711a2d411444ad62b13Jason Ekstrand .heapIndex = 0, 696c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg }; 697c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg } else { 698c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg /* The spec requires that we expose a host-visible, coherent memory 699c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg * type, but Atom GPUs don't share LLC. Thus we offer two memory types 700c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg * to give the application a choice between cached, but not coherent and 701c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg * coherent but uncached (WC though). 702c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg */ 703c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg pMemoryProperties->memoryTypeCount = 2; 704c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg pMemoryProperties->memoryTypes[0] = (VkMemoryType) { 705c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg .propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | 706c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | 707c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 7083421ba1843e67109daf17711a2d411444ad62b13Jason Ekstrand .heapIndex = 0, 709c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg }; 710c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg pMemoryProperties->memoryTypes[1] = (VkMemoryType) { 711c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg .propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | 712c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | 713c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg VK_MEMORY_PROPERTY_HOST_CACHED_BIT, 7143421ba1843e67109daf17711a2d411444ad62b13Jason Ekstrand .heapIndex = 0, 715c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg }; 716c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg } 717df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace 718df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace pMemoryProperties->memoryHeapCount = 1; 719df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace pMemoryProperties->memoryHeaps[0] = (VkMemoryHeap) { 720df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace .size = heap_size, 721e6ab06ae7f084ba0df4c4274e5de010a3a751cc2Jason Ekstrand .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT, 722df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace }; 723df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace} 724df2a013881532c9a29f6c9fd36b628ddc8565749Chad Versace 725e7acdda184de2d2d21a2413097cf11b2c489b387Jason EkstrandPFN_vkVoidFunction anv_GetInstanceProcAddr( 726e7acdda184de2d2d21a2413097cf11b2c489b387Jason Ekstrand VkInstance instance, 727e7acdda184de2d2d21a2413097cf11b2c489b387Jason Ekstrand const char* pName) 728e7acdda184de2d2d21a2413097cf11b2c489b387Jason Ekstrand{ 7296d557ae4032adafc85a4cb5a76d8653bf0cf6639Jason Ekstrand return anv_lookup_entrypoint(NULL, pName); 730e7acdda184de2d2d21a2413097cf11b2c489b387Jason Ekstrand} 731e7acdda184de2d2d21a2413097cf11b2c489b387Jason Ekstrand 73240e4fff563ef1448656b1d3e6c11f5bd0c0b9e8aEmil Velikov/* With version 1+ of the loader interface the ICD should expose 73340e4fff563ef1448656b1d3e6c11f5bd0c0b9e8aEmil Velikov * vk_icdGetInstanceProcAddr to work around certain LD_PRELOAD issues seen in apps. 7343a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand */ 73540e4fff563ef1448656b1d3e6c11f5bd0c0b9e8aEmil VelikovPUBLIC 7363a2b23a447d612f6e339ccee6fc853108ff9c7bdJason EkstrandVKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr( 7373a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand VkInstance instance, 7383a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand const char* pName); 7393a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand 74040e4fff563ef1448656b1d3e6c11f5bd0c0b9e8aEmil VelikovPUBLIC 7413a2b23a447d612f6e339ccee6fc853108ff9c7bdJason EkstrandVKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr( 7423a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand VkInstance instance, 7433a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand const char* pName) 7443a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand{ 7453a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand return anv_GetInstanceProcAddr(instance, pName); 7463a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand} 7473a2b23a447d612f6e339ccee6fc853108ff9c7bdJason Ekstrand 748e7acdda184de2d2d21a2413097cf11b2c489b387Jason EkstrandPFN_vkVoidFunction anv_GetDeviceProcAddr( 7496d557ae4032adafc85a4cb5a76d8653bf0cf6639Jason Ekstrand VkDevice _device, 750769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg const char* pName) 751769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 7526d557ae4032adafc85a4cb5a76d8653bf0cf6639Jason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 7536d557ae4032adafc85a4cb5a76d8653bf0cf6639Jason Ekstrand return anv_lookup_entrypoint(&device->info, pName); 754769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 755769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 756ca4706960c27e7ff46ce6ffa64cdaccfd2dee28bGwan-gyeong Munstatic void 75766b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrandanv_queue_init(struct anv_device *device, struct anv_queue *queue) 75866b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand{ 75939cd3783a42926c0c4570d6e5576e2e88baece4fJason Ekstrand queue->_loader_data.loaderMagic = ICD_LOADER_MAGIC; 76066b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand queue->device = device; 76166b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand queue->pool = &device->surface_state_pool; 76266b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand} 76366b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand 76466b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrandstatic void 76566b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrandanv_queue_finish(struct anv_queue *queue) 76666b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand{ 76766b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand} 76866b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand 769773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsbergstatic struct anv_state 770773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberganv_state_pool_emit_data(struct anv_state_pool *pool, size_t size, size_t align, const void *p) 771773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg{ 772773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg struct anv_state state; 773773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg 774773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg state = anv_state_pool_alloc(pool, size, align); 775773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg memcpy(state.map, p, size); 776773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg 777773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg if (!pool->block_pool->device->info.has_llc) 778773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg anv_state_clflush(state); 779773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg 780773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg return state; 781773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg} 782773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg 783d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrandstruct gen8_border_color { 784d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand union { 785d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand float float32[4]; 786d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand uint32_t uint32[4]; 787d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand }; 788d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand /* Pad out to 64 bytes */ 789d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand uint32_t _pad[12]; 790d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand}; 791d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand 792dc56e4f7b88ab79be12632fbf032ef85fd32f602Kristian Høgsbergstatic void 793dc56e4f7b88ab79be12632fbf032ef85fd32f602Kristian Høgsberganv_device_init_border_colors(struct anv_device *device) 794dc56e4f7b88ab79be12632fbf032ef85fd32f602Kristian Høgsberg{ 795d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand static const struct gen8_border_color border_colors[] = { 796bd4cde708a2ad0bea04eb318d7c54447ccbbc7afJason Ekstrand [VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 0.0 } }, 797bd4cde708a2ad0bea04eb318d7c54447ccbbc7afJason Ekstrand [VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 1.0 } }, 798bd4cde708a2ad0bea04eb318d7c54447ccbbc7afJason Ekstrand [VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE] = { .float32 = { 1.0, 1.0, 1.0, 1.0 } }, 799bd4cde708a2ad0bea04eb318d7c54447ccbbc7afJason Ekstrand [VK_BORDER_COLOR_INT_TRANSPARENT_BLACK] = { .uint32 = { 0, 0, 0, 0 } }, 800bd4cde708a2ad0bea04eb318d7c54447ccbbc7afJason Ekstrand [VK_BORDER_COLOR_INT_OPAQUE_BLACK] = { .uint32 = { 0, 0, 0, 1 } }, 801bd4cde708a2ad0bea04eb318d7c54447ccbbc7afJason Ekstrand [VK_BORDER_COLOR_INT_OPAQUE_WHITE] = { .uint32 = { 1, 1, 1, 1 } }, 802dc56e4f7b88ab79be12632fbf032ef85fd32f602Kristian Høgsberg }; 803dc56e4f7b88ab79be12632fbf032ef85fd32f602Kristian Høgsberg 804773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg device->border_colors = anv_state_pool_emit_data(&device->dynamic_state_pool, 805d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand sizeof(border_colors), 64, 806d49298c702e6cd1ca7ac77396bd6dd377ed9b635Jason Ekstrand border_colors); 807dc56e4f7b88ab79be12632fbf032ef85fd32f602Kristian Høgsberg} 808dc56e4f7b88ab79be12632fbf032ef85fd32f602Kristian Høgsberg 8096cdada0360145a620b0d7a279342f8bced87c902Kristian HøgsbergVkResult 8106cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberganv_device_submit_simple_batch(struct anv_device *device, 8116cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg struct anv_batch *batch) 812c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg{ 813c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg struct drm_i915_gem_execbuffer2 execbuf; 814c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg struct drm_i915_gem_exec_object2 exec2_objects[1]; 81507798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand struct anv_bo bo, *exec_bos[1]; 816c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg VkResult result = VK_SUCCESS; 817c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg uint32_t size; 818c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg int64_t timeout; 819c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg int ret; 820c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 8216cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg /* Kernel driver requires 8 byte aligned batch length */ 822c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg size = align_u32(batch->next - batch->start, 8); 823ecfb07427632b99a9f424ad06f0967fa8a7fe2a2Jason Ekstrand result = anv_bo_pool_alloc(&device->batch_bo_pool, &bo, size); 824ea93041ccce6f4c460b71c48c1cb8589bf0bbe7cJason Ekstrand if (result != VK_SUCCESS) 825ea93041ccce6f4c460b71c48c1cb8589bf0bbe7cJason Ekstrand return result; 826ea93041ccce6f4c460b71c48c1cb8589bf0bbe7cJason Ekstrand 827ea93041ccce6f4c460b71c48c1cb8589bf0bbe7cJason Ekstrand memcpy(bo.map, batch->start, size); 828699f21216f0d026c883b1cd2b3676fdc6e3668d8Jason Ekstrand if (!device->info.has_llc) 829699f21216f0d026c883b1cd2b3676fdc6e3668d8Jason Ekstrand anv_clflush_range(bo.map, size); 830c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 83107798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand exec_bos[0] = &bo; 832ea93041ccce6f4c460b71c48c1cb8589bf0bbe7cJason Ekstrand exec2_objects[0].handle = bo.gem_handle; 833c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg exec2_objects[0].relocation_count = 0; 834c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg exec2_objects[0].relocs_ptr = 0; 835c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg exec2_objects[0].alignment = 0; 836ea93041ccce6f4c460b71c48c1cb8589bf0bbe7cJason Ekstrand exec2_objects[0].offset = bo.offset; 837c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg exec2_objects[0].flags = 0; 838c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg exec2_objects[0].rsvd1 = 0; 839c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg exec2_objects[0].rsvd2 = 0; 840c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 841c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg execbuf.buffers_ptr = (uintptr_t) exec2_objects; 842c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg execbuf.buffer_count = 1; 843ea93041ccce6f4c460b71c48c1cb8589bf0bbe7cJason Ekstrand execbuf.batch_start_offset = 0; 8446cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg execbuf.batch_len = size; 845c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg execbuf.cliprects_ptr = 0; 846c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg execbuf.num_cliprects = 0; 847c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg execbuf.DR1 = 0; 848c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg execbuf.DR4 = 0; 849c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 850c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg execbuf.flags = 851c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg I915_EXEC_HANDLE_LUT | I915_EXEC_NO_RELOC | I915_EXEC_RENDER; 852c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg execbuf.rsvd1 = device->context_id; 853c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg execbuf.rsvd2 = 0; 854c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 85507798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand result = anv_device_execbuf(device, &execbuf, exec_bos); 85607798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand if (result != VK_SUCCESS) 857c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg goto fail; 858c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 859c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg timeout = INT64_MAX; 860ea93041ccce6f4c460b71c48c1cb8589bf0bbe7cJason Ekstrand ret = anv_gem_wait(device, bo.gem_handle, &timeout); 861c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg if (ret != 0) { 862c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg /* We don't know the real error. */ 863c41ec1679f02d6705ceda49d9ad966d0d0833824Jason Ekstrand result = vk_errorf(VK_ERROR_DEVICE_LOST, "execbuf2 failed: %m"); 864c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg goto fail; 865c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg } 866c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 867c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg fail: 868ea93041ccce6f4c460b71c48c1cb8589bf0bbe7cJason Ekstrand anv_bo_pool_free(&device->batch_bo_pool, &bo); 869c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 870c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg return result; 871c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg} 872c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 873454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_CreateDevice( 874c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand VkPhysicalDevice physicalDevice, 875769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg const VkDeviceCreateInfo* pCreateInfo, 876fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator, 877769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice* pDevice) 878769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 879c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice); 8805526c1782a01e73d3deac785449456018b53fd65Kristian Høgsberg Kristensen VkResult result; 881769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg struct anv_device *device; 882769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 883769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO); 884769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 885aab9517f3dc5a2f28eaae4a2fa64cb0ad82bb4f7Jason Ekstrand for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { 886b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand bool found = false; 887b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand for (uint32_t j = 0; j < ARRAY_SIZE(device_extensions); j++) { 888b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], 889aadb7dce9b5dfc16878638580dc80759a45ca773Jason Ekstrand device_extensions[j].extensionName) == 0) { 890b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand found = true; 891b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand break; 892b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand } 893b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand } 894b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand if (!found) 895f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT); 896b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand } 897b5f6889648488d735e920a630917ffa17ff3691fJason Ekstrand 8981ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie device = vk_alloc2(&physical_device->instance->alloc, pAllocator, 899fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand sizeof(*device), 8, 90045d17fcf9bd41dfcd34f01bf62b031d8ca071eddJason Ekstrand VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); 901769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg if (!device) 902769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); 903769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 90439cd3783a42926c0c4570d6e5576e2e88baece4fJason Ekstrand device->_loader_data.loaderMagic = ICD_LOADER_MAGIC; 905c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand device->instance = physical_device->instance; 90639a120aefe43f7b664713b5d0aff13f0a2a19168Kristian Høgsberg device->chipset_id = physical_device->chipset_id; 9078cda3e9b1bc0df5b2acfb8e3afac854a8d0defe7Chad Versace 908fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand if (pAllocator) 909fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand device->alloc = *pAllocator; 910fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand else 911fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand device->alloc = physical_device->instance->alloc; 912fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand 9138cda3e9b1bc0df5b2acfb8e3afac854a8d0defe7Chad Versace /* XXX(chadv): Can we dup() physicalDevice->fd here? */ 914c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand device->fd = open(physical_device->path, O_RDWR | O_CLOEXEC); 9155526c1782a01e73d3deac785449456018b53fd65Kristian Høgsberg Kristensen if (device->fd == -1) { 9165526c1782a01e73d3deac785449456018b53fd65Kristian Høgsberg Kristensen result = vk_error(VK_ERROR_INITIALIZATION_FAILED); 917769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg goto fail_device; 9185526c1782a01e73d3deac785449456018b53fd65Kristian Høgsberg Kristensen } 919477383e9ac2fd43f8b2176c13da7116f5d20b959Chad Versace 920769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg device->context_id = anv_gem_create_context(device); 9215526c1782a01e73d3deac785449456018b53fd65Kristian Høgsberg Kristensen if (device->context_id == -1) { 9225526c1782a01e73d3deac785449456018b53fd65Kristian Høgsberg Kristensen result = vk_error(VK_ERROR_INITIALIZATION_FAILED); 923769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg goto fail_fd; 9245526c1782a01e73d3deac785449456018b53fd65Kristian Høgsberg Kristensen } 925769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 926bc24590f0c579a2528fd94eb8d40dd4ce12eba29Lionel Landwerlin device->info = physical_device->info; 9279c84b6cce007e6ad7877c4787346b3a45ab1b0c7Jason Ekstrand device->isl_dev = physical_device->isl_dev; 9289c84b6cce007e6ad7877c4787346b3a45ab1b0c7Jason Ekstrand 929869e393eb36e6912ca16fcfd060892c0de07bb49Jason Ekstrand /* On Broadwell and later, we can use batch chaining to more efficiently 930869e393eb36e6912ca16fcfd060892c0de07bb49Jason Ekstrand * implement growing command buffers. Prior to Haswell, the kernel 931869e393eb36e6912ca16fcfd060892c0de07bb49Jason Ekstrand * command parser gets in the way and we have to fall back to growing 932869e393eb36e6912ca16fcfd060892c0de07bb49Jason Ekstrand * the batch. 933869e393eb36e6912ca16fcfd060892c0de07bb49Jason Ekstrand */ 934869e393eb36e6912ca16fcfd060892c0de07bb49Jason Ekstrand device->can_chain_batches = device->info.gen >= 8; 935869e393eb36e6912ca16fcfd060892c0de07bb49Jason Ekstrand 936c29ffea6d161b14e1c6d1d1af7727425b323a3b5Jason Ekstrand device->robust_buffer_access = pCreateInfo->pEnabledFeatures && 937c29ffea6d161b14e1c6d1d1af7727425b323a3b5Jason Ekstrand pCreateInfo->pEnabledFeatures->robustBufferAccess; 938c29ffea6d161b14e1c6d1d1af7727425b323a3b5Jason Ekstrand 939a788e7c659e86dec5430310e634401819b7d44f9Jason Ekstrand pthread_mutex_init(&device->mutex, NULL); 940a788e7c659e86dec5430310e634401819b7d44f9Jason Ekstrand 941843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pthread_condattr_t condattr; 942843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pthread_condattr_init(&condattr); 943843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC); 944843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pthread_cond_init(&device->queue_submit, NULL); 945843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pthread_condattr_destroy(&condattr); 946843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 947ecfb07427632b99a9f424ad06f0967fa8a7fe2a2Jason Ekstrand anv_bo_pool_init(&device->batch_bo_pool, device); 9485ef81f0a05ba383188aa9e3f9afd72e2f76cf032Jason Ekstrand 949c7f6e42a7d1280a0f67e52adc5c8807b78be46e8Jordan Justen anv_block_pool_init(&device->dynamic_state_block_pool, device, 16384); 950769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 9510a775e1eab2d6a2a6f62e59d5373e6a77a95ac2aKristian Høgsberg anv_state_pool_init(&device->dynamic_state_pool, 9520a775e1eab2d6a2a6f62e59d5373e6a77a95ac2aKristian Høgsberg &device->dynamic_state_block_pool); 953769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 954ff0dd67d2f9fc7cc240da732153ac4fac4e8d04dSamuel Iglesias Gonsálvez anv_block_pool_init(&device->instruction_block_pool, device, 1024 * 1024); 955689971847005219178f5a484dffecf9e5e515192Jason Ekstrand anv_state_pool_init(&device->instruction_state_pool, 956689971847005219178f5a484dffecf9e5e515192Jason Ekstrand &device->instruction_block_pool); 95730521fb19e01b6e34cba4eaff40b9b782000b5dbKristian Høgsberg Kristensen 9580e94446b25632523e5d9901a2e5e61c9c6f28ed9Jason Ekstrand anv_block_pool_init(&device->surface_state_block_pool, device, 4096); 959769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 960769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg anv_state_pool_init(&device->surface_state_pool, 961769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg &device->surface_state_block_pool); 962769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 9633a3d79b38e27babab7c5b2d79032e0879d6a7c44Jason Ekstrand anv_bo_init_new(&device->workaround_bo, device, 1024); 9643a3d79b38e27babab7c5b2d79032e0879d6a7c44Jason Ekstrand 965c2f2c8e407207c31c29aab5570d23cd6e98d287aJason Ekstrand anv_scratch_pool_init(device, &device->scratch_pool); 9669b9f973ca6d3cc1ec5be27857def00a83c032464Kristian Høgsberg 96766b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand anv_queue_init(device, &device->queue); 96866b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand 9696cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg switch (device->info.gen) { 9706cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg case 7: 9716cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg if (!device->info.is_haswell) 9726cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg result = gen7_init_device_state(device); 9736cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg else 9746cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg result = gen75_init_device_state(device); 9756cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg break; 9766cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg case 8: 9776cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg result = gen8_init_device_state(device); 9786cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg break; 9796cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg case 9: 9806cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg result = gen9_init_device_state(device); 9816cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg break; 9825d72d7b12d623c86539c807ea07f2e0bdc32836dKristian Høgsberg default: 9835d72d7b12d623c86539c807ea07f2e0bdc32836dKristian Høgsberg /* Shouldn't get here as we don't create physical devices for any other 9845d72d7b12d623c86539c807ea07f2e0bdc32836dKristian Høgsberg * gens. */ 9855d72d7b12d623c86539c807ea07f2e0bdc32836dKristian Høgsberg unreachable("unhandled gen"); 9866cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg } 9876cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg if (result != VK_SUCCESS) 9886cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg goto fail_fd; 9896cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg 9908f780af968ffda8c4cc241017a2bca1338176167Jason Ekstrand anv_device_init_blorp(device); 9918f780af968ffda8c4cc241017a2bca1338176167Jason Ekstrand 992dc56e4f7b88ab79be12632fbf032ef85fd32f602Kristian Høgsberg anv_device_init_border_colors(device); 993dc56e4f7b88ab79be12632fbf032ef85fd32f602Kristian Høgsberg 994098209eedf9532bb442caee7c28cb57f6b959004Jason Ekstrand *pDevice = anv_device_to_handle(device); 995769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 996769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return VK_SUCCESS; 997769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 998769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg fail_fd: 999769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg close(device->fd); 1000769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg fail_device: 10011ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie vk_free(&device->alloc, device); 1002769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 10035526c1782a01e73d3deac785449456018b53fd65Kristian Høgsberg Kristensen return result; 1004769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1005769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 100605a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroyDevice( 1007fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VkDevice _device, 1008fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator) 1009769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1010c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 1011769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1012d1f01d89e177ec51056b819c0aa71d49443e9fb8Jason Ekstrand if (!device) 1013d1f01d89e177ec51056b819c0aa71d49443e9fb8Jason Ekstrand return; 1014d1f01d89e177ec51056b819c0aa71d49443e9fb8Jason Ekstrand 10158f780af968ffda8c4cc241017a2bca1338176167Jason Ekstrand anv_device_finish_blorp(device); 10168f780af968ffda8c4cc241017a2bca1338176167Jason Ekstrand 1017b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun anv_queue_finish(&device->queue); 1018b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun 101938f5eef59de0be41c4c5bd77fb221c75981e1e5cJason Ekstrand#ifdef HAVE_VALGRIND 102038f5eef59de0be41c4c5bd77fb221c75981e1e5cJason Ekstrand /* We only need to free these to prevent valgrind errors. The backing 102138f5eef59de0be41c4c5bd77fb221c75981e1e5cJason Ekstrand * BO will go away in a couple of lines so we don't actually leak. 102238f5eef59de0be41c4c5bd77fb221c75981e1e5cJason Ekstrand */ 1023522ab835d6f14da3d6f08ed0bbd81573fcee1b25Jason Ekstrand anv_state_pool_free(&device->dynamic_state_pool, device->border_colors); 102438f5eef59de0be41c4c5bd77fb221c75981e1e5cJason Ekstrand#endif 102538f5eef59de0be41c4c5bd77fb221c75981e1e5cJason Ekstrand 1026b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun anv_scratch_pool_finish(device, &device->scratch_pool); 1027b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun 10283a3d79b38e27babab7c5b2d79032e0879d6a7c44Jason Ekstrand anv_gem_munmap(device->workaround_bo.map, device->workaround_bo.size); 10293a3d79b38e27babab7c5b2d79032e0879d6a7c44Jason Ekstrand anv_gem_close(device, device->workaround_bo.gem_handle); 10303a3d79b38e27babab7c5b2d79032e0879d6a7c44Jason Ekstrand 10311920ef9675b5ebdab2050b1f37c6cfdd6d9c6f69Jason Ekstrand anv_state_pool_finish(&device->surface_state_pool); 1032769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg anv_block_pool_finish(&device->surface_state_block_pool); 1033b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun anv_state_pool_finish(&device->instruction_state_pool); 1034b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun anv_block_pool_finish(&device->instruction_block_pool); 1035b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun anv_state_pool_finish(&device->dynamic_state_pool); 1036b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun anv_block_pool_finish(&device->dynamic_state_block_pool); 1037769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1038b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun anv_bo_pool_finish(&device->batch_bo_pool); 1039769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1040b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun pthread_cond_destroy(&device->queue_submit); 1041f551047751e8de826ebc13c9f5069d9842d2f884Kristian Høgsberg Kristensen pthread_mutex_destroy(&device->mutex); 1042f551047751e8de826ebc13c9f5069d9842d2f884Kristian Høgsberg Kristensen 1043b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun anv_gem_destroy_context(device, device->context_id); 1044b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun 1045b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun close(device->fd); 1046b178652b41410483dcd82aba495eab6bc892ab15Gwan-gyeong Mun 10471ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie vk_free(&device->alloc, device); 1048769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1049769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 10508ba684cbad6963be54f27aeeb42708069f8d9bd3Jason EkstrandVkResult anv_EnumerateInstanceExtensionProperties( 105102db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand const char* pLayerName, 1052fe644721aa122e46733f23ba1c902321fc1f64e8Jason Ekstrand uint32_t* pPropertyCount, 10538e05bbeee9f75e1902bd1592c27f5965124ee11bJason Ekstrand VkExtensionProperties* pProperties) 10548e05bbeee9f75e1902bd1592c27f5965124ee11bJason Ekstrand{ 105502db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand if (pProperties == NULL) { 1056fe644721aa122e46733f23ba1c902321fc1f64e8Jason Ekstrand *pPropertyCount = ARRAY_SIZE(global_extensions); 105702db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand return VK_SUCCESS; 105802db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand } 1059a29df71dd2e73ce4b9aa664b2a5aee64d19b3ea9Kristian Høgsberg 10605cc07d854c85e30c5aa1ced626b4b6500f8cd74cEmil Velikov *pPropertyCount = MIN2(*pPropertyCount, ARRAY_SIZE(global_extensions)); 10615cc07d854c85e30c5aa1ced626b4b6500f8cd74cEmil Velikov typed_memcpy(pProperties, global_extensions, *pPropertyCount); 10628e05bbeee9f75e1902bd1592c27f5965124ee11bJason Ekstrand 10635cc07d854c85e30c5aa1ced626b4b6500f8cd74cEmil Velikov if (*pPropertyCount < ARRAY_SIZE(global_extensions)) 10645cc07d854c85e30c5aa1ced626b4b6500f8cd74cEmil Velikov return VK_INCOMPLETE; 1065769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 10668e05bbeee9f75e1902bd1592c27f5965124ee11bJason Ekstrand return VK_SUCCESS; 10678e05bbeee9f75e1902bd1592c27f5965124ee11bJason Ekstrand} 1068783e6217fcd5f7dc4125c16d47a985f63a2ab486Kristian Høgsberg 10698ba684cbad6963be54f27aeeb42708069f8d9bd3Jason EkstrandVkResult anv_EnumerateDeviceExtensionProperties( 10708e05bbeee9f75e1902bd1592c27f5965124ee11bJason Ekstrand VkPhysicalDevice physicalDevice, 107102db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand const char* pLayerName, 1072fe644721aa122e46733f23ba1c902321fc1f64e8Jason Ekstrand uint32_t* pPropertyCount, 10738e05bbeee9f75e1902bd1592c27f5965124ee11bJason Ekstrand VkExtensionProperties* pProperties) 10748e05bbeee9f75e1902bd1592c27f5965124ee11bJason Ekstrand{ 107502db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand if (pProperties == NULL) { 1076fe644721aa122e46733f23ba1c902321fc1f64e8Jason Ekstrand *pPropertyCount = ARRAY_SIZE(device_extensions); 107702db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand return VK_SUCCESS; 107802db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand } 107902db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand 10805cc07d854c85e30c5aa1ced626b4b6500f8cd74cEmil Velikov *pPropertyCount = MIN2(*pPropertyCount, ARRAY_SIZE(device_extensions)); 10815cc07d854c85e30c5aa1ced626b4b6500f8cd74cEmil Velikov typed_memcpy(pProperties, device_extensions, *pPropertyCount); 10829a7600c9b58b0fc62033bb993016d3d7d4b8810aJason Ekstrand 10835cc07d854c85e30c5aa1ced626b4b6500f8cd74cEmil Velikov if (*pPropertyCount < ARRAY_SIZE(device_extensions)) 10845cc07d854c85e30c5aa1ced626b4b6500f8cd74cEmil Velikov return VK_INCOMPLETE; 10859a7600c9b58b0fc62033bb993016d3d7d4b8810aJason Ekstrand 10869a7600c9b58b0fc62033bb993016d3d7d4b8810aJason Ekstrand return VK_SUCCESS; 1087769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1088769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 10898ba684cbad6963be54f27aeeb42708069f8d9bd3Jason EkstrandVkResult anv_EnumerateInstanceLayerProperties( 1090fe644721aa122e46733f23ba1c902321fc1f64e8Jason Ekstrand uint32_t* pPropertyCount, 109102db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand VkLayerProperties* pProperties) 109202db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand{ 109302db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand if (pProperties == NULL) { 1094fe644721aa122e46733f23ba1c902321fc1f64e8Jason Ekstrand *pPropertyCount = 0; 109502db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand return VK_SUCCESS; 109602db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand } 109702db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand 109802db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand /* None supported at this time */ 1099f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace return vk_error(VK_ERROR_LAYER_NOT_PRESENT); 110002db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand} 110102db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand 11028ba684cbad6963be54f27aeeb42708069f8d9bd3Jason EkstrandVkResult anv_EnumerateDeviceLayerProperties( 1103769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkPhysicalDevice physicalDevice, 1104fe644721aa122e46733f23ba1c902321fc1f64e8Jason Ekstrand uint32_t* pPropertyCount, 110502db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand VkLayerProperties* pProperties) 1106769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 110702db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand if (pProperties == NULL) { 1108fe644721aa122e46733f23ba1c902321fc1f64e8Jason Ekstrand *pPropertyCount = 0; 110902db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand return VK_SUCCESS; 111002db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand } 1111769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 111202db21ae1188dd1e28efc8045de095be3e214bc8Jason Ekstrand /* None supported at this time */ 1113f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace return vk_error(VK_ERROR_LAYER_NOT_PRESENT); 1114769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1115769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1116f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrandvoid anv_GetDeviceQueue( 1117769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice _device, 1118769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg uint32_t queueNodeIndex, 1119769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg uint32_t queueIndex, 1120769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkQueue* pQueue) 1121769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1122c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 1123769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 112466b00d5e5a64dfa63f34514b01f6d01168f9a6a7Jason Ekstrand assert(queueIndex == 0); 1125769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1126098209eedf9532bb442caee7c28cb57f6b959004Jason Ekstrand *pQueue = anv_queue_to_handle(&device->queue); 1127769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1128769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 112907798c9c3ed29fd162ebc6b6d6beb8448218487fJason EkstrandVkResult 113007798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrandanv_device_execbuf(struct anv_device *device, 113107798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand struct drm_i915_gem_execbuffer2 *execbuf, 113207798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand struct anv_bo **execbuf_bos) 113307798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand{ 113407798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand int ret = anv_gem_execbuffer(device, execbuf); 113507798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand if (ret != 0) { 113607798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand /* We don't know the real error. */ 113707798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand return vk_errorf(VK_ERROR_DEVICE_LOST, "execbuf2 failed: %m"); 113807798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand } 113907798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand 114018266247a0750f2e63dc8ba1bb790177098a0354Jason Ekstrand struct drm_i915_gem_exec_object2 *objects = 114118266247a0750f2e63dc8ba1bb790177098a0354Jason Ekstrand (void *)(uintptr_t)execbuf->buffers_ptr; 114207798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand for (uint32_t k = 0; k < execbuf->buffer_count; k++) 114307798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand execbuf_bos[k]->offset = objects[k].offset; 114407798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand 114507798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand return VK_SUCCESS; 114607798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand} 114707798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand 1148454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_QueueSubmit( 1149769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkQueue _queue, 11504e904a0310be8a5c311355473e70df4fd4d9caa1Jason Ekstrand uint32_t submitCount, 11514e904a0310be8a5c311355473e70df4fd4d9caa1Jason Ekstrand const VkSubmitInfo* pSubmits, 11526afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg VkFence _fence) 1153769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1154c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_queue, queue, _queue); 1155c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_fence, fence, _fence); 1156769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg struct anv_device *device = queue->device; 115707798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand VkResult result = VK_SUCCESS; 1158769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1159b3a29f2e9eb528a16ceec0fd88aad9f0c3c3b6d4Kristian Høgsberg /* We lock around QueueSubmit for three main reasons: 11608b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * 11618b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * 1) When a block pool is resized, we create a new gem handle with a 11628b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * different size and, in the case of surface states, possibly a 11638b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * different center offset but we re-use the same anv_bo struct when 11648b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * we do so. If this happens in the middle of setting up an execbuf, 11658b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * we could end up with our list of BOs out of sync with our list of 11668b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * gem handles. 11678b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * 11688b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * 2) The algorithm we use for building the list of unique buffers isn't 11698b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * thread-safe. While the client is supposed to syncronize around 11708b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * QueueSubmit, this would be extremely difficult to debug if it ever 11718b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * came up in the wild due to a broken app. It's better to play it 11728b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * safe and just lock around QueueSubmit. 11738b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * 1174b3a29f2e9eb528a16ceec0fd88aad9f0c3c3b6d4Kristian Høgsberg * 3) The anv_cmd_buffer_execbuf function may perform relocations in 1175b3a29f2e9eb528a16ceec0fd88aad9f0c3c3b6d4Kristian Høgsberg * userspace. Due to the fact that the surface state buffer is shared 1176b3a29f2e9eb528a16ceec0fd88aad9f0c3c3b6d4Kristian Høgsberg * between batches, we can't afford to have that happen from multiple 1177b3a29f2e9eb528a16ceec0fd88aad9f0c3c3b6d4Kristian Høgsberg * threads at the same time. Even though the user is supposed to 1178b3a29f2e9eb528a16ceec0fd88aad9f0c3c3b6d4Kristian Høgsberg * ensure this doesn't happen, we play it safe as in (2) above. 1179b3a29f2e9eb528a16ceec0fd88aad9f0c3c3b6d4Kristian Høgsberg * 11808b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * Since the only other things that ever take the device lock such as block 11818b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * pool resize only rarely happen, this will almost never be contended so 11828b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand * taking a lock isn't really an expensive operation in this case. 11838b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand */ 11848b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand pthread_mutex_lock(&device->mutex); 11858b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand 11864e904a0310be8a5c311355473e70df4fd4d9caa1Jason Ekstrand for (uint32_t i = 0; i < submitCount; i++) { 11874e904a0310be8a5c311355473e70df4fd4d9caa1Jason Ekstrand for (uint32_t j = 0; j < pSubmits[i].commandBufferCount; j++) { 11884e904a0310be8a5c311355473e70df4fd4d9caa1Jason Ekstrand ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, 11894e904a0310be8a5c311355473e70df4fd4d9caa1Jason Ekstrand pSubmits[i].pCommandBuffers[j]); 11904e904a0310be8a5c311355473e70df4fd4d9caa1Jason Ekstrand assert(cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY); 1191769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1192db9f4b2a2bbf1aff3c6c878735495fc7accbb11eJason Ekstrand result = anv_cmd_buffer_execbuf(device, cmd_buffer); 119307798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand if (result != VK_SUCCESS) 11948b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand goto out; 11954e904a0310be8a5c311355473e70df4fd4d9caa1Jason Ekstrand } 1196769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg } 1197769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1198b0c30b77d4c57d653ed657d069d748b5be88d709Kristian Høgsberg if (fence) { 119907798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand struct anv_bo *fence_bo = &fence->bo; 120007798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand result = anv_device_execbuf(device, &fence->execbuf, &fence_bo); 120107798c9c3ed29fd162ebc6b6d6beb8448218487fJason Ekstrand if (result != VK_SUCCESS) 12028b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand goto out; 1203843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1204843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* Update the fence and wake up any waiters */ 1205843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand assert(fence->state == ANV_FENCE_STATE_RESET); 1206843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand fence->state = ANV_FENCE_STATE_SUBMITTED; 1207843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pthread_cond_broadcast(&device->queue_submit); 1208b0c30b77d4c57d653ed657d069d748b5be88d709Kristian Høgsberg } 1209b0c30b77d4c57d653ed657d069d748b5be88d709Kristian Høgsberg 12108b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrandout: 12118b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand pthread_mutex_unlock(&device->mutex); 12128b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand 12138b61c57049ff75766715ad4f7b1ad2d3657b9b4dJason Ekstrand return result; 1214769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1215769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1216454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_QueueWaitIdle( 1217769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkQueue _queue) 1218769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1219c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_queue, queue, _queue); 1220769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 12214c9dec80edeb7f1d1774ca51faa806241c1c59cbJason Ekstrand return anv_DeviceWaitIdle(anv_device_to_handle(queue->device)); 1222769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1223769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1224454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_DeviceWaitIdle( 1225769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice _device) 1226769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1227c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 1228769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg struct anv_batch batch; 1229769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1230c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg uint32_t cmds[8]; 1231c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg batch.start = batch.next = cmds; 1232c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg batch.end = (void *) cmds + sizeof(cmds); 1233c9c3344c4f5bb12ff5f872603671c2ac66878479Kristian Høgsberg 123450018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&batch, GEN7_MI_BATCH_BUFFER_END, bbe); 123550018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&batch, GEN7_MI_NOOP, noop); 1236769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 12376cdada0360145a620b0d7a279342f8bced87c902Kristian Høgsberg return anv_device_submit_simple_batch(device, &batch); 1238769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1239769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1240769785c497aaa60c629e0299e3ebfff53a8e393eKristian HøgsbergVkResult 1241769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberganv_bo_init_new(struct anv_bo *bo, struct anv_device *device, uint64_t size) 1242769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 12436283b6d56a2bb731cfcb4c876566901075f9bd34Jason Ekstrand uint32_t gem_handle = anv_gem_create(device, size); 12446283b6d56a2bb731cfcb4c876566901075f9bd34Jason Ekstrand if (!gem_handle) 1245769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return vk_error(VK_ERROR_OUT_OF_DEVICE_MEMORY); 1246769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 12476283b6d56a2bb731cfcb4c876566901075f9bd34Jason Ekstrand anv_bo_init(bo, gem_handle, size); 1248769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1249769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return VK_SUCCESS; 1250769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1251769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1252fcfb404a5860c67129e3672768cc557c0e4a1f12Jason EkstrandVkResult anv_AllocateMemory( 1253769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice _device, 1254fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkMemoryAllocateInfo* pAllocateInfo, 1255fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator, 1256769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDeviceMemory* pMem) 1257769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1258c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 1259769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg struct anv_device_memory *mem; 1260769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkResult result; 1261769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1262fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand assert(pAllocateInfo->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); 1263769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 126472ffe8318d13a1f5ed86af7999a5c5723f2ff774Chad Versace /* The Vulkan 1.0.33 spec says "allocationSize must be greater than 0". */ 126572ffe8318d13a1f5ed86af7999a5c5723f2ff774Chad Versace assert(pAllocateInfo->allocationSize > 0); 1266b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand 1267f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace /* We support exactly one memory heap. */ 1268c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg assert(pAllocateInfo->memoryTypeIndex == 0 || 1269c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg (!device->info.has_llc && pAllocateInfo->memoryTypeIndex < 2)); 1270f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace 1271f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace /* FINISHME: Fail if allocation request exceeds heap size. */ 1272f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace 12731ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie mem = vk_alloc2(&device->alloc, pAllocator, sizeof(*mem), 8, 1274fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); 1275769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg if (mem == NULL) 1276769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); 1277769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 12786b0b57225cf27aa5316b6c3085fa3254f0f4b1c2Jason Ekstrand /* The kernel is going to give us whole pages anyway */ 12796b0b57225cf27aa5316b6c3085fa3254f0f4b1c2Jason Ekstrand uint64_t alloc_size = align_u64(pAllocateInfo->allocationSize, 4096); 12806b0b57225cf27aa5316b6c3085fa3254f0f4b1c2Jason Ekstrand 12816b0b57225cf27aa5316b6c3085fa3254f0f4b1c2Jason Ekstrand result = anv_bo_init_new(&mem->bo, device, alloc_size); 1282769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg if (result != VK_SUCCESS) 1283769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg goto fail; 1284769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1285c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg mem->type_index = pAllocateInfo->memoryTypeIndex; 1286c3c61d210f0929a71e031dfb3830bf39cee583a4Kristian Høgsberg 1287b1217eada9e32bf387d4d14615340aa5b5fd1f5cJason Ekstrand mem->map = NULL; 1288b1217eada9e32bf387d4d14615340aa5b5fd1f5cJason Ekstrand mem->map_size = 0; 1289b1217eada9e32bf387d4d14615340aa5b5fd1f5cJason Ekstrand 1290098209eedf9532bb442caee7c28cb57f6b959004Jason Ekstrand *pMem = anv_device_memory_to_handle(mem); 1291769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1292c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand return VK_SUCCESS; 1293769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1294769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg fail: 12951ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie vk_free2(&device->alloc, pAllocator, mem); 1296769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1297769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return result; 1298769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1299769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 130005a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_FreeMemory( 1301769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice _device, 1302fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VkDeviceMemory _mem, 1303fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator) 1304769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1305c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 1306c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device_memory, mem, _mem); 1307769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1308b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand if (mem == NULL) 1309b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand return; 1310b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand 1311b1217eada9e32bf387d4d14615340aa5b5fd1f5cJason Ekstrand if (mem->map) 1312b1217eada9e32bf387d4d14615340aa5b5fd1f5cJason Ekstrand anv_UnmapMemory(_device, _mem); 1313b1217eada9e32bf387d4d14615340aa5b5fd1f5cJason Ekstrand 1314769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg if (mem->bo.map) 1315769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg anv_gem_munmap(mem->bo.map, mem->bo.size); 1316769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1317769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg if (mem->bo.gem_handle != 0) 1318769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg anv_gem_close(device, mem->bo.gem_handle); 1319769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 13201ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie vk_free2(&device->alloc, pAllocator, mem); 1321769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1322769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1323454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_MapMemory( 1324769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice _device, 13256a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand VkDeviceMemory _memory, 1326769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDeviceSize offset, 1327769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDeviceSize size, 1328769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkMemoryMapFlags flags, 1329769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg void** ppData) 1330769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1331c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 13326a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand ANV_FROM_HANDLE(anv_device_memory, mem, _memory); 1333769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1334b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand if (mem == NULL) { 1335b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand *ppData = NULL; 1336b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand return VK_SUCCESS; 1337b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand } 1338b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand 133956dbf13045c551984c362fdeed42baf9d74517a6Jason Ekstrand if (size == VK_WHOLE_SIZE) 134056dbf13045c551984c362fdeed42baf9d74517a6Jason Ekstrand size = mem->bo.size - offset; 134156dbf13045c551984c362fdeed42baf9d74517a6Jason Ekstrand 134273ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand /* From the Vulkan spec version 1.0.32 docs for MapMemory: 134373ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand * 134473ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand * * If size is not equal to VK_WHOLE_SIZE, size must be greater than 0 134573ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand * assert(size != 0); 134673ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand * * If size is not equal to VK_WHOLE_SIZE, size must be less than or 134773ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand * equal to the size of the memory minus offset 134873ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand */ 134973ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand assert(size > 0); 135073ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand assert(offset + size <= mem->bo.size); 135173ef9c8f047835d369db3646853cdb25442db8d3Jason Ekstrand 1352769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg /* FIXME: Is this supposed to be thread safe? Since vkUnmapMemory() only 1353769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * takes a VkDeviceMemory pointer, it seems like only one map of the memory 1354769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * at a time is valid. We could just mmap up front and return an offset 1355769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * pointer here, but that may exhaust virtual memory on 32 bit 1356769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg * userspace. */ 1357769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1358bbb6875f35c783d4f350dc9fbf2e2904b3d47a5aKristian Høgsberg uint32_t gem_flags = 0; 1359bbb6875f35c783d4f350dc9fbf2e2904b3d47a5aKristian Høgsberg if (!device->info.has_llc && mem->type_index == 0) 1360bbb6875f35c783d4f350dc9fbf2e2904b3d47a5aKristian Høgsberg gem_flags |= I915_MMAP_WC; 1361bbb6875f35c783d4f350dc9fbf2e2904b3d47a5aKristian Høgsberg 1362f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand /* GEM will fail to map if the offset isn't 4k-aligned. Round down. */ 1363f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand uint64_t map_offset = offset & ~4095ull; 1364f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand assert(offset >= map_offset); 1365f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand uint64_t map_size = (offset + size) - map_offset; 1366769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1367f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand /* Let's map whole pages */ 13686b0b57225cf27aa5316b6c3085fa3254f0f4b1c2Jason Ekstrand map_size = align_u64(map_size, 4096); 1369f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand 1370920f34a2d9f14f023aee5203baa110c971519ee8Jason Ekstrand void *map = anv_gem_mmap(device, mem->bo.gem_handle, 1371920f34a2d9f14f023aee5203baa110c971519ee8Jason Ekstrand map_offset, map_size, gem_flags); 1372920f34a2d9f14f023aee5203baa110c971519ee8Jason Ekstrand if (map == MAP_FAILED) 1373920f34a2d9f14f023aee5203baa110c971519ee8Jason Ekstrand return vk_error(VK_ERROR_MEMORY_MAP_FAILED); 1374920f34a2d9f14f023aee5203baa110c971519ee8Jason Ekstrand 1375920f34a2d9f14f023aee5203baa110c971519ee8Jason Ekstrand mem->map = map; 1376f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand mem->map_size = map_size; 1377f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand 1378f076d5330dca4b7a882de17853d6aedccb4e50adJason Ekstrand *ppData = mem->map + (offset - map_offset); 1379477383e9ac2fd43f8b2176c13da7116f5d20b959Chad Versace 1380769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return VK_SUCCESS; 1381769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1382769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 138305a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_UnmapMemory( 1384769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice _device, 13856a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand VkDeviceMemory _memory) 1386769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 13876a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand ANV_FROM_HANDLE(anv_device_memory, mem, _memory); 1388769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1389b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand if (mem == NULL) 1390b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand return; 1391b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand 1392769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg anv_gem_munmap(mem->map, mem->map_size); 1393b1217eada9e32bf387d4d14615340aa5b5fd1f5cJason Ekstrand 1394b1217eada9e32bf387d4d14615340aa5b5fd1f5cJason Ekstrand mem->map = NULL; 1395b1217eada9e32bf387d4d14615340aa5b5fd1f5cJason Ekstrand mem->map_size = 0; 1396769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1397769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1398e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsbergstatic void 1399e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsbergclflush_mapped_ranges(struct anv_device *device, 1400e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg uint32_t count, 1401e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg const VkMappedMemoryRange *ranges) 1402e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg{ 1403e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg for (uint32_t i = 0; i < count; i++) { 1404e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg ANV_FROM_HANDLE(anv_device_memory, mem, ranges[i].memory); 1405e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg void *p = mem->map + (ranges[i].offset & ~CACHELINE_MASK); 140631d3486bd2dda4b9dd65c8b24544b8f8cb54054bKristian Høgsberg void *end; 140731d3486bd2dda4b9dd65c8b24544b8f8cb54054bKristian Høgsberg 140831d3486bd2dda4b9dd65c8b24544b8f8cb54054bKristian Høgsberg if (ranges[i].offset + ranges[i].size > mem->map_size) 140931d3486bd2dda4b9dd65c8b24544b8f8cb54054bKristian Høgsberg end = mem->map + mem->map_size; 141031d3486bd2dda4b9dd65c8b24544b8f8cb54054bKristian Høgsberg else 141131d3486bd2dda4b9dd65c8b24544b8f8cb54054bKristian Høgsberg end = mem->map + ranges[i].offset + ranges[i].size; 1412e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg 1413e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg while (p < end) { 1414e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg __builtin_ia32_clflush(p); 1415e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg p += CACHELINE_SIZE; 1416e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg } 1417e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg } 1418e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg} 1419e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg 1420d9c2caea6ae6538095196b590f7eec8da1aa1feaJason EkstrandVkResult anv_FlushMappedMemoryRanges( 1421e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg VkDevice _device, 14226a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand uint32_t memoryRangeCount, 14236a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand const VkMappedMemoryRange* pMemoryRanges) 1424769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1425e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg ANV_FROM_HANDLE(anv_device, device, _device); 1426e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg 1427e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg if (device->info.has_llc) 1428e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg return VK_SUCCESS; 1429e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg 1430e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg /* Make sure the writes we're flushing have landed. */ 14310c4ef36360627686a0f3b56d64409ffb8bfbcb8cKristian Høgsberg __builtin_ia32_mfence(); 1432e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg 1433e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg clflush_mapped_ranges(device, memoryRangeCount, pMemoryRanges); 1434769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1435769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return VK_SUCCESS; 1436769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1437769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1438d9c2caea6ae6538095196b590f7eec8da1aa1feaJason EkstrandVkResult anv_InvalidateMappedMemoryRanges( 1439e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg VkDevice _device, 14406a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand uint32_t memoryRangeCount, 14416a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand const VkMappedMemoryRange* pMemoryRanges) 1442769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1443e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg ANV_FROM_HANDLE(anv_device, device, _device); 1444e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg 1445e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg if (device->info.has_llc) 1446e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg return VK_SUCCESS; 1447e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg 1448e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg clflush_mapped_ranges(device, memoryRangeCount, pMemoryRanges); 1449e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg 1450e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg /* Make sure no reads get moved up above the invalidate. */ 14510c4ef36360627686a0f3b56d64409ffb8bfbcb8cKristian Høgsberg __builtin_ia32_mfence(); 1452e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg 1453e0b5f0308c78ff5e6f7459a0f7d05e3fb376a104Kristian Høgsberg return VK_SUCCESS; 1454769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1455769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1456f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrandvoid anv_GetBufferMemoryRequirements( 14573b524138e6bad217fcf508340a86b65c874c9a9fConnor Abbott VkDevice _device, 145855723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand VkBuffer _buffer, 1459ef8980e256c30fa672efd515e768a1405752d803Jason Ekstrand VkMemoryRequirements* pMemoryRequirements) 1460769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 146155723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); 14623b524138e6bad217fcf508340a86b65c874c9a9fConnor Abbott ANV_FROM_HANDLE(anv_device, device, _device); 1463769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1464f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace /* The Vulkan spec (git aaed022) says: 1465f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace * 1466f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace * memoryTypeBits is a bitfield and contains one bit set for every 1467f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace * supported memory type for the resource. The bit `1<<i` is set if and 1468f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace * only if the memory type `i` in the VkPhysicalDeviceMemoryProperties 1469f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace * structure for the physical device is supported. 1470f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace * 14713b524138e6bad217fcf508340a86b65c874c9a9fConnor Abbott * We support exactly one memory type on LLC, two on non-LLC. 1472f43a304dc6284c8c98b9bcef32283b7715f1f820Chad Versace */ 14733b524138e6bad217fcf508340a86b65c874c9a9fConnor Abbott pMemoryRequirements->memoryTypeBits = device->info.has_llc ? 1 : 3; 1474769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 147555723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand pMemoryRequirements->size = buffer->size; 147655723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand pMemoryRequirements->alignment = 16; 1477769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1478769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1479f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrandvoid anv_GetImageMemoryRequirements( 14803b524138e6bad217fcf508340a86b65c874c9a9fConnor Abbott VkDevice _device, 148155723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand VkImage _image, 148255723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand VkMemoryRequirements* pMemoryRequirements) 148355723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand{ 148455723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand ANV_FROM_HANDLE(anv_image, image, _image); 14853b524138e6bad217fcf508340a86b65c874c9a9fConnor Abbott ANV_FROM_HANDLE(anv_device, device, _device); 148655723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand 148755723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand /* The Vulkan spec (git aaed022) says: 148855723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand * 148955723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand * memoryTypeBits is a bitfield and contains one bit set for every 149055723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand * supported memory type for the resource. The bit `1<<i` is set if and 149155723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand * only if the memory type `i` in the VkPhysicalDeviceMemoryProperties 149255723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand * structure for the physical device is supported. 149355723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand * 14943b524138e6bad217fcf508340a86b65c874c9a9fConnor Abbott * We support exactly one memory type on LLC, two on non-LLC. 149555723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand */ 14963b524138e6bad217fcf508340a86b65c874c9a9fConnor Abbott pMemoryRequirements->memoryTypeBits = device->info.has_llc ? 1 : 3; 149755723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand 149855723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand pMemoryRequirements->size = image->size; 149955723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand pMemoryRequirements->alignment = image->alignment; 150055723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand} 150155723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand 1502f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrandvoid anv_GetImageSparseMemoryRequirements( 1503c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand VkDevice device, 1504c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand VkImage image, 15055a024417894420d2647f53de8de8dd72e773fc74Jason Ekstrand uint32_t* pSparseMemoryRequirementCount, 1506c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand VkSparseImageMemoryRequirements* pSparseMemoryRequirements) 1507c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand{ 1508f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrand stub(); 1509c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand} 1510c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand 1511f1a7c7841f4484d81d4f6c0242e04fdaea5f0933Jason Ekstrandvoid anv_GetDeviceMemoryCommitment( 1512c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand VkDevice device, 1513c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand VkDeviceMemory memory, 1514c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand VkDeviceSize* pCommittedMemoryInBytes) 1515c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand{ 1516c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand *pCommittedMemoryInBytes = 0; 1517c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand} 1518c7fcfebd5bb5e1fb51b15615ecb091dbc986885dJason Ekstrand 151955723e97f1f4e830a8a0f05ed4dd85108c658a45Jason EkstrandVkResult anv_BindBufferMemory( 152055723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand VkDevice device, 152155723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand VkBuffer _buffer, 15226a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand VkDeviceMemory _memory, 15236a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand VkDeviceSize memoryOffset) 1524769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 15256a6da54ccb4b401e3a6675b15001854e10d94dbdJason Ekstrand ANV_FROM_HANDLE(anv_device_memory, mem, _memory); 152655723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); 1527769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1528b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand if (mem) { 1529b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand buffer->bo = &mem->bo; 1530b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand buffer->offset = memoryOffset; 1531b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand } else { 1532b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand buffer->bo = NULL; 1533b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand buffer->offset = 0; 1534b1325404c5931e0ec744b696eb078774f813505dJason Ekstrand } 153555723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand 153655723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand return VK_SUCCESS; 153755723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand} 153855723e97f1f4e830a8a0f05ed4dd85108c658a45Jason Ekstrand 1539fd53603e4259adee7ce976050412309b5a0550cbJason EkstrandVkResult anv_QueueBindSparse( 1540769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkQueue queue, 1541fd53603e4259adee7ce976050412309b5a0550cbJason Ekstrand uint32_t bindInfoCount, 1542fd53603e4259adee7ce976050412309b5a0550cbJason Ekstrand const VkBindSparseInfo* pBindInfo, 1543fd53603e4259adee7ce976050412309b5a0550cbJason Ekstrand VkFence fence) 1544769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1545fed3586f34ce701b0f6464c54456122e096c0beeJason Ekstrand stub_return(VK_ERROR_INCOMPATIBLE_DRIVER); 1546769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1547769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1548454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_CreateFence( 15496afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg VkDevice _device, 1550769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg const VkFenceCreateInfo* pCreateInfo, 1551fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator, 1552769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkFence* pFence) 1553769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1554c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 15552308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand struct anv_bo fence_bo; 15566afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg struct anv_fence *fence; 15576afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg struct anv_batch batch; 15586afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg VkResult result; 15596afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 15606afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_FENCE_CREATE_INFO); 15616afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 1562b1c5d45872c4c156b1366071c8532a0057a70745Jason Ekstrand result = anv_bo_pool_alloc(&device->batch_bo_pool, &fence_bo, 4096); 15636afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg if (result != VK_SUCCESS) 15642308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand return result; 15652308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand 15662308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand /* Fences are small. Just store the CPU data structure in the BO. */ 15672308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand fence = fence_bo.map; 15682308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand fence->bo = fence_bo; 15696afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 15702308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand /* Place the batch after the CPU data but on its own cache line. */ 15712308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand const uint32_t batch_offset = align_u32(sizeof(*fence), CACHELINE_SIZE); 15722308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand batch.next = batch.start = fence->bo.map + batch_offset; 1573da8f1482036d35e56250173d479f74b6514d27c7Jason Ekstrand batch.end = fence->bo.map + fence->bo.size; 157450018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&batch, GEN7_MI_BATCH_BUFFER_END, bbe); 157550018522d2f2e1deb91710d63e0985c0b3dc8818Jason Ekstrand anv_batch_emit(&batch, GEN7_MI_NOOP, noop); 15766afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 1577773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg if (!device->info.has_llc) { 15782308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand assert(((uintptr_t) batch.start & CACHELINE_MASK) == 0); 15792308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand assert(batch.next - batch.start <= CACHELINE_SIZE); 15800c4ef36360627686a0f3b56d64409ffb8bfbcb8cKristian Høgsberg __builtin_ia32_mfence(); 1581abaa3bed22ebb580724a5741bb8bee69e476a85fJason Ekstrand __builtin_ia32_clflush(batch.start); 1582773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg } 1583773592051be92f3f8c3ac11492b22d2bf4e96020Kristian Høgsberg 15846afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->exec2_objects[0].handle = fence->bo.gem_handle; 15856afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->exec2_objects[0].relocation_count = 0; 15866afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->exec2_objects[0].relocs_ptr = 0; 15876afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->exec2_objects[0].alignment = 0; 15886afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->exec2_objects[0].offset = fence->bo.offset; 15896afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->exec2_objects[0].flags = 0; 15906afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->exec2_objects[0].rsvd1 = 0; 15916afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->exec2_objects[0].rsvd2 = 0; 15926afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 15936afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->execbuf.buffers_ptr = (uintptr_t) fence->exec2_objects; 15946afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->execbuf.buffer_count = 1; 15952308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand fence->execbuf.batch_start_offset = batch.start - fence->bo.map; 15962308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand fence->execbuf.batch_len = batch.next - batch.start; 15976afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->execbuf.cliprects_ptr = 0; 15986afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->execbuf.num_cliprects = 0; 15996afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->execbuf.DR1 = 0; 16006afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->execbuf.DR4 = 0; 16016afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 16026afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->execbuf.flags = 16036afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg I915_EXEC_HANDLE_LUT | I915_EXEC_NO_RELOC | I915_EXEC_RENDER; 16046afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->execbuf.rsvd1 = device->context_id; 16056afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg fence->execbuf.rsvd2 = 0; 16066afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 16071c97432ce88ea272ff7d906cd36f70e09dafcab9Jason Ekstrand if (pCreateInfo->flags & VK_FENCE_CREATE_SIGNALED_BIT) { 16081c97432ce88ea272ff7d906cd36f70e09dafcab9Jason Ekstrand fence->state = ANV_FENCE_STATE_SIGNALED; 16091c97432ce88ea272ff7d906cd36f70e09dafcab9Jason Ekstrand } else { 16101c97432ce88ea272ff7d906cd36f70e09dafcab9Jason Ekstrand fence->state = ANV_FENCE_STATE_RESET; 16111c97432ce88ea272ff7d906cd36f70e09dafcab9Jason Ekstrand } 16120d2145b50f4b8b85702c9442f754c060901f38e0Jason Ekstrand 1613098209eedf9532bb442caee7c28cb57f6b959004Jason Ekstrand *pFence = anv_fence_to_handle(fence); 16146afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 16156afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg return VK_SUCCESS; 1616769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1617769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 161805a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroyFence( 1619ebb191f14576d870bda8b66f6d5cadc67924bf42Chad Versace VkDevice _device, 1620fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VkFence _fence, 1621fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator) 1622ebb191f14576d870bda8b66f6d5cadc67924bf42Chad Versace{ 1623ebb191f14576d870bda8b66f6d5cadc67924bf42Chad Versace ANV_FROM_HANDLE(anv_device, device, _device); 1624ebb191f14576d870bda8b66f6d5cadc67924bf42Chad Versace ANV_FROM_HANDLE(anv_fence, fence, _fence); 1625ebb191f14576d870bda8b66f6d5cadc67924bf42Chad Versace 162649f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand if (!fence) 162749f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand return; 162849f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand 16292308891edea4d8508d3e95f29c58b4089e96b5e7Jason Ekstrand assert(fence->bo.map == fence); 163023de78768b69d5600233df022431b8f26a0907fcJason Ekstrand anv_bo_pool_free(&device->batch_bo_pool, &fence->bo); 1631ebb191f14576d870bda8b66f6d5cadc67924bf42Chad Versace} 1632ebb191f14576d870bda8b66f6d5cadc67924bf42Chad Versace 1633454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_ResetFences( 16346afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg VkDevice _device, 1635769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg uint32_t fenceCount, 1636d5349b1b18b2c9bece7f6491e5bf3918a53fedd2Jason Ekstrand const VkFence* pFences) 1637769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1638169251bff0ec4bdafa84da50b6144e6cf02bf0daChad Versace for (uint32_t i = 0; i < fenceCount; i++) { 1639169251bff0ec4bdafa84da50b6144e6cf02bf0daChad Versace ANV_FROM_HANDLE(anv_fence, fence, pFences[i]); 1640843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand fence->state = ANV_FENCE_STATE_RESET; 1641169251bff0ec4bdafa84da50b6144e6cf02bf0daChad Versace } 16426afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 16436afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg return VK_SUCCESS; 1644769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1645769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1646454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_GetFenceStatus( 16476afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg VkDevice _device, 16486afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg VkFence _fence) 1649769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1650c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 1651c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_fence, fence, _fence); 16526afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg int64_t t = 0; 16536afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg int ret; 16546afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 1655843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand switch (fence->state) { 1656843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand case ANV_FENCE_STATE_RESET: 1657843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* If it hasn't even been sent off to the GPU yet, it's not ready */ 1658843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand return VK_NOT_READY; 16596afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 1660843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand case ANV_FENCE_STATE_SIGNALED: 1661843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* It's been signaled, return success */ 16626afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg return VK_SUCCESS; 16635c49730164e0607008d3f82336b1b5ea3c5f855aJason Ekstrand 1664843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand case ANV_FENCE_STATE_SUBMITTED: 1665843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* It's been submitted to the GPU but we don't know if it's done yet. */ 1666843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand ret = anv_gem_wait(device, fence->bo.gem_handle, &t); 1667843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand if (ret == 0) { 1668843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand fence->state = ANV_FENCE_STATE_SIGNALED; 1669843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand return VK_SUCCESS; 1670843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } else { 1671843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand return VK_NOT_READY; 1672843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } 1673843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand default: 1674843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand unreachable("Invalid fence status"); 1675843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } 1676769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1677769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1678843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand#define NSEC_PER_SEC 1000000000 1679843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand#define INT_TYPE_MAX(type) ((1ull << (sizeof(type) * 8 - 1)) - 1) 1680843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1681454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_WaitForFences( 16826afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg VkDevice _device, 1683769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg uint32_t fenceCount, 1684769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg const VkFence* pFences, 16858f3b2187e1add8fabe30e0da93d6bfbf2c89673dChad Versace VkBool32 waitAll, 1686843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand uint64_t _timeout) 1687769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1688c8577b5f5243ee696a9f534e2cab0646474456a2Jason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 1689843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand int ret; 1690aafc87402d1d12a00e1969be52a2c3b6d18c5652Jason Ekstrand 1691aafc87402d1d12a00e1969be52a2c3b6d18c5652Jason Ekstrand /* DRM_IOCTL_I915_GEM_WAIT uses a signed 64 bit timeout and is supposed 1692aafc87402d1d12a00e1969be52a2c3b6d18c5652Jason Ekstrand * to block indefinitely timeouts <= 0. Unfortunately, this was broken 1693aafc87402d1d12a00e1969be52a2c3b6d18c5652Jason Ekstrand * for a couple of kernel releases. Since there's no way to know 1694aafc87402d1d12a00e1969be52a2c3b6d18c5652Jason Ekstrand * whether or not the kernel we're using is one of the broken ones, the 1695aafc87402d1d12a00e1969be52a2c3b6d18c5652Jason Ekstrand * best we can do is to clamp the timeout to INT64_MAX. This limits the 1696aafc87402d1d12a00e1969be52a2c3b6d18c5652Jason Ekstrand * maximum timeout from 584 years to 292 years - likely not a big deal. 1697aafc87402d1d12a00e1969be52a2c3b6d18c5652Jason Ekstrand */ 1698843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand int64_t timeout = MIN2(_timeout, INT64_MAX); 1699843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1700843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand uint32_t pending_fences = fenceCount; 1701843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand while (pending_fences) { 1702843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pending_fences = 0; 1703843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand bool signaled_fences = false; 1704843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand for (uint32_t i = 0; i < fenceCount; i++) { 1705843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand ANV_FROM_HANDLE(anv_fence, fence, pFences[i]); 1706843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand switch (fence->state) { 1707843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand case ANV_FENCE_STATE_RESET: 1708843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* This fence hasn't been submitted yet, we'll catch it the next 1709843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * time around. Yes, this may mean we dead-loop but, short of 1710843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * lots of locking and a condition variable, there's not much that 1711843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * we can do about that. 1712843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand */ 1713843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pending_fences++; 1714843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand continue; 1715843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1716843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand case ANV_FENCE_STATE_SIGNALED: 1717843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* This fence is not pending. If waitAll isn't set, we can return 1718843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * early. Otherwise, we have to keep going. 1719843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand */ 1720843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand if (!waitAll) 1721843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand return VK_SUCCESS; 1722843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand continue; 1723843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1724843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand case ANV_FENCE_STATE_SUBMITTED: 1725843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* These are the fences we really care about. Go ahead and wait 1726843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * on it until we hit a timeout. 1727843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand */ 1728843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand ret = anv_gem_wait(device, fence->bo.gem_handle, &timeout); 1729843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand if (ret == -1 && errno == ETIME) { 1730843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand return VK_TIMEOUT; 1731843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } else if (ret == -1) { 1732843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* We don't know the real error. */ 1733843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand return vk_errorf(VK_ERROR_DEVICE_LOST, "gem wait failed: %m"); 1734843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } else { 1735843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand fence->state = ANV_FENCE_STATE_SIGNALED; 1736843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand signaled_fences = true; 1737843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand if (!waitAll) 1738843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand return VK_SUCCESS; 1739843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand continue; 1740843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } 1741843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } 1742843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } 1743427978d9334d887715e00c7609a36aedaac1b4cfJason Ekstrand 1744843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand if (pending_fences && !signaled_fences) { 1745843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* If we've hit this then someone decided to vkWaitForFences before 1746843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * they've actually submitted any of them to a queue. This is a 1747843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * fairly pessimal case, so it's ok to lock here and use a standard 1748843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * pthreads condition variable. 1749843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand */ 1750843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pthread_mutex_lock(&device->mutex); 1751843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1752843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* It's possible that some of the fences have changed state since the 1753843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * last time we checked. Now that we have the lock, check for 1754843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * pending fences again and don't wait if it's changed. 1755843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand */ 1756843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand uint32_t now_pending_fences = 0; 1757843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand for (uint32_t i = 0; i < fenceCount; i++) { 1758843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand ANV_FROM_HANDLE(anv_fence, fence, pFences[i]); 1759843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand if (fence->state == ANV_FENCE_STATE_RESET) 1760843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand now_pending_fences++; 1761843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } 1762843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand assert(now_pending_fences <= pending_fences); 1763843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1764843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand if (now_pending_fences == pending_fences) { 1765843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand struct timespec before; 1766843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand clock_gettime(CLOCK_MONOTONIC, &before); 1767843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1768843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand uint32_t abs_nsec = before.tv_nsec + timeout % NSEC_PER_SEC; 1769843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand uint64_t abs_sec = before.tv_sec + (abs_nsec / NSEC_PER_SEC) + 1770843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand (timeout / NSEC_PER_SEC); 1771843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand abs_nsec %= NSEC_PER_SEC; 1772843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1773843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand /* Avoid roll-over in tv_sec on 32-bit systems if the user 1774843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand * provided timeout is UINT64_MAX 1775843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand */ 1776843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand struct timespec abstime; 1777843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand abstime.tv_nsec = abs_nsec; 1778843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand abstime.tv_sec = MIN2(abs_sec, INT_TYPE_MAX(abstime.tv_sec)); 1779843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1780843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand ret = pthread_cond_timedwait(&device->queue_submit, 1781843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand &device->mutex, &abstime); 1782843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand assert(ret != EINVAL); 1783843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1784843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand struct timespec after; 1785843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand clock_gettime(CLOCK_MONOTONIC, &after); 1786843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand uint64_t time_elapsed = 1787843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand ((uint64_t)after.tv_sec * NSEC_PER_SEC + after.tv_nsec) - 1788843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand ((uint64_t)before.tv_sec * NSEC_PER_SEC + before.tv_nsec); 1789843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1790843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand if (time_elapsed >= timeout) { 1791843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pthread_mutex_unlock(&device->mutex); 1792843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand return VK_TIMEOUT; 1793843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } 1794843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand 1795843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand timeout -= time_elapsed; 1796843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand } 17976afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 1798843775bab78a6b4d5cb4f02bd95d9d0e95c1c5e3Jason Ekstrand pthread_mutex_unlock(&device->mutex); 1799f9c948ed00787c56bac265dc934049ed67a1cd61Chad Versace } 18005c49730164e0607008d3f82336b1b5ea3c5f855aJason Ekstrand } 18016afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg 18026afb26452b95c4e35860ba69fdf31a055d6b62e8Kristian Høgsberg return VK_SUCCESS; 1803769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1804769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1805769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg// Queue semaphore functions 1806769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1807454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_CreateSemaphore( 1808769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice device, 1809769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg const VkSemaphoreCreateInfo* pCreateInfo, 1810fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator, 1811769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkSemaphore* pSemaphore) 1812769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1813a00524a216fc5b22d4ec67583b5e9a352f700321Kristian Høgsberg /* The DRM execbuffer ioctl always execute in-oder, even between different 1814a00524a216fc5b22d4ec67583b5e9a352f700321Kristian Høgsberg * rings. As such, there's nothing to do for the user space semaphore. 1815a00524a216fc5b22d4ec67583b5e9a352f700321Kristian Høgsberg */ 1816a00524a216fc5b22d4ec67583b5e9a352f700321Kristian Høgsberg 18173db43e8f3e60f8dc746eb4ab2e86f6b1b32d248aJason Ekstrand *pSemaphore = (VkSemaphore)1; 1818a00524a216fc5b22d4ec67583b5e9a352f700321Kristian Høgsberg 1819a00524a216fc5b22d4ec67583b5e9a352f700321Kristian Høgsberg return VK_SUCCESS; 1820769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1821769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 182205a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroySemaphore( 1823549070b18c301e6f80ce0964037778b6936564c0Chad Versace VkDevice device, 1824fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VkSemaphore semaphore, 1825fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator) 1826549070b18c301e6f80ce0964037778b6936564c0Chad Versace{ 1827549070b18c301e6f80ce0964037778b6936564c0Chad Versace} 1828549070b18c301e6f80ce0964037778b6936564c0Chad Versace 1829769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg// Event functions 1830769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1831454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_CreateEvent( 1832c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg VkDevice _device, 1833769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg const VkEventCreateInfo* pCreateInfo, 1834fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator, 1835769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkEvent* pEvent) 1836769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1837c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg ANV_FROM_HANDLE(anv_device, device, _device); 1838c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg struct anv_state state; 1839c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg struct anv_event *event; 1840c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1841c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_EVENT_CREATE_INFO); 1842c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1843c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg state = anv_state_pool_alloc(&device->dynamic_state_pool, 184425b09d1b5d74a946700f0956799cf00db0edae1aJason Ekstrand sizeof(*event), 8); 1845c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg event = state.map; 1846c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg event->state = state; 1847c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg event->semaphore = VK_EVENT_RESET; 1848c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1849c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg if (!device->info.has_llc) { 1850c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg /* Make sure the writes we're flushing have landed. */ 18510c4ef36360627686a0f3b56d64409ffb8bfbcb8cKristian Høgsberg __builtin_ia32_mfence(); 1852c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg __builtin_ia32_clflush(event); 1853c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg } 1854c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1855c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg *pEvent = anv_event_to_handle(event); 1856c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1857c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg return VK_SUCCESS; 1858769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1859769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 186005a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroyEvent( 1861c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg VkDevice _device, 1862c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg VkEvent _event, 1863fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator) 186468c7ef502da6c99d87e37973cdd1ff92995e77dfChad Versace{ 1865c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg ANV_FROM_HANDLE(anv_device, device, _device); 1866c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg ANV_FROM_HANDLE(anv_event, event, _event); 1867c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 186849f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand if (!event) 186949f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand return; 187049f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand 1871c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg anv_state_pool_free(&device->dynamic_state_pool, event->state); 187268c7ef502da6c99d87e37973cdd1ff92995e77dfChad Versace} 187368c7ef502da6c99d87e37973cdd1ff92995e77dfChad Versace 1874454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_GetEventStatus( 1875c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg VkDevice _device, 1876c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg VkEvent _event) 1877769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1878c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg ANV_FROM_HANDLE(anv_device, device, _device); 1879c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg ANV_FROM_HANDLE(anv_event, event, _event); 1880c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1881c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg if (!device->info.has_llc) { 18820c4ef36360627686a0f3b56d64409ffb8bfbcb8cKristian Høgsberg /* Invalidate read cache before reading event written by GPU. */ 1883c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg __builtin_ia32_clflush(event); 18840c4ef36360627686a0f3b56d64409ffb8bfbcb8cKristian Høgsberg __builtin_ia32_mfence(); 18850c4ef36360627686a0f3b56d64409ffb8bfbcb8cKristian Høgsberg 1886c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg } 1887c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1888c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg return event->semaphore; 1889769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1890769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1891454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_SetEvent( 1892c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg VkDevice _device, 1893c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg VkEvent _event) 1894769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1895c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg ANV_FROM_HANDLE(anv_device, device, _device); 1896c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg ANV_FROM_HANDLE(anv_event, event, _event); 1897c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1898c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg event->semaphore = VK_EVENT_SET; 1899c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1900c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg if (!device->info.has_llc) { 1901c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg /* Make sure the writes we're flushing have landed. */ 19020c4ef36360627686a0f3b56d64409ffb8bfbcb8cKristian Høgsberg __builtin_ia32_mfence(); 1903c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg __builtin_ia32_clflush(event); 1904c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg } 1905c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1906c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg return VK_SUCCESS; 1907769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1908769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1909454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_ResetEvent( 1910c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg VkDevice _device, 1911c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg VkEvent _event) 1912769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1913c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg ANV_FROM_HANDLE(anv_device, device, _device); 1914c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg ANV_FROM_HANDLE(anv_event, event, _event); 1915c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1916c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg event->semaphore = VK_EVENT_RESET; 1917c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1918c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg if (!device->info.has_llc) { 1919c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg /* Make sure the writes we're flushing have landed. */ 19200c4ef36360627686a0f3b56d64409ffb8bfbcb8cKristian Høgsberg __builtin_ia32_mfence(); 1921c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg __builtin_ia32_clflush(event); 1922c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg } 1923c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg 1924c4802bc44c0625fd3bb8b7da7068ce5673ce3d1eKristian Høgsberg return VK_SUCCESS; 1925769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1926769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1927769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg// Buffer functions 1928769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1929454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_CreateBuffer( 1930769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice _device, 1931769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg const VkBufferCreateInfo* pCreateInfo, 1932fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator, 1933769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkBuffer* pBuffer) 1934769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 1935c8577b5f5243ee696a9f534e2cab0646474456a2Jason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 1936769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg struct anv_buffer *buffer; 1937769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1938769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO); 1939769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 19401ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie buffer = vk_alloc2(&device->alloc, pAllocator, sizeof(*buffer), 8, 1941fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); 1942769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg if (buffer == NULL) 1943769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); 1944769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1945769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg buffer->size = pCreateInfo->size; 1946783a21192c7cc35113ec089354369e1ad34a7df9Jason Ekstrand buffer->usage = pCreateInfo->usage; 1947099faa1a2b339baf1dee2ee9c099e7457df2fce1Kristian Høgsberg buffer->bo = NULL; 1948769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg buffer->offset = 0; 1949769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1950098209eedf9532bb442caee7c28cb57f6b959004Jason Ekstrand *pBuffer = anv_buffer_to_handle(buffer); 1951769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 1952769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return VK_SUCCESS; 1953769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 1954769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 195505a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroyBuffer( 1956e93b6d8eb114b2fc7c7b7ef624874214a37dc184Chad Versace VkDevice _device, 1957fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VkBuffer _buffer, 1958fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator) 1959e93b6d8eb114b2fc7c7b7ef624874214a37dc184Chad Versace{ 1960e93b6d8eb114b2fc7c7b7ef624874214a37dc184Chad Versace ANV_FROM_HANDLE(anv_device, device, _device); 1961e93b6d8eb114b2fc7c7b7ef624874214a37dc184Chad Versace ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); 1962e93b6d8eb114b2fc7c7b7ef624874214a37dc184Chad Versace 196349f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand if (!buffer) 196449f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand return; 196549f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand 19661ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie vk_free2(&device->alloc, pAllocator, buffer); 1967e93b6d8eb114b2fc7c7b7ef624874214a37dc184Chad Versace} 1968e93b6d8eb114b2fc7c7b7ef624874214a37dc184Chad Versace 19698fe74ec45c93b3ec64243f351a7e2173a76cf788Kristian Høgsbergvoid 19706840cc15136fb405abd999222f2b08a068ba2e3cFrancisco Jerezanv_fill_buffer_surface_state(struct anv_device *device, struct anv_state state, 19711f98bf8da028c4d0e2b47cc1a59e6f004e2207a1Jason Ekstrand enum isl_format format, 1972399d5314f679921f0e383171bb01a3d259b04754Jason Ekstrand uint32_t offset, uint32_t range, uint32_t stride) 19738fe74ec45c93b3ec64243f351a7e2173a76cf788Kristian Høgsberg{ 1974eb19d640eb46249ba20734aa478c84fadfc35d80Jason Ekstrand isl_buffer_fill_state(&device->isl_dev, state.map, 1975eb19d640eb46249ba20734aa478c84fadfc35d80Jason Ekstrand .address = offset, 1976eb19d640eb46249ba20734aa478c84fadfc35d80Jason Ekstrand .mocs = device->default_mocs, 1977eb19d640eb46249ba20734aa478c84fadfc35d80Jason Ekstrand .size = range, 1978eb19d640eb46249ba20734aa478c84fadfc35d80Jason Ekstrand .format = format, 1979eb19d640eb46249ba20734aa478c84fadfc35d80Jason Ekstrand .stride = stride); 19806840cc15136fb405abd999222f2b08a068ba2e3cFrancisco Jerez 19816840cc15136fb405abd999222f2b08a068ba2e3cFrancisco Jerez if (!device->info.has_llc) 19826840cc15136fb405abd999222f2b08a068ba2e3cFrancisco Jerez anv_state_clflush(state); 19838fe74ec45c93b3ec64243f351a7e2173a76cf788Kristian Høgsberg} 19848fe74ec45c93b3ec64243f351a7e2173a76cf788Kristian Høgsberg 198505a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroySampler( 1986ec5e2f4992a5ddd7aeb4385324fb4d674d168d36Chad Versace VkDevice _device, 1987fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VkSampler _sampler, 1988fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator) 1989ec5e2f4992a5ddd7aeb4385324fb4d674d168d36Chad Versace{ 1990ec5e2f4992a5ddd7aeb4385324fb4d674d168d36Chad Versace ANV_FROM_HANDLE(anv_device, device, _device); 1991ec5e2f4992a5ddd7aeb4385324fb4d674d168d36Chad Versace ANV_FROM_HANDLE(anv_sampler, sampler, _sampler); 1992ec5e2f4992a5ddd7aeb4385324fb4d674d168d36Chad Versace 199349f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand if (!sampler) 199449f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand return; 199549f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand 19961ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie vk_free2(&device->alloc, pAllocator, sampler); 1997ec5e2f4992a5ddd7aeb4385324fb4d674d168d36Chad Versace} 1998ec5e2f4992a5ddd7aeb4385324fb4d674d168d36Chad Versace 1999454345da1e8d22f3612aa3fec6b1cf3027845d48Kristian HøgsbergVkResult anv_CreateFramebuffer( 2000769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkDevice _device, 2001769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg const VkFramebufferCreateInfo* pCreateInfo, 2002fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator, 2003769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg VkFramebuffer* pFramebuffer) 2004769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg{ 2005c95f9b61f2cc395a8b8d972d2796e4e7969cfd2cJason Ekstrand ANV_FROM_HANDLE(anv_device, device, _device); 2006769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg struct anv_framebuffer *framebuffer; 2007769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 2008769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO); 2009769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 201084783509926f01dcc6f96ddf8a86e4b9cac1c48fJason Ekstrand size_t size = sizeof(*framebuffer) + 2011d4446a7e58e4c57da68432ed108320936a910e5dChad Versace sizeof(struct anv_image_view *) * pCreateInfo->attachmentCount; 20121ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie framebuffer = vk_alloc2(&device->alloc, pAllocator, size, 8, 2013fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); 2014769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg if (framebuffer == NULL) 2015769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); 2016769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 201784783509926f01dcc6f96ddf8a86e4b9cac1c48fJason Ekstrand framebuffer->attachment_count = pCreateInfo->attachmentCount; 201884783509926f01dcc6f96ddf8a86e4b9cac1c48fJason Ekstrand for (uint32_t i = 0; i < pCreateInfo->attachmentCount; i++) { 20196dea1a9ba1acd7a957feb9ad43504e7accc4f8f8Chad Versace VkImageView _iview = pCreateInfo->pAttachments[i]; 2020d4446a7e58e4c57da68432ed108320936a910e5dChad Versace framebuffer->attachments[i] = anv_image_view_from_handle(_iview); 2021769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg } 2022769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 2023769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg framebuffer->width = pCreateInfo->width; 2024769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg framebuffer->height = pCreateInfo->height; 2025769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg framebuffer->layers = pCreateInfo->layers; 2026769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 2027098209eedf9532bb442caee7c28cb57f6b959004Jason Ekstrand *pFramebuffer = anv_framebuffer_to_handle(framebuffer); 2028769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 2029769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg return VK_SUCCESS; 2030769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg} 2031769785c497aaa60c629e0299e3ebfff53a8e393eKristian Høgsberg 203205a26a60c831f1dafc60a9f88b0d5cb2ca303d01Jason Ekstrandvoid anv_DestroyFramebuffer( 203308f7731f67dfb7926d66928619e84e4dd33624d3Chad Versace VkDevice _device, 2034fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand VkFramebuffer _fb, 2035fcfb404a5860c67129e3672768cc557c0e4a1f12Jason Ekstrand const VkAllocationCallbacks* pAllocator) 203608f7731f67dfb7926d66928619e84e4dd33624d3Chad Versace{ 203708f7731f67dfb7926d66928619e84e4dd33624d3Chad Versace ANV_FROM_HANDLE(anv_device, device, _device); 203808f7731f67dfb7926d66928619e84e4dd33624d3Chad Versace ANV_FROM_HANDLE(anv_framebuffer, fb, _fb); 203908f7731f67dfb7926d66928619e84e4dd33624d3Chad Versace 204049f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand if (!fb) 204149f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand return; 204249f08ad77f51cc344e4bfe60ba9f8d9fccfbd753Jason Ekstrand 20431ae6ece9802e77ede97722c0f7cdd0c24e6fbd04Dave Airlie vk_free2(&device->alloc, pAllocator, fb); 204408f7731f67dfb7926d66928619e84e4dd33624d3Chad Versace} 20451e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace 20461e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace/* vk_icd.h does not declare this function, so we declare it here to 20471e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * suppress Wmissing-prototypes. 20481e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace */ 20491e41d7f7b0855934744fe578ba4eae9209ee69f7Chad VersacePUBLIC VKAPI_ATTR VkResult VKAPI_CALL 20501e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versacevk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion); 20511e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace 20521e41d7f7b0855934744fe578ba4eae9209ee69f7Chad VersacePUBLIC VKAPI_ATTR VkResult VKAPI_CALL 20531e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versacevk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) 20541e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace{ 20551e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace /* For the full details on loader interface versioning, see 20561e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. 20571e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * What follows is a condensed summary, to help you navigate the large and 20581e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * confusing official doc. 20591e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * 20601e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - Loader interface v0 is incompatible with later versions. We don't 20611e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * support it. 20621e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * 20631e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - In loader interface v1: 20641e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - The first ICD entrypoint called by the loader is 20651e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * vk_icdGetInstanceProcAddr(). The ICD must statically expose this 20661e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * entrypoint. 20671e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - The ICD must statically expose no other Vulkan symbol unless it is 20681e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * linked with -Bsymbolic. 20691e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - Each dispatchable Vulkan handle created by the ICD must be 20701e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * a pointer to a struct whose first member is VK_LOADER_DATA. The 20711e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. 20721e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and 20731e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * vkDestroySurfaceKHR(). The ICD must be capable of working with 20741e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * such loader-managed surfaces. 20751e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * 20761e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - Loader interface v2 differs from v1 in: 20771e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - The first ICD entrypoint called by the loader is 20781e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must 20791e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * statically expose this entrypoint. 20801e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * 20811e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - Loader interface v3 differs from v2 in: 20821e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), 20831e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, 20841e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace * because the loader no longer does so. 20851e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace */ 20861e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace *pSupportedVersion = MIN2(*pSupportedVersion, 3u); 20871e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace return VK_SUCCESS; 20881e41d7f7b0855934744fe578ba4eae9209ee69f7Chad Versace} 2089