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, &timestamp))
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