• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // CLCommandQueueVk.h: Defines the class interface for CLCommandQueueVk,
7 // implementing CLCommandQueueImpl.
8 
9 #ifndef LIBANGLE_RENDERER_VULKAN_CLCOMMANDQUEUEVK_H_
10 #define LIBANGLE_RENDERER_VULKAN_CLCOMMANDQUEUEVK_H_
11 
12 #include <vector>
13 
14 #include "libANGLE/renderer/vulkan/CLContextVk.h"
15 #include "libANGLE/renderer/vulkan/CLEventVk.h"
16 #include "libANGLE/renderer/vulkan/CLKernelVk.h"
17 #include "libANGLE/renderer/vulkan/CLMemoryVk.h"
18 #include "libANGLE/renderer/vulkan/DisplayVk.h"
19 #include "libANGLE/renderer/vulkan/ShareGroupVk.h"
20 #include "libANGLE/renderer/vulkan/cl_types.h"
21 #include "libANGLE/renderer/vulkan/vk_command_buffer_utils.h"
22 #include "libANGLE/renderer/vulkan/vk_helpers.h"
23 #include "libANGLE/renderer/vulkan/vk_resource.h"
24 #include "libANGLE/renderer/vulkan/vk_utils.h"
25 #include "libANGLE/renderer/vulkan/vk_wrapper.h"
26 
27 #include "libANGLE/renderer/CLCommandQueueImpl.h"
28 
29 namespace rx
30 {
31 
32 class CLCommandQueueVk : public CLCommandQueueImpl
33 {
34   public:
35     CLCommandQueueVk(const cl::CommandQueue &commandQueue);
36     ~CLCommandQueueVk() override;
37 
38     angle::Result init();
39 
40     angle::Result setProperty(cl::CommandQueueProperties properties, cl_bool enable) override;
41 
42     angle::Result enqueueReadBuffer(const cl::Buffer &buffer,
43                                     bool blocking,
44                                     size_t offset,
45                                     size_t size,
46                                     void *ptr,
47                                     const cl::EventPtrs &waitEvents,
48                                     CLEventImpl::CreateFunc *eventCreateFunc) override;
49 
50     angle::Result enqueueWriteBuffer(const cl::Buffer &buffer,
51                                      bool blocking,
52                                      size_t offset,
53                                      size_t size,
54                                      const void *ptr,
55                                      const cl::EventPtrs &waitEvents,
56                                      CLEventImpl::CreateFunc *eventCreateFunc) override;
57 
58     angle::Result enqueueReadBufferRect(const cl::Buffer &buffer,
59                                         bool blocking,
60                                         const cl::MemOffsets &bufferOrigin,
61                                         const cl::MemOffsets &hostOrigin,
62                                         const cl::Coordinate &region,
63                                         size_t bufferRowPitch,
64                                         size_t bufferSlicePitch,
65                                         size_t hostRowPitch,
66                                         size_t hostSlicePitch,
67                                         void *ptr,
68                                         const cl::EventPtrs &waitEvents,
69                                         CLEventImpl::CreateFunc *eventCreateFunc) override;
70 
71     angle::Result enqueueWriteBufferRect(const cl::Buffer &buffer,
72                                          bool blocking,
73                                          const cl::MemOffsets &bufferOrigin,
74                                          const cl::MemOffsets &hostOrigin,
75                                          const cl::Coordinate &region,
76                                          size_t bufferRowPitch,
77                                          size_t bufferSlicePitch,
78                                          size_t hostRowPitch,
79                                          size_t hostSlicePitch,
80                                          const void *ptr,
81                                          const cl::EventPtrs &waitEvents,
82                                          CLEventImpl::CreateFunc *eventCreateFunc) override;
83 
84     angle::Result enqueueCopyBuffer(const cl::Buffer &srcBuffer,
85                                     const cl::Buffer &dstBuffer,
86                                     size_t srcOffset,
87                                     size_t dstOffset,
88                                     size_t size,
89                                     const cl::EventPtrs &waitEvents,
90                                     CLEventImpl::CreateFunc *eventCreateFunc) override;
91 
92     angle::Result enqueueCopyBufferRect(const cl::Buffer &srcBuffer,
93                                         const cl::Buffer &dstBuffer,
94                                         const cl::MemOffsets &srcOrigin,
95                                         const cl::MemOffsets &dstOrigin,
96                                         const cl::Coordinate &region,
97                                         size_t srcRowPitch,
98                                         size_t srcSlicePitch,
99                                         size_t dstRowPitch,
100                                         size_t dstSlicePitch,
101                                         const cl::EventPtrs &waitEvents,
102                                         CLEventImpl::CreateFunc *eventCreateFunc) override;
103 
104     angle::Result enqueueFillBuffer(const cl::Buffer &buffer,
105                                     const void *pattern,
106                                     size_t patternSize,
107                                     size_t offset,
108                                     size_t size,
109                                     const cl::EventPtrs &waitEvents,
110                                     CLEventImpl::CreateFunc *eventCreateFunc) override;
111 
112     angle::Result enqueueMapBuffer(const cl::Buffer &buffer,
113                                    bool blocking,
114                                    cl::MapFlags mapFlags,
115                                    size_t offset,
116                                    size_t size,
117                                    const cl::EventPtrs &waitEvents,
118                                    CLEventImpl::CreateFunc *eventCreateFunc,
119                                    void *&mapPtr) override;
120 
121     angle::Result enqueueReadImage(const cl::Image &image,
122                                    bool blocking,
123                                    const cl::MemOffsets &origin,
124                                    const cl::Coordinate &region,
125                                    size_t rowPitch,
126                                    size_t slicePitch,
127                                    void *ptr,
128                                    const cl::EventPtrs &waitEvents,
129                                    CLEventImpl::CreateFunc *eventCreateFunc) override;
130 
131     angle::Result enqueueWriteImage(const cl::Image &image,
132                                     bool blocking,
133                                     const cl::MemOffsets &origin,
134                                     const cl::Coordinate &region,
135                                     size_t inputRowPitch,
136                                     size_t inputSlicePitch,
137                                     const void *ptr,
138                                     const cl::EventPtrs &waitEvents,
139                                     CLEventImpl::CreateFunc *eventCreateFunc) override;
140 
141     angle::Result enqueueCopyImage(const cl::Image &srcImage,
142                                    const cl::Image &dstImage,
143                                    const cl::MemOffsets &srcOrigin,
144                                    const cl::MemOffsets &dstOrigin,
145                                    const cl::Coordinate &region,
146                                    const cl::EventPtrs &waitEvents,
147                                    CLEventImpl::CreateFunc *eventCreateFunc) override;
148 
149     angle::Result enqueueFillImage(const cl::Image &image,
150                                    const void *fillColor,
151                                    const cl::MemOffsets &origin,
152                                    const cl::Coordinate &region,
153                                    const cl::EventPtrs &waitEvents,
154                                    CLEventImpl::CreateFunc *eventCreateFunc) override;
155 
156     angle::Result enqueueCopyImageToBuffer(const cl::Image &srcImage,
157                                            const cl::Buffer &dstBuffer,
158                                            const cl::MemOffsets &srcOrigin,
159                                            const cl::Coordinate &region,
160                                            size_t dstOffset,
161                                            const cl::EventPtrs &waitEvents,
162                                            CLEventImpl::CreateFunc *eventCreateFunc) override;
163 
164     angle::Result enqueueCopyBufferToImage(const cl::Buffer &srcBuffer,
165                                            const cl::Image &dstImage,
166                                            size_t srcOffset,
167                                            const cl::MemOffsets &dstOrigin,
168                                            const cl::Coordinate &region,
169                                            const cl::EventPtrs &waitEvents,
170                                            CLEventImpl::CreateFunc *eventCreateFunc) override;
171 
172     angle::Result enqueueMapImage(const cl::Image &image,
173                                   bool blocking,
174                                   cl::MapFlags mapFlags,
175                                   const cl::MemOffsets &origin,
176                                   const cl::Coordinate &region,
177                                   size_t *imageRowPitch,
178                                   size_t *imageSlicePitch,
179                                   const cl::EventPtrs &waitEvents,
180                                   CLEventImpl::CreateFunc *eventCreateFunc,
181                                   void *&mapPtr) override;
182 
183     angle::Result enqueueUnmapMemObject(const cl::Memory &memory,
184                                         void *mappedPtr,
185                                         const cl::EventPtrs &waitEvents,
186                                         CLEventImpl::CreateFunc *eventCreateFunc) override;
187 
188     angle::Result enqueueMigrateMemObjects(const cl::MemoryPtrs &memObjects,
189                                            cl::MemMigrationFlags flags,
190                                            const cl::EventPtrs &waitEvents,
191                                            CLEventImpl::CreateFunc *eventCreateFunc) override;
192 
193     angle::Result enqueueNDRangeKernel(const cl::Kernel &kernel,
194                                        const cl::NDRange &ndrange,
195                                        const cl::EventPtrs &waitEvents,
196                                        CLEventImpl::CreateFunc *eventCreateFunc) override;
197 
198     angle::Result enqueueTask(const cl::Kernel &kernel,
199                               const cl::EventPtrs &waitEvents,
200                               CLEventImpl::CreateFunc *eventCreateFunc) override;
201 
202     angle::Result enqueueNativeKernel(cl::UserFunc userFunc,
203                                       void *args,
204                                       size_t cbArgs,
205                                       const cl::BufferPtrs &buffers,
206                                       const std::vector<size_t> bufferPtrOffsets,
207                                       const cl::EventPtrs &waitEvents,
208                                       CLEventImpl::CreateFunc *eventCreateFunc) override;
209 
210     angle::Result enqueueMarkerWithWaitList(const cl::EventPtrs &waitEvents,
211                                             CLEventImpl::CreateFunc *eventCreateFunc) override;
212 
213     angle::Result enqueueMarker(CLEventImpl::CreateFunc &eventCreateFunc) override;
214 
215     angle::Result enqueueWaitForEvents(const cl::EventPtrs &events) override;
216 
217     angle::Result enqueueBarrierWithWaitList(const cl::EventPtrs &waitEvents,
218                                              CLEventImpl::CreateFunc *eventCreateFunc) override;
219 
220     angle::Result enqueueBarrier() override;
221 
222     angle::Result flush() override;
223 
224     angle::Result finish() override;
225 
getPlatform()226     CLPlatformVk *getPlatform() { return mContext->getPlatform(); }
227 
228   private:
229     static constexpr size_t kMaxDependencyTrackerSize    = 64;
230     static constexpr size_t kMaxHostBufferUpdateListSize = 16;
231 
getProtectionType()232     vk::ProtectionType getProtectionType() const { return vk::ProtectionType::Unprotected; }
233 
234     // Create-update-bind the kernel's descriptor set, put push-constants in cmd buffer, capture
235     // kernel resources, and handle kernel execution dependencies
236     angle::Result processKernelResources(CLKernelVk &kernelVk, const cl::NDRange &ndrange);
237 
238     angle::Result submitCommands();
239     angle::Result finishInternal();
240     angle::Result syncHostBuffers();
241     angle::Result flushComputePassCommands();
242     angle::Result processWaitlist(const cl::EventPtrs &waitEvents);
243     angle::Result createEvent(CLEventImpl::CreateFunc *createFunc);
244 
245     CLContextVk *mContext;
246     const CLDeviceVk *mDevice;
247 
248     vk::SecondaryCommandPools mCommandPool;
249     vk::OutsideRenderPassCommandBufferHelper *mComputePassCommands;
250     vk::SecondaryCommandMemoryAllocator mOutsideRenderPassCommandsAllocator;
251     SerialIndex mCurrentQueueSerialIndex;
252     QueueSerial mLastSubmittedQueueSerial;
253     QueueSerial mLastFlushedQueueSerial;
254     std::mutex mCommandQueueMutex;
255 
256     // Created event objects associated with this command queue
257     cl::EventPtrs mAssociatedEvents;
258 
259     // Dependant event(s) that this queue has to wait on
260     cl::EventPtrs mDependantEvents;
261 
262     // Keep track of kernel resources on prior kernel enqueues
263     angle::HashSet<cl::Object *> mDependencyTracker;
264 
265     // Resource reference capturing during execution
266     cl::MemoryPtrs mMemoryCaptures;
267 
268     // Check to see if flush/finish can be skipped
269     bool mHasAnyCommandsPendingSubmission;
270 
271     // List of buffer refs that need host syncing
272     cl::MemoryPtrs mHostBufferUpdateList;
273 };
274 
275 }  // namespace rx
276 
277 #endif  // LIBANGLE_RENDERER_VULKAN_CLCOMMANDQUEUEVK_H_
278