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()19Resource::Resource() 20 { 21 mUse.init(); 22 } 23 ~Resource()24Resource::~Resource() 25 { 26 mUse.release(); 27 } 28 finishRunningCommands(ContextVk * contextVk)29angle::Result Resource::finishRunningCommands(ContextVk *contextVk) 30 { 31 return contextVk->finishToSerial(mUse.getSerial()); 32 } 33 waitForIdle(ContextVk * contextVk)34angle::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)56SharedGarbage::SharedGarbage(SharedGarbage &&other) 57 { 58 *this = std::move(other); 59 } 60 SharedGarbage(SharedResourceUse && use,std::vector<GarbageObject> && garbage)61SharedGarbage::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)67SharedGarbage &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)74bool 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()92ResourceUseList::~ResourceUseList() 93 { 94 ASSERT(mResourceUses.empty()); 95 } 96 releaseResourceUses()97void ResourceUseList::releaseResourceUses() 98 { 99 for (SharedResourceUse &use : mResourceUses) 100 { 101 use.release(); 102 } 103 104 mResourceUses.clear(); 105 } 106 releaseResourceUsesAndUpdateSerials(Serial serial)107void 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