/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrDirectContext_DEFINED #define GrDirectContext_DEFINED #include "include/private/GrContext.h" class GrAtlasManager; class GrSmallPathAtlasMgr; class SK_API GrDirectContext : public GrContext { public: #ifdef SK_GL /** * Creates a GrDirectContext for a backend context. If no GrGLInterface is provided then the * result of GrGLMakeNativeInterface() is used if it succeeds. */ static sk_sp MakeGL(sk_sp, const GrContextOptions&); static sk_sp MakeGL(sk_sp); static sk_sp MakeGL(const GrContextOptions&); static sk_sp MakeGL(); #endif #ifdef SK_VULKAN /** * The Vulkan context (VkQueue, VkDevice, VkInstance) must be kept alive until the returned * GrDirectContext is destroyed. This also means that any objects created with this * GrDirectContext (e.g. SkSurfaces, SkImages, etc.) must also be released as they may hold * refs on the GrDirectContext. Once all these objects and the GrDirectContext are released, * then it is safe to delete the vulkan objects. */ static sk_sp MakeVulkan(const GrVkBackendContext&, const GrContextOptions&); static sk_sp MakeVulkan(const GrVkBackendContext&); #endif #ifdef SK_METAL /** * Makes a GrDirectContext which uses Metal as the backend. The device parameter is an * MTLDevice and queue is an MTLCommandQueue which should be used by the backend. These objects * must have a ref on them which can be transferred to Ganesh which will release the ref * when the GrDirectContext is destroyed. */ static sk_sp MakeMetal(void* device, void* queue, const GrContextOptions&); static sk_sp MakeMetal(void* device, void* queue); #endif #ifdef SK_DIRECT3D /** * Makes a GrDirectContext which uses Direct3D as the backend. The Direct3D context * must be kept alive until the returned GrDirectContext is first destroyed or abandoned. */ static sk_sp MakeDirect3D(const GrD3DBackendContext&, const GrContextOptions&); static sk_sp MakeDirect3D(const GrD3DBackendContext&); #endif #ifdef SK_DAWN static sk_sp MakeDawn(const wgpu::Device&, const GrContextOptions&); static sk_sp MakeDawn(const wgpu::Device&); #endif static sk_sp MakeMock(const GrMockOptions*, const GrContextOptions&); static sk_sp MakeMock(const GrMockOptions*); ~GrDirectContext() override; void abandonContext() override; void releaseResourcesAndAbandonContext() override; void freeGpuResources() override; protected: GrDirectContext(GrBackendApi backend, const GrContextOptions& options); bool init() override; GrAtlasManager* onGetAtlasManager() override { return fAtlasManager.get(); } GrSmallPathAtlasMgr* onGetSmallPathAtlasMgr() override; GrDirectContext* asDirectContext() override { return this; } private: std::unique_ptr fAtlasManager; std::unique_ptr fSmallPathAtlasMgr; using INHERITED = GrContext; }; #endif