• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)27 Recorder::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()38 Recorder::~Recorder() {
39     ASSERT_SINGLE_OWNER
40     for (auto& device : fTrackedDevices) {
41         device->abandonRecorder();
42     }
43 }
44 
snap()45 std::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)60 void Recorder::registerDevice(Device* device) {
61     ASSERT_SINGLE_OWNER
62     fTrackedDevices.push_back(device);
63 }
64 
deregisterDevice(const Device * device)65 void 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)76 bool 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