1 /* 2 * Copyright 2021 Google LLC 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 #include "experimental/graphite/include/Recorder.h" 9 10 #include "experimental/graphite/include/Recording.h" 11 #include "experimental/graphite/src/Caps.h" 12 #include "experimental/graphite/src/CommandBuffer.h" 13 #include "experimental/graphite/src/ContextPriv.h" 14 #include "experimental/graphite/src/Device.h" 15 #include "experimental/graphite/src/DrawBufferManager.h" 16 #include "experimental/graphite/src/GlobalCache.h" 17 #include "experimental/graphite/src/Gpu.h" 18 #include "experimental/graphite/src/ResourceProvider.h" 19 #include "experimental/graphite/src/TaskGraph.h" 20 #include "experimental/graphite/src/UniformCache.h" 21 #include "src/core/SkUniformData.h" 22 23 namespace skgpu { 24 25 #define ASSERT_SINGLE_OWNER SKGPU_ASSERT_SINGLE_OWNER(this->singleOwner()) 26 Recorder(sk_sp<Gpu> gpu,sk_sp<GlobalCache> globalCache)27Recorder::Recorder(sk_sp<Gpu> gpu, sk_sp<GlobalCache> globalCache) 28 : fGpu(std::move(gpu)) 29 , fGraph(new TaskGraph) 30 , fUniformCache(new UniformCache) { 31 32 fResourceProvider = fGpu->makeResourceProvider(std::move(globalCache), this->singleOwner()); 33 fDrawBufferManager.reset(new DrawBufferManager(fResourceProvider.get(), 34 fGpu->caps()->requiredUniformBufferAlignment())); 35 SkASSERT(fResourceProvider); 36 } 37 ~Recorder()38Recorder::~Recorder() { 39 ASSERT_SINGLE_OWNER 40 for (auto& device : fTrackedDevices) { 41 device->abandonRecorder(); 42 } 43 } 44 snap()45std::unique_ptr<Recording> Recorder::snap() { 46 ASSERT_SINGLE_OWNER 47 for (auto& device : fTrackedDevices) { 48 device->flushPendingWorkToRecorder(); 49 } 50 51 auto commandBuffer = fResourceProvider->createCommandBuffer(); 52 53 fGraph->addCommands(fResourceProvider.get(), commandBuffer.get()); 54 fDrawBufferManager->transferToCommandBuffer(commandBuffer.get()); 55 56 fGraph->reset(); 57 return std::unique_ptr<Recording>(new Recording(std::move(commandBuffer))); 58 } 59 registerDevice(Device * device)60void Recorder::registerDevice(Device* device) { 61 ASSERT_SINGLE_OWNER 62 fTrackedDevices.push_back(device); 63 } 64 deregisterDevice(const Device * device)65void Recorder::deregisterDevice(const Device* device) { 66 ASSERT_SINGLE_OWNER 67 for (auto it = fTrackedDevices.begin(); it != fTrackedDevices.end(); it++) { 68 if (*it == device) { 69 fTrackedDevices.erase(it); 70 return; 71 } 72 } 73 } 74 75 #if GR_TEST_UTILS deviceIsRegistered(Device * device)76bool Recorder::deviceIsRegistered(Device* device) { 77 for (auto& currentDevice : fTrackedDevices) { 78 if (device == currentDevice) { 79 return true; 80 } 81 } 82 return false; 83 } 84 #endif 85 86 } // namespace skgpu 87