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 ®ion, 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 ®ion, 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 ®ion, 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 ®ion, 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 ®ion, 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 ®ion, 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 ®ion, 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 ®ion, 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 ®ion, 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 ®ion, 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