xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/anv_device.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include <assert.h>
25*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
26*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
27*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
28*61046927SAndroid Build Coastguard Worker #include "drm-uapi/drm_fourcc.h"
29*61046927SAndroid Build Coastguard Worker #include "drm-uapi/drm.h"
30*61046927SAndroid Build Coastguard Worker #include <xf86drm.h>
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #include "anv_private.h"
33*61046927SAndroid Build Coastguard Worker #include "anv_measure.h"
34*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
35*61046927SAndroid Build Coastguard Worker #include "util/os_file.h"
36*61046927SAndroid Build Coastguard Worker #include "util/os_misc.h"
37*61046927SAndroid Build Coastguard Worker #include "util/u_atomic.h"
38*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
39*61046927SAndroid Build Coastguard Worker #include "util/u_gralloc/u_gralloc.h"
40*61046927SAndroid Build Coastguard Worker #endif
41*61046927SAndroid Build Coastguard Worker #include "util/u_string.h"
42*61046927SAndroid Build Coastguard Worker #include "vk_common_entrypoints.h"
43*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
44*61046927SAndroid Build Coastguard Worker #include "vk_deferred_operation.h"
45*61046927SAndroid Build Coastguard Worker #include "vk_drm_syncobj.h"
46*61046927SAndroid Build Coastguard Worker #include "common/intel_aux_map.h"
47*61046927SAndroid Build Coastguard Worker #include "common/intel_common.h"
48*61046927SAndroid Build Coastguard Worker #include "common/intel_debug_identifier.h"
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker #include "i915/anv_device.h"
51*61046927SAndroid Build Coastguard Worker #include "xe/anv_device.h"
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker #include "genxml/gen7_pack.h"
54*61046927SAndroid Build Coastguard Worker #include "genxml/genX_bits.h"
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker static void
anv_device_init_border_colors(struct anv_device * device)57*61046927SAndroid Build Coastguard Worker anv_device_init_border_colors(struct anv_device *device)
58*61046927SAndroid Build Coastguard Worker {
59*61046927SAndroid Build Coastguard Worker    static const struct gfx8_border_color border_colors[] = {
60*61046927SAndroid Build Coastguard Worker       [VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK] =  { .float32 = { 0.0, 0.0, 0.0, 0.0 } },
61*61046927SAndroid Build Coastguard Worker       [VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK] =       { .float32 = { 0.0, 0.0, 0.0, 1.0 } },
62*61046927SAndroid Build Coastguard Worker       [VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE] =       { .float32 = { 1.0, 1.0, 1.0, 1.0 } },
63*61046927SAndroid Build Coastguard Worker       [VK_BORDER_COLOR_INT_TRANSPARENT_BLACK] =    { .uint32 = { 0, 0, 0, 0 } },
64*61046927SAndroid Build Coastguard Worker       [VK_BORDER_COLOR_INT_OPAQUE_BLACK] =         { .uint32 = { 0, 0, 0, 1 } },
65*61046927SAndroid Build Coastguard Worker       [VK_BORDER_COLOR_INT_OPAQUE_WHITE] =         { .uint32 = { 1, 1, 1, 1 } },
66*61046927SAndroid Build Coastguard Worker    };
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker    device->border_colors =
69*61046927SAndroid Build Coastguard Worker       anv_state_pool_emit_data(&device->dynamic_state_pool,
70*61046927SAndroid Build Coastguard Worker                                sizeof(border_colors), 64, border_colors);
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker static VkResult
anv_device_init_trivial_batch(struct anv_device * device)74*61046927SAndroid Build Coastguard Worker anv_device_init_trivial_batch(struct anv_device *device)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker    VkResult result = anv_device_alloc_bo(device, "trivial-batch", 4096,
77*61046927SAndroid Build Coastguard Worker                                          ANV_BO_ALLOC_MAPPED |
78*61046927SAndroid Build Coastguard Worker                                          ANV_BO_ALLOC_HOST_COHERENT |
79*61046927SAndroid Build Coastguard Worker                                          ANV_BO_ALLOC_INTERNAL |
80*61046927SAndroid Build Coastguard Worker                                          ANV_BO_ALLOC_CAPTURE,
81*61046927SAndroid Build Coastguard Worker                                          0 /* explicit_address */,
82*61046927SAndroid Build Coastguard Worker                                          &device->trivial_batch_bo);
83*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
84*61046927SAndroid Build Coastguard Worker       return result;
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    struct anv_batch batch = {
87*61046927SAndroid Build Coastguard Worker       .start = device->trivial_batch_bo->map,
88*61046927SAndroid Build Coastguard Worker       .next = device->trivial_batch_bo->map,
89*61046927SAndroid Build Coastguard Worker       .end = device->trivial_batch_bo->map + 4096,
90*61046927SAndroid Build Coastguard Worker    };
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker    anv_batch_emit(&batch, GFX7_MI_BATCH_BUFFER_END, bbe);
93*61046927SAndroid Build Coastguard Worker    anv_batch_emit(&batch, GFX7_MI_NOOP, noop);
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker static bool
get_bo_from_pool(struct intel_batch_decode_bo * ret,struct anv_block_pool * pool,uint64_t address)99*61046927SAndroid Build Coastguard Worker get_bo_from_pool(struct intel_batch_decode_bo *ret,
100*61046927SAndroid Build Coastguard Worker                  struct anv_block_pool *pool,
101*61046927SAndroid Build Coastguard Worker                  uint64_t address)
102*61046927SAndroid Build Coastguard Worker {
103*61046927SAndroid Build Coastguard Worker    anv_block_pool_foreach_bo(bo, pool) {
104*61046927SAndroid Build Coastguard Worker       uint64_t bo_address = intel_48b_address(bo->offset);
105*61046927SAndroid Build Coastguard Worker       if (address >= bo_address && address < (bo_address + bo->size)) {
106*61046927SAndroid Build Coastguard Worker          *ret = (struct intel_batch_decode_bo) {
107*61046927SAndroid Build Coastguard Worker             .addr = bo_address,
108*61046927SAndroid Build Coastguard Worker             .size = bo->size,
109*61046927SAndroid Build Coastguard Worker             .map = bo->map,
110*61046927SAndroid Build Coastguard Worker          };
111*61046927SAndroid Build Coastguard Worker          return true;
112*61046927SAndroid Build Coastguard Worker       }
113*61046927SAndroid Build Coastguard Worker    }
114*61046927SAndroid Build Coastguard Worker    return false;
115*61046927SAndroid Build Coastguard Worker }
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker /* Finding a buffer for batch decoding */
118*61046927SAndroid Build Coastguard Worker static struct intel_batch_decode_bo
decode_get_bo(void * v_batch,bool ppgtt,uint64_t address)119*61046927SAndroid Build Coastguard Worker decode_get_bo(void *v_batch, bool ppgtt, uint64_t address)
120*61046927SAndroid Build Coastguard Worker {
121*61046927SAndroid Build Coastguard Worker    struct anv_device *device = v_batch;
122*61046927SAndroid Build Coastguard Worker    struct intel_batch_decode_bo ret_bo = {};
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    assert(ppgtt);
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker    if (get_bo_from_pool(&ret_bo, &device->dynamic_state_pool.block_pool, address))
127*61046927SAndroid Build Coastguard Worker       return ret_bo;
128*61046927SAndroid Build Coastguard Worker    if (get_bo_from_pool(&ret_bo, &device->instruction_state_pool.block_pool, address))
129*61046927SAndroid Build Coastguard Worker       return ret_bo;
130*61046927SAndroid Build Coastguard Worker    if (get_bo_from_pool(&ret_bo, &device->binding_table_pool.block_pool, address))
131*61046927SAndroid Build Coastguard Worker       return ret_bo;
132*61046927SAndroid Build Coastguard Worker    if (get_bo_from_pool(&ret_bo, &device->scratch_surface_state_pool.block_pool, address))
133*61046927SAndroid Build Coastguard Worker       return ret_bo;
134*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors &&
135*61046927SAndroid Build Coastguard Worker        get_bo_from_pool(&ret_bo, &device->bindless_surface_state_pool.block_pool, address))
136*61046927SAndroid Build Coastguard Worker       return ret_bo;
137*61046927SAndroid Build Coastguard Worker    if (get_bo_from_pool(&ret_bo, &device->internal_surface_state_pool.block_pool, address))
138*61046927SAndroid Build Coastguard Worker       return ret_bo;
139*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors &&
140*61046927SAndroid Build Coastguard Worker        get_bo_from_pool(&ret_bo, &device->indirect_push_descriptor_pool.block_pool, address))
141*61046927SAndroid Build Coastguard Worker       return ret_bo;
142*61046927SAndroid Build Coastguard Worker    if (device->info->has_aux_map &&
143*61046927SAndroid Build Coastguard Worker        get_bo_from_pool(&ret_bo, &device->aux_tt_pool.block_pool, address))
144*61046927SAndroid Build Coastguard Worker       return ret_bo;
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker    if (!device->cmd_buffer_being_decoded)
147*61046927SAndroid Build Coastguard Worker       return (struct intel_batch_decode_bo) { };
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker    struct anv_batch_bo **bbo;
150*61046927SAndroid Build Coastguard Worker    u_vector_foreach(bbo, &device->cmd_buffer_being_decoded->seen_bbos) {
151*61046927SAndroid Build Coastguard Worker       /* The decoder zeroes out the top 16 bits, so we need to as well */
152*61046927SAndroid Build Coastguard Worker       uint64_t bo_address = (*bbo)->bo->offset & (~0ull >> 16);
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker       if (address >= bo_address && address < bo_address + (*bbo)->bo->size) {
155*61046927SAndroid Build Coastguard Worker          return (struct intel_batch_decode_bo) {
156*61046927SAndroid Build Coastguard Worker             .addr = bo_address,
157*61046927SAndroid Build Coastguard Worker             .size = (*bbo)->bo->size,
158*61046927SAndroid Build Coastguard Worker             .map = (*bbo)->bo->map,
159*61046927SAndroid Build Coastguard Worker          };
160*61046927SAndroid Build Coastguard Worker       }
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker       uint32_t dep_words = (*bbo)->relocs.dep_words;
163*61046927SAndroid Build Coastguard Worker       BITSET_WORD *deps = (*bbo)->relocs.deps;
164*61046927SAndroid Build Coastguard Worker       for (uint32_t w = 0; w < dep_words; w++) {
165*61046927SAndroid Build Coastguard Worker          BITSET_WORD mask = deps[w];
166*61046927SAndroid Build Coastguard Worker          while (mask) {
167*61046927SAndroid Build Coastguard Worker             int i = u_bit_scan(&mask);
168*61046927SAndroid Build Coastguard Worker             uint32_t gem_handle = w * BITSET_WORDBITS + i;
169*61046927SAndroid Build Coastguard Worker             struct anv_bo *bo = anv_device_lookup_bo(device, gem_handle);
170*61046927SAndroid Build Coastguard Worker             assert(bo->refcount > 0);
171*61046927SAndroid Build Coastguard Worker             bo_address = bo->offset & (~0ull >> 16);
172*61046927SAndroid Build Coastguard Worker             if (address >= bo_address && address < bo_address + bo->size) {
173*61046927SAndroid Build Coastguard Worker                return (struct intel_batch_decode_bo) {
174*61046927SAndroid Build Coastguard Worker                   .addr = bo_address,
175*61046927SAndroid Build Coastguard Worker                   .size = bo->size,
176*61046927SAndroid Build Coastguard Worker                   .map = bo->map,
177*61046927SAndroid Build Coastguard Worker                };
178*61046927SAndroid Build Coastguard Worker             }
179*61046927SAndroid Build Coastguard Worker          }
180*61046927SAndroid Build Coastguard Worker       }
181*61046927SAndroid Build Coastguard Worker    }
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker    return (struct intel_batch_decode_bo) { };
184*61046927SAndroid Build Coastguard Worker }
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker struct intel_aux_map_buffer {
187*61046927SAndroid Build Coastguard Worker    struct intel_buffer base;
188*61046927SAndroid Build Coastguard Worker    struct anv_state state;
189*61046927SAndroid Build Coastguard Worker };
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker static struct intel_buffer *
intel_aux_map_buffer_alloc(void * driver_ctx,uint32_t size)192*61046927SAndroid Build Coastguard Worker intel_aux_map_buffer_alloc(void *driver_ctx, uint32_t size)
193*61046927SAndroid Build Coastguard Worker {
194*61046927SAndroid Build Coastguard Worker    struct intel_aux_map_buffer *buf = malloc(sizeof(struct intel_aux_map_buffer));
195*61046927SAndroid Build Coastguard Worker    if (!buf)
196*61046927SAndroid Build Coastguard Worker       return NULL;
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker    struct anv_device *device = (struct anv_device*)driver_ctx;
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker    struct anv_state_pool *pool = &device->aux_tt_pool;
201*61046927SAndroid Build Coastguard Worker    buf->state = anv_state_pool_alloc(pool, size, size);
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker    buf->base.gpu = pool->block_pool.bo->offset + buf->state.offset;
204*61046927SAndroid Build Coastguard Worker    buf->base.gpu_end = buf->base.gpu + buf->state.alloc_size;
205*61046927SAndroid Build Coastguard Worker    buf->base.map = buf->state.map;
206*61046927SAndroid Build Coastguard Worker    buf->base.driver_bo = &buf->state;
207*61046927SAndroid Build Coastguard Worker    return &buf->base;
208*61046927SAndroid Build Coastguard Worker }
209*61046927SAndroid Build Coastguard Worker 
210*61046927SAndroid Build Coastguard Worker static void
intel_aux_map_buffer_free(void * driver_ctx,struct intel_buffer * buffer)211*61046927SAndroid Build Coastguard Worker intel_aux_map_buffer_free(void *driver_ctx, struct intel_buffer *buffer)
212*61046927SAndroid Build Coastguard Worker {
213*61046927SAndroid Build Coastguard Worker    struct intel_aux_map_buffer *buf = (struct intel_aux_map_buffer*)buffer;
214*61046927SAndroid Build Coastguard Worker    struct anv_device *device = (struct anv_device*)driver_ctx;
215*61046927SAndroid Build Coastguard Worker    struct anv_state_pool *pool = &device->aux_tt_pool;
216*61046927SAndroid Build Coastguard Worker    anv_state_pool_free(pool, buf->state);
217*61046927SAndroid Build Coastguard Worker    free(buf);
218*61046927SAndroid Build Coastguard Worker }
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker static struct intel_mapped_pinned_buffer_alloc aux_map_allocator = {
221*61046927SAndroid Build Coastguard Worker    .alloc = intel_aux_map_buffer_alloc,
222*61046927SAndroid Build Coastguard Worker    .free = intel_aux_map_buffer_free,
223*61046927SAndroid Build Coastguard Worker };
224*61046927SAndroid Build Coastguard Worker 
225*61046927SAndroid Build Coastguard Worker static VkResult
anv_device_setup_context_or_vm(struct anv_device * device,const VkDeviceCreateInfo * pCreateInfo,const uint32_t num_queues)226*61046927SAndroid Build Coastguard Worker anv_device_setup_context_or_vm(struct anv_device *device,
227*61046927SAndroid Build Coastguard Worker                                const VkDeviceCreateInfo *pCreateInfo,
228*61046927SAndroid Build Coastguard Worker                                const uint32_t num_queues)
229*61046927SAndroid Build Coastguard Worker {
230*61046927SAndroid Build Coastguard Worker    switch (device->info->kmd_type) {
231*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_I915:
232*61046927SAndroid Build Coastguard Worker       return anv_i915_device_setup_context(device, pCreateInfo, num_queues);
233*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_XE:
234*61046927SAndroid Build Coastguard Worker       return anv_xe_device_setup_vm(device);
235*61046927SAndroid Build Coastguard Worker    default:
236*61046927SAndroid Build Coastguard Worker       unreachable("Missing");
237*61046927SAndroid Build Coastguard Worker       return VK_ERROR_UNKNOWN;
238*61046927SAndroid Build Coastguard Worker    }
239*61046927SAndroid Build Coastguard Worker }
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker static bool
anv_device_destroy_context_or_vm(struct anv_device * device)242*61046927SAndroid Build Coastguard Worker anv_device_destroy_context_or_vm(struct anv_device *device)
243*61046927SAndroid Build Coastguard Worker {
244*61046927SAndroid Build Coastguard Worker    switch (device->info->kmd_type) {
245*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_I915:
246*61046927SAndroid Build Coastguard Worker       if (device->physical->has_vm_control)
247*61046927SAndroid Build Coastguard Worker          return anv_i915_device_destroy_vm(device);
248*61046927SAndroid Build Coastguard Worker       else
249*61046927SAndroid Build Coastguard Worker          return intel_gem_destroy_context(device->fd, device->context_id);
250*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_XE:
251*61046927SAndroid Build Coastguard Worker       return anv_xe_device_destroy_vm(device);
252*61046927SAndroid Build Coastguard Worker    default:
253*61046927SAndroid Build Coastguard Worker       unreachable("Missing");
254*61046927SAndroid Build Coastguard Worker       return false;
255*61046927SAndroid Build Coastguard Worker    }
256*61046927SAndroid Build Coastguard Worker }
257*61046927SAndroid Build Coastguard Worker 
258*61046927SAndroid Build Coastguard Worker static VkResult
anv_device_init_trtt(struct anv_device * device)259*61046927SAndroid Build Coastguard Worker anv_device_init_trtt(struct anv_device *device)
260*61046927SAndroid Build Coastguard Worker {
261*61046927SAndroid Build Coastguard Worker    if (device->physical->sparse_type != ANV_SPARSE_TYPE_TRTT ||
262*61046927SAndroid Build Coastguard Worker        !device->vk.enabled_features.sparseBinding)
263*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
264*61046927SAndroid Build Coastguard Worker 
265*61046927SAndroid Build Coastguard Worker    struct anv_trtt *trtt = &device->trtt;
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker    VkResult result =
268*61046927SAndroid Build Coastguard Worker       vk_sync_create(&device->vk,
269*61046927SAndroid Build Coastguard Worker                      &device->physical->sync_syncobj_type,
270*61046927SAndroid Build Coastguard Worker                      VK_SYNC_IS_TIMELINE,
271*61046927SAndroid Build Coastguard Worker                      0 /* initial_value */,
272*61046927SAndroid Build Coastguard Worker                      &trtt->timeline);
273*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
274*61046927SAndroid Build Coastguard Worker       return result;
275*61046927SAndroid Build Coastguard Worker 
276*61046927SAndroid Build Coastguard Worker    simple_mtx_init(&trtt->mutex, mtx_plain);
277*61046927SAndroid Build Coastguard Worker 
278*61046927SAndroid Build Coastguard Worker    list_inithead(&trtt->in_flight_batches);
279*61046927SAndroid Build Coastguard Worker 
280*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
281*61046927SAndroid Build Coastguard Worker }
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker static void
anv_device_finish_trtt(struct anv_device * device)284*61046927SAndroid Build Coastguard Worker anv_device_finish_trtt(struct anv_device *device)
285*61046927SAndroid Build Coastguard Worker {
286*61046927SAndroid Build Coastguard Worker    if (device->physical->sparse_type != ANV_SPARSE_TYPE_TRTT ||
287*61046927SAndroid Build Coastguard Worker        !device->vk.enabled_features.sparseBinding)
288*61046927SAndroid Build Coastguard Worker       return;
289*61046927SAndroid Build Coastguard Worker 
290*61046927SAndroid Build Coastguard Worker    struct anv_trtt *trtt = &device->trtt;
291*61046927SAndroid Build Coastguard Worker 
292*61046927SAndroid Build Coastguard Worker    anv_sparse_trtt_garbage_collect_batches(device, true);
293*61046927SAndroid Build Coastguard Worker 
294*61046927SAndroid Build Coastguard Worker    vk_sync_destroy(&device->vk, trtt->timeline);
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker    simple_mtx_destroy(&trtt->mutex);
297*61046927SAndroid Build Coastguard Worker 
298*61046927SAndroid Build Coastguard Worker    vk_free(&device->vk.alloc, trtt->l3_mirror);
299*61046927SAndroid Build Coastguard Worker    vk_free(&device->vk.alloc, trtt->l2_mirror);
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker    for (int i = 0; i < trtt->num_page_table_bos; i++)
302*61046927SAndroid Build Coastguard Worker       anv_device_release_bo(device, trtt->page_table_bos[i]);
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker    vk_free(&device->vk.alloc, trtt->page_table_bos);
305*61046927SAndroid Build Coastguard Worker }
306*61046927SAndroid Build Coastguard Worker 
anv_CreateDevice(VkPhysicalDevice physicalDevice,const VkDeviceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDevice * pDevice)307*61046927SAndroid Build Coastguard Worker VkResult anv_CreateDevice(
308*61046927SAndroid Build Coastguard Worker     VkPhysicalDevice                            physicalDevice,
309*61046927SAndroid Build Coastguard Worker     const VkDeviceCreateInfo*                   pCreateInfo,
310*61046927SAndroid Build Coastguard Worker     const VkAllocationCallbacks*                pAllocator,
311*61046927SAndroid Build Coastguard Worker     VkDevice*                                   pDevice)
312*61046927SAndroid Build Coastguard Worker {
313*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
314*61046927SAndroid Build Coastguard Worker    VkResult result;
315*61046927SAndroid Build Coastguard Worker    struct anv_device *device;
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO);
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker    /* Check requested queues and fail if we are requested to create any
320*61046927SAndroid Build Coastguard Worker     * queues with flags we don't support.
321*61046927SAndroid Build Coastguard Worker     */
322*61046927SAndroid Build Coastguard Worker    assert(pCreateInfo->queueCreateInfoCount > 0);
323*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) {
324*61046927SAndroid Build Coastguard Worker       if (pCreateInfo->pQueueCreateInfos[i].flags & ~VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT)
325*61046927SAndroid Build Coastguard Worker          return vk_error(physical_device, VK_ERROR_INITIALIZATION_FAILED);
326*61046927SAndroid Build Coastguard Worker    }
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker    device = vk_zalloc2(&physical_device->instance->vk.alloc, pAllocator,
329*61046927SAndroid Build Coastguard Worker                        sizeof(*device), 8,
330*61046927SAndroid Build Coastguard Worker                        VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
331*61046927SAndroid Build Coastguard Worker    if (!device)
332*61046927SAndroid Build Coastguard Worker       return vk_error(physical_device, VK_ERROR_OUT_OF_HOST_MEMORY);
333*61046927SAndroid Build Coastguard Worker 
334*61046927SAndroid Build Coastguard Worker    struct vk_device_dispatch_table dispatch_table;
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker    bool override_initial_entrypoints = true;
337*61046927SAndroid Build Coastguard Worker    if (physical_device->instance->vk.app_info.app_name &&
338*61046927SAndroid Build Coastguard Worker        !strcmp(physical_device->instance->vk.app_info.app_name, "HITMAN3.exe")) {
339*61046927SAndroid Build Coastguard Worker       vk_device_dispatch_table_from_entrypoints(&dispatch_table,
340*61046927SAndroid Build Coastguard Worker                                                 &anv_hitman3_device_entrypoints,
341*61046927SAndroid Build Coastguard Worker                                                 true);
342*61046927SAndroid Build Coastguard Worker       override_initial_entrypoints = false;
343*61046927SAndroid Build Coastguard Worker    }
344*61046927SAndroid Build Coastguard Worker    if (physical_device->info.ver < 12 &&
345*61046927SAndroid Build Coastguard Worker        physical_device->instance->vk.app_info.app_name &&
346*61046927SAndroid Build Coastguard Worker        !strcmp(physical_device->instance->vk.app_info.app_name, "DOOM 64")) {
347*61046927SAndroid Build Coastguard Worker       vk_device_dispatch_table_from_entrypoints(&dispatch_table,
348*61046927SAndroid Build Coastguard Worker                                                 &anv_doom64_device_entrypoints,
349*61046927SAndroid Build Coastguard Worker                                                 true);
350*61046927SAndroid Build Coastguard Worker       override_initial_entrypoints = false;
351*61046927SAndroid Build Coastguard Worker    }
352*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
353*61046927SAndroid Build Coastguard Worker    vk_device_dispatch_table_from_entrypoints(&dispatch_table,
354*61046927SAndroid Build Coastguard Worker                                              &anv_android_device_entrypoints,
355*61046927SAndroid Build Coastguard Worker                                              true);
356*61046927SAndroid Build Coastguard Worker    override_initial_entrypoints = false;
357*61046927SAndroid Build Coastguard Worker #endif
358*61046927SAndroid Build Coastguard Worker    if (physical_device->instance->vk.trace_mode & VK_TRACE_MODE_RMV) {
359*61046927SAndroid Build Coastguard Worker       vk_device_dispatch_table_from_entrypoints(&dispatch_table,
360*61046927SAndroid Build Coastguard Worker                                                 &anv_rmv_device_entrypoints,
361*61046927SAndroid Build Coastguard Worker                                                 true);
362*61046927SAndroid Build Coastguard Worker       override_initial_entrypoints = false;
363*61046927SAndroid Build Coastguard Worker    }
364*61046927SAndroid Build Coastguard Worker    vk_device_dispatch_table_from_entrypoints(&dispatch_table,
365*61046927SAndroid Build Coastguard Worker       anv_genX(&physical_device->info, device_entrypoints),
366*61046927SAndroid Build Coastguard Worker       override_initial_entrypoints);
367*61046927SAndroid Build Coastguard Worker    vk_device_dispatch_table_from_entrypoints(&dispatch_table,
368*61046927SAndroid Build Coastguard Worker       &anv_device_entrypoints, false);
369*61046927SAndroid Build Coastguard Worker    vk_device_dispatch_table_from_entrypoints(&dispatch_table,
370*61046927SAndroid Build Coastguard Worker       &wsi_device_entrypoints, false);
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker    result = vk_device_init(&device->vk, &physical_device->vk,
374*61046927SAndroid Build Coastguard Worker                            &dispatch_table, pCreateInfo, pAllocator);
375*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
376*61046927SAndroid Build Coastguard Worker       goto fail_alloc;
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker    if (INTEL_DEBUG(DEBUG_BATCH | DEBUG_BATCH_STATS)) {
379*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < physical_device->queue.family_count; i++) {
380*61046927SAndroid Build Coastguard Worker          struct intel_batch_decode_ctx *decoder = &device->decoder[i];
381*61046927SAndroid Build Coastguard Worker 
382*61046927SAndroid Build Coastguard Worker          const unsigned decode_flags = INTEL_BATCH_DECODE_DEFAULT_FLAGS;
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker          intel_batch_decode_ctx_init_brw(decoder,
385*61046927SAndroid Build Coastguard Worker                                          &physical_device->compiler->isa,
386*61046927SAndroid Build Coastguard Worker                                          &physical_device->info,
387*61046927SAndroid Build Coastguard Worker                                          stderr, decode_flags, NULL,
388*61046927SAndroid Build Coastguard Worker                                          decode_get_bo, NULL, device);
389*61046927SAndroid Build Coastguard Worker          intel_batch_stats_reset(decoder);
390*61046927SAndroid Build Coastguard Worker 
391*61046927SAndroid Build Coastguard Worker          decoder->engine = physical_device->queue.families[i].engine_class;
392*61046927SAndroid Build Coastguard Worker          decoder->dynamic_base = physical_device->va.dynamic_state_pool.addr;
393*61046927SAndroid Build Coastguard Worker          decoder->surface_base = physical_device->va.internal_surface_state_pool.addr;
394*61046927SAndroid Build Coastguard Worker          decoder->instruction_base = physical_device->va.instruction_state_pool.addr;
395*61046927SAndroid Build Coastguard Worker       }
396*61046927SAndroid Build Coastguard Worker    }
397*61046927SAndroid Build Coastguard Worker 
398*61046927SAndroid Build Coastguard Worker    anv_device_set_physical(device, physical_device);
399*61046927SAndroid Build Coastguard Worker    device->kmd_backend = anv_kmd_backend_get(device->info->kmd_type);
400*61046927SAndroid Build Coastguard Worker 
401*61046927SAndroid Build Coastguard Worker    /* XXX(chadv): Can we dup() physicalDevice->fd here? */
402*61046927SAndroid Build Coastguard Worker    device->fd = open(physical_device->path, O_RDWR | O_CLOEXEC);
403*61046927SAndroid Build Coastguard Worker    if (device->fd == -1) {
404*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED);
405*61046927SAndroid Build Coastguard Worker       goto fail_device;
406*61046927SAndroid Build Coastguard Worker    }
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker    switch (device->info->kmd_type) {
409*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_I915:
410*61046927SAndroid Build Coastguard Worker       device->vk.check_status = anv_i915_device_check_status;
411*61046927SAndroid Build Coastguard Worker       break;
412*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_XE:
413*61046927SAndroid Build Coastguard Worker       device->vk.check_status = anv_xe_device_check_status;
414*61046927SAndroid Build Coastguard Worker       break;
415*61046927SAndroid Build Coastguard Worker    default:
416*61046927SAndroid Build Coastguard Worker       unreachable("Missing");
417*61046927SAndroid Build Coastguard Worker    }
418*61046927SAndroid Build Coastguard Worker 
419*61046927SAndroid Build Coastguard Worker    device->vk.command_buffer_ops = &anv_cmd_buffer_ops;
420*61046927SAndroid Build Coastguard Worker    device->vk.create_sync_for_memory = anv_create_sync_for_memory;
421*61046927SAndroid Build Coastguard Worker    if (physical_device->info.kmd_type == INTEL_KMD_TYPE_I915)
422*61046927SAndroid Build Coastguard Worker       device->vk.create_sync_for_memory = anv_create_sync_for_memory;
423*61046927SAndroid Build Coastguard Worker    vk_device_set_drm_fd(&device->vk, device->fd);
424*61046927SAndroid Build Coastguard Worker 
425*61046927SAndroid Build Coastguard Worker    uint32_t num_queues = 0;
426*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++)
427*61046927SAndroid Build Coastguard Worker       num_queues += pCreateInfo->pQueueCreateInfos[i].queueCount;
428*61046927SAndroid Build Coastguard Worker 
429*61046927SAndroid Build Coastguard Worker    result = anv_device_setup_context_or_vm(device, pCreateInfo, num_queues);
430*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
431*61046927SAndroid Build Coastguard Worker       goto fail_fd;
432*61046927SAndroid Build Coastguard Worker 
433*61046927SAndroid Build Coastguard Worker    device->queues =
434*61046927SAndroid Build Coastguard Worker       vk_zalloc(&device->vk.alloc, num_queues * sizeof(*device->queues), 8,
435*61046927SAndroid Build Coastguard Worker                 VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
436*61046927SAndroid Build Coastguard Worker    if (device->queues == NULL) {
437*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
438*61046927SAndroid Build Coastguard Worker       goto fail_context_id;
439*61046927SAndroid Build Coastguard Worker    }
440*61046927SAndroid Build Coastguard Worker 
441*61046927SAndroid Build Coastguard Worker    if (pthread_mutex_init(&device->vma_mutex, NULL) != 0) {
442*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED);
443*61046927SAndroid Build Coastguard Worker       goto fail_queues_alloc;
444*61046927SAndroid Build Coastguard Worker    }
445*61046927SAndroid Build Coastguard Worker 
446*61046927SAndroid Build Coastguard Worker    /* keep the page with address zero out of the allocator */
447*61046927SAndroid Build Coastguard Worker    util_vma_heap_init(&device->vma_lo,
448*61046927SAndroid Build Coastguard Worker                       device->physical->va.low_heap.addr,
449*61046927SAndroid Build Coastguard Worker                       device->physical->va.low_heap.size);
450*61046927SAndroid Build Coastguard Worker 
451*61046927SAndroid Build Coastguard Worker    util_vma_heap_init(&device->vma_hi,
452*61046927SAndroid Build Coastguard Worker                       device->physical->va.high_heap.addr,
453*61046927SAndroid Build Coastguard Worker                       device->physical->va.high_heap.size);
454*61046927SAndroid Build Coastguard Worker 
455*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors) {
456*61046927SAndroid Build Coastguard Worker       util_vma_heap_init(&device->vma_desc,
457*61046927SAndroid Build Coastguard Worker                          device->physical->va.indirect_descriptor_pool.addr,
458*61046927SAndroid Build Coastguard Worker                          device->physical->va.indirect_descriptor_pool.size);
459*61046927SAndroid Build Coastguard Worker    } else {
460*61046927SAndroid Build Coastguard Worker       util_vma_heap_init(&device->vma_desc,
461*61046927SAndroid Build Coastguard Worker                          device->physical->va.bindless_surface_state_pool.addr,
462*61046927SAndroid Build Coastguard Worker                          device->physical->va.bindless_surface_state_pool.size);
463*61046927SAndroid Build Coastguard Worker    }
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker    /* Always initialized because the the memory types point to this and they
466*61046927SAndroid Build Coastguard Worker     * are on the physical device.
467*61046927SAndroid Build Coastguard Worker     */
468*61046927SAndroid Build Coastguard Worker    util_vma_heap_init(&device->vma_dynamic_visible,
469*61046927SAndroid Build Coastguard Worker                       device->physical->va.dynamic_visible_pool.addr,
470*61046927SAndroid Build Coastguard Worker                       device->physical->va.dynamic_visible_pool.size);
471*61046927SAndroid Build Coastguard Worker    util_vma_heap_init(&device->vma_trtt,
472*61046927SAndroid Build Coastguard Worker                       device->physical->va.trtt.addr,
473*61046927SAndroid Build Coastguard Worker                       device->physical->va.trtt.size);
474*61046927SAndroid Build Coastguard Worker 
475*61046927SAndroid Build Coastguard Worker    list_inithead(&device->memory_objects);
476*61046927SAndroid Build Coastguard Worker    list_inithead(&device->image_private_objects);
477*61046927SAndroid Build Coastguard Worker 
478*61046927SAndroid Build Coastguard Worker    if (pthread_mutex_init(&device->mutex, NULL) != 0) {
479*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED);
480*61046927SAndroid Build Coastguard Worker       goto fail_vmas;
481*61046927SAndroid Build Coastguard Worker    }
482*61046927SAndroid Build Coastguard Worker 
483*61046927SAndroid Build Coastguard Worker    pthread_condattr_t condattr;
484*61046927SAndroid Build Coastguard Worker    if (pthread_condattr_init(&condattr) != 0) {
485*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED);
486*61046927SAndroid Build Coastguard Worker       goto fail_mutex;
487*61046927SAndroid Build Coastguard Worker    }
488*61046927SAndroid Build Coastguard Worker    if (pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC) != 0) {
489*61046927SAndroid Build Coastguard Worker       pthread_condattr_destroy(&condattr);
490*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED);
491*61046927SAndroid Build Coastguard Worker       goto fail_mutex;
492*61046927SAndroid Build Coastguard Worker    }
493*61046927SAndroid Build Coastguard Worker    if (pthread_cond_init(&device->queue_submit, &condattr) != 0) {
494*61046927SAndroid Build Coastguard Worker       pthread_condattr_destroy(&condattr);
495*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED);
496*61046927SAndroid Build Coastguard Worker       goto fail_mutex;
497*61046927SAndroid Build Coastguard Worker    }
498*61046927SAndroid Build Coastguard Worker    pthread_condattr_destroy(&condattr);
499*61046927SAndroid Build Coastguard Worker 
500*61046927SAndroid Build Coastguard Worker    if (physical_device->instance->vk.trace_mode & VK_TRACE_MODE_RMV)
501*61046927SAndroid Build Coastguard Worker       anv_memory_trace_init(device);
502*61046927SAndroid Build Coastguard Worker 
503*61046927SAndroid Build Coastguard Worker    result = anv_bo_cache_init(&device->bo_cache, device);
504*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
505*61046927SAndroid Build Coastguard Worker       goto fail_queue_cond;
506*61046927SAndroid Build Coastguard Worker 
507*61046927SAndroid Build Coastguard Worker    anv_bo_pool_init(&device->batch_bo_pool, device, "batch",
508*61046927SAndroid Build Coastguard Worker                     ANV_BO_ALLOC_MAPPED |
509*61046927SAndroid Build Coastguard Worker                     ANV_BO_ALLOC_HOST_CACHED_COHERENT |
510*61046927SAndroid Build Coastguard Worker                     ANV_BO_ALLOC_CAPTURE);
511*61046927SAndroid Build Coastguard Worker    if (device->vk.enabled_extensions.KHR_acceleration_structure) {
512*61046927SAndroid Build Coastguard Worker       anv_bo_pool_init(&device->bvh_bo_pool, device, "bvh build",
513*61046927SAndroid Build Coastguard Worker                        0 /* alloc_flags */);
514*61046927SAndroid Build Coastguard Worker    }
515*61046927SAndroid Build Coastguard Worker 
516*61046927SAndroid Build Coastguard Worker    /* Because scratch is also relative to General State Base Address, we leave
517*61046927SAndroid Build Coastguard Worker     * the base address 0 and start the pool memory at an offset.  This way we
518*61046927SAndroid Build Coastguard Worker     * get the correct offsets in the anv_states that get allocated from it.
519*61046927SAndroid Build Coastguard Worker     */
520*61046927SAndroid Build Coastguard Worker    result = anv_state_pool_init(&device->general_state_pool, device,
521*61046927SAndroid Build Coastguard Worker                                 &(struct anv_state_pool_params) {
522*61046927SAndroid Build Coastguard Worker                                    .name         = "general pool",
523*61046927SAndroid Build Coastguard Worker                                    .base_address = 0,
524*61046927SAndroid Build Coastguard Worker                                    .start_offset = device->physical->va.general_state_pool.addr,
525*61046927SAndroid Build Coastguard Worker                                    .block_size   = 16384,
526*61046927SAndroid Build Coastguard Worker                                    .max_size     = device->physical->va.general_state_pool.size
527*61046927SAndroid Build Coastguard Worker                                 });
528*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
529*61046927SAndroid Build Coastguard Worker       goto fail_batch_bo_pool;
530*61046927SAndroid Build Coastguard Worker 
531*61046927SAndroid Build Coastguard Worker    result = anv_state_pool_init(&device->dynamic_state_pool, device,
532*61046927SAndroid Build Coastguard Worker                                 &(struct anv_state_pool_params) {
533*61046927SAndroid Build Coastguard Worker                                    .name         = "dynamic pool",
534*61046927SAndroid Build Coastguard Worker                                    .base_address = device->physical->va.dynamic_state_pool.addr,
535*61046927SAndroid Build Coastguard Worker                                    .block_size   = 16384,
536*61046927SAndroid Build Coastguard Worker                                    .max_size     = device->physical->va.dynamic_state_pool.size,
537*61046927SAndroid Build Coastguard Worker                                 });
538*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
539*61046927SAndroid Build Coastguard Worker       goto fail_general_state_pool;
540*61046927SAndroid Build Coastguard Worker 
541*61046927SAndroid Build Coastguard Worker    /* The border color pointer is limited to 24 bits, so we need to make
542*61046927SAndroid Build Coastguard Worker     * sure that any such color used at any point in the program doesn't
543*61046927SAndroid Build Coastguard Worker     * exceed that limit.
544*61046927SAndroid Build Coastguard Worker     * We achieve that by reserving all the custom border colors we support
545*61046927SAndroid Build Coastguard Worker     * right off the bat, so they are close to the base address.
546*61046927SAndroid Build Coastguard Worker     */
547*61046927SAndroid Build Coastguard Worker    result = anv_state_reserved_array_pool_init(&device->custom_border_colors,
548*61046927SAndroid Build Coastguard Worker                                                &device->dynamic_state_pool,
549*61046927SAndroid Build Coastguard Worker                                                MAX_CUSTOM_BORDER_COLORS,
550*61046927SAndroid Build Coastguard Worker                                                sizeof(struct gfx8_border_color), 64);
551*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
552*61046927SAndroid Build Coastguard Worker       goto fail_dynamic_state_pool;
553*61046927SAndroid Build Coastguard Worker 
554*61046927SAndroid Build Coastguard Worker    result = anv_state_pool_init(&device->instruction_state_pool, device,
555*61046927SAndroid Build Coastguard Worker                                 &(struct anv_state_pool_params) {
556*61046927SAndroid Build Coastguard Worker                                    .name         = "instruction pool",
557*61046927SAndroid Build Coastguard Worker                                    .base_address = device->physical->va.instruction_state_pool.addr,
558*61046927SAndroid Build Coastguard Worker                                    .block_size   = 16384,
559*61046927SAndroid Build Coastguard Worker                                    .max_size     = device->physical->va.instruction_state_pool.size,
560*61046927SAndroid Build Coastguard Worker                                 });
561*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
562*61046927SAndroid Build Coastguard Worker       goto fail_custom_border_color_pool;
563*61046927SAndroid Build Coastguard Worker 
564*61046927SAndroid Build Coastguard Worker    if (device->info->verx10 >= 125) {
565*61046927SAndroid Build Coastguard Worker       /* Put the scratch surface states at the beginning of the internal
566*61046927SAndroid Build Coastguard Worker        * surface state pool.
567*61046927SAndroid Build Coastguard Worker        */
568*61046927SAndroid Build Coastguard Worker       result = anv_state_pool_init(&device->scratch_surface_state_pool, device,
569*61046927SAndroid Build Coastguard Worker                                    &(struct anv_state_pool_params) {
570*61046927SAndroid Build Coastguard Worker                                       .name         = "scratch surface state pool",
571*61046927SAndroid Build Coastguard Worker                                       .base_address = device->physical->va.scratch_surface_state_pool.addr,
572*61046927SAndroid Build Coastguard Worker                                       .block_size   = 4096,
573*61046927SAndroid Build Coastguard Worker                                       .max_size     = device->physical->va.scratch_surface_state_pool.size,
574*61046927SAndroid Build Coastguard Worker                                    });
575*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
576*61046927SAndroid Build Coastguard Worker          goto fail_instruction_state_pool;
577*61046927SAndroid Build Coastguard Worker 
578*61046927SAndroid Build Coastguard Worker       result = anv_state_pool_init(&device->internal_surface_state_pool, device,
579*61046927SAndroid Build Coastguard Worker                                    &(struct anv_state_pool_params) {
580*61046927SAndroid Build Coastguard Worker                                       .name         = "internal surface state pool",
581*61046927SAndroid Build Coastguard Worker                                       .base_address = device->physical->va.internal_surface_state_pool.addr,
582*61046927SAndroid Build Coastguard Worker                                       .start_offset = device->physical->va.scratch_surface_state_pool.size,
583*61046927SAndroid Build Coastguard Worker                                       .block_size   = 4096,
584*61046927SAndroid Build Coastguard Worker                                       .max_size     = device->physical->va.internal_surface_state_pool.size,
585*61046927SAndroid Build Coastguard Worker                                    });
586*61046927SAndroid Build Coastguard Worker    } else {
587*61046927SAndroid Build Coastguard Worker       result = anv_state_pool_init(&device->internal_surface_state_pool, device,
588*61046927SAndroid Build Coastguard Worker                                    &(struct anv_state_pool_params) {
589*61046927SAndroid Build Coastguard Worker                                       .name         = "internal surface state pool",
590*61046927SAndroid Build Coastguard Worker                                       .base_address = device->physical->va.internal_surface_state_pool.addr,
591*61046927SAndroid Build Coastguard Worker                                       .block_size   = 4096,
592*61046927SAndroid Build Coastguard Worker                                       .max_size     = device->physical->va.internal_surface_state_pool.size,
593*61046927SAndroid Build Coastguard Worker                                    });
594*61046927SAndroid Build Coastguard Worker    }
595*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
596*61046927SAndroid Build Coastguard Worker       goto fail_scratch_surface_state_pool;
597*61046927SAndroid Build Coastguard Worker 
598*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors) {
599*61046927SAndroid Build Coastguard Worker       result = anv_state_pool_init(&device->bindless_surface_state_pool, device,
600*61046927SAndroid Build Coastguard Worker                                    &(struct anv_state_pool_params) {
601*61046927SAndroid Build Coastguard Worker                                       .name         = "bindless surface state pool",
602*61046927SAndroid Build Coastguard Worker                                       .base_address = device->physical->va.bindless_surface_state_pool.addr,
603*61046927SAndroid Build Coastguard Worker                                       .block_size   = 4096,
604*61046927SAndroid Build Coastguard Worker                                       .max_size     = device->physical->va.bindless_surface_state_pool.size,
605*61046927SAndroid Build Coastguard Worker                                    });
606*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
607*61046927SAndroid Build Coastguard Worker          goto fail_internal_surface_state_pool;
608*61046927SAndroid Build Coastguard Worker    }
609*61046927SAndroid Build Coastguard Worker 
610*61046927SAndroid Build Coastguard Worker    if (device->info->verx10 >= 125) {
611*61046927SAndroid Build Coastguard Worker       /* We're using 3DSTATE_BINDING_TABLE_POOL_ALLOC to give the binding
612*61046927SAndroid Build Coastguard Worker        * table its own base address separately from surface state base.
613*61046927SAndroid Build Coastguard Worker        */
614*61046927SAndroid Build Coastguard Worker       result = anv_state_pool_init(&device->binding_table_pool, device,
615*61046927SAndroid Build Coastguard Worker                                    &(struct anv_state_pool_params) {
616*61046927SAndroid Build Coastguard Worker                                       .name         = "binding table pool",
617*61046927SAndroid Build Coastguard Worker                                       .base_address = device->physical->va.binding_table_pool.addr,
618*61046927SAndroid Build Coastguard Worker                                       .block_size   = BINDING_TABLE_POOL_BLOCK_SIZE,
619*61046927SAndroid Build Coastguard Worker                                       .max_size     = device->physical->va.binding_table_pool.size,
620*61046927SAndroid Build Coastguard Worker                                    });
621*61046927SAndroid Build Coastguard Worker    } else {
622*61046927SAndroid Build Coastguard Worker       /* The binding table should be in front of the surface states in virtual
623*61046927SAndroid Build Coastguard Worker        * address space so that all surface states can be express as relative
624*61046927SAndroid Build Coastguard Worker        * offsets from the binding table location.
625*61046927SAndroid Build Coastguard Worker        */
626*61046927SAndroid Build Coastguard Worker       assert(device->physical->va.binding_table_pool.addr <
627*61046927SAndroid Build Coastguard Worker              device->physical->va.internal_surface_state_pool.addr);
628*61046927SAndroid Build Coastguard Worker       int64_t bt_pool_offset = (int64_t)device->physical->va.binding_table_pool.addr -
629*61046927SAndroid Build Coastguard Worker                                (int64_t)device->physical->va.internal_surface_state_pool.addr;
630*61046927SAndroid Build Coastguard Worker       assert(INT32_MIN < bt_pool_offset && bt_pool_offset < 0);
631*61046927SAndroid Build Coastguard Worker       result = anv_state_pool_init(&device->binding_table_pool, device,
632*61046927SAndroid Build Coastguard Worker                                    &(struct anv_state_pool_params) {
633*61046927SAndroid Build Coastguard Worker                                       .name         = "binding table pool",
634*61046927SAndroid Build Coastguard Worker                                       .base_address = device->physical->va.internal_surface_state_pool.addr,
635*61046927SAndroid Build Coastguard Worker                                       .start_offset = bt_pool_offset,
636*61046927SAndroid Build Coastguard Worker                                       .block_size   = BINDING_TABLE_POOL_BLOCK_SIZE,
637*61046927SAndroid Build Coastguard Worker                                       .max_size     = device->physical->va.internal_surface_state_pool.size,
638*61046927SAndroid Build Coastguard Worker                                    });
639*61046927SAndroid Build Coastguard Worker    }
640*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
641*61046927SAndroid Build Coastguard Worker       goto fail_bindless_surface_state_pool;
642*61046927SAndroid Build Coastguard Worker 
643*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors) {
644*61046927SAndroid Build Coastguard Worker       result = anv_state_pool_init(&device->indirect_push_descriptor_pool, device,
645*61046927SAndroid Build Coastguard Worker                                    &(struct anv_state_pool_params) {
646*61046927SAndroid Build Coastguard Worker                                       .name         = "indirect push descriptor pool",
647*61046927SAndroid Build Coastguard Worker                                       .base_address = device->physical->va.indirect_push_descriptor_pool.addr,
648*61046927SAndroid Build Coastguard Worker                                       .block_size   = 4096,
649*61046927SAndroid Build Coastguard Worker                                       .max_size     = device->physical->va.indirect_push_descriptor_pool.size,
650*61046927SAndroid Build Coastguard Worker                                    });
651*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
652*61046927SAndroid Build Coastguard Worker          goto fail_binding_table_pool;
653*61046927SAndroid Build Coastguard Worker    }
654*61046927SAndroid Build Coastguard Worker 
655*61046927SAndroid Build Coastguard Worker    if (device->vk.enabled_extensions.EXT_descriptor_buffer &&
656*61046927SAndroid Build Coastguard Worker        device->info->verx10 >= 125) {
657*61046927SAndroid Build Coastguard Worker       /* On Gfx12.5+ because of the bindless stages (Mesh, Task, RT), the only
658*61046927SAndroid Build Coastguard Worker        * way we can wire push descriptors is through the bindless heap. This
659*61046927SAndroid Build Coastguard Worker        * state pool is a 1Gb carve out of the 4Gb HW heap.
660*61046927SAndroid Build Coastguard Worker        */
661*61046927SAndroid Build Coastguard Worker       result = anv_state_pool_init(&device->push_descriptor_buffer_pool, device,
662*61046927SAndroid Build Coastguard Worker                                    &(struct anv_state_pool_params) {
663*61046927SAndroid Build Coastguard Worker                                       .name         = "push descriptor buffer state pool",
664*61046927SAndroid Build Coastguard Worker                                       .base_address = device->physical->va.push_descriptor_buffer_pool.addr,
665*61046927SAndroid Build Coastguard Worker                                       .block_size   = 4096,
666*61046927SAndroid Build Coastguard Worker                                       .max_size     = device->physical->va.push_descriptor_buffer_pool.size,
667*61046927SAndroid Build Coastguard Worker                                    });
668*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
669*61046927SAndroid Build Coastguard Worker          goto fail_indirect_push_descriptor_pool;
670*61046927SAndroid Build Coastguard Worker    }
671*61046927SAndroid Build Coastguard Worker 
672*61046927SAndroid Build Coastguard Worker    if (device->info->has_aux_map) {
673*61046927SAndroid Build Coastguard Worker       result = anv_state_pool_init(&device->aux_tt_pool, device,
674*61046927SAndroid Build Coastguard Worker                                    &(struct anv_state_pool_params) {
675*61046927SAndroid Build Coastguard Worker                                       .name         = "aux-tt pool",
676*61046927SAndroid Build Coastguard Worker                                       .base_address = device->physical->va.aux_tt_pool.addr,
677*61046927SAndroid Build Coastguard Worker                                       .block_size   = 16384,
678*61046927SAndroid Build Coastguard Worker                                       .max_size     = device->physical->va.aux_tt_pool.size,
679*61046927SAndroid Build Coastguard Worker                                    });
680*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
681*61046927SAndroid Build Coastguard Worker          goto fail_push_descriptor_buffer_pool;
682*61046927SAndroid Build Coastguard Worker 
683*61046927SAndroid Build Coastguard Worker       device->aux_map_ctx = intel_aux_map_init(device, &aux_map_allocator,
684*61046927SAndroid Build Coastguard Worker                                                &physical_device->info);
685*61046927SAndroid Build Coastguard Worker       if (!device->aux_map_ctx)
686*61046927SAndroid Build Coastguard Worker          goto fail_aux_tt_pool;
687*61046927SAndroid Build Coastguard Worker    }
688*61046927SAndroid Build Coastguard Worker 
689*61046927SAndroid Build Coastguard Worker    result = anv_device_alloc_bo(device, "workaround", 8192,
690*61046927SAndroid Build Coastguard Worker                                 ANV_BO_ALLOC_CAPTURE |
691*61046927SAndroid Build Coastguard Worker                                 ANV_BO_ALLOC_HOST_COHERENT |
692*61046927SAndroid Build Coastguard Worker                                 ANV_BO_ALLOC_MAPPED |
693*61046927SAndroid Build Coastguard Worker                                 ANV_BO_ALLOC_INTERNAL,
694*61046927SAndroid Build Coastguard Worker                                 0 /* explicit_address */,
695*61046927SAndroid Build Coastguard Worker                                 &device->workaround_bo);
696*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
697*61046927SAndroid Build Coastguard Worker       goto fail_surface_aux_map_pool;
698*61046927SAndroid Build Coastguard Worker 
699*61046927SAndroid Build Coastguard Worker    if (intel_needs_workaround(device->info, 14019708328)) {
700*61046927SAndroid Build Coastguard Worker       result = anv_device_alloc_bo(device, "dummy_aux", 4096,
701*61046927SAndroid Build Coastguard Worker                                    0 /* alloc_flags */,
702*61046927SAndroid Build Coastguard Worker                                    0 /* explicit_address */,
703*61046927SAndroid Build Coastguard Worker                                    &device->dummy_aux_bo);
704*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
705*61046927SAndroid Build Coastguard Worker          goto fail_workaround_bo;
706*61046927SAndroid Build Coastguard Worker 
707*61046927SAndroid Build Coastguard Worker       device->isl_dev.dummy_aux_address = device->dummy_aux_bo->offset;
708*61046927SAndroid Build Coastguard Worker    }
709*61046927SAndroid Build Coastguard Worker 
710*61046927SAndroid Build Coastguard Worker    struct anv_address wa_addr = (struct anv_address) {
711*61046927SAndroid Build Coastguard Worker       .bo = device->workaround_bo,
712*61046927SAndroid Build Coastguard Worker    };
713*61046927SAndroid Build Coastguard Worker 
714*61046927SAndroid Build Coastguard Worker    wa_addr = anv_address_add_aligned(wa_addr,
715*61046927SAndroid Build Coastguard Worker                                      intel_debug_write_identifiers(
716*61046927SAndroid Build Coastguard Worker                                         device->workaround_bo->map,
717*61046927SAndroid Build Coastguard Worker                                         device->workaround_bo->size,
718*61046927SAndroid Build Coastguard Worker                                         "Anv"), 32);
719*61046927SAndroid Build Coastguard Worker 
720*61046927SAndroid Build Coastguard Worker    device->rt_uuid_addr = wa_addr;
721*61046927SAndroid Build Coastguard Worker    memcpy(device->rt_uuid_addr.bo->map + device->rt_uuid_addr.offset,
722*61046927SAndroid Build Coastguard Worker           physical_device->rt_uuid,
723*61046927SAndroid Build Coastguard Worker           sizeof(physical_device->rt_uuid));
724*61046927SAndroid Build Coastguard Worker 
725*61046927SAndroid Build Coastguard Worker    /* Make sure the workaround address is the last one in the workaround BO,
726*61046927SAndroid Build Coastguard Worker     * so that writes never overwrite other bits of data stored in the
727*61046927SAndroid Build Coastguard Worker     * workaround BO.
728*61046927SAndroid Build Coastguard Worker     */
729*61046927SAndroid Build Coastguard Worker    wa_addr = anv_address_add_aligned(wa_addr,
730*61046927SAndroid Build Coastguard Worker                                      sizeof(physical_device->rt_uuid), 64);
731*61046927SAndroid Build Coastguard Worker    device->workaround_address = wa_addr;
732*61046927SAndroid Build Coastguard Worker 
733*61046927SAndroid Build Coastguard Worker    /* Make sure we don't over the allocated BO. */
734*61046927SAndroid Build Coastguard Worker    assert(device->workaround_address.offset < device->workaround_bo->size);
735*61046927SAndroid Build Coastguard Worker    /* We also need 64B (maximum GRF size) from the workaround address (see
736*61046927SAndroid Build Coastguard Worker     * TBIMR workaround)
737*61046927SAndroid Build Coastguard Worker     */
738*61046927SAndroid Build Coastguard Worker    assert((device->workaround_bo->size -
739*61046927SAndroid Build Coastguard Worker            device->workaround_address.offset) >= 64);
740*61046927SAndroid Build Coastguard Worker 
741*61046927SAndroid Build Coastguard Worker    device->workarounds.doom64_images = NULL;
742*61046927SAndroid Build Coastguard Worker 
743*61046927SAndroid Build Coastguard Worker 
744*61046927SAndroid Build Coastguard Worker    device->debug_frame_desc =
745*61046927SAndroid Build Coastguard Worker       intel_debug_get_identifier_block(device->workaround_bo->map,
746*61046927SAndroid Build Coastguard Worker                                        device->workaround_bo->size,
747*61046927SAndroid Build Coastguard Worker                                        INTEL_DEBUG_BLOCK_TYPE_FRAME);
748*61046927SAndroid Build Coastguard Worker 
749*61046927SAndroid Build Coastguard Worker    if (device->vk.enabled_extensions.KHR_ray_query) {
750*61046927SAndroid Build Coastguard Worker       uint32_t ray_queries_size =
751*61046927SAndroid Build Coastguard Worker          align(brw_rt_ray_queries_hw_stacks_size(device->info), 4096);
752*61046927SAndroid Build Coastguard Worker 
753*61046927SAndroid Build Coastguard Worker       result = anv_device_alloc_bo(device, "ray queries",
754*61046927SAndroid Build Coastguard Worker                                    ray_queries_size,
755*61046927SAndroid Build Coastguard Worker                                    ANV_BO_ALLOC_INTERNAL,
756*61046927SAndroid Build Coastguard Worker                                    0 /* explicit_address */,
757*61046927SAndroid Build Coastguard Worker                                    &device->ray_query_bo);
758*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
759*61046927SAndroid Build Coastguard Worker          goto fail_dummy_aux_bo;
760*61046927SAndroid Build Coastguard Worker    }
761*61046927SAndroid Build Coastguard Worker 
762*61046927SAndroid Build Coastguard Worker    result = anv_device_init_trivial_batch(device);
763*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
764*61046927SAndroid Build Coastguard Worker       goto fail_ray_query_bo;
765*61046927SAndroid Build Coastguard Worker 
766*61046927SAndroid Build Coastguard Worker    /* Emit the CPS states before running the initialization batch as those
767*61046927SAndroid Build Coastguard Worker     * structures are referenced.
768*61046927SAndroid Build Coastguard Worker     */
769*61046927SAndroid Build Coastguard Worker    if (device->info->ver >= 12) {
770*61046927SAndroid Build Coastguard Worker       uint32_t n_cps_states = 3 * 3; /* All combinaisons of X by Y CP sizes (1, 2, 4) */
771*61046927SAndroid Build Coastguard Worker 
772*61046927SAndroid Build Coastguard Worker       if (device->info->has_coarse_pixel_primitive_and_cb)
773*61046927SAndroid Build Coastguard Worker          n_cps_states *= 5 * 5; /* 5 combiners by 2 operators */
774*61046927SAndroid Build Coastguard Worker 
775*61046927SAndroid Build Coastguard Worker       n_cps_states += 1; /* Disable CPS */
776*61046927SAndroid Build Coastguard Worker 
777*61046927SAndroid Build Coastguard Worker        /* Each of the combinaison must be replicated on all viewports */
778*61046927SAndroid Build Coastguard Worker       n_cps_states *= MAX_VIEWPORTS;
779*61046927SAndroid Build Coastguard Worker 
780*61046927SAndroid Build Coastguard Worker       device->cps_states =
781*61046927SAndroid Build Coastguard Worker          anv_state_pool_alloc(&device->dynamic_state_pool,
782*61046927SAndroid Build Coastguard Worker                               n_cps_states * CPS_STATE_length(device->info) * 4,
783*61046927SAndroid Build Coastguard Worker                               32);
784*61046927SAndroid Build Coastguard Worker       if (device->cps_states.map == NULL)
785*61046927SAndroid Build Coastguard Worker          goto fail_trivial_batch;
786*61046927SAndroid Build Coastguard Worker 
787*61046927SAndroid Build Coastguard Worker       anv_genX(device->info, init_cps_device_state)(device);
788*61046927SAndroid Build Coastguard Worker    }
789*61046927SAndroid Build Coastguard Worker 
790*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors) {
791*61046927SAndroid Build Coastguard Worker       /* Allocate a null surface state at surface state offset 0. This makes
792*61046927SAndroid Build Coastguard Worker        * NULL descriptor handling trivial because we can just memset
793*61046927SAndroid Build Coastguard Worker        * structures to zero and they have a valid descriptor.
794*61046927SAndroid Build Coastguard Worker        */
795*61046927SAndroid Build Coastguard Worker       device->null_surface_state =
796*61046927SAndroid Build Coastguard Worker          anv_state_pool_alloc(&device->bindless_surface_state_pool,
797*61046927SAndroid Build Coastguard Worker                               device->isl_dev.ss.size,
798*61046927SAndroid Build Coastguard Worker                               device->isl_dev.ss.align);
799*61046927SAndroid Build Coastguard Worker       isl_null_fill_state(&device->isl_dev, device->null_surface_state.map,
800*61046927SAndroid Build Coastguard Worker                           .size = isl_extent3d(1, 1, 1) /* This shouldn't matter */);
801*61046927SAndroid Build Coastguard Worker       assert(device->null_surface_state.offset == 0);
802*61046927SAndroid Build Coastguard Worker    } else {
803*61046927SAndroid Build Coastguard Worker       /* When using direct descriptors, those can hold the null surface state
804*61046927SAndroid Build Coastguard Worker        * directly. We still need a null surface for the binding table entries
805*61046927SAndroid Build Coastguard Worker        * though but this one can live anywhere the internal surface state
806*61046927SAndroid Build Coastguard Worker        * pool.
807*61046927SAndroid Build Coastguard Worker        */
808*61046927SAndroid Build Coastguard Worker       device->null_surface_state =
809*61046927SAndroid Build Coastguard Worker          anv_state_pool_alloc(&device->internal_surface_state_pool,
810*61046927SAndroid Build Coastguard Worker                               device->isl_dev.ss.size,
811*61046927SAndroid Build Coastguard Worker                               device->isl_dev.ss.align);
812*61046927SAndroid Build Coastguard Worker       isl_null_fill_state(&device->isl_dev, device->null_surface_state.map,
813*61046927SAndroid Build Coastguard Worker                           .size = isl_extent3d(1, 1, 1) /* This shouldn't matter */);
814*61046927SAndroid Build Coastguard Worker    }
815*61046927SAndroid Build Coastguard Worker 
816*61046927SAndroid Build Coastguard Worker    isl_null_fill_state(&device->isl_dev, &device->host_null_surface_state,
817*61046927SAndroid Build Coastguard Worker                        .size = isl_extent3d(1, 1, 1) /* This shouldn't matter */);
818*61046927SAndroid Build Coastguard Worker 
819*61046927SAndroid Build Coastguard Worker    anv_scratch_pool_init(device, &device->scratch_pool, false);
820*61046927SAndroid Build Coastguard Worker    anv_scratch_pool_init(device, &device->protected_scratch_pool, true);
821*61046927SAndroid Build Coastguard Worker 
822*61046927SAndroid Build Coastguard Worker    /* TODO(RT): Do we want some sort of data structure for this? */
823*61046927SAndroid Build Coastguard Worker    memset(device->rt_scratch_bos, 0, sizeof(device->rt_scratch_bos));
824*61046927SAndroid Build Coastguard Worker 
825*61046927SAndroid Build Coastguard Worker    if (ANV_SUPPORT_RT && device->info->has_ray_tracing) {
826*61046927SAndroid Build Coastguard Worker       /* The docs say to always allocate 128KB per DSS */
827*61046927SAndroid Build Coastguard Worker       const uint32_t btd_fifo_bo_size =
828*61046927SAndroid Build Coastguard Worker          128 * 1024 * intel_device_info_dual_subslice_id_bound(device->info);
829*61046927SAndroid Build Coastguard Worker       result = anv_device_alloc_bo(device,
830*61046927SAndroid Build Coastguard Worker                                    "rt-btd-fifo",
831*61046927SAndroid Build Coastguard Worker                                    btd_fifo_bo_size,
832*61046927SAndroid Build Coastguard Worker                                    ANV_BO_ALLOC_INTERNAL,
833*61046927SAndroid Build Coastguard Worker                                    0 /* explicit_address */,
834*61046927SAndroid Build Coastguard Worker                                    &device->btd_fifo_bo);
835*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
836*61046927SAndroid Build Coastguard Worker          goto fail_trivial_batch_bo_and_scratch_pool;
837*61046927SAndroid Build Coastguard Worker    }
838*61046927SAndroid Build Coastguard Worker 
839*61046927SAndroid Build Coastguard Worker    struct vk_pipeline_cache_create_info pcc_info = { .weak_ref = true, };
840*61046927SAndroid Build Coastguard Worker    device->vk.mem_cache =
841*61046927SAndroid Build Coastguard Worker       vk_pipeline_cache_create(&device->vk, &pcc_info, NULL);
842*61046927SAndroid Build Coastguard Worker    if (!device->vk.mem_cache) {
843*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
844*61046927SAndroid Build Coastguard Worker       goto fail_btd_fifo_bo;
845*61046927SAndroid Build Coastguard Worker    }
846*61046927SAndroid Build Coastguard Worker 
847*61046927SAndroid Build Coastguard Worker    /* Internal shaders need their own pipeline cache because, unlike the rest
848*61046927SAndroid Build Coastguard Worker     * of ANV, it won't work at all without the cache. It depends on it for
849*61046927SAndroid Build Coastguard Worker     * shaders to remain resident while it runs. Therefore, we need a special
850*61046927SAndroid Build Coastguard Worker     * cache just for BLORP/RT that's forced to always be enabled.
851*61046927SAndroid Build Coastguard Worker     */
852*61046927SAndroid Build Coastguard Worker    struct vk_pipeline_cache_create_info internal_pcc_info = {
853*61046927SAndroid Build Coastguard Worker       .force_enable = true,
854*61046927SAndroid Build Coastguard Worker       .weak_ref = false,
855*61046927SAndroid Build Coastguard Worker    };
856*61046927SAndroid Build Coastguard Worker    device->internal_cache =
857*61046927SAndroid Build Coastguard Worker       vk_pipeline_cache_create(&device->vk, &internal_pcc_info, NULL);
858*61046927SAndroid Build Coastguard Worker    if (device->internal_cache == NULL) {
859*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
860*61046927SAndroid Build Coastguard Worker       goto fail_default_pipeline_cache;
861*61046927SAndroid Build Coastguard Worker    }
862*61046927SAndroid Build Coastguard Worker 
863*61046927SAndroid Build Coastguard Worker    /* The device (currently is ICL/TGL) does not have float64 support. */
864*61046927SAndroid Build Coastguard Worker    if (!device->info->has_64bit_float &&
865*61046927SAndroid Build Coastguard Worker       device->physical->instance->fp64_workaround_enabled)
866*61046927SAndroid Build Coastguard Worker       anv_load_fp64_shader(device);
867*61046927SAndroid Build Coastguard Worker 
868*61046927SAndroid Build Coastguard Worker    if (INTEL_DEBUG(DEBUG_SHADER_PRINT)) {
869*61046927SAndroid Build Coastguard Worker       result = anv_device_print_init(device);
870*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
871*61046927SAndroid Build Coastguard Worker          goto fail_internal_cache;
872*61046927SAndroid Build Coastguard Worker    }
873*61046927SAndroid Build Coastguard Worker 
874*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
875*61046927SAndroid Build Coastguard Worker    device->u_gralloc = u_gralloc_create(U_GRALLOC_TYPE_AUTO);
876*61046927SAndroid Build Coastguard Worker #endif
877*61046927SAndroid Build Coastguard Worker 
878*61046927SAndroid Build Coastguard Worker    device->robust_buffer_access =
879*61046927SAndroid Build Coastguard Worker       device->vk.enabled_features.robustBufferAccess ||
880*61046927SAndroid Build Coastguard Worker       device->vk.enabled_features.nullDescriptor;
881*61046927SAndroid Build Coastguard Worker 
882*61046927SAndroid Build Coastguard Worker    device->breakpoint = anv_state_pool_alloc(&device->dynamic_state_pool, 4,
883*61046927SAndroid Build Coastguard Worker                                              4);
884*61046927SAndroid Build Coastguard Worker    p_atomic_set(&device->draw_call_count, 0);
885*61046927SAndroid Build Coastguard Worker 
886*61046927SAndroid Build Coastguard Worker    /* Create a separate command pool for companion RCS command buffer. */
887*61046927SAndroid Build Coastguard Worker    if (device->info->verx10 >= 125) {
888*61046927SAndroid Build Coastguard Worker       VkCommandPoolCreateInfo pool_info = {
889*61046927SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
890*61046927SAndroid Build Coastguard Worker          .queueFamilyIndex =
891*61046927SAndroid Build Coastguard Worker              anv_get_first_render_queue_index(device->physical),
892*61046927SAndroid Build Coastguard Worker       };
893*61046927SAndroid Build Coastguard Worker 
894*61046927SAndroid Build Coastguard Worker       result = vk_common_CreateCommandPool(anv_device_to_handle(device),
895*61046927SAndroid Build Coastguard Worker                                            &pool_info, NULL,
896*61046927SAndroid Build Coastguard Worker                                            &device->companion_rcs_cmd_pool);
897*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS) {
898*61046927SAndroid Build Coastguard Worker          goto fail_print;
899*61046927SAndroid Build Coastguard Worker       }
900*61046927SAndroid Build Coastguard Worker    }
901*61046927SAndroid Build Coastguard Worker 
902*61046927SAndroid Build Coastguard Worker    result = anv_device_init_trtt(device);
903*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
904*61046927SAndroid Build Coastguard Worker       goto fail_companion_cmd_pool;
905*61046927SAndroid Build Coastguard Worker 
906*61046927SAndroid Build Coastguard Worker    result = anv_device_init_rt_shaders(device);
907*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS) {
908*61046927SAndroid Build Coastguard Worker       result = vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
909*61046927SAndroid Build Coastguard Worker       goto fail_trtt;
910*61046927SAndroid Build Coastguard Worker    }
911*61046927SAndroid Build Coastguard Worker 
912*61046927SAndroid Build Coastguard Worker    anv_device_init_blorp(device);
913*61046927SAndroid Build Coastguard Worker 
914*61046927SAndroid Build Coastguard Worker    anv_device_init_border_colors(device);
915*61046927SAndroid Build Coastguard Worker 
916*61046927SAndroid Build Coastguard Worker    anv_device_init_internal_kernels(device);
917*61046927SAndroid Build Coastguard Worker 
918*61046927SAndroid Build Coastguard Worker    anv_device_init_astc_emu(device);
919*61046927SAndroid Build Coastguard Worker 
920*61046927SAndroid Build Coastguard Worker    anv_device_perf_init(device);
921*61046927SAndroid Build Coastguard Worker 
922*61046927SAndroid Build Coastguard Worker    anv_device_init_embedded_samplers(device);
923*61046927SAndroid Build Coastguard Worker 
924*61046927SAndroid Build Coastguard Worker    BITSET_ONES(device->gfx_dirty_state);
925*61046927SAndroid Build Coastguard Worker    BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_INDEX_BUFFER);
926*61046927SAndroid Build Coastguard Worker    BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_SO_DECL_LIST);
927*61046927SAndroid Build Coastguard Worker    if (device->info->ver < 11)
928*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_VF_SGVS_2);
929*61046927SAndroid Build Coastguard Worker    if (device->info->ver < 12) {
930*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_PRIMITIVE_REPLICATION);
931*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_DEPTH_BOUNDS);
932*61046927SAndroid Build Coastguard Worker    }
933*61046927SAndroid Build Coastguard Worker    if (!device->vk.enabled_extensions.EXT_sample_locations)
934*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_SAMPLE_PATTERN);
935*61046927SAndroid Build Coastguard Worker    if (!device->vk.enabled_extensions.KHR_fragment_shading_rate)
936*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_CPS);
937*61046927SAndroid Build Coastguard Worker    if (!device->vk.enabled_extensions.EXT_mesh_shader) {
938*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_SBE_MESH);
939*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_CLIP_MESH);
940*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_MESH_CONTROL);
941*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_MESH_SHADER);
942*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_MESH_DISTRIB);
943*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_TASK_CONTROL);
944*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_TASK_SHADER);
945*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_TASK_REDISTRIB);
946*61046927SAndroid Build Coastguard Worker    }
947*61046927SAndroid Build Coastguard Worker    if (!intel_needs_workaround(device->info, 18019816803))
948*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_WA_18019816803);
949*61046927SAndroid Build Coastguard Worker    if (!intel_needs_workaround(device->info, 14018283232))
950*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_WA_14018283232);
951*61046927SAndroid Build Coastguard Worker    if (device->info->ver > 9)
952*61046927SAndroid Build Coastguard Worker       BITSET_CLEAR(device->gfx_dirty_state, ANV_GFX_STATE_PMA_FIX);
953*61046927SAndroid Build Coastguard Worker 
954*61046927SAndroid Build Coastguard Worker    device->queue_count = 0;
955*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) {
956*61046927SAndroid Build Coastguard Worker       const VkDeviceQueueCreateInfo *queueCreateInfo =
957*61046927SAndroid Build Coastguard Worker          &pCreateInfo->pQueueCreateInfos[i];
958*61046927SAndroid Build Coastguard Worker 
959*61046927SAndroid Build Coastguard Worker       for (uint32_t j = 0; j < queueCreateInfo->queueCount; j++) {
960*61046927SAndroid Build Coastguard Worker          result = anv_queue_init(device, &device->queues[device->queue_count],
961*61046927SAndroid Build Coastguard Worker                                  queueCreateInfo, j);
962*61046927SAndroid Build Coastguard Worker          if (result != VK_SUCCESS)
963*61046927SAndroid Build Coastguard Worker             goto fail_queues;
964*61046927SAndroid Build Coastguard Worker 
965*61046927SAndroid Build Coastguard Worker          device->queue_count++;
966*61046927SAndroid Build Coastguard Worker       }
967*61046927SAndroid Build Coastguard Worker    }
968*61046927SAndroid Build Coastguard Worker 
969*61046927SAndroid Build Coastguard Worker    anv_device_utrace_init(device);
970*61046927SAndroid Build Coastguard Worker 
971*61046927SAndroid Build Coastguard Worker    result = anv_genX(device->info, init_device_state)(device);
972*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
973*61046927SAndroid Build Coastguard Worker       goto fail_utrace;
974*61046927SAndroid Build Coastguard Worker 
975*61046927SAndroid Build Coastguard Worker    *pDevice = anv_device_to_handle(device);
976*61046927SAndroid Build Coastguard Worker 
977*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
978*61046927SAndroid Build Coastguard Worker 
979*61046927SAndroid Build Coastguard Worker  fail_utrace:
980*61046927SAndroid Build Coastguard Worker    anv_device_utrace_finish(device);
981*61046927SAndroid Build Coastguard Worker  fail_queues:
982*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < device->queue_count; i++)
983*61046927SAndroid Build Coastguard Worker       anv_queue_finish(&device->queues[i]);
984*61046927SAndroid Build Coastguard Worker    anv_device_finish_embedded_samplers(device);
985*61046927SAndroid Build Coastguard Worker    anv_device_finish_blorp(device);
986*61046927SAndroid Build Coastguard Worker    anv_device_finish_astc_emu(device);
987*61046927SAndroid Build Coastguard Worker    anv_device_finish_internal_kernels(device);
988*61046927SAndroid Build Coastguard Worker    anv_device_finish_rt_shaders(device);
989*61046927SAndroid Build Coastguard Worker  fail_trtt:
990*61046927SAndroid Build Coastguard Worker    anv_device_finish_trtt(device);
991*61046927SAndroid Build Coastguard Worker  fail_companion_cmd_pool:
992*61046927SAndroid Build Coastguard Worker    if (device->info->verx10 >= 125) {
993*61046927SAndroid Build Coastguard Worker       vk_common_DestroyCommandPool(anv_device_to_handle(device),
994*61046927SAndroid Build Coastguard Worker                                    device->companion_rcs_cmd_pool, NULL);
995*61046927SAndroid Build Coastguard Worker    }
996*61046927SAndroid Build Coastguard Worker  fail_print:
997*61046927SAndroid Build Coastguard Worker    if (INTEL_DEBUG(DEBUG_SHADER_PRINT))
998*61046927SAndroid Build Coastguard Worker       anv_device_print_fini(device);
999*61046927SAndroid Build Coastguard Worker  fail_internal_cache:
1000*61046927SAndroid Build Coastguard Worker    vk_pipeline_cache_destroy(device->internal_cache, NULL);
1001*61046927SAndroid Build Coastguard Worker  fail_default_pipeline_cache:
1002*61046927SAndroid Build Coastguard Worker    vk_pipeline_cache_destroy(device->vk.mem_cache, NULL);
1003*61046927SAndroid Build Coastguard Worker  fail_btd_fifo_bo:
1004*61046927SAndroid Build Coastguard Worker    if (ANV_SUPPORT_RT && device->info->has_ray_tracing)
1005*61046927SAndroid Build Coastguard Worker       anv_device_release_bo(device, device->btd_fifo_bo);
1006*61046927SAndroid Build Coastguard Worker  fail_trivial_batch_bo_and_scratch_pool:
1007*61046927SAndroid Build Coastguard Worker    anv_scratch_pool_finish(device, &device->scratch_pool);
1008*61046927SAndroid Build Coastguard Worker    anv_scratch_pool_finish(device, &device->protected_scratch_pool);
1009*61046927SAndroid Build Coastguard Worker  fail_trivial_batch:
1010*61046927SAndroid Build Coastguard Worker    anv_device_release_bo(device, device->trivial_batch_bo);
1011*61046927SAndroid Build Coastguard Worker  fail_ray_query_bo:
1012*61046927SAndroid Build Coastguard Worker    if (device->ray_query_bo)
1013*61046927SAndroid Build Coastguard Worker       anv_device_release_bo(device, device->ray_query_bo);
1014*61046927SAndroid Build Coastguard Worker  fail_dummy_aux_bo:
1015*61046927SAndroid Build Coastguard Worker    if (device->dummy_aux_bo)
1016*61046927SAndroid Build Coastguard Worker       anv_device_release_bo(device, device->dummy_aux_bo);
1017*61046927SAndroid Build Coastguard Worker  fail_workaround_bo:
1018*61046927SAndroid Build Coastguard Worker    anv_device_release_bo(device, device->workaround_bo);
1019*61046927SAndroid Build Coastguard Worker  fail_surface_aux_map_pool:
1020*61046927SAndroid Build Coastguard Worker    if (device->info->has_aux_map) {
1021*61046927SAndroid Build Coastguard Worker       intel_aux_map_finish(device->aux_map_ctx);
1022*61046927SAndroid Build Coastguard Worker       device->aux_map_ctx = NULL;
1023*61046927SAndroid Build Coastguard Worker    }
1024*61046927SAndroid Build Coastguard Worker  fail_aux_tt_pool:
1025*61046927SAndroid Build Coastguard Worker    if (device->info->has_aux_map)
1026*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->aux_tt_pool);
1027*61046927SAndroid Build Coastguard Worker  fail_push_descriptor_buffer_pool:
1028*61046927SAndroid Build Coastguard Worker    if (device->vk.enabled_extensions.EXT_descriptor_buffer &&
1029*61046927SAndroid Build Coastguard Worker        device->info->verx10 >= 125)
1030*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->push_descriptor_buffer_pool);
1031*61046927SAndroid Build Coastguard Worker  fail_indirect_push_descriptor_pool:
1032*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors)
1033*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->indirect_push_descriptor_pool);
1034*61046927SAndroid Build Coastguard Worker  fail_binding_table_pool:
1035*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->binding_table_pool);
1036*61046927SAndroid Build Coastguard Worker  fail_bindless_surface_state_pool:
1037*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors)
1038*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->bindless_surface_state_pool);
1039*61046927SAndroid Build Coastguard Worker  fail_internal_surface_state_pool:
1040*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->internal_surface_state_pool);
1041*61046927SAndroid Build Coastguard Worker  fail_scratch_surface_state_pool:
1042*61046927SAndroid Build Coastguard Worker    if (device->info->verx10 >= 125)
1043*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->scratch_surface_state_pool);
1044*61046927SAndroid Build Coastguard Worker  fail_instruction_state_pool:
1045*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->instruction_state_pool);
1046*61046927SAndroid Build Coastguard Worker  fail_custom_border_color_pool:
1047*61046927SAndroid Build Coastguard Worker    anv_state_reserved_array_pool_finish(&device->custom_border_colors);
1048*61046927SAndroid Build Coastguard Worker  fail_dynamic_state_pool:
1049*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->dynamic_state_pool);
1050*61046927SAndroid Build Coastguard Worker  fail_general_state_pool:
1051*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->general_state_pool);
1052*61046927SAndroid Build Coastguard Worker  fail_batch_bo_pool:
1053*61046927SAndroid Build Coastguard Worker    if (device->vk.enabled_extensions.KHR_acceleration_structure)
1054*61046927SAndroid Build Coastguard Worker       anv_bo_pool_finish(&device->bvh_bo_pool);
1055*61046927SAndroid Build Coastguard Worker    anv_bo_pool_finish(&device->batch_bo_pool);
1056*61046927SAndroid Build Coastguard Worker    anv_bo_cache_finish(&device->bo_cache);
1057*61046927SAndroid Build Coastguard Worker  fail_queue_cond:
1058*61046927SAndroid Build Coastguard Worker    pthread_cond_destroy(&device->queue_submit);
1059*61046927SAndroid Build Coastguard Worker  fail_mutex:
1060*61046927SAndroid Build Coastguard Worker    pthread_mutex_destroy(&device->mutex);
1061*61046927SAndroid Build Coastguard Worker  fail_vmas:
1062*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_trtt);
1063*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_dynamic_visible);
1064*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_desc);
1065*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_hi);
1066*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_lo);
1067*61046927SAndroid Build Coastguard Worker    pthread_mutex_destroy(&device->vma_mutex);
1068*61046927SAndroid Build Coastguard Worker  fail_queues_alloc:
1069*61046927SAndroid Build Coastguard Worker    vk_free(&device->vk.alloc, device->queues);
1070*61046927SAndroid Build Coastguard Worker  fail_context_id:
1071*61046927SAndroid Build Coastguard Worker    anv_device_destroy_context_or_vm(device);
1072*61046927SAndroid Build Coastguard Worker  fail_fd:
1073*61046927SAndroid Build Coastguard Worker    close(device->fd);
1074*61046927SAndroid Build Coastguard Worker  fail_device:
1075*61046927SAndroid Build Coastguard Worker    vk_device_finish(&device->vk);
1076*61046927SAndroid Build Coastguard Worker  fail_alloc:
1077*61046927SAndroid Build Coastguard Worker    vk_free(&device->vk.alloc, device);
1078*61046927SAndroid Build Coastguard Worker 
1079*61046927SAndroid Build Coastguard Worker    return result;
1080*61046927SAndroid Build Coastguard Worker }
1081*61046927SAndroid Build Coastguard Worker 
anv_DestroyDevice(VkDevice _device,const VkAllocationCallbacks * pAllocator)1082*61046927SAndroid Build Coastguard Worker void anv_DestroyDevice(
1083*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
1084*61046927SAndroid Build Coastguard Worker     const VkAllocationCallbacks*                pAllocator)
1085*61046927SAndroid Build Coastguard Worker {
1086*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1087*61046927SAndroid Build Coastguard Worker 
1088*61046927SAndroid Build Coastguard Worker    if (!device)
1089*61046927SAndroid Build Coastguard Worker       return;
1090*61046927SAndroid Build Coastguard Worker 
1091*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
1092*61046927SAndroid Build Coastguard Worker    u_gralloc_destroy(&device->u_gralloc);
1093*61046927SAndroid Build Coastguard Worker #endif
1094*61046927SAndroid Build Coastguard Worker 
1095*61046927SAndroid Build Coastguard Worker    anv_memory_trace_finish(device);
1096*61046927SAndroid Build Coastguard Worker 
1097*61046927SAndroid Build Coastguard Worker    struct anv_physical_device *pdevice = device->physical;
1098*61046927SAndroid Build Coastguard Worker 
1099*61046927SAndroid Build Coastguard Worker    /* Do TRTT batch garbage collection before destroying queues. */
1100*61046927SAndroid Build Coastguard Worker    anv_device_finish_trtt(device);
1101*61046927SAndroid Build Coastguard Worker 
1102*61046927SAndroid Build Coastguard Worker    anv_device_utrace_finish(device);
1103*61046927SAndroid Build Coastguard Worker 
1104*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < device->queue_count; i++)
1105*61046927SAndroid Build Coastguard Worker       anv_queue_finish(&device->queues[i]);
1106*61046927SAndroid Build Coastguard Worker    vk_free(&device->vk.alloc, device->queues);
1107*61046927SAndroid Build Coastguard Worker 
1108*61046927SAndroid Build Coastguard Worker    anv_device_finish_blorp(device);
1109*61046927SAndroid Build Coastguard Worker 
1110*61046927SAndroid Build Coastguard Worker    anv_device_finish_rt_shaders(device);
1111*61046927SAndroid Build Coastguard Worker 
1112*61046927SAndroid Build Coastguard Worker    anv_device_finish_astc_emu(device);
1113*61046927SAndroid Build Coastguard Worker 
1114*61046927SAndroid Build Coastguard Worker    anv_device_finish_internal_kernels(device);
1115*61046927SAndroid Build Coastguard Worker 
1116*61046927SAndroid Build Coastguard Worker    if (INTEL_DEBUG(DEBUG_SHADER_PRINT))
1117*61046927SAndroid Build Coastguard Worker       anv_device_print_fini(device);
1118*61046927SAndroid Build Coastguard Worker 
1119*61046927SAndroid Build Coastguard Worker    vk_pipeline_cache_destroy(device->internal_cache, NULL);
1120*61046927SAndroid Build Coastguard Worker    vk_pipeline_cache_destroy(device->vk.mem_cache, NULL);
1121*61046927SAndroid Build Coastguard Worker 
1122*61046927SAndroid Build Coastguard Worker    anv_device_finish_embedded_samplers(device);
1123*61046927SAndroid Build Coastguard Worker 
1124*61046927SAndroid Build Coastguard Worker    if (ANV_SUPPORT_RT && device->info->has_ray_tracing)
1125*61046927SAndroid Build Coastguard Worker       anv_device_release_bo(device, device->btd_fifo_bo);
1126*61046927SAndroid Build Coastguard Worker 
1127*61046927SAndroid Build Coastguard Worker    if (device->info->verx10 >= 125) {
1128*61046927SAndroid Build Coastguard Worker       vk_common_DestroyCommandPool(anv_device_to_handle(device),
1129*61046927SAndroid Build Coastguard Worker                                    device->companion_rcs_cmd_pool, NULL);
1130*61046927SAndroid Build Coastguard Worker    }
1131*61046927SAndroid Build Coastguard Worker 
1132*61046927SAndroid Build Coastguard Worker    anv_state_reserved_array_pool_finish(&device->custom_border_colors);
1133*61046927SAndroid Build Coastguard Worker #ifdef HAVE_VALGRIND
1134*61046927SAndroid Build Coastguard Worker    /* We only need to free these to prevent valgrind errors.  The backing
1135*61046927SAndroid Build Coastguard Worker     * BO will go away in a couple of lines so we don't actually leak.
1136*61046927SAndroid Build Coastguard Worker     */
1137*61046927SAndroid Build Coastguard Worker    anv_state_pool_free(&device->dynamic_state_pool, device->border_colors);
1138*61046927SAndroid Build Coastguard Worker    anv_state_pool_free(&device->dynamic_state_pool, device->slice_hash);
1139*61046927SAndroid Build Coastguard Worker    anv_state_pool_free(&device->dynamic_state_pool, device->cps_states);
1140*61046927SAndroid Build Coastguard Worker    anv_state_pool_free(&device->dynamic_state_pool, device->breakpoint);
1141*61046927SAndroid Build Coastguard Worker #endif
1142*61046927SAndroid Build Coastguard Worker 
1143*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(device->rt_scratch_bos); i++) {
1144*61046927SAndroid Build Coastguard Worker       if (device->rt_scratch_bos[i] != NULL)
1145*61046927SAndroid Build Coastguard Worker          anv_device_release_bo(device, device->rt_scratch_bos[i]);
1146*61046927SAndroid Build Coastguard Worker    }
1147*61046927SAndroid Build Coastguard Worker 
1148*61046927SAndroid Build Coastguard Worker    anv_scratch_pool_finish(device, &device->scratch_pool);
1149*61046927SAndroid Build Coastguard Worker    anv_scratch_pool_finish(device, &device->protected_scratch_pool);
1150*61046927SAndroid Build Coastguard Worker 
1151*61046927SAndroid Build Coastguard Worker    if (device->vk.enabled_extensions.KHR_ray_query) {
1152*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < ARRAY_SIZE(device->ray_query_shadow_bos); i++) {
1153*61046927SAndroid Build Coastguard Worker          if (device->ray_query_shadow_bos[i] != NULL)
1154*61046927SAndroid Build Coastguard Worker             anv_device_release_bo(device, device->ray_query_shadow_bos[i]);
1155*61046927SAndroid Build Coastguard Worker       }
1156*61046927SAndroid Build Coastguard Worker       anv_device_release_bo(device, device->ray_query_bo);
1157*61046927SAndroid Build Coastguard Worker    }
1158*61046927SAndroid Build Coastguard Worker    anv_device_release_bo(device, device->workaround_bo);
1159*61046927SAndroid Build Coastguard Worker    if (device->dummy_aux_bo)
1160*61046927SAndroid Build Coastguard Worker       anv_device_release_bo(device, device->dummy_aux_bo);
1161*61046927SAndroid Build Coastguard Worker    anv_device_release_bo(device, device->trivial_batch_bo);
1162*61046927SAndroid Build Coastguard Worker 
1163*61046927SAndroid Build Coastguard Worker    if (device->info->has_aux_map) {
1164*61046927SAndroid Build Coastguard Worker       intel_aux_map_finish(device->aux_map_ctx);
1165*61046927SAndroid Build Coastguard Worker       device->aux_map_ctx = NULL;
1166*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->aux_tt_pool);
1167*61046927SAndroid Build Coastguard Worker    }
1168*61046927SAndroid Build Coastguard Worker    if (device->vk.enabled_extensions.EXT_descriptor_buffer &&
1169*61046927SAndroid Build Coastguard Worker        device->info->verx10 >= 125)
1170*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->push_descriptor_buffer_pool);
1171*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors)
1172*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->indirect_push_descriptor_pool);
1173*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->binding_table_pool);
1174*61046927SAndroid Build Coastguard Worker    if (device->info->verx10 >= 125)
1175*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->scratch_surface_state_pool);
1176*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->internal_surface_state_pool);
1177*61046927SAndroid Build Coastguard Worker    if (device->physical->indirect_descriptors)
1178*61046927SAndroid Build Coastguard Worker       anv_state_pool_finish(&device->bindless_surface_state_pool);
1179*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->instruction_state_pool);
1180*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->dynamic_state_pool);
1181*61046927SAndroid Build Coastguard Worker    anv_state_pool_finish(&device->general_state_pool);
1182*61046927SAndroid Build Coastguard Worker 
1183*61046927SAndroid Build Coastguard Worker    if (device->vk.enabled_extensions.KHR_acceleration_structure)
1184*61046927SAndroid Build Coastguard Worker       anv_bo_pool_finish(&device->bvh_bo_pool);
1185*61046927SAndroid Build Coastguard Worker    anv_bo_pool_finish(&device->batch_bo_pool);
1186*61046927SAndroid Build Coastguard Worker 
1187*61046927SAndroid Build Coastguard Worker    anv_bo_cache_finish(&device->bo_cache);
1188*61046927SAndroid Build Coastguard Worker 
1189*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_trtt);
1190*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_dynamic_visible);
1191*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_desc);
1192*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_hi);
1193*61046927SAndroid Build Coastguard Worker    util_vma_heap_finish(&device->vma_lo);
1194*61046927SAndroid Build Coastguard Worker    pthread_mutex_destroy(&device->vma_mutex);
1195*61046927SAndroid Build Coastguard Worker 
1196*61046927SAndroid Build Coastguard Worker    pthread_cond_destroy(&device->queue_submit);
1197*61046927SAndroid Build Coastguard Worker    pthread_mutex_destroy(&device->mutex);
1198*61046927SAndroid Build Coastguard Worker 
1199*61046927SAndroid Build Coastguard Worker    ralloc_free(device->fp64_nir);
1200*61046927SAndroid Build Coastguard Worker 
1201*61046927SAndroid Build Coastguard Worker    anv_device_destroy_context_or_vm(device);
1202*61046927SAndroid Build Coastguard Worker 
1203*61046927SAndroid Build Coastguard Worker    if (INTEL_DEBUG(DEBUG_BATCH | DEBUG_BATCH_STATS)) {
1204*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < pdevice->queue.family_count; i++) {
1205*61046927SAndroid Build Coastguard Worker          if (INTEL_DEBUG(DEBUG_BATCH_STATS))
1206*61046927SAndroid Build Coastguard Worker             intel_batch_print_stats(&device->decoder[i]);
1207*61046927SAndroid Build Coastguard Worker          intel_batch_decode_ctx_finish(&device->decoder[i]);
1208*61046927SAndroid Build Coastguard Worker       }
1209*61046927SAndroid Build Coastguard Worker    }
1210*61046927SAndroid Build Coastguard Worker 
1211*61046927SAndroid Build Coastguard Worker    close(device->fd);
1212*61046927SAndroid Build Coastguard Worker 
1213*61046927SAndroid Build Coastguard Worker    vk_device_finish(&device->vk);
1214*61046927SAndroid Build Coastguard Worker    vk_free(&device->vk.alloc, device);
1215*61046927SAndroid Build Coastguard Worker }
1216*61046927SAndroid Build Coastguard Worker 
anv_EnumerateInstanceLayerProperties(uint32_t * pPropertyCount,VkLayerProperties * pProperties)1217*61046927SAndroid Build Coastguard Worker VkResult anv_EnumerateInstanceLayerProperties(
1218*61046927SAndroid Build Coastguard Worker     uint32_t*                                   pPropertyCount,
1219*61046927SAndroid Build Coastguard Worker     VkLayerProperties*                          pProperties)
1220*61046927SAndroid Build Coastguard Worker {
1221*61046927SAndroid Build Coastguard Worker    if (pProperties == NULL) {
1222*61046927SAndroid Build Coastguard Worker       *pPropertyCount = 0;
1223*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
1224*61046927SAndroid Build Coastguard Worker    }
1225*61046927SAndroid Build Coastguard Worker 
1226*61046927SAndroid Build Coastguard Worker    /* None supported at this time */
1227*61046927SAndroid Build Coastguard Worker    return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT);
1228*61046927SAndroid Build Coastguard Worker }
1229*61046927SAndroid Build Coastguard Worker 
1230*61046927SAndroid Build Coastguard Worker VkResult
anv_device_wait(struct anv_device * device,struct anv_bo * bo,int64_t timeout)1231*61046927SAndroid Build Coastguard Worker anv_device_wait(struct anv_device *device, struct anv_bo *bo,
1232*61046927SAndroid Build Coastguard Worker                 int64_t timeout)
1233*61046927SAndroid Build Coastguard Worker {
1234*61046927SAndroid Build Coastguard Worker    int ret = anv_gem_wait(device, bo->gem_handle, &timeout);
1235*61046927SAndroid Build Coastguard Worker    if (ret == -1 && errno == ETIME) {
1236*61046927SAndroid Build Coastguard Worker       return VK_TIMEOUT;
1237*61046927SAndroid Build Coastguard Worker    } else if (ret == -1) {
1238*61046927SAndroid Build Coastguard Worker       /* We don't know the real error. */
1239*61046927SAndroid Build Coastguard Worker       return vk_device_set_lost(&device->vk, "gem wait failed: %m");
1240*61046927SAndroid Build Coastguard Worker    } else {
1241*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
1242*61046927SAndroid Build Coastguard Worker    }
1243*61046927SAndroid Build Coastguard Worker }
1244*61046927SAndroid Build Coastguard Worker 
1245*61046927SAndroid Build Coastguard Worker static struct util_vma_heap *
anv_vma_heap_for_flags(struct anv_device * device,enum anv_bo_alloc_flags alloc_flags)1246*61046927SAndroid Build Coastguard Worker anv_vma_heap_for_flags(struct anv_device *device,
1247*61046927SAndroid Build Coastguard Worker                        enum anv_bo_alloc_flags alloc_flags)
1248*61046927SAndroid Build Coastguard Worker {
1249*61046927SAndroid Build Coastguard Worker    if (alloc_flags & ANV_BO_ALLOC_TRTT)
1250*61046927SAndroid Build Coastguard Worker       return &device->vma_trtt;
1251*61046927SAndroid Build Coastguard Worker 
1252*61046927SAndroid Build Coastguard Worker    if (alloc_flags & ANV_BO_ALLOC_32BIT_ADDRESS)
1253*61046927SAndroid Build Coastguard Worker       return &device->vma_lo;
1254*61046927SAndroid Build Coastguard Worker 
1255*61046927SAndroid Build Coastguard Worker    if (alloc_flags & ANV_BO_ALLOC_DESCRIPTOR_POOL)
1256*61046927SAndroid Build Coastguard Worker       return &device->vma_desc;
1257*61046927SAndroid Build Coastguard Worker 
1258*61046927SAndroid Build Coastguard Worker    if (alloc_flags & ANV_BO_ALLOC_DYNAMIC_VISIBLE_POOL)
1259*61046927SAndroid Build Coastguard Worker       return &device->vma_dynamic_visible;
1260*61046927SAndroid Build Coastguard Worker 
1261*61046927SAndroid Build Coastguard Worker    return &device->vma_hi;
1262*61046927SAndroid Build Coastguard Worker }
1263*61046927SAndroid Build Coastguard Worker 
1264*61046927SAndroid Build Coastguard Worker uint64_t
anv_vma_alloc(struct anv_device * device,uint64_t size,uint64_t align,enum anv_bo_alloc_flags alloc_flags,uint64_t client_address,struct util_vma_heap ** out_vma_heap)1265*61046927SAndroid Build Coastguard Worker anv_vma_alloc(struct anv_device *device,
1266*61046927SAndroid Build Coastguard Worker               uint64_t size, uint64_t align,
1267*61046927SAndroid Build Coastguard Worker               enum anv_bo_alloc_flags alloc_flags,
1268*61046927SAndroid Build Coastguard Worker               uint64_t client_address,
1269*61046927SAndroid Build Coastguard Worker               struct util_vma_heap **out_vma_heap)
1270*61046927SAndroid Build Coastguard Worker {
1271*61046927SAndroid Build Coastguard Worker    pthread_mutex_lock(&device->vma_mutex);
1272*61046927SAndroid Build Coastguard Worker 
1273*61046927SAndroid Build Coastguard Worker    uint64_t addr = 0;
1274*61046927SAndroid Build Coastguard Worker    *out_vma_heap = anv_vma_heap_for_flags(device, alloc_flags);
1275*61046927SAndroid Build Coastguard Worker 
1276*61046927SAndroid Build Coastguard Worker    if (alloc_flags & ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS) {
1277*61046927SAndroid Build Coastguard Worker       assert(*out_vma_heap == &device->vma_hi ||
1278*61046927SAndroid Build Coastguard Worker              *out_vma_heap == &device->vma_dynamic_visible ||
1279*61046927SAndroid Build Coastguard Worker              *out_vma_heap == &device->vma_trtt);
1280*61046927SAndroid Build Coastguard Worker 
1281*61046927SAndroid Build Coastguard Worker       if (client_address) {
1282*61046927SAndroid Build Coastguard Worker          if (util_vma_heap_alloc_addr(*out_vma_heap,
1283*61046927SAndroid Build Coastguard Worker                                       client_address, size)) {
1284*61046927SAndroid Build Coastguard Worker             addr = client_address;
1285*61046927SAndroid Build Coastguard Worker          }
1286*61046927SAndroid Build Coastguard Worker       } else {
1287*61046927SAndroid Build Coastguard Worker          (*out_vma_heap)->alloc_high = false;
1288*61046927SAndroid Build Coastguard Worker          addr = util_vma_heap_alloc(*out_vma_heap, size, align);
1289*61046927SAndroid Build Coastguard Worker          (*out_vma_heap)->alloc_high = true;
1290*61046927SAndroid Build Coastguard Worker       }
1291*61046927SAndroid Build Coastguard Worker       /* We don't want to fall back to other heaps */
1292*61046927SAndroid Build Coastguard Worker       goto done;
1293*61046927SAndroid Build Coastguard Worker    }
1294*61046927SAndroid Build Coastguard Worker 
1295*61046927SAndroid Build Coastguard Worker    assert(client_address == 0);
1296*61046927SAndroid Build Coastguard Worker 
1297*61046927SAndroid Build Coastguard Worker    addr = util_vma_heap_alloc(*out_vma_heap, size, align);
1298*61046927SAndroid Build Coastguard Worker 
1299*61046927SAndroid Build Coastguard Worker done:
1300*61046927SAndroid Build Coastguard Worker    pthread_mutex_unlock(&device->vma_mutex);
1301*61046927SAndroid Build Coastguard Worker 
1302*61046927SAndroid Build Coastguard Worker    assert(addr == intel_48b_address(addr));
1303*61046927SAndroid Build Coastguard Worker    return intel_canonical_address(addr);
1304*61046927SAndroid Build Coastguard Worker }
1305*61046927SAndroid Build Coastguard Worker 
1306*61046927SAndroid Build Coastguard Worker void
anv_vma_free(struct anv_device * device,struct util_vma_heap * vma_heap,uint64_t address,uint64_t size)1307*61046927SAndroid Build Coastguard Worker anv_vma_free(struct anv_device *device,
1308*61046927SAndroid Build Coastguard Worker              struct util_vma_heap *vma_heap,
1309*61046927SAndroid Build Coastguard Worker              uint64_t address, uint64_t size)
1310*61046927SAndroid Build Coastguard Worker {
1311*61046927SAndroid Build Coastguard Worker    assert(vma_heap == &device->vma_lo ||
1312*61046927SAndroid Build Coastguard Worker           vma_heap == &device->vma_hi ||
1313*61046927SAndroid Build Coastguard Worker           vma_heap == &device->vma_desc ||
1314*61046927SAndroid Build Coastguard Worker           vma_heap == &device->vma_dynamic_visible ||
1315*61046927SAndroid Build Coastguard Worker           vma_heap == &device->vma_trtt);
1316*61046927SAndroid Build Coastguard Worker 
1317*61046927SAndroid Build Coastguard Worker    const uint64_t addr_48b = intel_48b_address(address);
1318*61046927SAndroid Build Coastguard Worker 
1319*61046927SAndroid Build Coastguard Worker    pthread_mutex_lock(&device->vma_mutex);
1320*61046927SAndroid Build Coastguard Worker 
1321*61046927SAndroid Build Coastguard Worker    util_vma_heap_free(vma_heap, addr_48b, size);
1322*61046927SAndroid Build Coastguard Worker 
1323*61046927SAndroid Build Coastguard Worker    pthread_mutex_unlock(&device->vma_mutex);
1324*61046927SAndroid Build Coastguard Worker }
1325*61046927SAndroid Build Coastguard Worker 
anv_AllocateMemory(VkDevice _device,const VkMemoryAllocateInfo * pAllocateInfo,const VkAllocationCallbacks * pAllocator,VkDeviceMemory * pMem)1326*61046927SAndroid Build Coastguard Worker VkResult anv_AllocateMemory(
1327*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
1328*61046927SAndroid Build Coastguard Worker     const VkMemoryAllocateInfo*                 pAllocateInfo,
1329*61046927SAndroid Build Coastguard Worker     const VkAllocationCallbacks*                pAllocator,
1330*61046927SAndroid Build Coastguard Worker     VkDeviceMemory*                             pMem)
1331*61046927SAndroid Build Coastguard Worker {
1332*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1333*61046927SAndroid Build Coastguard Worker    struct anv_physical_device *pdevice = device->physical;
1334*61046927SAndroid Build Coastguard Worker    struct anv_device_memory *mem;
1335*61046927SAndroid Build Coastguard Worker    VkResult result = VK_SUCCESS;
1336*61046927SAndroid Build Coastguard Worker 
1337*61046927SAndroid Build Coastguard Worker    assert(pAllocateInfo->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO);
1338*61046927SAndroid Build Coastguard Worker 
1339*61046927SAndroid Build Coastguard Worker    VkDeviceSize aligned_alloc_size =
1340*61046927SAndroid Build Coastguard Worker       align64(pAllocateInfo->allocationSize, 4096);
1341*61046927SAndroid Build Coastguard Worker 
1342*61046927SAndroid Build Coastguard Worker    assert(pAllocateInfo->memoryTypeIndex < pdevice->memory.type_count);
1343*61046927SAndroid Build Coastguard Worker    const struct anv_memory_type *mem_type =
1344*61046927SAndroid Build Coastguard Worker       &pdevice->memory.types[pAllocateInfo->memoryTypeIndex];
1345*61046927SAndroid Build Coastguard Worker    assert(mem_type->heapIndex < pdevice->memory.heap_count);
1346*61046927SAndroid Build Coastguard Worker    struct anv_memory_heap *mem_heap =
1347*61046927SAndroid Build Coastguard Worker       &pdevice->memory.heaps[mem_type->heapIndex];
1348*61046927SAndroid Build Coastguard Worker 
1349*61046927SAndroid Build Coastguard Worker    if (aligned_alloc_size > mem_heap->size)
1350*61046927SAndroid Build Coastguard Worker       return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
1351*61046927SAndroid Build Coastguard Worker 
1352*61046927SAndroid Build Coastguard Worker    uint64_t mem_heap_used = p_atomic_read(&mem_heap->used);
1353*61046927SAndroid Build Coastguard Worker    if (mem_heap_used + aligned_alloc_size > mem_heap->size)
1354*61046927SAndroid Build Coastguard Worker       return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
1355*61046927SAndroid Build Coastguard Worker 
1356*61046927SAndroid Build Coastguard Worker    mem = vk_device_memory_create(&device->vk, pAllocateInfo,
1357*61046927SAndroid Build Coastguard Worker                                  pAllocator, sizeof(*mem));
1358*61046927SAndroid Build Coastguard Worker    if (mem == NULL)
1359*61046927SAndroid Build Coastguard Worker       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
1360*61046927SAndroid Build Coastguard Worker 
1361*61046927SAndroid Build Coastguard Worker    mem->type = mem_type;
1362*61046927SAndroid Build Coastguard Worker    mem->map = NULL;
1363*61046927SAndroid Build Coastguard Worker    mem->map_size = 0;
1364*61046927SAndroid Build Coastguard Worker    mem->map_delta = 0;
1365*61046927SAndroid Build Coastguard Worker 
1366*61046927SAndroid Build Coastguard Worker    enum anv_bo_alloc_flags alloc_flags = 0;
1367*61046927SAndroid Build Coastguard Worker 
1368*61046927SAndroid Build Coastguard Worker    const VkImportMemoryFdInfoKHR *fd_info = NULL;
1369*61046927SAndroid Build Coastguard Worker    const VkMemoryDedicatedAllocateInfo *dedicated_info = NULL;
1370*61046927SAndroid Build Coastguard Worker    const struct wsi_memory_allocate_info *wsi_info = NULL;
1371*61046927SAndroid Build Coastguard Worker    uint64_t client_address = 0;
1372*61046927SAndroid Build Coastguard Worker 
1373*61046927SAndroid Build Coastguard Worker    vk_foreach_struct_const(ext, pAllocateInfo->pNext) {
1374*61046927SAndroid Build Coastguard Worker       /* VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA isn't a real enum
1375*61046927SAndroid Build Coastguard Worker        * value, so use cast to avoid compiler warn
1376*61046927SAndroid Build Coastguard Worker        */
1377*61046927SAndroid Build Coastguard Worker       switch ((uint32_t)ext->sType) {
1378*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
1379*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
1380*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
1381*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
1382*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
1383*61046927SAndroid Build Coastguard Worker          /* handled by vk_device_memory_create */
1384*61046927SAndroid Build Coastguard Worker          break;
1385*61046927SAndroid Build Coastguard Worker 
1386*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
1387*61046927SAndroid Build Coastguard Worker          fd_info = (void *)ext;
1388*61046927SAndroid Build Coastguard Worker          break;
1389*61046927SAndroid Build Coastguard Worker 
1390*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
1391*61046927SAndroid Build Coastguard Worker          dedicated_info = (void *)ext;
1392*61046927SAndroid Build Coastguard Worker          break;
1393*61046927SAndroid Build Coastguard Worker 
1394*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
1395*61046927SAndroid Build Coastguard Worker          const VkMemoryOpaqueCaptureAddressAllocateInfo *addr_info =
1396*61046927SAndroid Build Coastguard Worker             (const VkMemoryOpaqueCaptureAddressAllocateInfo *)ext;
1397*61046927SAndroid Build Coastguard Worker          client_address = addr_info->opaqueCaptureAddress;
1398*61046927SAndroid Build Coastguard Worker          break;
1399*61046927SAndroid Build Coastguard Worker       }
1400*61046927SAndroid Build Coastguard Worker 
1401*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA:
1402*61046927SAndroid Build Coastguard Worker          wsi_info = (void *)ext;
1403*61046927SAndroid Build Coastguard Worker          break;
1404*61046927SAndroid Build Coastguard Worker 
1405*61046927SAndroid Build Coastguard Worker       default:
1406*61046927SAndroid Build Coastguard Worker          vk_debug_ignored_stype(ext->sType);
1407*61046927SAndroid Build Coastguard Worker          break;
1408*61046927SAndroid Build Coastguard Worker       }
1409*61046927SAndroid Build Coastguard Worker    }
1410*61046927SAndroid Build Coastguard Worker 
1411*61046927SAndroid Build Coastguard Worker    /* If i915 reported a mappable/non_mappable vram regions and the
1412*61046927SAndroid Build Coastguard Worker     * application want lmem mappable, then we need to use the
1413*61046927SAndroid Build Coastguard Worker     * I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS flag to create our BO.
1414*61046927SAndroid Build Coastguard Worker     */
1415*61046927SAndroid Build Coastguard Worker    if (pdevice->vram_mappable.size > 0 &&
1416*61046927SAndroid Build Coastguard Worker        pdevice->vram_non_mappable.size > 0 &&
1417*61046927SAndroid Build Coastguard Worker        (mem_type->propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) &&
1418*61046927SAndroid Build Coastguard Worker        (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT))
1419*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_LOCAL_MEM_CPU_VISIBLE;
1420*61046927SAndroid Build Coastguard Worker 
1421*61046927SAndroid Build Coastguard Worker    if (!mem_heap->is_local_mem)
1422*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_NO_LOCAL_MEM;
1423*61046927SAndroid Build Coastguard Worker 
1424*61046927SAndroid Build Coastguard Worker    if (mem->vk.alloc_flags & VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT)
1425*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS;
1426*61046927SAndroid Build Coastguard Worker 
1427*61046927SAndroid Build Coastguard Worker    if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT)
1428*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_PROTECTED;
1429*61046927SAndroid Build Coastguard Worker 
1430*61046927SAndroid Build Coastguard Worker    /* For now, always allocated AUX-TT aligned memory, regardless of dedicated
1431*61046927SAndroid Build Coastguard Worker     * allocations. An application can for example, suballocate a large
1432*61046927SAndroid Build Coastguard Worker     * VkDeviceMemory and try to bind an image created with a CCS modifier. In
1433*61046927SAndroid Build Coastguard Worker     * that case we cannot disable CCS if the alignment doesn´t meet the AUX-TT
1434*61046927SAndroid Build Coastguard Worker     * requirements, so we need to ensure both the VkDeviceMemory and the
1435*61046927SAndroid Build Coastguard Worker     * alignment reported through vkGetImageMemoryRequirements() meet the
1436*61046927SAndroid Build Coastguard Worker     * AUX-TT requirement.
1437*61046927SAndroid Build Coastguard Worker     *
1438*61046927SAndroid Build Coastguard Worker     * Allocations with the special dynamic_visible mem type are for things like
1439*61046927SAndroid Build Coastguard Worker     * descriptor buffers, so AUX-TT alignment is not needed here.
1440*61046927SAndroid Build Coastguard Worker     */
1441*61046927SAndroid Build Coastguard Worker    if (device->info->has_aux_map && !mem_type->dynamic_visible)
1442*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_AUX_TT_ALIGNED;
1443*61046927SAndroid Build Coastguard Worker 
1444*61046927SAndroid Build Coastguard Worker    /* If the allocation is not dedicated nor a host pointer, allocate
1445*61046927SAndroid Build Coastguard Worker     * additional CCS space.
1446*61046927SAndroid Build Coastguard Worker     *
1447*61046927SAndroid Build Coastguard Worker     * Allocations with the special dynamic_visible mem type are for things like
1448*61046927SAndroid Build Coastguard Worker     * descriptor buffers, which don't need any compression.
1449*61046927SAndroid Build Coastguard Worker     */
1450*61046927SAndroid Build Coastguard Worker    if (device->physical->alloc_aux_tt_mem &&
1451*61046927SAndroid Build Coastguard Worker        dedicated_info == NULL &&
1452*61046927SAndroid Build Coastguard Worker        mem->vk.host_ptr == NULL &&
1453*61046927SAndroid Build Coastguard Worker        !mem_type->dynamic_visible)
1454*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_AUX_CCS;
1455*61046927SAndroid Build Coastguard Worker 
1456*61046927SAndroid Build Coastguard Worker    /* TODO: Android, ChromeOS and other applications may need another way to
1457*61046927SAndroid Build Coastguard Worker     * allocate buffers that can be scanout to display but it should pretty
1458*61046927SAndroid Build Coastguard Worker     * easy to catch those as Xe KMD driver will print warnings in dmesg when
1459*61046927SAndroid Build Coastguard Worker     * scanning buffers allocated without proper flag set.
1460*61046927SAndroid Build Coastguard Worker     */
1461*61046927SAndroid Build Coastguard Worker    if (wsi_info)
1462*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_SCANOUT;
1463*61046927SAndroid Build Coastguard Worker 
1464*61046927SAndroid Build Coastguard Worker    /* Anything imported or exported is EXTERNAL */
1465*61046927SAndroid Build Coastguard Worker    if (mem->vk.export_handle_types || mem->vk.import_handle_type) {
1466*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_EXTERNAL;
1467*61046927SAndroid Build Coastguard Worker 
1468*61046927SAndroid Build Coastguard Worker       /* wsi has its own way of synchronizing with the compositor */
1469*61046927SAndroid Build Coastguard Worker       if (pdevice->instance->external_memory_implicit_sync &&
1470*61046927SAndroid Build Coastguard Worker           !wsi_info && dedicated_info &&
1471*61046927SAndroid Build Coastguard Worker           dedicated_info->image != VK_NULL_HANDLE) {
1472*61046927SAndroid Build Coastguard Worker          ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
1473*61046927SAndroid Build Coastguard Worker 
1474*61046927SAndroid Build Coastguard Worker          /* Apply implicit sync to be compatible with clients relying on
1475*61046927SAndroid Build Coastguard Worker           * implicit fencing. This matches the behavior in iris i915_batch
1476*61046927SAndroid Build Coastguard Worker           * submit. An example client is VA-API (iHD), so only dedicated
1477*61046927SAndroid Build Coastguard Worker           * image scenario has to be covered.
1478*61046927SAndroid Build Coastguard Worker           */
1479*61046927SAndroid Build Coastguard Worker          alloc_flags |= ANV_BO_ALLOC_IMPLICIT_SYNC;
1480*61046927SAndroid Build Coastguard Worker 
1481*61046927SAndroid Build Coastguard Worker          /* For color attachment, apply IMPLICIT_WRITE so a client on the
1482*61046927SAndroid Build Coastguard Worker           * consumer side relying on implicit fencing can have a fence to
1483*61046927SAndroid Build Coastguard Worker           * wait for render complete.
1484*61046927SAndroid Build Coastguard Worker           */
1485*61046927SAndroid Build Coastguard Worker          if (image->vk.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
1486*61046927SAndroid Build Coastguard Worker             alloc_flags |= ANV_BO_ALLOC_IMPLICIT_WRITE;
1487*61046927SAndroid Build Coastguard Worker       }
1488*61046927SAndroid Build Coastguard Worker    }
1489*61046927SAndroid Build Coastguard Worker 
1490*61046927SAndroid Build Coastguard Worker    /* TODO: Disabling compression on external bos will cause problems once we
1491*61046927SAndroid Build Coastguard Worker     * have a modifier that supports compression (Xe2+).
1492*61046927SAndroid Build Coastguard Worker     */
1493*61046927SAndroid Build Coastguard Worker    if (!(alloc_flags & ANV_BO_ALLOC_EXTERNAL) && mem_type->compressed)
1494*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_COMPRESSED;
1495*61046927SAndroid Build Coastguard Worker 
1496*61046927SAndroid Build Coastguard Worker    if (mem_type->dynamic_visible)
1497*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_DYNAMIC_VISIBLE_POOL;
1498*61046927SAndroid Build Coastguard Worker 
1499*61046927SAndroid Build Coastguard Worker    if (mem->vk.ahardware_buffer) {
1500*61046927SAndroid Build Coastguard Worker       result = anv_import_ahw_memory(_device, mem);
1501*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
1502*61046927SAndroid Build Coastguard Worker          goto fail;
1503*61046927SAndroid Build Coastguard Worker 
1504*61046927SAndroid Build Coastguard Worker       goto success;
1505*61046927SAndroid Build Coastguard Worker    }
1506*61046927SAndroid Build Coastguard Worker 
1507*61046927SAndroid Build Coastguard Worker    /* The Vulkan spec permits handleType to be 0, in which case the struct is
1508*61046927SAndroid Build Coastguard Worker     * ignored.
1509*61046927SAndroid Build Coastguard Worker     */
1510*61046927SAndroid Build Coastguard Worker    if (fd_info && fd_info->handleType) {
1511*61046927SAndroid Build Coastguard Worker       /* At the moment, we support only the below handle types. */
1512*61046927SAndroid Build Coastguard Worker       assert(fd_info->handleType ==
1513*61046927SAndroid Build Coastguard Worker                VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ||
1514*61046927SAndroid Build Coastguard Worker              fd_info->handleType ==
1515*61046927SAndroid Build Coastguard Worker                VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
1516*61046927SAndroid Build Coastguard Worker 
1517*61046927SAndroid Build Coastguard Worker       result = anv_device_import_bo(device, fd_info->fd, alloc_flags,
1518*61046927SAndroid Build Coastguard Worker                                     client_address, &mem->bo);
1519*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
1520*61046927SAndroid Build Coastguard Worker          goto fail;
1521*61046927SAndroid Build Coastguard Worker 
1522*61046927SAndroid Build Coastguard Worker       /* For security purposes, we reject importing the bo if it's smaller
1523*61046927SAndroid Build Coastguard Worker        * than the requested allocation size.  This prevents a malicious client
1524*61046927SAndroid Build Coastguard Worker        * from passing a buffer to a trusted client, lying about the size, and
1525*61046927SAndroid Build Coastguard Worker        * telling the trusted client to try and texture from an image that goes
1526*61046927SAndroid Build Coastguard Worker        * out-of-bounds.  This sort of thing could lead to GPU hangs or worse
1527*61046927SAndroid Build Coastguard Worker        * in the trusted client.  The trusted client can protect itself against
1528*61046927SAndroid Build Coastguard Worker        * this sort of attack but only if it can trust the buffer size.
1529*61046927SAndroid Build Coastguard Worker        */
1530*61046927SAndroid Build Coastguard Worker       if (mem->bo->size < aligned_alloc_size) {
1531*61046927SAndroid Build Coastguard Worker          result = vk_errorf(device, VK_ERROR_INVALID_EXTERNAL_HANDLE,
1532*61046927SAndroid Build Coastguard Worker                             "aligned allocationSize too large for "
1533*61046927SAndroid Build Coastguard Worker                             "VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT: "
1534*61046927SAndroid Build Coastguard Worker                             "%"PRIu64"B > %"PRIu64"B",
1535*61046927SAndroid Build Coastguard Worker                             aligned_alloc_size, mem->bo->size);
1536*61046927SAndroid Build Coastguard Worker          anv_device_release_bo(device, mem->bo);
1537*61046927SAndroid Build Coastguard Worker          goto fail;
1538*61046927SAndroid Build Coastguard Worker       }
1539*61046927SAndroid Build Coastguard Worker 
1540*61046927SAndroid Build Coastguard Worker       /* From the Vulkan spec:
1541*61046927SAndroid Build Coastguard Worker        *
1542*61046927SAndroid Build Coastguard Worker        *    "Importing memory from a file descriptor transfers ownership of
1543*61046927SAndroid Build Coastguard Worker        *    the file descriptor from the application to the Vulkan
1544*61046927SAndroid Build Coastguard Worker        *    implementation. The application must not perform any operations on
1545*61046927SAndroid Build Coastguard Worker        *    the file descriptor after a successful import."
1546*61046927SAndroid Build Coastguard Worker        *
1547*61046927SAndroid Build Coastguard Worker        * If the import fails, we leave the file descriptor open.
1548*61046927SAndroid Build Coastguard Worker        */
1549*61046927SAndroid Build Coastguard Worker       close(fd_info->fd);
1550*61046927SAndroid Build Coastguard Worker       goto success;
1551*61046927SAndroid Build Coastguard Worker    }
1552*61046927SAndroid Build Coastguard Worker 
1553*61046927SAndroid Build Coastguard Worker    if (mem->vk.host_ptr) {
1554*61046927SAndroid Build Coastguard Worker       if (mem->vk.import_handle_type ==
1555*61046927SAndroid Build Coastguard Worker           VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT) {
1556*61046927SAndroid Build Coastguard Worker          result = vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
1557*61046927SAndroid Build Coastguard Worker          goto fail;
1558*61046927SAndroid Build Coastguard Worker       }
1559*61046927SAndroid Build Coastguard Worker 
1560*61046927SAndroid Build Coastguard Worker       assert(mem->vk.import_handle_type ==
1561*61046927SAndroid Build Coastguard Worker              VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT);
1562*61046927SAndroid Build Coastguard Worker 
1563*61046927SAndroid Build Coastguard Worker       result = anv_device_import_bo_from_host_ptr(device,
1564*61046927SAndroid Build Coastguard Worker                                                   mem->vk.host_ptr,
1565*61046927SAndroid Build Coastguard Worker                                                   mem->vk.size,
1566*61046927SAndroid Build Coastguard Worker                                                   alloc_flags,
1567*61046927SAndroid Build Coastguard Worker                                                   client_address,
1568*61046927SAndroid Build Coastguard Worker                                                   &mem->bo);
1569*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
1570*61046927SAndroid Build Coastguard Worker          goto fail;
1571*61046927SAndroid Build Coastguard Worker 
1572*61046927SAndroid Build Coastguard Worker       goto success;
1573*61046927SAndroid Build Coastguard Worker    }
1574*61046927SAndroid Build Coastguard Worker 
1575*61046927SAndroid Build Coastguard Worker    if (alloc_flags & (ANV_BO_ALLOC_EXTERNAL | ANV_BO_ALLOC_SCANOUT)) {
1576*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_HOST_COHERENT;
1577*61046927SAndroid Build Coastguard Worker    } else if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
1578*61046927SAndroid Build Coastguard Worker       if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1579*61046927SAndroid Build Coastguard Worker          alloc_flags |= ANV_BO_ALLOC_HOST_COHERENT;
1580*61046927SAndroid Build Coastguard Worker       if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)
1581*61046927SAndroid Build Coastguard Worker          alloc_flags |= ANV_BO_ALLOC_HOST_CACHED;
1582*61046927SAndroid Build Coastguard Worker    } else {
1583*61046927SAndroid Build Coastguard Worker       /* Required to set some host mode to have a valid pat index set */
1584*61046927SAndroid Build Coastguard Worker       alloc_flags |= ANV_BO_ALLOC_HOST_COHERENT;
1585*61046927SAndroid Build Coastguard Worker    }
1586*61046927SAndroid Build Coastguard Worker 
1587*61046927SAndroid Build Coastguard Worker    /* Regular allocate (not importing memory). */
1588*61046927SAndroid Build Coastguard Worker 
1589*61046927SAndroid Build Coastguard Worker    result = anv_device_alloc_bo(device, "user", pAllocateInfo->allocationSize,
1590*61046927SAndroid Build Coastguard Worker                                 alloc_flags, client_address, &mem->bo);
1591*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
1592*61046927SAndroid Build Coastguard Worker       goto fail;
1593*61046927SAndroid Build Coastguard Worker 
1594*61046927SAndroid Build Coastguard Worker    if (dedicated_info && dedicated_info->image != VK_NULL_HANDLE) {
1595*61046927SAndroid Build Coastguard Worker       ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
1596*61046927SAndroid Build Coastguard Worker 
1597*61046927SAndroid Build Coastguard Worker       /* Some legacy (non-modifiers) consumers need the tiling to be set on
1598*61046927SAndroid Build Coastguard Worker        * the BO.  In this case, we have a dedicated allocation.
1599*61046927SAndroid Build Coastguard Worker        */
1600*61046927SAndroid Build Coastguard Worker       if (image->vk.wsi_legacy_scanout) {
1601*61046927SAndroid Build Coastguard Worker          const struct isl_surf *surf = &image->planes[0].primary_surface.isl;
1602*61046927SAndroid Build Coastguard Worker          result = anv_device_set_bo_tiling(device, mem->bo,
1603*61046927SAndroid Build Coastguard Worker                                            surf->row_pitch_B,
1604*61046927SAndroid Build Coastguard Worker                                            surf->tiling);
1605*61046927SAndroid Build Coastguard Worker          if (result != VK_SUCCESS) {
1606*61046927SAndroid Build Coastguard Worker             anv_device_release_bo(device, mem->bo);
1607*61046927SAndroid Build Coastguard Worker             goto fail;
1608*61046927SAndroid Build Coastguard Worker          }
1609*61046927SAndroid Build Coastguard Worker       }
1610*61046927SAndroid Build Coastguard Worker    }
1611*61046927SAndroid Build Coastguard Worker 
1612*61046927SAndroid Build Coastguard Worker  success:
1613*61046927SAndroid Build Coastguard Worker    mem_heap_used = p_atomic_add_return(&mem_heap->used, mem->bo->size);
1614*61046927SAndroid Build Coastguard Worker    if (mem_heap_used > mem_heap->size) {
1615*61046927SAndroid Build Coastguard Worker       p_atomic_add(&mem_heap->used, -mem->bo->size);
1616*61046927SAndroid Build Coastguard Worker       anv_device_release_bo(device, mem->bo);
1617*61046927SAndroid Build Coastguard Worker       result = vk_errorf(device, VK_ERROR_OUT_OF_DEVICE_MEMORY,
1618*61046927SAndroid Build Coastguard Worker                          "Out of heap memory");
1619*61046927SAndroid Build Coastguard Worker       goto fail;
1620*61046927SAndroid Build Coastguard Worker    }
1621*61046927SAndroid Build Coastguard Worker 
1622*61046927SAndroid Build Coastguard Worker    pthread_mutex_lock(&device->mutex);
1623*61046927SAndroid Build Coastguard Worker    list_addtail(&mem->link, &device->memory_objects);
1624*61046927SAndroid Build Coastguard Worker    pthread_mutex_unlock(&device->mutex);
1625*61046927SAndroid Build Coastguard Worker 
1626*61046927SAndroid Build Coastguard Worker    ANV_RMV(heap_create, device, mem, false, 0);
1627*61046927SAndroid Build Coastguard Worker 
1628*61046927SAndroid Build Coastguard Worker    *pMem = anv_device_memory_to_handle(mem);
1629*61046927SAndroid Build Coastguard Worker 
1630*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
1631*61046927SAndroid Build Coastguard Worker 
1632*61046927SAndroid Build Coastguard Worker  fail:
1633*61046927SAndroid Build Coastguard Worker    vk_device_memory_destroy(&device->vk, pAllocator, &mem->vk);
1634*61046927SAndroid Build Coastguard Worker 
1635*61046927SAndroid Build Coastguard Worker    return result;
1636*61046927SAndroid Build Coastguard Worker }
1637*61046927SAndroid Build Coastguard Worker 
anv_GetMemoryFdKHR(VkDevice device_h,const VkMemoryGetFdInfoKHR * pGetFdInfo,int * pFd)1638*61046927SAndroid Build Coastguard Worker VkResult anv_GetMemoryFdKHR(
1639*61046927SAndroid Build Coastguard Worker     VkDevice                                    device_h,
1640*61046927SAndroid Build Coastguard Worker     const VkMemoryGetFdInfoKHR*                 pGetFdInfo,
1641*61046927SAndroid Build Coastguard Worker     int*                                        pFd)
1642*61046927SAndroid Build Coastguard Worker {
1643*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, dev, device_h);
1644*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device_memory, mem, pGetFdInfo->memory);
1645*61046927SAndroid Build Coastguard Worker 
1646*61046927SAndroid Build Coastguard Worker    assert(pGetFdInfo->sType == VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR);
1647*61046927SAndroid Build Coastguard Worker 
1648*61046927SAndroid Build Coastguard Worker    assert(pGetFdInfo->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ||
1649*61046927SAndroid Build Coastguard Worker           pGetFdInfo->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
1650*61046927SAndroid Build Coastguard Worker 
1651*61046927SAndroid Build Coastguard Worker    return anv_device_export_bo(dev, mem->bo, pFd);
1652*61046927SAndroid Build Coastguard Worker }
1653*61046927SAndroid Build Coastguard Worker 
anv_GetMemoryFdPropertiesKHR(VkDevice _device,VkExternalMemoryHandleTypeFlagBits handleType,int fd,VkMemoryFdPropertiesKHR * pMemoryFdProperties)1654*61046927SAndroid Build Coastguard Worker VkResult anv_GetMemoryFdPropertiesKHR(
1655*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
1656*61046927SAndroid Build Coastguard Worker     VkExternalMemoryHandleTypeFlagBits          handleType,
1657*61046927SAndroid Build Coastguard Worker     int                                         fd,
1658*61046927SAndroid Build Coastguard Worker     VkMemoryFdPropertiesKHR*                    pMemoryFdProperties)
1659*61046927SAndroid Build Coastguard Worker {
1660*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1661*61046927SAndroid Build Coastguard Worker 
1662*61046927SAndroid Build Coastguard Worker    switch (handleType) {
1663*61046927SAndroid Build Coastguard Worker    case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
1664*61046927SAndroid Build Coastguard Worker       /* dma-buf can be imported as any memory type */
1665*61046927SAndroid Build Coastguard Worker       pMemoryFdProperties->memoryTypeBits =
1666*61046927SAndroid Build Coastguard Worker          (1 << device->physical->memory.type_count) - 1;
1667*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
1668*61046927SAndroid Build Coastguard Worker 
1669*61046927SAndroid Build Coastguard Worker    default:
1670*61046927SAndroid Build Coastguard Worker       /* The valid usage section for this function says:
1671*61046927SAndroid Build Coastguard Worker        *
1672*61046927SAndroid Build Coastguard Worker        *    "handleType must not be one of the handle types defined as
1673*61046927SAndroid Build Coastguard Worker        *    opaque."
1674*61046927SAndroid Build Coastguard Worker        *
1675*61046927SAndroid Build Coastguard Worker        * So opaque handle types fall into the default "unsupported" case.
1676*61046927SAndroid Build Coastguard Worker        */
1677*61046927SAndroid Build Coastguard Worker       return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
1678*61046927SAndroid Build Coastguard Worker    }
1679*61046927SAndroid Build Coastguard Worker }
1680*61046927SAndroid Build Coastguard Worker 
anv_GetMemoryHostPointerPropertiesEXT(VkDevice _device,VkExternalMemoryHandleTypeFlagBits handleType,const void * pHostPointer,VkMemoryHostPointerPropertiesEXT * pMemoryHostPointerProperties)1681*61046927SAndroid Build Coastguard Worker VkResult anv_GetMemoryHostPointerPropertiesEXT(
1682*61046927SAndroid Build Coastguard Worker    VkDevice                                    _device,
1683*61046927SAndroid Build Coastguard Worker    VkExternalMemoryHandleTypeFlagBits          handleType,
1684*61046927SAndroid Build Coastguard Worker    const void*                                 pHostPointer,
1685*61046927SAndroid Build Coastguard Worker    VkMemoryHostPointerPropertiesEXT*           pMemoryHostPointerProperties)
1686*61046927SAndroid Build Coastguard Worker {
1687*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1688*61046927SAndroid Build Coastguard Worker 
1689*61046927SAndroid Build Coastguard Worker    assert(pMemoryHostPointerProperties->sType ==
1690*61046927SAndroid Build Coastguard Worker           VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT);
1691*61046927SAndroid Build Coastguard Worker 
1692*61046927SAndroid Build Coastguard Worker    switch (handleType) {
1693*61046927SAndroid Build Coastguard Worker    case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
1694*61046927SAndroid Build Coastguard Worker       /* Host memory can be imported as any memory type. */
1695*61046927SAndroid Build Coastguard Worker       pMemoryHostPointerProperties->memoryTypeBits =
1696*61046927SAndroid Build Coastguard Worker          (1ull << device->physical->memory.type_count) - 1;
1697*61046927SAndroid Build Coastguard Worker 
1698*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
1699*61046927SAndroid Build Coastguard Worker 
1700*61046927SAndroid Build Coastguard Worker    default:
1701*61046927SAndroid Build Coastguard Worker       return VK_ERROR_INVALID_EXTERNAL_HANDLE;
1702*61046927SAndroid Build Coastguard Worker    }
1703*61046927SAndroid Build Coastguard Worker }
1704*61046927SAndroid Build Coastguard Worker 
anv_FreeMemory(VkDevice _device,VkDeviceMemory _mem,const VkAllocationCallbacks * pAllocator)1705*61046927SAndroid Build Coastguard Worker void anv_FreeMemory(
1706*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
1707*61046927SAndroid Build Coastguard Worker     VkDeviceMemory                              _mem,
1708*61046927SAndroid Build Coastguard Worker     const VkAllocationCallbacks*                pAllocator)
1709*61046927SAndroid Build Coastguard Worker {
1710*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1711*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device_memory, mem, _mem);
1712*61046927SAndroid Build Coastguard Worker 
1713*61046927SAndroid Build Coastguard Worker    if (mem == NULL)
1714*61046927SAndroid Build Coastguard Worker       return;
1715*61046927SAndroid Build Coastguard Worker 
1716*61046927SAndroid Build Coastguard Worker    pthread_mutex_lock(&device->mutex);
1717*61046927SAndroid Build Coastguard Worker    list_del(&mem->link);
1718*61046927SAndroid Build Coastguard Worker    pthread_mutex_unlock(&device->mutex);
1719*61046927SAndroid Build Coastguard Worker 
1720*61046927SAndroid Build Coastguard Worker    if (mem->map) {
1721*61046927SAndroid Build Coastguard Worker       const VkMemoryUnmapInfoKHR unmap = {
1722*61046927SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO_KHR,
1723*61046927SAndroid Build Coastguard Worker          .memory = _mem,
1724*61046927SAndroid Build Coastguard Worker       };
1725*61046927SAndroid Build Coastguard Worker       anv_UnmapMemory2KHR(_device, &unmap);
1726*61046927SAndroid Build Coastguard Worker    }
1727*61046927SAndroid Build Coastguard Worker 
1728*61046927SAndroid Build Coastguard Worker    p_atomic_add(&device->physical->memory.heaps[mem->type->heapIndex].used,
1729*61046927SAndroid Build Coastguard Worker                 -mem->bo->size);
1730*61046927SAndroid Build Coastguard Worker 
1731*61046927SAndroid Build Coastguard Worker    anv_device_release_bo(device, mem->bo);
1732*61046927SAndroid Build Coastguard Worker 
1733*61046927SAndroid Build Coastguard Worker    ANV_RMV(resource_destroy, device, mem);
1734*61046927SAndroid Build Coastguard Worker 
1735*61046927SAndroid Build Coastguard Worker    vk_device_memory_destroy(&device->vk, pAllocator, &mem->vk);
1736*61046927SAndroid Build Coastguard Worker }
1737*61046927SAndroid Build Coastguard Worker 
anv_MapMemory2KHR(VkDevice _device,const VkMemoryMapInfoKHR * pMemoryMapInfo,void ** ppData)1738*61046927SAndroid Build Coastguard Worker VkResult anv_MapMemory2KHR(
1739*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
1740*61046927SAndroid Build Coastguard Worker     const VkMemoryMapInfoKHR*                   pMemoryMapInfo,
1741*61046927SAndroid Build Coastguard Worker     void**                                      ppData)
1742*61046927SAndroid Build Coastguard Worker {
1743*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1744*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device_memory, mem, pMemoryMapInfo->memory);
1745*61046927SAndroid Build Coastguard Worker 
1746*61046927SAndroid Build Coastguard Worker    if (mem == NULL) {
1747*61046927SAndroid Build Coastguard Worker       *ppData = NULL;
1748*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
1749*61046927SAndroid Build Coastguard Worker    }
1750*61046927SAndroid Build Coastguard Worker 
1751*61046927SAndroid Build Coastguard Worker    if (mem->vk.host_ptr) {
1752*61046927SAndroid Build Coastguard Worker       *ppData = mem->vk.host_ptr + pMemoryMapInfo->offset;
1753*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
1754*61046927SAndroid Build Coastguard Worker    }
1755*61046927SAndroid Build Coastguard Worker 
1756*61046927SAndroid Build Coastguard Worker    /* From the Vulkan spec version 1.0.32 docs for MapMemory:
1757*61046927SAndroid Build Coastguard Worker     *
1758*61046927SAndroid Build Coastguard Worker     *  * memory must have been created with a memory type that reports
1759*61046927SAndroid Build Coastguard Worker     *    VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1760*61046927SAndroid Build Coastguard Worker     */
1761*61046927SAndroid Build Coastguard Worker    if (!(mem->type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)) {
1762*61046927SAndroid Build Coastguard Worker       return vk_errorf(device, VK_ERROR_MEMORY_MAP_FAILED,
1763*61046927SAndroid Build Coastguard Worker                        "Memory object not mappable.");
1764*61046927SAndroid Build Coastguard Worker    }
1765*61046927SAndroid Build Coastguard Worker 
1766*61046927SAndroid Build Coastguard Worker    assert(pMemoryMapInfo->size > 0);
1767*61046927SAndroid Build Coastguard Worker    const VkDeviceSize offset = pMemoryMapInfo->offset;
1768*61046927SAndroid Build Coastguard Worker    const VkDeviceSize size =
1769*61046927SAndroid Build Coastguard Worker       vk_device_memory_range(&mem->vk, pMemoryMapInfo->offset,
1770*61046927SAndroid Build Coastguard Worker                                        pMemoryMapInfo->size);
1771*61046927SAndroid Build Coastguard Worker 
1772*61046927SAndroid Build Coastguard Worker    if (size != (size_t)size) {
1773*61046927SAndroid Build Coastguard Worker       return vk_errorf(device, VK_ERROR_MEMORY_MAP_FAILED,
1774*61046927SAndroid Build Coastguard Worker                        "requested size 0x%"PRIx64" does not fit in %u bits",
1775*61046927SAndroid Build Coastguard Worker                        size, (unsigned)(sizeof(size_t) * 8));
1776*61046927SAndroid Build Coastguard Worker    }
1777*61046927SAndroid Build Coastguard Worker 
1778*61046927SAndroid Build Coastguard Worker    /* From the Vulkan 1.2.194 spec:
1779*61046927SAndroid Build Coastguard Worker     *
1780*61046927SAndroid Build Coastguard Worker     *    "memory must not be currently host mapped"
1781*61046927SAndroid Build Coastguard Worker     */
1782*61046927SAndroid Build Coastguard Worker    if (mem->map != NULL) {
1783*61046927SAndroid Build Coastguard Worker       return vk_errorf(device, VK_ERROR_MEMORY_MAP_FAILED,
1784*61046927SAndroid Build Coastguard Worker                        "Memory object already mapped.");
1785*61046927SAndroid Build Coastguard Worker    }
1786*61046927SAndroid Build Coastguard Worker 
1787*61046927SAndroid Build Coastguard Worker    void *placed_addr = NULL;
1788*61046927SAndroid Build Coastguard Worker    if (pMemoryMapInfo->flags & VK_MEMORY_MAP_PLACED_BIT_EXT) {
1789*61046927SAndroid Build Coastguard Worker       const VkMemoryMapPlacedInfoEXT *placed_info =
1790*61046927SAndroid Build Coastguard Worker          vk_find_struct_const(pMemoryMapInfo->pNext, MEMORY_MAP_PLACED_INFO_EXT);
1791*61046927SAndroid Build Coastguard Worker       assert(placed_info != NULL);
1792*61046927SAndroid Build Coastguard Worker       placed_addr = placed_info->pPlacedAddress;
1793*61046927SAndroid Build Coastguard Worker    }
1794*61046927SAndroid Build Coastguard Worker 
1795*61046927SAndroid Build Coastguard Worker    /* GEM will fail to map if the offset isn't 4k-aligned.  Round down. */
1796*61046927SAndroid Build Coastguard Worker    uint64_t map_offset;
1797*61046927SAndroid Build Coastguard Worker    if (!device->physical->info.has_mmap_offset)
1798*61046927SAndroid Build Coastguard Worker       map_offset = offset & ~4095ull;
1799*61046927SAndroid Build Coastguard Worker    else
1800*61046927SAndroid Build Coastguard Worker       map_offset = 0;
1801*61046927SAndroid Build Coastguard Worker    assert(offset >= map_offset);
1802*61046927SAndroid Build Coastguard Worker    uint64_t map_size = (offset + size) - map_offset;
1803*61046927SAndroid Build Coastguard Worker 
1804*61046927SAndroid Build Coastguard Worker    /* Let's map whole pages */
1805*61046927SAndroid Build Coastguard Worker    map_size = align64(map_size, 4096);
1806*61046927SAndroid Build Coastguard Worker 
1807*61046927SAndroid Build Coastguard Worker    void *map;
1808*61046927SAndroid Build Coastguard Worker    VkResult result = anv_device_map_bo(device, mem->bo, map_offset,
1809*61046927SAndroid Build Coastguard Worker                                        map_size, placed_addr, &map);
1810*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
1811*61046927SAndroid Build Coastguard Worker       return result;
1812*61046927SAndroid Build Coastguard Worker 
1813*61046927SAndroid Build Coastguard Worker    mem->map = map;
1814*61046927SAndroid Build Coastguard Worker    mem->map_size = map_size;
1815*61046927SAndroid Build Coastguard Worker    mem->map_delta = (offset - map_offset);
1816*61046927SAndroid Build Coastguard Worker    *ppData = mem->map + mem->map_delta;
1817*61046927SAndroid Build Coastguard Worker 
1818*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
1819*61046927SAndroid Build Coastguard Worker }
1820*61046927SAndroid Build Coastguard Worker 
anv_UnmapMemory2KHR(VkDevice _device,const VkMemoryUnmapInfoKHR * pMemoryUnmapInfo)1821*61046927SAndroid Build Coastguard Worker VkResult anv_UnmapMemory2KHR(
1822*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
1823*61046927SAndroid Build Coastguard Worker     const VkMemoryUnmapInfoKHR*                 pMemoryUnmapInfo)
1824*61046927SAndroid Build Coastguard Worker {
1825*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1826*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device_memory, mem, pMemoryUnmapInfo->memory);
1827*61046927SAndroid Build Coastguard Worker 
1828*61046927SAndroid Build Coastguard Worker    if (mem == NULL || mem->vk.host_ptr)
1829*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
1830*61046927SAndroid Build Coastguard Worker 
1831*61046927SAndroid Build Coastguard Worker    VkResult result =
1832*61046927SAndroid Build Coastguard Worker       anv_device_unmap_bo(device, mem->bo, mem->map, mem->map_size,
1833*61046927SAndroid Build Coastguard Worker                           pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT);
1834*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
1835*61046927SAndroid Build Coastguard Worker       return result;
1836*61046927SAndroid Build Coastguard Worker 
1837*61046927SAndroid Build Coastguard Worker    mem->map = NULL;
1838*61046927SAndroid Build Coastguard Worker    mem->map_size = 0;
1839*61046927SAndroid Build Coastguard Worker    mem->map_delta = 0;
1840*61046927SAndroid Build Coastguard Worker 
1841*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
1842*61046927SAndroid Build Coastguard Worker }
1843*61046927SAndroid Build Coastguard Worker 
anv_FlushMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)1844*61046927SAndroid Build Coastguard Worker VkResult anv_FlushMappedMemoryRanges(
1845*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
1846*61046927SAndroid Build Coastguard Worker     uint32_t                                    memoryRangeCount,
1847*61046927SAndroid Build Coastguard Worker     const VkMappedMemoryRange*                  pMemoryRanges)
1848*61046927SAndroid Build Coastguard Worker {
1849*61046927SAndroid Build Coastguard Worker #ifdef SUPPORT_INTEL_INTEGRATED_GPUS
1850*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1851*61046927SAndroid Build Coastguard Worker 
1852*61046927SAndroid Build Coastguard Worker    if (!device->physical->memory.need_flush)
1853*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
1854*61046927SAndroid Build Coastguard Worker 
1855*61046927SAndroid Build Coastguard Worker    /* Make sure the writes we're flushing have landed. */
1856*61046927SAndroid Build Coastguard Worker    __builtin_ia32_mfence();
1857*61046927SAndroid Build Coastguard Worker 
1858*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < memoryRangeCount; i++) {
1859*61046927SAndroid Build Coastguard Worker       ANV_FROM_HANDLE(anv_device_memory, mem, pMemoryRanges[i].memory);
1860*61046927SAndroid Build Coastguard Worker       if (mem->type->propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1861*61046927SAndroid Build Coastguard Worker          continue;
1862*61046927SAndroid Build Coastguard Worker 
1863*61046927SAndroid Build Coastguard Worker       uint64_t map_offset = pMemoryRanges[i].offset + mem->map_delta;
1864*61046927SAndroid Build Coastguard Worker       if (map_offset >= mem->map_size)
1865*61046927SAndroid Build Coastguard Worker          continue;
1866*61046927SAndroid Build Coastguard Worker 
1867*61046927SAndroid Build Coastguard Worker       intel_flush_range(mem->map + map_offset,
1868*61046927SAndroid Build Coastguard Worker                         MIN2(pMemoryRanges[i].size,
1869*61046927SAndroid Build Coastguard Worker                              mem->map_size - map_offset));
1870*61046927SAndroid Build Coastguard Worker    }
1871*61046927SAndroid Build Coastguard Worker #endif
1872*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
1873*61046927SAndroid Build Coastguard Worker }
1874*61046927SAndroid Build Coastguard Worker 
anv_InvalidateMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)1875*61046927SAndroid Build Coastguard Worker VkResult anv_InvalidateMappedMemoryRanges(
1876*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
1877*61046927SAndroid Build Coastguard Worker     uint32_t                                    memoryRangeCount,
1878*61046927SAndroid Build Coastguard Worker     const VkMappedMemoryRange*                  pMemoryRanges)
1879*61046927SAndroid Build Coastguard Worker {
1880*61046927SAndroid Build Coastguard Worker #ifdef SUPPORT_INTEL_INTEGRATED_GPUS
1881*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1882*61046927SAndroid Build Coastguard Worker 
1883*61046927SAndroid Build Coastguard Worker    if (!device->physical->memory.need_flush)
1884*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
1885*61046927SAndroid Build Coastguard Worker 
1886*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < memoryRangeCount; i++) {
1887*61046927SAndroid Build Coastguard Worker       ANV_FROM_HANDLE(anv_device_memory, mem, pMemoryRanges[i].memory);
1888*61046927SAndroid Build Coastguard Worker       if (mem->type->propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1889*61046927SAndroid Build Coastguard Worker          continue;
1890*61046927SAndroid Build Coastguard Worker 
1891*61046927SAndroid Build Coastguard Worker       uint64_t map_offset = pMemoryRanges[i].offset + mem->map_delta;
1892*61046927SAndroid Build Coastguard Worker       if (map_offset >= mem->map_size)
1893*61046927SAndroid Build Coastguard Worker          continue;
1894*61046927SAndroid Build Coastguard Worker 
1895*61046927SAndroid Build Coastguard Worker       intel_invalidate_range(mem->map + map_offset,
1896*61046927SAndroid Build Coastguard Worker                              MIN2(pMemoryRanges[i].size,
1897*61046927SAndroid Build Coastguard Worker                                   mem->map_size - map_offset));
1898*61046927SAndroid Build Coastguard Worker    }
1899*61046927SAndroid Build Coastguard Worker 
1900*61046927SAndroid Build Coastguard Worker    /* Make sure no reads get moved up above the invalidate. */
1901*61046927SAndroid Build Coastguard Worker    __builtin_ia32_mfence();
1902*61046927SAndroid Build Coastguard Worker #endif
1903*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
1904*61046927SAndroid Build Coastguard Worker }
1905*61046927SAndroid Build Coastguard Worker 
anv_GetDeviceMemoryCommitment(VkDevice device,VkDeviceMemory memory,VkDeviceSize * pCommittedMemoryInBytes)1906*61046927SAndroid Build Coastguard Worker void anv_GetDeviceMemoryCommitment(
1907*61046927SAndroid Build Coastguard Worker     VkDevice                                    device,
1908*61046927SAndroid Build Coastguard Worker     VkDeviceMemory                              memory,
1909*61046927SAndroid Build Coastguard Worker     VkDeviceSize*                               pCommittedMemoryInBytes)
1910*61046927SAndroid Build Coastguard Worker {
1911*61046927SAndroid Build Coastguard Worker    *pCommittedMemoryInBytes = 0;
1912*61046927SAndroid Build Coastguard Worker }
1913*61046927SAndroid Build Coastguard Worker 
1914*61046927SAndroid Build Coastguard Worker static inline clockid_t
anv_get_default_cpu_clock_id(void)1915*61046927SAndroid Build Coastguard Worker anv_get_default_cpu_clock_id(void)
1916*61046927SAndroid Build Coastguard Worker {
1917*61046927SAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_RAW
1918*61046927SAndroid Build Coastguard Worker    return CLOCK_MONOTONIC_RAW;
1919*61046927SAndroid Build Coastguard Worker #else
1920*61046927SAndroid Build Coastguard Worker    return CLOCK_MONOTONIC;
1921*61046927SAndroid Build Coastguard Worker #endif
1922*61046927SAndroid Build Coastguard Worker }
1923*61046927SAndroid Build Coastguard Worker 
1924*61046927SAndroid Build Coastguard Worker static inline clockid_t
vk_time_domain_to_clockid(VkTimeDomainKHR domain)1925*61046927SAndroid Build Coastguard Worker vk_time_domain_to_clockid(VkTimeDomainKHR domain)
1926*61046927SAndroid Build Coastguard Worker {
1927*61046927SAndroid Build Coastguard Worker    switch (domain) {
1928*61046927SAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_RAW
1929*61046927SAndroid Build Coastguard Worker    case VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR:
1930*61046927SAndroid Build Coastguard Worker       return CLOCK_MONOTONIC_RAW;
1931*61046927SAndroid Build Coastguard Worker #endif
1932*61046927SAndroid Build Coastguard Worker    case VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR:
1933*61046927SAndroid Build Coastguard Worker       return CLOCK_MONOTONIC;
1934*61046927SAndroid Build Coastguard Worker    default:
1935*61046927SAndroid Build Coastguard Worker       unreachable("Missing");
1936*61046927SAndroid Build Coastguard Worker       return CLOCK_MONOTONIC;
1937*61046927SAndroid Build Coastguard Worker    }
1938*61046927SAndroid Build Coastguard Worker }
1939*61046927SAndroid Build Coastguard Worker 
1940*61046927SAndroid Build Coastguard Worker static inline bool
is_cpu_time_domain(VkTimeDomainKHR domain)1941*61046927SAndroid Build Coastguard Worker is_cpu_time_domain(VkTimeDomainKHR domain)
1942*61046927SAndroid Build Coastguard Worker {
1943*61046927SAndroid Build Coastguard Worker    return domain == VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR ||
1944*61046927SAndroid Build Coastguard Worker           domain == VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR;
1945*61046927SAndroid Build Coastguard Worker }
1946*61046927SAndroid Build Coastguard Worker 
1947*61046927SAndroid Build Coastguard Worker static inline bool
is_gpu_time_domain(VkTimeDomainKHR domain)1948*61046927SAndroid Build Coastguard Worker is_gpu_time_domain(VkTimeDomainKHR domain)
1949*61046927SAndroid Build Coastguard Worker {
1950*61046927SAndroid Build Coastguard Worker    return domain == VK_TIME_DOMAIN_DEVICE_KHR;
1951*61046927SAndroid Build Coastguard Worker }
1952*61046927SAndroid Build Coastguard Worker 
anv_GetCalibratedTimestampsKHR(VkDevice _device,uint32_t timestampCount,const VkCalibratedTimestampInfoKHR * pTimestampInfos,uint64_t * pTimestamps,uint64_t * pMaxDeviation)1953*61046927SAndroid Build Coastguard Worker VkResult anv_GetCalibratedTimestampsKHR(
1954*61046927SAndroid Build Coastguard Worker    VkDevice                                     _device,
1955*61046927SAndroid Build Coastguard Worker    uint32_t                                     timestampCount,
1956*61046927SAndroid Build Coastguard Worker    const VkCalibratedTimestampInfoKHR           *pTimestampInfos,
1957*61046927SAndroid Build Coastguard Worker    uint64_t                                     *pTimestamps,
1958*61046927SAndroid Build Coastguard Worker    uint64_t                                     *pMaxDeviation)
1959*61046927SAndroid Build Coastguard Worker {
1960*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
1961*61046927SAndroid Build Coastguard Worker    const uint64_t timestamp_frequency = device->info->timestamp_frequency;
1962*61046927SAndroid Build Coastguard Worker    const uint64_t device_period = DIV_ROUND_UP(1000000000, timestamp_frequency);
1963*61046927SAndroid Build Coastguard Worker    uint32_t d, increment;
1964*61046927SAndroid Build Coastguard Worker    uint64_t begin, end;
1965*61046927SAndroid Build Coastguard Worker    uint64_t max_clock_period = 0;
1966*61046927SAndroid Build Coastguard Worker    const enum intel_kmd_type kmd_type = device->physical->info.kmd_type;
1967*61046927SAndroid Build Coastguard Worker    const bool has_correlate_timestamp = kmd_type == INTEL_KMD_TYPE_XE;
1968*61046927SAndroid Build Coastguard Worker    clockid_t cpu_clock_id = -1;
1969*61046927SAndroid Build Coastguard Worker 
1970*61046927SAndroid Build Coastguard Worker    begin = end = vk_clock_gettime(anv_get_default_cpu_clock_id());
1971*61046927SAndroid Build Coastguard Worker 
1972*61046927SAndroid Build Coastguard Worker    for (d = 0, increment = 1; d < timestampCount; d += increment) {
1973*61046927SAndroid Build Coastguard Worker       const VkTimeDomainKHR current = pTimestampInfos[d].timeDomain;
1974*61046927SAndroid Build Coastguard Worker       /* If we have a request pattern like this :
1975*61046927SAndroid Build Coastguard Worker        * - domain0 = VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR or VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR
1976*61046927SAndroid Build Coastguard Worker        * - domain1 = VK_TIME_DOMAIN_DEVICE_KHR
1977*61046927SAndroid Build Coastguard Worker        * - domain2 = domain0 (optional)
1978*61046927SAndroid Build Coastguard Worker        *
1979*61046927SAndroid Build Coastguard Worker        * We can combine all of those into a single ioctl for maximum accuracy.
1980*61046927SAndroid Build Coastguard Worker        */
1981*61046927SAndroid Build Coastguard Worker       if (has_correlate_timestamp && (d + 1) < timestampCount) {
1982*61046927SAndroid Build Coastguard Worker          const VkTimeDomainKHR next = pTimestampInfos[d + 1].timeDomain;
1983*61046927SAndroid Build Coastguard Worker 
1984*61046927SAndroid Build Coastguard Worker          if ((is_cpu_time_domain(current) && is_gpu_time_domain(next)) ||
1985*61046927SAndroid Build Coastguard Worker              (is_gpu_time_domain(current) && is_cpu_time_domain(next))) {
1986*61046927SAndroid Build Coastguard Worker             /* We'll consume at least 2 elements. */
1987*61046927SAndroid Build Coastguard Worker             increment = 2;
1988*61046927SAndroid Build Coastguard Worker 
1989*61046927SAndroid Build Coastguard Worker             if (is_cpu_time_domain(current))
1990*61046927SAndroid Build Coastguard Worker                cpu_clock_id = vk_time_domain_to_clockid(current);
1991*61046927SAndroid Build Coastguard Worker             else
1992*61046927SAndroid Build Coastguard Worker                cpu_clock_id = vk_time_domain_to_clockid(next);
1993*61046927SAndroid Build Coastguard Worker 
1994*61046927SAndroid Build Coastguard Worker             uint64_t cpu_timestamp, gpu_timestamp, cpu_delta_timestamp, cpu_end_timestamp;
1995*61046927SAndroid Build Coastguard Worker             if (!intel_gem_read_correlate_cpu_gpu_timestamp(device->fd,
1996*61046927SAndroid Build Coastguard Worker                                                             kmd_type,
1997*61046927SAndroid Build Coastguard Worker                                                             INTEL_ENGINE_CLASS_RENDER,
1998*61046927SAndroid Build Coastguard Worker                                                             0 /* engine_instance */,
1999*61046927SAndroid Build Coastguard Worker                                                             cpu_clock_id,
2000*61046927SAndroid Build Coastguard Worker                                                             &cpu_timestamp,
2001*61046927SAndroid Build Coastguard Worker                                                             &gpu_timestamp,
2002*61046927SAndroid Build Coastguard Worker                                                             &cpu_delta_timestamp))
2003*61046927SAndroid Build Coastguard Worker                return vk_device_set_lost(&device->vk, "Failed to read correlate timestamp %m");
2004*61046927SAndroid Build Coastguard Worker 
2005*61046927SAndroid Build Coastguard Worker             cpu_end_timestamp = cpu_timestamp + cpu_delta_timestamp;
2006*61046927SAndroid Build Coastguard Worker             if (is_cpu_time_domain(current)) {
2007*61046927SAndroid Build Coastguard Worker                pTimestamps[d] = cpu_timestamp;
2008*61046927SAndroid Build Coastguard Worker                pTimestamps[d + 1] = gpu_timestamp;
2009*61046927SAndroid Build Coastguard Worker             } else {
2010*61046927SAndroid Build Coastguard Worker                pTimestamps[d] = gpu_timestamp;
2011*61046927SAndroid Build Coastguard Worker                pTimestamps[d + 1] = cpu_end_timestamp;
2012*61046927SAndroid Build Coastguard Worker             }
2013*61046927SAndroid Build Coastguard Worker             max_clock_period = MAX2(max_clock_period, device_period);
2014*61046927SAndroid Build Coastguard Worker 
2015*61046927SAndroid Build Coastguard Worker             /* If we can consume a third element */
2016*61046927SAndroid Build Coastguard Worker             if ((d + 2) < timestampCount &&
2017*61046927SAndroid Build Coastguard Worker                 is_cpu_time_domain(current) &&
2018*61046927SAndroid Build Coastguard Worker                 current == pTimestampInfos[d + 2].timeDomain) {
2019*61046927SAndroid Build Coastguard Worker                pTimestamps[d + 2] = cpu_end_timestamp;
2020*61046927SAndroid Build Coastguard Worker                increment++;
2021*61046927SAndroid Build Coastguard Worker             }
2022*61046927SAndroid Build Coastguard Worker 
2023*61046927SAndroid Build Coastguard Worker             /* If we're the first element, we can replace begin */
2024*61046927SAndroid Build Coastguard Worker             if (d == 0 && cpu_clock_id == anv_get_default_cpu_clock_id())
2025*61046927SAndroid Build Coastguard Worker                begin = cpu_timestamp;
2026*61046927SAndroid Build Coastguard Worker 
2027*61046927SAndroid Build Coastguard Worker             /* If we're in the same clock domain as begin/end. We can set the end. */
2028*61046927SAndroid Build Coastguard Worker             if (cpu_clock_id == anv_get_default_cpu_clock_id())
2029*61046927SAndroid Build Coastguard Worker                end = cpu_end_timestamp;
2030*61046927SAndroid Build Coastguard Worker 
2031*61046927SAndroid Build Coastguard Worker             continue;
2032*61046927SAndroid Build Coastguard Worker          }
2033*61046927SAndroid Build Coastguard Worker       }
2034*61046927SAndroid Build Coastguard Worker 
2035*61046927SAndroid Build Coastguard Worker       /* fallback to regular method */
2036*61046927SAndroid Build Coastguard Worker       increment = 1;
2037*61046927SAndroid Build Coastguard Worker       switch (current) {
2038*61046927SAndroid Build Coastguard Worker       case VK_TIME_DOMAIN_DEVICE_KHR:
2039*61046927SAndroid Build Coastguard Worker          if (!intel_gem_read_render_timestamp(device->fd,
2040*61046927SAndroid Build Coastguard Worker                                               device->info->kmd_type,
2041*61046927SAndroid Build Coastguard Worker                                               &pTimestamps[d])) {
2042*61046927SAndroid Build Coastguard Worker             return vk_device_set_lost(&device->vk, "Failed to read the "
2043*61046927SAndroid Build Coastguard Worker                                       "TIMESTAMP register: %m");
2044*61046927SAndroid Build Coastguard Worker          }
2045*61046927SAndroid Build Coastguard Worker          max_clock_period = MAX2(max_clock_period, device_period);
2046*61046927SAndroid Build Coastguard Worker          break;
2047*61046927SAndroid Build Coastguard Worker       case VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR:
2048*61046927SAndroid Build Coastguard Worker          pTimestamps[d] = vk_clock_gettime(CLOCK_MONOTONIC);
2049*61046927SAndroid Build Coastguard Worker          max_clock_period = MAX2(max_clock_period, 1);
2050*61046927SAndroid Build Coastguard Worker          break;
2051*61046927SAndroid Build Coastguard Worker 
2052*61046927SAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_RAW
2053*61046927SAndroid Build Coastguard Worker       case VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR:
2054*61046927SAndroid Build Coastguard Worker          pTimestamps[d] = begin;
2055*61046927SAndroid Build Coastguard Worker          break;
2056*61046927SAndroid Build Coastguard Worker #endif
2057*61046927SAndroid Build Coastguard Worker       default:
2058*61046927SAndroid Build Coastguard Worker          pTimestamps[d] = 0;
2059*61046927SAndroid Build Coastguard Worker          break;
2060*61046927SAndroid Build Coastguard Worker       }
2061*61046927SAndroid Build Coastguard Worker    }
2062*61046927SAndroid Build Coastguard Worker 
2063*61046927SAndroid Build Coastguard Worker    /* If last timestamp was not get with has_correlate_timestamp method or
2064*61046927SAndroid Build Coastguard Worker     * if it was but last cpu clock is not the default one, get time again
2065*61046927SAndroid Build Coastguard Worker     */
2066*61046927SAndroid Build Coastguard Worker    if (increment == 1 || cpu_clock_id != anv_get_default_cpu_clock_id())
2067*61046927SAndroid Build Coastguard Worker       end = vk_clock_gettime(anv_get_default_cpu_clock_id());
2068*61046927SAndroid Build Coastguard Worker 
2069*61046927SAndroid Build Coastguard Worker    *pMaxDeviation = vk_time_max_deviation(begin, end, max_clock_period);
2070*61046927SAndroid Build Coastguard Worker 
2071*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
2072*61046927SAndroid Build Coastguard Worker }
2073*61046927SAndroid Build Coastguard Worker 
2074*61046927SAndroid Build Coastguard Worker const struct intel_device_info_pat_entry *
anv_device_get_pat_entry(struct anv_device * device,enum anv_bo_alloc_flags alloc_flags)2075*61046927SAndroid Build Coastguard Worker anv_device_get_pat_entry(struct anv_device *device,
2076*61046927SAndroid Build Coastguard Worker                          enum anv_bo_alloc_flags alloc_flags)
2077*61046927SAndroid Build Coastguard Worker {
2078*61046927SAndroid Build Coastguard Worker    if (alloc_flags & ANV_BO_ALLOC_IMPORTED)
2079*61046927SAndroid Build Coastguard Worker       return &device->info->pat.cached_coherent;
2080*61046927SAndroid Build Coastguard Worker 
2081*61046927SAndroid Build Coastguard Worker    if (alloc_flags & ANV_BO_ALLOC_COMPRESSED)
2082*61046927SAndroid Build Coastguard Worker       return &device->info->pat.compressed;
2083*61046927SAndroid Build Coastguard Worker 
2084*61046927SAndroid Build Coastguard Worker    /* PAT indexes has no actual effect in DG2 and DG1, smem caches will always
2085*61046927SAndroid Build Coastguard Worker     * be snopped by GPU and lmem will always be WC.
2086*61046927SAndroid Build Coastguard Worker     * This might change in future discrete platforms.
2087*61046927SAndroid Build Coastguard Worker     */
2088*61046927SAndroid Build Coastguard Worker    if (anv_physical_device_has_vram(device->physical)) {
2089*61046927SAndroid Build Coastguard Worker       if (alloc_flags & ANV_BO_ALLOC_NO_LOCAL_MEM)
2090*61046927SAndroid Build Coastguard Worker          return &device->info->pat.cached_coherent;
2091*61046927SAndroid Build Coastguard Worker       return &device->info->pat.writecombining;
2092*61046927SAndroid Build Coastguard Worker    }
2093*61046927SAndroid Build Coastguard Worker 
2094*61046927SAndroid Build Coastguard Worker    /* Integrated platforms handling only */
2095*61046927SAndroid Build Coastguard Worker    if ((alloc_flags & (ANV_BO_ALLOC_HOST_CACHED_COHERENT)) == ANV_BO_ALLOC_HOST_CACHED_COHERENT)
2096*61046927SAndroid Build Coastguard Worker       return &device->info->pat.cached_coherent;
2097*61046927SAndroid Build Coastguard Worker    else if (alloc_flags & (ANV_BO_ALLOC_EXTERNAL | ANV_BO_ALLOC_SCANOUT))
2098*61046927SAndroid Build Coastguard Worker       return &device->info->pat.scanout;
2099*61046927SAndroid Build Coastguard Worker    else if (alloc_flags & ANV_BO_ALLOC_HOST_CACHED)
2100*61046927SAndroid Build Coastguard Worker       return &device->info->pat.writeback_incoherent;
2101*61046927SAndroid Build Coastguard Worker    else
2102*61046927SAndroid Build Coastguard Worker       return &device->info->pat.writecombining;
2103*61046927SAndroid Build Coastguard Worker }
2104