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 "Layer.h"
#include "Properties.h" #include "Properties.h"
#include "RenderThread.h" #include "RenderThread.h"
#include "VulkanManager.h"
#include "pipeline/skia/ATraceMemoryDump.h" #include "pipeline/skia/ATraceMemoryDump.h"
#include "pipeline/skia/ShaderCache.h" #include "pipeline/skia/ShaderCache.h"
#include "pipeline/skia/SkiaMemoryTracer.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); log.appendFormat("Contexts: %zu (stopped = %zu)\n", mCanvasContexts.size(), stoppedContexts);
auto vkInstance = VulkanManager::peekInstance();
if (!mGrContext) { if (!mGrContext) {
if (!vkInstance) {
log.appendFormat("No GPU context.\n"); log.appendFormat("No GPU context.\n");
} else {
log.appendFormat("No GrContext; however %d remaining Vulkan refs",
vkInstance->getStrongCount() - 1);
}
return; return;
} }
std::vector<skiapipeline::ResourcePair> cpuResourceMap = { 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_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) #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
// cache a weakptr to the context to enable a second thread to share the same vulkan state static wp<VulkanManager> sWeakInstance = nullptr;
static wp<VulkanManager> sWeakInstance = nullptr; static std::mutex sLock;
static std::mutex sLock;
sp<VulkanManager> VulkanManager::getInstance() {
std::lock_guard _lock{sLock}; std::lock_guard _lock{sLock};
sp<VulkanManager> vulkanManager = sWeakInstance.promote(); sp<VulkanManager> vulkanManager = sWeakInstance.promote();
if (!vulkanManager.get()) { if (!vulkanManager.get()) {
@@ -122,6 +122,11 @@ sp<VulkanManager> VulkanManager::getInstance() {
return vulkanManager; return vulkanManager;
} }
sp<VulkanManager> VulkanManager::peekInstance() {
std::lock_guard _lock{sLock};
return sWeakInstance.promote();
}
VulkanManager::~VulkanManager() { VulkanManager::~VulkanManager() {
if (mDevice != VK_NULL_HANDLE) { if (mDevice != VK_NULL_HANDLE) {
mDeviceWaitIdle(mDevice); mDeviceWaitIdle(mDevice);
@@ -404,9 +409,13 @@ void VulkanManager::initialize() {
} }
} }
sk_sp<GrDirectContext> VulkanManager::createContext(const GrContextOptions& options, static void onGrContextReleased(void* context) {
ContextType contextType) { VulkanManager* manager = (VulkanManager*)context;
manager->decStrong((void*)onGrContextReleased);
}
sk_sp<GrDirectContext> VulkanManager::createContext(GrContextOptions& options,
ContextType contextType) {
GrVkBackendContext backendContext; GrVkBackendContext backendContext;
backendContext.fInstance = mInstance; backendContext.fInstance = mInstance;
backendContext.fPhysicalDevice = mPhysicalDevice; backendContext.fPhysicalDevice = mPhysicalDevice;
@@ -418,6 +427,11 @@ sk_sp<GrDirectContext> VulkanManager::createContext(const GrContextOptions& opti
backendContext.fDeviceFeatures2 = &mPhysicalDeviceFeatures2; backendContext.fDeviceFeatures2 = &mPhysicalDeviceFeatures2;
backendContext.fGetProc = sSkiaGetProp; 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); return GrDirectContext::MakeVulkan(backendContext, options);
} }

View File

@@ -66,6 +66,7 @@ class RenderThread;
class VulkanManager final : public RefBase { class VulkanManager final : public RefBase {
public: public:
static sp<VulkanManager> getInstance(); static sp<VulkanManager> getInstance();
static sp<VulkanManager> peekInstance();
// Sets up the vulkan context that is shared amonst all clients of the VulkanManager. This must // 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 // 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 // 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); ContextType contextType = ContextType::kRenderThread);
uint32_t getDriverVersion() const { return mDriverVersion; } uint32_t getDriverVersion() const { return mDriverVersion; }