blob: 406fd814876af18cf8ca6cb475f54050ca8336ba [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 -060086SkiaVkRenderEngine::SkiaVkRenderEngine(const RenderEngineCreationArgs& args)
Leon Scroggins III696bf932024-01-24 15:21:05 -050087 : SkiaRenderEngine(args.threaded, static_cast<PixelFormat>(args.pixelFormat),
Robin Lee7338bd92024-04-04 14:05:07 +000088 args.blurAlgorithm) {}
Ian Elliott1f0911e2022-09-09 16:31:47 -060089
90SkiaVkRenderEngine::~SkiaVkRenderEngine() {
91 finishRenderingAndAbandonContext();
92}
93
Nolan Scobiefc125ec2024-03-11 20:08:27 -040094SkiaRenderEngine::Contexts SkiaVkRenderEngine::createContexts() {
Ian Elliott1f0911e2022-09-09 16:31:47 -060095 sSetupVulkanInterface();
96
97 SkiaRenderEngine::Contexts contexts;
Nolan Scobie342d3942024-03-21 16:41:39 -040098 contexts.first = createContext(sVulkanInterface);
Ian Elliott1f0911e2022-09-09 16:31:47 -060099 if (supportsProtectedContentImpl()) {
Nolan Scobie342d3942024-03-21 16:41:39 -0400100 contexts.second = createContext(sProtectedContentVulkanInterface);
Ian Elliott1f0911e2022-09-09 16:31:47 -0600101 }
102
103 return contexts;
104}
105
106bool SkiaVkRenderEngine::supportsProtectedContentImpl() const {
Nolan Scobief52ad202024-03-06 18:18:28 -0500107 return sProtectedContentVulkanInterface.isInitialized();
Ian Elliott1f0911e2022-09-09 16:31:47 -0600108}
109
110bool SkiaVkRenderEngine::useProtectedContextImpl(GrProtected) {
111 return true;
112}
113
Nolan Scobie02c160c2024-03-18 10:40:23 -0400114VulkanInterface& SkiaVkRenderEngine::getVulkanInterface(bool protectedContext) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600115 if (protectedContext) {
116 return sProtectedContentVulkanInterface;
117 }
118 return sVulkanInterface;
119}
120
Ian Elliott1f0911e2022-09-09 16:31:47 -0600121int SkiaVkRenderEngine::getContextPriority() {
122 // EGL_CONTEXT_PRIORITY_REALTIME_NV
123 constexpr int kRealtimePriority = 0x3357;
Nolan Scobief52ad202024-03-06 18:18:28 -0500124 if (getVulkanInterface(isProtected()).isRealtimePriority()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600125 return kRealtimePriority;
126 } else {
127 return 0;
128 }
129}
130
131void SkiaVkRenderEngine::appendBackendSpecificInfoToDump(std::string& result) {
132 StringAppendF(&result, "\n ------------RE Vulkan----------\n");
Nolan Scobief52ad202024-03-06 18:18:28 -0500133 StringAppendF(&result, "\n Vulkan device initialized: %d\n", sVulkanInterface.isInitialized());
Ian Elliott1f0911e2022-09-09 16:31:47 -0600134 StringAppendF(&result, "\n Vulkan protected device initialized: %d\n",
Nolan Scobief52ad202024-03-06 18:18:28 -0500135 sProtectedContentVulkanInterface.isInitialized());
Ian Elliott1f0911e2022-09-09 16:31:47 -0600136
Nolan Scobief52ad202024-03-06 18:18:28 -0500137 if (!sVulkanInterface.isInitialized()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600138 return;
139 }
140
141 StringAppendF(&result, "\n Instance extensions:\n");
Nolan Scobief52ad202024-03-06 18:18:28 -0500142 for (const auto& name : sVulkanInterface.getInstanceExtensionNames()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600143 StringAppendF(&result, "\n %s\n", name.c_str());
144 }
145
146 StringAppendF(&result, "\n Device extensions:\n");
Nolan Scobief52ad202024-03-06 18:18:28 -0500147 for (const auto& name : sVulkanInterface.getDeviceExtensionNames()) {
Ian Elliott1f0911e2022-09-09 16:31:47 -0600148 StringAppendF(&result, "\n %s\n", name.c_str());
149 }
150}
151
152} // namespace skia
153} // namespace renderengine
154} // namespace android