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 struct vkr_context *ctx = dispatch->data;
16
17 struct vkr_device *dev = vkr_device_from_handle(args->device);
18
19 #ifdef FORCE_ENABLE_DMABUF
20 VkExternalMemoryBufferCreateInfo local_external_info;
21 if (dev->physical_device->EXT_external_memory_dma_buf) {
22 VkExternalMemoryBufferCreateInfo *external_info = vkr_find_pnext(
23 args->pCreateInfo->pNext, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO);
24 if (external_info) {
25 external_info->handleTypes |= VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
26 } else {
27 local_external_info = (const VkExternalMemoryBufferCreateInfo){
28 .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
29 .pNext = args->pCreateInfo->pNext,
30 .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
31 };
32 ((VkBufferCreateInfo *)args->pCreateInfo)->pNext = &local_external_info;
33 }
34 }
35 #endif
36
37 vkr_buffer_create_and_add(ctx, args);
38 }
39
40 static void
vkr_dispatch_vkDestroyBuffer(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyBuffer * args)41 vkr_dispatch_vkDestroyBuffer(struct vn_dispatch_context *dispatch,
42 struct vn_command_vkDestroyBuffer *args)
43 {
44 vkr_buffer_destroy_and_remove(dispatch->data, args);
45 }
46
47 static void
vkr_dispatch_vkGetBufferMemoryRequirements(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferMemoryRequirements * args)48 vkr_dispatch_vkGetBufferMemoryRequirements(
49 UNUSED struct vn_dispatch_context *dispatch,
50 struct vn_command_vkGetBufferMemoryRequirements *args)
51 {
52 vn_replace_vkGetBufferMemoryRequirements_args_handle(args);
53 vkGetBufferMemoryRequirements(args->device, args->buffer, args->pMemoryRequirements);
54 }
55
56 static void
vkr_dispatch_vkGetBufferMemoryRequirements2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferMemoryRequirements2 * args)57 vkr_dispatch_vkGetBufferMemoryRequirements2(
58 UNUSED struct vn_dispatch_context *dispatch,
59 struct vn_command_vkGetBufferMemoryRequirements2 *args)
60 {
61 vn_replace_vkGetBufferMemoryRequirements2_args_handle(args);
62 vkGetBufferMemoryRequirements2(args->device, args->pInfo, args->pMemoryRequirements);
63 }
64
65 static void
vkr_dispatch_vkBindBufferMemory(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindBufferMemory * args)66 vkr_dispatch_vkBindBufferMemory(UNUSED struct vn_dispatch_context *dispatch,
67 struct vn_command_vkBindBufferMemory *args)
68 {
69 vn_replace_vkBindBufferMemory_args_handle(args);
70 args->ret =
71 vkBindBufferMemory(args->device, args->buffer, args->memory, args->memoryOffset);
72 }
73
74 static void
vkr_dispatch_vkBindBufferMemory2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindBufferMemory2 * args)75 vkr_dispatch_vkBindBufferMemory2(UNUSED struct vn_dispatch_context *dispatch,
76 struct vn_command_vkBindBufferMemory2 *args)
77 {
78 vn_replace_vkBindBufferMemory2_args_handle(args);
79 args->ret = vkBindBufferMemory2(args->device, args->bindInfoCount, args->pBindInfos);
80 }
81
82 static void
vkr_dispatch_vkGetBufferOpaqueCaptureAddress(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferOpaqueCaptureAddress * args)83 vkr_dispatch_vkGetBufferOpaqueCaptureAddress(
84 UNUSED struct vn_dispatch_context *dispatch,
85 struct vn_command_vkGetBufferOpaqueCaptureAddress *args)
86 {
87 struct vkr_device *dev = vkr_device_from_handle(args->device);
88
89 vn_replace_vkGetBufferOpaqueCaptureAddress_args_handle(args);
90 args->ret = dev->GetBufferOpaqueCaptureAddress(args->device, args->pInfo);
91 }
92
93 static void
vkr_dispatch_vkGetBufferDeviceAddress(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferDeviceAddress * args)94 vkr_dispatch_vkGetBufferDeviceAddress(UNUSED struct vn_dispatch_context *dispatch,
95 struct vn_command_vkGetBufferDeviceAddress *args)
96 {
97 struct vkr_device *dev = vkr_device_from_handle(args->device);
98
99 vn_replace_vkGetBufferDeviceAddress_args_handle(args);
100 args->ret = dev->GetBufferDeviceAddress(args->device, args->pInfo);
101 }
102
103 static void
vkr_dispatch_vkCreateBufferView(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateBufferView * args)104 vkr_dispatch_vkCreateBufferView(struct vn_dispatch_context *dispatch,
105 struct vn_command_vkCreateBufferView *args)
106 {
107 vkr_buffer_view_create_and_add(dispatch->data, args);
108 }
109
110 static void
vkr_dispatch_vkDestroyBufferView(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyBufferView * args)111 vkr_dispatch_vkDestroyBufferView(struct vn_dispatch_context *dispatch,
112 struct vn_command_vkDestroyBufferView *args)
113 {
114 vkr_buffer_view_destroy_and_remove(dispatch->data, args);
115 }
116
117 void
vkr_context_init_buffer_dispatch(struct vkr_context * ctx)118 vkr_context_init_buffer_dispatch(struct vkr_context *ctx)
119 {
120 struct vn_dispatch_context *dispatch = &ctx->dispatch;
121
122 dispatch->dispatch_vkCreateBuffer = vkr_dispatch_vkCreateBuffer;
123 dispatch->dispatch_vkDestroyBuffer = vkr_dispatch_vkDestroyBuffer;
124 dispatch->dispatch_vkGetBufferMemoryRequirements =
125 vkr_dispatch_vkGetBufferMemoryRequirements;
126 dispatch->dispatch_vkGetBufferMemoryRequirements2 =
127 vkr_dispatch_vkGetBufferMemoryRequirements2;
128 dispatch->dispatch_vkBindBufferMemory = vkr_dispatch_vkBindBufferMemory;
129 dispatch->dispatch_vkBindBufferMemory2 = vkr_dispatch_vkBindBufferMemory2;
130 dispatch->dispatch_vkGetBufferOpaqueCaptureAddress =
131 vkr_dispatch_vkGetBufferOpaqueCaptureAddress;
132 dispatch->dispatch_vkGetBufferDeviceAddress = vkr_dispatch_vkGetBufferDeviceAddress;
133 }
134
135 void
vkr_context_init_buffer_view_dispatch(struct vkr_context * ctx)136 vkr_context_init_buffer_view_dispatch(struct vkr_context *ctx)
137 {
138 struct vn_dispatch_context *dispatch = &ctx->dispatch;
139
140 dispatch->dispatch_vkCreateBufferView = vkr_dispatch_vkCreateBufferView;
141 dispatch->dispatch_vkDestroyBufferView = vkr_dispatch_vkDestroyBufferView;
142 }
143