1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker * Copyright 2020 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker */
5*bbecb9d1SAndroid Build Coastguard Worker
6*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_buffer.h"
7*bbecb9d1SAndroid Build Coastguard Worker
8*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_buffer_gen.h"
9*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_physical_device.h"
10*bbecb9d1SAndroid Build Coastguard Worker
11*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkCreateBuffer(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateBuffer * args)12*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkCreateBuffer(struct vn_dispatch_context *dispatch,
13*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkCreateBuffer *args)
14*bbecb9d1SAndroid Build Coastguard Worker {
15*bbecb9d1SAndroid Build Coastguard Worker /* XXX If VkExternalMemoryBufferCreateInfo is chained by the app, all is
16*bbecb9d1SAndroid Build Coastguard Worker * good. If it is not chained, we might still bind an external memory to
17*bbecb9d1SAndroid Build Coastguard Worker * the buffer, because vkr_dispatch_vkAllocateMemory makes any HOST_VISIBLE
18*bbecb9d1SAndroid Build Coastguard Worker * memory external. That is a spec violation.
19*bbecb9d1SAndroid Build Coastguard Worker *
20*bbecb9d1SAndroid Build Coastguard Worker * We could unconditionally chain VkExternalMemoryBufferCreateInfo. Or we
21*bbecb9d1SAndroid Build Coastguard Worker * could call vkGetPhysicalDeviceExternalBufferProperties and fail
22*bbecb9d1SAndroid Build Coastguard Worker * vkCreateBuffer if the buffer does not support external memory. But we
23*bbecb9d1SAndroid Build Coastguard Worker * would still end up with spec violation either way, while having a higher
24*bbecb9d1SAndroid Build Coastguard Worker * chance of causing compatibility issues.
25*bbecb9d1SAndroid Build Coastguard Worker *
26*bbecb9d1SAndroid Build Coastguard Worker * In practice, drivers usually ignore VkExternalMemoryBufferCreateInfo, or
27*bbecb9d1SAndroid Build Coastguard Worker * use it to filter out memory types in VkMemoryRequirements that do not
28*bbecb9d1SAndroid Build Coastguard Worker * support external memory. Binding an external memory to a buffer created
29*bbecb9d1SAndroid Build Coastguard Worker * without VkExternalMemoryBufferCreateInfo usually works.
30*bbecb9d1SAndroid Build Coastguard Worker *
31*bbecb9d1SAndroid Build Coastguard Worker * To formalize this, we are potentially looking for an extension that
32*bbecb9d1SAndroid Build Coastguard Worker * supports exporting memories without making them external. Because they
33*bbecb9d1SAndroid Build Coastguard Worker * are not external, they can be bound to buffers created without
34*bbecb9d1SAndroid Build Coastguard Worker * VkExternalMemoryBufferCreateInfo. And because they are not external, we
35*bbecb9d1SAndroid Build Coastguard Worker * need something that is not vkGetPhysicalDeviceExternalBufferProperties
36*bbecb9d1SAndroid Build Coastguard Worker * to determine the exportability. See
37*bbecb9d1SAndroid Build Coastguard Worker * vkr_physical_device_init_memory_properties as well.
38*bbecb9d1SAndroid Build Coastguard Worker */
39*bbecb9d1SAndroid Build Coastguard Worker
40*bbecb9d1SAndroid Build Coastguard Worker vkr_buffer_create_and_add(dispatch->data, args);
41*bbecb9d1SAndroid Build Coastguard Worker }
42*bbecb9d1SAndroid Build Coastguard Worker
43*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkDestroyBuffer(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyBuffer * args)44*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkDestroyBuffer(struct vn_dispatch_context *dispatch,
45*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkDestroyBuffer *args)
46*bbecb9d1SAndroid Build Coastguard Worker {
47*bbecb9d1SAndroid Build Coastguard Worker vkr_buffer_destroy_and_remove(dispatch->data, args);
48*bbecb9d1SAndroid Build Coastguard Worker }
49*bbecb9d1SAndroid Build Coastguard Worker
50*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetBufferMemoryRequirements(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferMemoryRequirements * args)51*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetBufferMemoryRequirements(
52*bbecb9d1SAndroid Build Coastguard Worker UNUSED struct vn_dispatch_context *dispatch,
53*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkGetBufferMemoryRequirements *args)
54*bbecb9d1SAndroid Build Coastguard Worker {
55*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device *dev = vkr_device_from_handle(args->device);
56*bbecb9d1SAndroid Build Coastguard Worker struct vn_device_proc_table *vk = &dev->proc_table;
57*bbecb9d1SAndroid Build Coastguard Worker
58*bbecb9d1SAndroid Build Coastguard Worker vn_replace_vkGetBufferMemoryRequirements_args_handle(args);
59*bbecb9d1SAndroid Build Coastguard Worker vk->GetBufferMemoryRequirements(args->device, args->buffer, args->pMemoryRequirements);
60*bbecb9d1SAndroid Build Coastguard Worker }
61*bbecb9d1SAndroid Build Coastguard Worker
62*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetBufferMemoryRequirements2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferMemoryRequirements2 * args)63*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetBufferMemoryRequirements2(
64*bbecb9d1SAndroid Build Coastguard Worker UNUSED struct vn_dispatch_context *dispatch,
65*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkGetBufferMemoryRequirements2 *args)
66*bbecb9d1SAndroid Build Coastguard Worker {
67*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device *dev = vkr_device_from_handle(args->device);
68*bbecb9d1SAndroid Build Coastguard Worker struct vn_device_proc_table *vk = &dev->proc_table;
69*bbecb9d1SAndroid Build Coastguard Worker
70*bbecb9d1SAndroid Build Coastguard Worker vn_replace_vkGetBufferMemoryRequirements2_args_handle(args);
71*bbecb9d1SAndroid Build Coastguard Worker vk->GetBufferMemoryRequirements2(args->device, args->pInfo, args->pMemoryRequirements);
72*bbecb9d1SAndroid Build Coastguard Worker }
73*bbecb9d1SAndroid Build Coastguard Worker
74*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkBindBufferMemory(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindBufferMemory * args)75*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkBindBufferMemory(UNUSED struct vn_dispatch_context *dispatch,
76*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkBindBufferMemory *args)
77*bbecb9d1SAndroid Build Coastguard Worker {
78*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device *dev = vkr_device_from_handle(args->device);
79*bbecb9d1SAndroid Build Coastguard Worker struct vn_device_proc_table *vk = &dev->proc_table;
80*bbecb9d1SAndroid Build Coastguard Worker
81*bbecb9d1SAndroid Build Coastguard Worker vn_replace_vkBindBufferMemory_args_handle(args);
82*bbecb9d1SAndroid Build Coastguard Worker args->ret =
83*bbecb9d1SAndroid Build Coastguard Worker vk->BindBufferMemory(args->device, args->buffer, args->memory, args->memoryOffset);
84*bbecb9d1SAndroid Build Coastguard Worker }
85*bbecb9d1SAndroid Build Coastguard Worker
86*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkBindBufferMemory2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindBufferMemory2 * args)87*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkBindBufferMemory2(UNUSED struct vn_dispatch_context *dispatch,
88*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkBindBufferMemory2 *args)
89*bbecb9d1SAndroid Build Coastguard Worker {
90*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device *dev = vkr_device_from_handle(args->device);
91*bbecb9d1SAndroid Build Coastguard Worker struct vn_device_proc_table *vk = &dev->proc_table;
92*bbecb9d1SAndroid Build Coastguard Worker
93*bbecb9d1SAndroid Build Coastguard Worker vn_replace_vkBindBufferMemory2_args_handle(args);
94*bbecb9d1SAndroid Build Coastguard Worker args->ret = vk->BindBufferMemory2(args->device, args->bindInfoCount, args->pBindInfos);
95*bbecb9d1SAndroid Build Coastguard Worker }
96*bbecb9d1SAndroid Build Coastguard Worker
97*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetBufferOpaqueCaptureAddress(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferOpaqueCaptureAddress * args)98*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetBufferOpaqueCaptureAddress(
99*bbecb9d1SAndroid Build Coastguard Worker UNUSED struct vn_dispatch_context *dispatch,
100*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkGetBufferOpaqueCaptureAddress *args)
101*bbecb9d1SAndroid Build Coastguard Worker {
102*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device *dev = vkr_device_from_handle(args->device);
103*bbecb9d1SAndroid Build Coastguard Worker struct vn_device_proc_table *vk = &dev->proc_table;
104*bbecb9d1SAndroid Build Coastguard Worker
105*bbecb9d1SAndroid Build Coastguard Worker vn_replace_vkGetBufferOpaqueCaptureAddress_args_handle(args);
106*bbecb9d1SAndroid Build Coastguard Worker args->ret = vk->GetBufferOpaqueCaptureAddress(args->device, args->pInfo);
107*bbecb9d1SAndroid Build Coastguard Worker }
108*bbecb9d1SAndroid Build Coastguard Worker
109*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetBufferDeviceAddress(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferDeviceAddress * args)110*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetBufferDeviceAddress(UNUSED struct vn_dispatch_context *dispatch,
111*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkGetBufferDeviceAddress *args)
112*bbecb9d1SAndroid Build Coastguard Worker {
113*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device *dev = vkr_device_from_handle(args->device);
114*bbecb9d1SAndroid Build Coastguard Worker struct vn_device_proc_table *vk = &dev->proc_table;
115*bbecb9d1SAndroid Build Coastguard Worker
116*bbecb9d1SAndroid Build Coastguard Worker vn_replace_vkGetBufferDeviceAddress_args_handle(args);
117*bbecb9d1SAndroid Build Coastguard Worker args->ret = vk->GetBufferDeviceAddress(args->device, args->pInfo);
118*bbecb9d1SAndroid Build Coastguard Worker }
119*bbecb9d1SAndroid Build Coastguard Worker
120*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkCreateBufferView(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateBufferView * args)121*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkCreateBufferView(struct vn_dispatch_context *dispatch,
122*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkCreateBufferView *args)
123*bbecb9d1SAndroid Build Coastguard Worker {
124*bbecb9d1SAndroid Build Coastguard Worker vkr_buffer_view_create_and_add(dispatch->data, args);
125*bbecb9d1SAndroid Build Coastguard Worker }
126*bbecb9d1SAndroid Build Coastguard Worker
127*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkDestroyBufferView(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyBufferView * args)128*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkDestroyBufferView(struct vn_dispatch_context *dispatch,
129*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkDestroyBufferView *args)
130*bbecb9d1SAndroid Build Coastguard Worker {
131*bbecb9d1SAndroid Build Coastguard Worker vkr_buffer_view_destroy_and_remove(dispatch->data, args);
132*bbecb9d1SAndroid Build Coastguard Worker }
133*bbecb9d1SAndroid Build Coastguard Worker
134*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetDeviceBufferMemoryRequirements(UNUSED struct vn_dispatch_context * ctx,struct vn_command_vkGetDeviceBufferMemoryRequirements * args)135*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetDeviceBufferMemoryRequirements(
136*bbecb9d1SAndroid Build Coastguard Worker UNUSED struct vn_dispatch_context *ctx,
137*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkGetDeviceBufferMemoryRequirements *args)
138*bbecb9d1SAndroid Build Coastguard Worker {
139*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device *dev = vkr_device_from_handle(args->device);
140*bbecb9d1SAndroid Build Coastguard Worker struct vn_device_proc_table *vk = &dev->proc_table;
141*bbecb9d1SAndroid Build Coastguard Worker
142*bbecb9d1SAndroid Build Coastguard Worker vn_replace_vkGetDeviceBufferMemoryRequirements_args_handle(args);
143*bbecb9d1SAndroid Build Coastguard Worker vk->GetDeviceBufferMemoryRequirements(args->device, args->pInfo,
144*bbecb9d1SAndroid Build Coastguard Worker args->pMemoryRequirements);
145*bbecb9d1SAndroid Build Coastguard Worker }
146*bbecb9d1SAndroid Build Coastguard Worker
147*bbecb9d1SAndroid Build Coastguard Worker void
vkr_context_init_buffer_dispatch(struct vkr_context * ctx)148*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_buffer_dispatch(struct vkr_context *ctx)
149*bbecb9d1SAndroid Build Coastguard Worker {
150*bbecb9d1SAndroid Build Coastguard Worker struct vn_dispatch_context *dispatch = &ctx->dispatch;
151*bbecb9d1SAndroid Build Coastguard Worker
152*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkCreateBuffer = vkr_dispatch_vkCreateBuffer;
153*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkDestroyBuffer = vkr_dispatch_vkDestroyBuffer;
154*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkGetBufferMemoryRequirements =
155*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetBufferMemoryRequirements;
156*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkGetBufferMemoryRequirements2 =
157*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetBufferMemoryRequirements2;
158*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkBindBufferMemory = vkr_dispatch_vkBindBufferMemory;
159*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkBindBufferMemory2 = vkr_dispatch_vkBindBufferMemory2;
160*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkGetBufferOpaqueCaptureAddress =
161*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetBufferOpaqueCaptureAddress;
162*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkGetBufferDeviceAddress = vkr_dispatch_vkGetBufferDeviceAddress;
163*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkGetDeviceBufferMemoryRequirements =
164*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetDeviceBufferMemoryRequirements;
165*bbecb9d1SAndroid Build Coastguard Worker }
166*bbecb9d1SAndroid Build Coastguard Worker
167*bbecb9d1SAndroid Build Coastguard Worker void
vkr_context_init_buffer_view_dispatch(struct vkr_context * ctx)168*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_buffer_view_dispatch(struct vkr_context *ctx)
169*bbecb9d1SAndroid Build Coastguard Worker {
170*bbecb9d1SAndroid Build Coastguard Worker struct vn_dispatch_context *dispatch = &ctx->dispatch;
171*bbecb9d1SAndroid Build Coastguard Worker
172*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkCreateBufferView = vkr_dispatch_vkCreateBufferView;
173*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkDestroyBufferView = vkr_dispatch_vkDestroyBufferView;
174*bbecb9d1SAndroid Build Coastguard Worker }
175