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