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