• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2017 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 // Resource:
7 //    Resource lifetime tracking in the Vulkan back-end.
8 //
9 
10 #include "libANGLE/renderer/vulkan/ResourceVk.h"
11 
12 #include "libANGLE/renderer/vulkan/ContextVk.h"
13 
14 namespace rx
15 {
16 namespace vk
17 {
18 // Resource implementation.
Resource()19 Resource::Resource()
20 {
21     mUse.init();
22 }
23 
~Resource()24 Resource::~Resource()
25 {
26     mUse.release();
27 }
28 
finishRunningCommands(ContextVk * contextVk)29 angle::Result Resource::finishRunningCommands(ContextVk *contextVk)
30 {
31     return contextVk->finishToSerial(mUse.getSerial());
32 }
33 
waitForIdle(ContextVk * contextVk)34 angle::Result Resource::waitForIdle(ContextVk *contextVk)
35 {
36     // If there are pending commands for the resource, flush them.
37     if (usedInRecordedCommands())
38     {
39         ANGLE_TRY(contextVk->flushImpl(nullptr));
40     }
41 
42     // Make sure the driver is done with the resource.
43     if (usedInRunningCommands(contextVk->getLastCompletedQueueSerial()))
44     {
45         ANGLE_TRY(finishRunningCommands(contextVk));
46     }
47 
48     ASSERT(!isCurrentlyInUse(contextVk->getLastCompletedQueueSerial()));
49 
50     return angle::Result::Continue;
51 }
52 
53 // SharedGarbage implementation.
54 SharedGarbage::SharedGarbage() = default;
55 
SharedGarbage(SharedGarbage && other)56 SharedGarbage::SharedGarbage(SharedGarbage &&other)
57 {
58     *this = std::move(other);
59 }
60 
SharedGarbage(SharedResourceUse && use,std::vector<GarbageObject> && garbage)61 SharedGarbage::SharedGarbage(SharedResourceUse &&use, std::vector<GarbageObject> &&garbage)
62     : mLifetime(std::move(use)), mGarbage(std::move(garbage))
63 {}
64 
65 SharedGarbage::~SharedGarbage() = default;
66 
operator =(SharedGarbage && rhs)67 SharedGarbage &SharedGarbage::operator=(SharedGarbage &&rhs)
68 {
69     std::swap(mLifetime, rhs.mLifetime);
70     std::swap(mGarbage, rhs.mGarbage);
71     return *this;
72 }
73 
destroyIfComplete(RendererVk * renderer,Serial completedSerial)74 bool SharedGarbage::destroyIfComplete(RendererVk *renderer, Serial completedSerial)
75 {
76     if (mLifetime.isCurrentlyInUse(completedSerial))
77         return false;
78 
79     mLifetime.release();
80 
81     for (GarbageObject &object : mGarbage)
82     {
83         object.destroy(renderer);
84     }
85 
86     return true;
87 }
88 
89 // ResourceUseList implementation.
90 ResourceUseList::ResourceUseList() = default;
91 
~ResourceUseList()92 ResourceUseList::~ResourceUseList()
93 {
94     ASSERT(mResourceUses.empty());
95 }
96 
releaseResourceUses()97 void ResourceUseList::releaseResourceUses()
98 {
99     for (SharedResourceUse &use : mResourceUses)
100     {
101         use.release();
102     }
103 
104     mResourceUses.clear();
105 }
106 
releaseResourceUsesAndUpdateSerials(Serial serial)107 void ResourceUseList::releaseResourceUsesAndUpdateSerials(Serial serial)
108 {
109     for (SharedResourceUse &use : mResourceUses)
110     {
111         use.releaseAndUpdateSerial(serial);
112     }
113 
114     mResourceUses.clear();
115 }
116 }  // namespace vk
117 }  // namespace rx
118