1 /* 2 * Copyright 2019 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrDawnStagingManager_DEFINED 9 #define GrDawnStagingManager_DEFINED 10 11 #include <map> 12 #include <memory> 13 #include <vector> 14 15 #include "dawn/webgpu_cpp.h" 16 17 struct GrDawnStagingBuffer; 18 19 class GrDawnStagingManager { 20 public: 21 GrDawnStagingManager(wgpu::Device device); 22 ~GrDawnStagingManager(); 23 GrDawnStagingBuffer* findOrCreateStagingBuffer(size_t size); 24 25 void addToReadyPool(GrDawnStagingBuffer* buffer); 26 void mapBusyList(); 27 28 private: 29 wgpu::Device fDevice; 30 std::vector<std::unique_ptr<GrDawnStagingBuffer>> fBuffers; 31 std::multimap<size_t, GrDawnStagingBuffer*> fReadyPool; 32 std::vector<GrDawnStagingBuffer*> fBusyList; 33 int fWaitingCount = 0; 34 }; 35 36 struct GrDawnStagingBuffer { GrDawnStagingBufferGrDawnStagingBuffer37 GrDawnStagingBuffer(GrDawnStagingManager* manager, wgpu::Buffer buffer, size_t size, 38 void* data) 39 : fManager(manager), fBuffer(buffer), fSize(size), fData(data) {} ~GrDawnStagingBufferGrDawnStagingBuffer40 ~GrDawnStagingBuffer() { 41 fManager = nullptr; 42 } 43 GrDawnStagingManager* fManager; 44 wgpu::Buffer fBuffer; 45 size_t fSize; 46 void* fData; 47 }; 48 49 #endif 50