xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_buffer.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
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