Merge "Have GrContext hold a strong ref to VulkanManager" into udc-dev

This commit is contained in:
John Reck
2023-05-02 18:37:28 +00:00
committed by Android (Google) Code Review
3 changed files with 30 additions and 8 deletions

View File

@@ -29,6 +29,7 @@
#include "Layer.h"
#include "Properties.h"
#include "RenderThread.h"
#include "VulkanManager.h"
#include "pipeline/skia/ATraceMemoryDump.h"
#include "pipeline/skia/ShaderCache.h"
#include "pipeline/skia/SkiaMemoryTracer.h"
@@ -182,8 +183,14 @@ void CacheManager::dumpMemoryUsage(String8& log, const RenderState* renderState)
}
log.appendFormat("Contexts: %zu (stopped = %zu)\n", mCanvasContexts.size(), stoppedContexts);
auto vkInstance = VulkanManager::peekInstance();
if (!mGrContext) {
log.appendFormat("No GPU context.\n");
if (!vkInstance) {
log.appendFormat("No GPU context.\n");
} else {
log.appendFormat("No GrContext; however %d remaining Vulkan refs",
vkInstance->getStrongCount() - 1);
}
return;
}
std::vector<skiapipeline::ResourcePair> cpuResourceMap = {

View File

@@ -107,11 +107,11 @@ GrVkGetProc VulkanManager::sSkiaGetProp = [](const char* proc_name, VkInstance i
#define GET_INST_PROC(F) m##F = (PFN_vk##F)vkGetInstanceProcAddr(mInstance, "vk" #F)
#define GET_DEV_PROC(F) m##F = (PFN_vk##F)vkGetDeviceProcAddr(mDevice, "vk" #F)
sp<VulkanManager> VulkanManager::getInstance() {
// cache a weakptr to the context to enable a second thread to share the same vulkan state
static wp<VulkanManager> sWeakInstance = nullptr;
static std::mutex sLock;
// cache a weakptr to the context to enable a second thread to share the same vulkan state
static wp<VulkanManager> sWeakInstance = nullptr;
static std::mutex sLock;
sp<VulkanManager> VulkanManager::getInstance() {
std::lock_guard _lock{sLock};
sp<VulkanManager> vulkanManager = sWeakInstance.promote();
if (!vulkanManager.get()) {
@@ -122,6 +122,11 @@ sp<VulkanManager> VulkanManager::getInstance() {
return vulkanManager;
}
sp<VulkanManager> VulkanManager::peekInstance() {
std::lock_guard _lock{sLock};
return sWeakInstance.promote();
}
VulkanManager::~VulkanManager() {
if (mDevice != VK_NULL_HANDLE) {
mDeviceWaitIdle(mDevice);
@@ -404,9 +409,13 @@ void VulkanManager::initialize() {
}
}
sk_sp<GrDirectContext> VulkanManager::createContext(const GrContextOptions& options,
ContextType contextType) {
static void onGrContextReleased(void* context) {
VulkanManager* manager = (VulkanManager*)context;
manager->decStrong((void*)onGrContextReleased);
}
sk_sp<GrDirectContext> VulkanManager::createContext(GrContextOptions& options,
ContextType contextType) {
GrVkBackendContext backendContext;
backendContext.fInstance = mInstance;
backendContext.fPhysicalDevice = mPhysicalDevice;
@@ -418,6 +427,11 @@ sk_sp<GrDirectContext> VulkanManager::createContext(const GrContextOptions& opti
backendContext.fDeviceFeatures2 = &mPhysicalDeviceFeatures2;
backendContext.fGetProc = sSkiaGetProp;
LOG_ALWAYS_FATAL_IF(options.fContextDeleteProc != nullptr, "Conflicting fContextDeleteProcs!");
this->incStrong((void*)onGrContextReleased);
options.fContextDeleteContext = this;
options.fContextDeleteProc = onGrContextReleased;
return GrDirectContext::MakeVulkan(backendContext, options);
}

View File

@@ -66,6 +66,7 @@ class RenderThread;
class VulkanManager final : public RefBase {
public:
static sp<VulkanManager> getInstance();
static sp<VulkanManager> peekInstance();
// Sets up the vulkan context that is shared amonst all clients of the VulkanManager. This must
// be call once before use of the VulkanManager. Multiple calls after the first will simiply
@@ -109,7 +110,7 @@ public:
};
// returns a Skia graphic context used to draw content on the specified thread
sk_sp<GrDirectContext> createContext(const GrContextOptions& options,
sk_sp<GrDirectContext> createContext(GrContextOptions& options,
ContextType contextType = ContextType::kRenderThread);
uint32_t getDriverVersion() const { return mDriverVersion; }