• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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