Merge "Have GrContext hold a strong ref to VulkanManager" into udc-dev
This commit is contained in:
@@ -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 = {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
Reference in New Issue
Block a user