blob: 3715859e8a07662c6ef331b6a1cae6f6e51b2e24 [file] [log] [blame]
Ian Elliott1f0911e2022-09-09 16:31:47 -06001/*
2 * Copyright 2022 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// #define LOG_NDEBUG 0
18#undef LOG_TAG
19#define LOG_TAG "RenderEngine"
20#define ATRACE_TAG ATRACE_TAG_GRAPHICS
21
22#include "SkiaVkRenderEngine.h"
23
Nolan Scobie02c160c2024-03-18 10:40:23 -040024#include "GaneshVkRenderEngine.h"
Nolan Scobiefc125ec2024-03-11 20:08:27 -040025#include "compat/SkiaGpuContext.h"
26
Ian Elliott1f0911e2022-09-09 16:31:47 -060027#include <GrBackendSemaphore.h>
28#include <GrContextOptions.h>
Nolan Scobiefc125ec2024-03-11 20:08:27 -040029#include <GrDirectContext.h>
Kevin Lubick9f207082024-03-06 13:33:17 +000030#include <include/gpu/ganesh/vk/GrVkBackendSemaphore.h>
Kevin Lubick2fc49112023-10-13 13:10:48 +000031#include <include/gpu/ganesh/vk/GrVkDirectContext.h>
Nolan Scobiefc125ec2024-03-11 20:08:27 -040032#include <vk/GrVkExtensions.h>
33#include <vk/GrVkTypes.h>
Ian Elliott1f0911e2022-09-09 16:31:47 -060034
35#include <android-base/stringprintf.h>
36#include <gui/TraceUtils.h>
37#include <sync/sync.h>
38#include <utils/Trace.h>
39
Ian Elliott1f0911e2022-09-09 16:31:47 -060040#include <memory>
Nolan Scobie0f539a72024-01-29 10:49:10 -050041#include <string>
Ian Elliott1f0911e2022-09-09 16:31:47 -060042
43#include <vulkan/vulkan.h>
44#include "log/log_main.h"
45
46namespace android {
47namespace renderengine {
48
Nolan Scobief52ad202024-03-06 18:18:28 -050049static skia::VulkanInterface sVulkanInterface;
50static skia::VulkanInterface sProtectedContentVulkanInterface;
Ian Elliott1f0911e2022-09-09 16:31:47 -060051
52static void sSetupVulkanInterface() {
Nolan Scobief52ad202024-03-06 18:18:28 -050053 if (!sVulkanInterface.isInitialized()) {
54 sVulkanInterface.init(false /* no protected content */);
Ian Elliott1f0911e2022-09-09 16:31:47 -060055 // We will have to abort if non-protected VkDevice creation fails (then nothing works).
Nolan Scobief52ad202024-03-06 18:18:28 -050056 LOG_ALWAYS_FATAL_IF(!sVulkanInterface.isInitialized(),
Ian Elliott1f0911e2022-09-09 16:31:47 -060057 "Could not initialize Vulkan RenderEngine!");
58 }
Nolan Scobief52ad202024-03-06 18:18:28 -050059 if (!sProtectedContentVulkanInterface.isInitialized()) {
60 sProtectedContentVulkanInterface.init(true /* protected content */);
61 if (!sProtectedContentVulkanInterface.isInitialized()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -060062 ALOGE("Could not initialize protected content Vulkan RenderEngine.");
63 }
64 }
65}
66
Leon Scroggins IIIf3369ed2024-02-16 17:52:42 -050067bool RenderEngine::canSupport(GraphicsApi graphicsApi) {
68 switch (graphicsApi) {
69 case GraphicsApi::GL:
70 return true;
71 case GraphicsApi::VK: {
Nolan Scobief52ad202024-03-06 18:18:28 -050072 if (!sVulkanInterface.isInitialized()) {
73 sVulkanInterface.init(false /* no protected content */);
Leon Scroggins IIIf3369ed2024-02-16 17:52:42 -050074 ALOGD("%s: initialized == %s.", __func__,
Nolan Scobief52ad202024-03-06 18:18:28 -050075 sVulkanInterface.isInitialized() ? "true" : "false");
Leon Scroggins IIIf3369ed2024-02-16 17:52:42 -050076 }
Nolan Scobief52ad202024-03-06 18:18:28 -050077 return sVulkanInterface.isInitialized();
Leon Scroggins IIIf3369ed2024-02-16 17:52:42 -050078 }
79 }
80}
81
Ian Elliott1f0911e2022-09-09 16:31:47 -060082namespace skia {
83
84using base::StringAppendF;
85
Ian Elliott1f0911e2022-09-09 16:31:47 -060086std::unique_ptr<SkiaVkRenderEngine> SkiaVkRenderEngine::create(
87 const RenderEngineCreationArgs& args) {
Nolan Scobie02c160c2024-03-18 10:40:23 -040088 // TODO: b/293371537 - Ganesh vs. Graphite subclass based on flag in RenderEngineCreationArgs
89 std::unique_ptr<SkiaVkRenderEngine> engine(new GaneshVkRenderEngine(args));
Nolan Scobiefc125ec2024-03-11 20:08:27 -040090 engine->ensureContextsCreated();
Ian Elliott1f0911e2022-09-09 16:31:47 -060091
Nolan Scobief52ad202024-03-06 18:18:28 -050092 if (sVulkanInterface.isInitialized()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -060093 ALOGD("SkiaVkRenderEngine::%s: successfully initialized SkiaVkRenderEngine", __func__);
94 return engine;
95 } else {
96 ALOGD("SkiaVkRenderEngine::%s: could not create SkiaVkRenderEngine. "
97 "Likely insufficient Vulkan support",
98 __func__);
99 return {};
100 }
101}
102
103SkiaVkRenderEngine::SkiaVkRenderEngine(const RenderEngineCreationArgs& args)
Leon Scroggins III696bf932024-01-24 15:21:05 -0500104 : SkiaRenderEngine(args.threaded, static_cast<PixelFormat>(args.pixelFormat),
Alec Mouri47bcb072023-08-15 02:02:49 +0000105 args.supportsBackgroundBlur) {}
Ian Elliott1f0911e2022-09-09 16:31:47 -0600106
107SkiaVkRenderEngine::~SkiaVkRenderEngine() {
108 finishRenderingAndAbandonContext();
109}
110
Nolan Scobiefc125ec2024-03-11 20:08:27 -0400111SkiaRenderEngine::Contexts SkiaVkRenderEngine::createContexts() {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600112 sSetupVulkanInterface();
113
114 SkiaRenderEngine::Contexts contexts;
Nolan Scobie342d3942024-03-21 16:41:39 -0400115 contexts.first = createContext(sVulkanInterface);
Ian Elliott1f0911e2022-09-09 16:31:47 -0600116 if (supportsProtectedContentImpl()) {
Nolan Scobie342d3942024-03-21 16:41:39 -0400117 contexts.second = createContext(sProtectedContentVulkanInterface);
Ian Elliott1f0911e2022-09-09 16:31:47 -0600118 }
119
120 return contexts;
121}
122
123bool SkiaVkRenderEngine::supportsProtectedContentImpl() const {
Nolan Scobief52ad202024-03-06 18:18:28 -0500124 return sProtectedContentVulkanInterface.isInitialized();
Ian Elliott1f0911e2022-09-09 16:31:47 -0600125}
126
127bool SkiaVkRenderEngine::useProtectedContextImpl(GrProtected) {
128 return true;
129}
130
Nolan Scobie02c160c2024-03-18 10:40:23 -0400131VulkanInterface& SkiaVkRenderEngine::getVulkanInterface(bool protectedContext) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600132 if (protectedContext) {
133 return sProtectedContentVulkanInterface;
134 }
135 return sVulkanInterface;
136}
137
Ian Elliott1f0911e2022-09-09 16:31:47 -0600138int SkiaVkRenderEngine::getContextPriority() {
139 // EGL_CONTEXT_PRIORITY_REALTIME_NV
140 constexpr int kRealtimePriority = 0x3357;
Nolan Scobief52ad202024-03-06 18:18:28 -0500141 if (getVulkanInterface(isProtected()).isRealtimePriority()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600142 return kRealtimePriority;
143 } else {
144 return 0;
145 }
146}
147
148void SkiaVkRenderEngine::appendBackendSpecificInfoToDump(std::string& result) {
149 StringAppendF(&result, "\n ------------RE Vulkan----------\n");
Nolan Scobief52ad202024-03-06 18:18:28 -0500150 StringAppendF(&result, "\n Vulkan device initialized: %d\n", sVulkanInterface.isInitialized());
Ian Elliott1f0911e2022-09-09 16:31:47 -0600151 StringAppendF(&result, "\n Vulkan protected device initialized: %d\n",
Nolan Scobief52ad202024-03-06 18:18:28 -0500152 sProtectedContentVulkanInterface.isInitialized());
Ian Elliott1f0911e2022-09-09 16:31:47 -0600153
Nolan Scobief52ad202024-03-06 18:18:28 -0500154 if (!sVulkanInterface.isInitialized()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600155 return;
156 }
157
158 StringAppendF(&result, "\n Instance extensions:\n");
Nolan Scobief52ad202024-03-06 18:18:28 -0500159 for (const auto& name : sVulkanInterface.getInstanceExtensionNames()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600160 StringAppendF(&result, "\n %s\n", name.c_str());
161 }
162
163 StringAppendF(&result, "\n Device extensions:\n");
Nolan Scobief52ad202024-03-06 18:18:28 -0500164 for (const auto& name : sVulkanInterface.getDeviceExtensionNames()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600165 StringAppendF(&result, "\n %s\n", name.c_str());
166 }
167}
168
169} // namespace skia
170} // namespace renderengine
171} // namespace android