blob: 0bd8283987dba2cd49da28fa83bc80722b8a5468 [file] [log] [blame]
Nolan Scobiefc125ec2024-03-11 20:08:27 -04001/*
2 * Copyright 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#undef LOG_TAG
20#define LOG_TAG "RenderEngine"
21
22#include <include/core/SkSurface.h>
Nolan Scobiebc3f3602024-08-30 13:51:37 -040023#include <include/gpu/ganesh/GrDirectContext.h>
24#include <include/gpu/ganesh/gl/GrGLInterface.h>
Nolan Scobie609e5972024-03-20 14:47:34 -040025#include <include/gpu/graphite/Context.h>
Nolan Scobiebc3f3602024-08-30 13:51:37 -040026#include <include/gpu/vk/VulkanBackendContext.h>
Nolan Scobiefc125ec2024-03-11 20:08:27 -040027
Nolan Scobieca050282024-03-15 13:27:06 -040028#include "SkiaBackendTexture.h"
29
Nolan Scobiefc125ec2024-03-11 20:08:27 -040030#include <log/log.h>
31
Nolan Scobieca050282024-03-15 13:27:06 -040032#include <memory>
33
Nolan Scobiefc125ec2024-03-11 20:08:27 -040034namespace android::renderengine::skia {
35
36/**
37 * Abstraction over Ganesh and Graphite's underlying context-like objects.
Nolan Scobie2526b2f2024-04-16 15:12:22 -040038 *
39 * On destruction, subclasses will submit any pending work before destroying their internal Skia
40 * context(s). Any unused cached SkiaBackendTextures created from a SkiaGpuContext that are awaiting
41 * cleanup must be deleted before destroying that SkiaGpuContext, and any textures that are released
42 * during ~SkiaGpuContext must be configured to be deleted immediately.
Nolan Scobiefc125ec2024-03-11 20:08:27 -040043 */
44class SkiaGpuContext {
45public:
Nolan Scobie2526b2f2024-04-16 15:12:22 -040046 /**
47 * glInterface must remain valid until after SkiaGpuContext is destroyed.
48 */
Nolan Scobiefc125ec2024-03-11 20:08:27 -040049 static std::unique_ptr<SkiaGpuContext> MakeGL_Ganesh(
50 sk_sp<const GrGLInterface> glInterface,
51 GrContextOptions::PersistentCache& skSLCacheMonitor);
52
Nolan Scobie2526b2f2024-04-16 15:12:22 -040053 /**
Kaylee Lubick1a25e4e2024-06-20 17:35:57 +000054 * vkBackendContext must remain valid until after SkiaGpuContext is destroyed.
Nolan Scobie2526b2f2024-04-16 15:12:22 -040055 */
Nolan Scobiefc125ec2024-03-11 20:08:27 -040056 static std::unique_ptr<SkiaGpuContext> MakeVulkan_Ganesh(
Kaylee Lubick1a25e4e2024-06-20 17:35:57 +000057 const skgpu::VulkanBackendContext& vkBackendContext,
Nolan Scobiefc125ec2024-03-11 20:08:27 -040058 GrContextOptions::PersistentCache& skSLCacheMonitor);
59
Nolan Scobie609e5972024-03-20 14:47:34 -040060 // TODO: b/293371537 - Need shader / pipeline monitoring support in Graphite.
Nolan Scobie2526b2f2024-04-16 15:12:22 -040061 /**
62 * vulkanBackendContext must remain valid until after SkiaGpuContext is destroyed.
63 */
Nolan Scobie609e5972024-03-20 14:47:34 -040064 static std::unique_ptr<SkiaGpuContext> MakeVulkan_Graphite(
65 const skgpu::VulkanBackendContext& vulkanBackendContext);
66
Nolan Scobiefc125ec2024-03-11 20:08:27 -040067 virtual ~SkiaGpuContext() = default;
68
Nolan Scobiefc125ec2024-03-11 20:08:27 -040069 /**
70 * Only callable on Ganesh-backed instances of SkiaGpuContext, otherwise fatal.
71 */
72 virtual sk_sp<GrDirectContext> grDirectContext() {
73 LOG_ALWAYS_FATAL("grDirectContext() called on a non-Ganesh instance of SkiaGpuContext!");
74 }
75
Nolan Scobie609e5972024-03-20 14:47:34 -040076 /**
77 * Only callable on Graphite-backed instances of SkiaGpuContext, otherwise fatal.
78 */
79 virtual std::shared_ptr<skgpu::graphite::Context> graphiteContext() {
80 LOG_ALWAYS_FATAL("graphiteContext() called on a non-Graphite instance of SkiaGpuContext!");
81 }
82
83 /**
84 * Only callable on Graphite-backed instances of SkiaGpuContext, otherwise fatal.
85 */
86 virtual std::shared_ptr<skgpu::graphite::Recorder> graphiteRecorder() {
87 LOG_ALWAYS_FATAL("graphiteRecorder() called on a non-Graphite instance of SkiaGpuContext!");
88 }
89
Nolan Scobieca050282024-03-15 13:27:06 -040090 virtual std::unique_ptr<SkiaBackendTexture> makeBackendTexture(AHardwareBuffer* buffer,
91 bool isOutputBuffer) = 0;
92
Nolan Scobiefc125ec2024-03-11 20:08:27 -040093 /**
94 * Notes:
95 * - The surface doesn't count against Skia's caching budgets.
96 * - Protected status is set to match the implementation's underlying context.
97 * - The origin of the surface in texture space corresponds to the top-left content pixel.
98 * - AA is always enabled.
99 */
100 virtual sk_sp<SkSurface> createRenderTarget(SkImageInfo imageInfo) = 0;
101
Nolan Scobie17ffe902024-03-25 11:07:30 -0400102 virtual bool isAbandonedOrDeviceLost() = 0;
Nolan Scobiefc125ec2024-03-11 20:08:27 -0400103 virtual size_t getMaxRenderTargetSize() const = 0;
104 virtual size_t getMaxTextureSize() const = 0;
105 virtual void setResourceCacheLimit(size_t maxResourceBytes) = 0;
106
Nolan Scobiefc125ec2024-03-11 20:08:27 -0400107 virtual void purgeUnlockedScratchResources() = 0;
108 virtual void resetContextIfApplicable() = 0; // No-op outside of GL (&& Ganesh at this point.)
109
110 virtual void dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const = 0;
111};
112
113} // namespace android::renderengine::skia