xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // DisplayVk.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //    Implements the class methods for DisplayVk.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/DisplayVk.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "common/system_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/BlobCache.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/BufferVk.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/ContextVk.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/DeviceVk.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/ImageVk.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/ShareGroupVk.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/SurfaceVk.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/SyncVk.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/TextureVk.h"
25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/VkImageImageSiblingVk.h"
26*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_renderer.h"
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker namespace rx
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker namespace
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker // Query surface format and colorspace support.
GetSupportedFormatColorspaces(VkPhysicalDevice physicalDevice,const angle::FeaturesVk & featuresVk,VkSurfaceKHR surface,std::vector<VkSurfaceFormat2KHR> * surfaceFormatsOut)34*8975f5c5SAndroid Build Coastguard Worker void GetSupportedFormatColorspaces(VkPhysicalDevice physicalDevice,
35*8975f5c5SAndroid Build Coastguard Worker                                    const angle::FeaturesVk &featuresVk,
36*8975f5c5SAndroid Build Coastguard Worker                                    VkSurfaceKHR surface,
37*8975f5c5SAndroid Build Coastguard Worker                                    std::vector<VkSurfaceFormat2KHR> *surfaceFormatsOut)
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker     ASSERT(surfaceFormatsOut);
40*8975f5c5SAndroid Build Coastguard Worker     surfaceFormatsOut->clear();
41*8975f5c5SAndroid Build Coastguard Worker 
42*8975f5c5SAndroid Build Coastguard Worker     constexpr VkSurfaceFormat2KHR kSurfaceFormat2Initializer = {
43*8975f5c5SAndroid Build Coastguard Worker         VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR,
44*8975f5c5SAndroid Build Coastguard Worker         nullptr,
45*8975f5c5SAndroid Build Coastguard Worker         {VK_FORMAT_UNDEFINED, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR}};
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     if (featuresVk.supportsSurfaceCapabilities2Extension.enabled)
48*8975f5c5SAndroid Build Coastguard Worker     {
49*8975f5c5SAndroid Build Coastguard Worker         VkPhysicalDeviceSurfaceInfo2KHR surfaceInfo2 = {};
50*8975f5c5SAndroid Build Coastguard Worker         surfaceInfo2.sType          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR;
51*8975f5c5SAndroid Build Coastguard Worker         surfaceInfo2.surface        = surface;
52*8975f5c5SAndroid Build Coastguard Worker         uint32_t surfaceFormatCount = 0;
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker         // Query the count first
55*8975f5c5SAndroid Build Coastguard Worker         VkResult result = vkGetPhysicalDeviceSurfaceFormats2KHR(physicalDevice, &surfaceInfo2,
56*8975f5c5SAndroid Build Coastguard Worker                                                                 &surfaceFormatCount, nullptr);
57*8975f5c5SAndroid Build Coastguard Worker         ASSERT(result == VK_SUCCESS);
58*8975f5c5SAndroid Build Coastguard Worker         ASSERT(surfaceFormatCount > 0);
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker         // Query the VkSurfaceFormat2KHR list
61*8975f5c5SAndroid Build Coastguard Worker         std::vector<VkSurfaceFormat2KHR> surfaceFormats2(surfaceFormatCount,
62*8975f5c5SAndroid Build Coastguard Worker                                                          kSurfaceFormat2Initializer);
63*8975f5c5SAndroid Build Coastguard Worker         result = vkGetPhysicalDeviceSurfaceFormats2KHR(physicalDevice, &surfaceInfo2,
64*8975f5c5SAndroid Build Coastguard Worker                                                        &surfaceFormatCount, surfaceFormats2.data());
65*8975f5c5SAndroid Build Coastguard Worker         ASSERT(result == VK_SUCCESS);
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker         *surfaceFormatsOut = std::move(surfaceFormats2);
68*8975f5c5SAndroid Build Coastguard Worker     }
69*8975f5c5SAndroid Build Coastguard Worker     else
70*8975f5c5SAndroid Build Coastguard Worker     {
71*8975f5c5SAndroid Build Coastguard Worker         uint32_t surfaceFormatCount = 0;
72*8975f5c5SAndroid Build Coastguard Worker         // Query the count first
73*8975f5c5SAndroid Build Coastguard Worker         VkResult result = vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface,
74*8975f5c5SAndroid Build Coastguard Worker                                                                &surfaceFormatCount, nullptr);
75*8975f5c5SAndroid Build Coastguard Worker         ASSERT(result == VK_SUCCESS);
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker         // Query the VkSurfaceFormatKHR list
78*8975f5c5SAndroid Build Coastguard Worker         std::vector<VkSurfaceFormatKHR> surfaceFormats(surfaceFormatCount);
79*8975f5c5SAndroid Build Coastguard Worker         result = vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &surfaceFormatCount,
80*8975f5c5SAndroid Build Coastguard Worker                                                       surfaceFormats.data());
81*8975f5c5SAndroid Build Coastguard Worker         ASSERT(result == VK_SUCCESS);
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker         // Copy over data from std::vector<VkSurfaceFormatKHR> to std::vector<VkSurfaceFormat2KHR>
84*8975f5c5SAndroid Build Coastguard Worker         std::vector<VkSurfaceFormat2KHR> surfaceFormats2(surfaceFormatCount,
85*8975f5c5SAndroid Build Coastguard Worker                                                          kSurfaceFormat2Initializer);
86*8975f5c5SAndroid Build Coastguard Worker         for (size_t index = 0; index < surfaceFormatCount; index++)
87*8975f5c5SAndroid Build Coastguard Worker         {
88*8975f5c5SAndroid Build Coastguard Worker             surfaceFormats2[index].surfaceFormat.format = surfaceFormats[index].format;
89*8975f5c5SAndroid Build Coastguard Worker         }
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker         *surfaceFormatsOut = std::move(surfaceFormats2);
92*8975f5c5SAndroid Build Coastguard Worker     }
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker 
ShouldLoadDebugLayers(const egl::AttributeMap & attribs)95*8975f5c5SAndroid Build Coastguard Worker vk::UseDebugLayers ShouldLoadDebugLayers(const egl::AttributeMap &attribs)
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker     EGLAttrib debugSetting =
98*8975f5c5SAndroid Build Coastguard Worker         attribs.get(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE, EGL_DONT_CARE);
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_VULKAN_VALIDATION_LAYERS_BY_DEFAULT)
101*8975f5c5SAndroid Build Coastguard Worker     const bool yes = ShouldUseDebugLayers(attribs);
102*8975f5c5SAndroid Build Coastguard Worker #else
103*8975f5c5SAndroid Build Coastguard Worker     const bool yes = debugSetting == EGL_TRUE;
104*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_ENABLE_VULKAN_VALIDATION_LAYERS_BY_DEFAULT)
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     const bool ifAvailable = debugSetting == EGL_DONT_CARE;
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     return yes && ifAvailable ? vk::UseDebugLayers::YesIfAvailable
109*8975f5c5SAndroid Build Coastguard Worker            : yes              ? vk::UseDebugLayers::Yes
110*8975f5c5SAndroid Build Coastguard Worker                               : vk::UseDebugLayers::No;
111*8975f5c5SAndroid Build Coastguard Worker }
112*8975f5c5SAndroid Build Coastguard Worker 
ChooseICDFromAttribs(const egl::AttributeMap & attribs)113*8975f5c5SAndroid Build Coastguard Worker angle::vk::ICD ChooseICDFromAttribs(const egl::AttributeMap &attribs)
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker #if !defined(ANGLE_PLATFORM_ANDROID)
116*8975f5c5SAndroid Build Coastguard Worker     // Mock ICD does not currently run on Android
117*8975f5c5SAndroid Build Coastguard Worker     EGLAttrib deviceType = attribs.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE,
118*8975f5c5SAndroid Build Coastguard Worker                                        EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE);
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker     switch (deviceType)
121*8975f5c5SAndroid Build Coastguard Worker     {
122*8975f5c5SAndroid Build Coastguard Worker         case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
123*8975f5c5SAndroid Build Coastguard Worker             break;
124*8975f5c5SAndroid Build Coastguard Worker         case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE:
125*8975f5c5SAndroid Build Coastguard Worker             return angle::vk::ICD::Mock;
126*8975f5c5SAndroid Build Coastguard Worker         case EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE:
127*8975f5c5SAndroid Build Coastguard Worker             return angle::vk::ICD::SwiftShader;
128*8975f5c5SAndroid Build Coastguard Worker         default:
129*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
130*8975f5c5SAndroid Build Coastguard Worker             break;
131*8975f5c5SAndroid Build Coastguard Worker     }
132*8975f5c5SAndroid Build Coastguard Worker #endif  // !defined(ANGLE_PLATFORM_ANDROID)
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker     return angle::vk::ICD::Default;
135*8975f5c5SAndroid Build Coastguard Worker }
136*8975f5c5SAndroid Build Coastguard Worker 
InstallDebugAnnotator(egl::Display * display,vk::Renderer * renderer)137*8975f5c5SAndroid Build Coastguard Worker void InstallDebugAnnotator(egl::Display *display, vk::Renderer *renderer)
138*8975f5c5SAndroid Build Coastguard Worker {
139*8975f5c5SAndroid Build Coastguard Worker     bool installedAnnotator = false;
140*8975f5c5SAndroid Build Coastguard Worker 
141*8975f5c5SAndroid Build Coastguard Worker     // Ensure the appropriate global DebugAnnotator is used
142*8975f5c5SAndroid Build Coastguard Worker     ASSERT(renderer);
143*8975f5c5SAndroid Build Coastguard Worker     renderer->setGlobalDebugAnnotator(&installedAnnotator);
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker     if (!installedAnnotator)
146*8975f5c5SAndroid Build Coastguard Worker     {
147*8975f5c5SAndroid Build Coastguard Worker         std::unique_lock<angle::SimpleMutex> lock(gl::GetDebugMutex());
148*8975f5c5SAndroid Build Coastguard Worker         display->setGlobalDebugAnnotator();
149*8975f5c5SAndroid Build Coastguard Worker     }
150*8975f5c5SAndroid Build Coastguard Worker }
151*8975f5c5SAndroid Build Coastguard Worker }  // namespace
152*8975f5c5SAndroid Build Coastguard Worker 
DisplayVk(const egl::DisplayState & state)153*8975f5c5SAndroid Build Coastguard Worker DisplayVk::DisplayVk(const egl::DisplayState &state)
154*8975f5c5SAndroid Build Coastguard Worker     : DisplayImpl(state),
155*8975f5c5SAndroid Build Coastguard Worker       vk::Context(new vk::Renderer()),
156*8975f5c5SAndroid Build Coastguard Worker       mScratchBuffer(1000u),
157*8975f5c5SAndroid Build Coastguard Worker       mSupportedColorspaceFormatsMap{}
158*8975f5c5SAndroid Build Coastguard Worker {}
159*8975f5c5SAndroid Build Coastguard Worker 
~DisplayVk()160*8975f5c5SAndroid Build Coastguard Worker DisplayVk::~DisplayVk()
161*8975f5c5SAndroid Build Coastguard Worker {
162*8975f5c5SAndroid Build Coastguard Worker     delete mRenderer;
163*8975f5c5SAndroid Build Coastguard Worker }
164*8975f5c5SAndroid Build Coastguard Worker 
initialize(egl::Display * display)165*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayVk::initialize(egl::Display *display)
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr && display != nullptr);
168*8975f5c5SAndroid Build Coastguard Worker     const egl::AttributeMap &attribs = display->getAttributeMap();
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker     const vk::UseDebugLayers useDebugLayers = ShouldLoadDebugLayers(attribs);
171*8975f5c5SAndroid Build Coastguard Worker     const angle::vk::ICD desiredICD         = ChooseICDFromAttribs(attribs);
172*8975f5c5SAndroid Build Coastguard Worker     const uint32_t preferredVendorId =
173*8975f5c5SAndroid Build Coastguard Worker         static_cast<uint32_t>(attribs.get(EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE, 0));
174*8975f5c5SAndroid Build Coastguard Worker     const uint32_t preferredDeviceId =
175*8975f5c5SAndroid Build Coastguard Worker         static_cast<uint32_t>(attribs.get(EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE, 0));
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker     angle::Result result = mRenderer->initialize(
178*8975f5c5SAndroid Build Coastguard Worker         this, this, desiredICD, preferredVendorId, preferredDeviceId, useDebugLayers,
179*8975f5c5SAndroid Build Coastguard Worker         getWSIExtension(), getWSILayer(), getWindowSystem(), mState.featureOverrides);
180*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(angle::ToEGL(result, EGL_NOT_INITIALIZED));
181*8975f5c5SAndroid Build Coastguard Worker 
182*8975f5c5SAndroid Build Coastguard Worker     mDeviceQueueIndex = mRenderer->getDeviceQueueIndex(egl::ContextPriority::Medium);
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker     InstallDebugAnnotator(display, mRenderer);
185*8975f5c5SAndroid Build Coastguard Worker 
186*8975f5c5SAndroid Build Coastguard Worker     // Query and cache supported surface format and colorspace for later use.
187*8975f5c5SAndroid Build Coastguard Worker     initSupportedSurfaceFormatColorspaces();
188*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
189*8975f5c5SAndroid Build Coastguard Worker }
190*8975f5c5SAndroid Build Coastguard Worker 
terminate()191*8975f5c5SAndroid Build Coastguard Worker void DisplayVk::terminate()
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker     mRenderer->reloadVolkIfNeeded();
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer);
196*8975f5c5SAndroid Build Coastguard Worker     mRenderer->onDestroy(this);
197*8975f5c5SAndroid Build Coastguard Worker }
198*8975f5c5SAndroid Build Coastguard Worker 
makeCurrent(egl::Display * display,egl::Surface *,egl::Surface *,gl::Context *)199*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayVk::makeCurrent(egl::Display *display,
200*8975f5c5SAndroid Build Coastguard Worker                                   egl::Surface * /*drawSurface*/,
201*8975f5c5SAndroid Build Coastguard Worker                                   egl::Surface * /*readSurface*/,
202*8975f5c5SAndroid Build Coastguard Worker                                   gl::Context * /*context*/)
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker     InstallDebugAnnotator(display, mRenderer);
205*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
206*8975f5c5SAndroid Build Coastguard Worker }
207*8975f5c5SAndroid Build Coastguard Worker 
testDeviceLost()208*8975f5c5SAndroid Build Coastguard Worker bool DisplayVk::testDeviceLost()
209*8975f5c5SAndroid Build Coastguard Worker {
210*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->isDeviceLost();
211*8975f5c5SAndroid Build Coastguard Worker }
212*8975f5c5SAndroid Build Coastguard Worker 
restoreLostDevice(const egl::Display * display)213*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayVk::restoreLostDevice(const egl::Display *display)
214*8975f5c5SAndroid Build Coastguard Worker {
215*8975f5c5SAndroid Build Coastguard Worker     // A vulkan device cannot be restored, the entire renderer would have to be re-created along
216*8975f5c5SAndroid Build Coastguard Worker     // with any other EGL objects that reference it.
217*8975f5c5SAndroid Build Coastguard Worker     return egl::EglBadDisplay();
218*8975f5c5SAndroid Build Coastguard Worker }
219*8975f5c5SAndroid Build Coastguard Worker 
getRendererDescription()220*8975f5c5SAndroid Build Coastguard Worker std::string DisplayVk::getRendererDescription()
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker     if (mRenderer)
223*8975f5c5SAndroid Build Coastguard Worker     {
224*8975f5c5SAndroid Build Coastguard Worker         return mRenderer->getRendererDescription();
225*8975f5c5SAndroid Build Coastguard Worker     }
226*8975f5c5SAndroid Build Coastguard Worker     return std::string();
227*8975f5c5SAndroid Build Coastguard Worker }
228*8975f5c5SAndroid Build Coastguard Worker 
getVendorString()229*8975f5c5SAndroid Build Coastguard Worker std::string DisplayVk::getVendorString()
230*8975f5c5SAndroid Build Coastguard Worker {
231*8975f5c5SAndroid Build Coastguard Worker     if (mRenderer)
232*8975f5c5SAndroid Build Coastguard Worker     {
233*8975f5c5SAndroid Build Coastguard Worker         return mRenderer->getVendorString();
234*8975f5c5SAndroid Build Coastguard Worker     }
235*8975f5c5SAndroid Build Coastguard Worker     return std::string();
236*8975f5c5SAndroid Build Coastguard Worker }
237*8975f5c5SAndroid Build Coastguard Worker 
getVersionString(bool includeFullVersion)238*8975f5c5SAndroid Build Coastguard Worker std::string DisplayVk::getVersionString(bool includeFullVersion)
239*8975f5c5SAndroid Build Coastguard Worker {
240*8975f5c5SAndroid Build Coastguard Worker     if (mRenderer)
241*8975f5c5SAndroid Build Coastguard Worker     {
242*8975f5c5SAndroid Build Coastguard Worker         return mRenderer->getVersionString(includeFullVersion);
243*8975f5c5SAndroid Build Coastguard Worker     }
244*8975f5c5SAndroid Build Coastguard Worker     return std::string();
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker 
createDevice()247*8975f5c5SAndroid Build Coastguard Worker DeviceImpl *DisplayVk::createDevice()
248*8975f5c5SAndroid Build Coastguard Worker {
249*8975f5c5SAndroid Build Coastguard Worker     return new DeviceVk();
250*8975f5c5SAndroid Build Coastguard Worker }
251*8975f5c5SAndroid Build Coastguard Worker 
waitClient(const gl::Context * context)252*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayVk::waitClient(const gl::Context *context)
253*8975f5c5SAndroid Build Coastguard Worker {
254*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRACE_EVENT0("gpu.angle", "DisplayVk::waitClient");
255*8975f5c5SAndroid Build Coastguard Worker     ContextVk *contextVk = vk::GetImpl(context);
256*8975f5c5SAndroid Build Coastguard Worker     return angle::ToEGL(contextVk->finishImpl(RenderPassClosureReason::EGLWaitClient),
257*8975f5c5SAndroid Build Coastguard Worker                         EGL_BAD_ACCESS);
258*8975f5c5SAndroid Build Coastguard Worker }
259*8975f5c5SAndroid Build Coastguard Worker 
waitNative(const gl::Context * context,EGLint engine)260*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayVk::waitNative(const gl::Context *context, EGLint engine)
261*8975f5c5SAndroid Build Coastguard Worker {
262*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRACE_EVENT0("gpu.angle", "DisplayVk::waitNative");
263*8975f5c5SAndroid Build Coastguard Worker     return angle::ResultToEGL(waitNativeImpl());
264*8975f5c5SAndroid Build Coastguard Worker }
265*8975f5c5SAndroid Build Coastguard Worker 
waitNativeImpl()266*8975f5c5SAndroid Build Coastguard Worker angle::Result DisplayVk::waitNativeImpl()
267*8975f5c5SAndroid Build Coastguard Worker {
268*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
269*8975f5c5SAndroid Build Coastguard Worker }
270*8975f5c5SAndroid Build Coastguard Worker 
createWindowSurface(const egl::SurfaceState & state,EGLNativeWindowType window,const egl::AttributeMap & attribs)271*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *DisplayVk::createWindowSurface(const egl::SurfaceState &state,
272*8975f5c5SAndroid Build Coastguard Worker                                             EGLNativeWindowType window,
273*8975f5c5SAndroid Build Coastguard Worker                                             const egl::AttributeMap &attribs)
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker     return createWindowSurfaceVk(state, window);
276*8975f5c5SAndroid Build Coastguard Worker }
277*8975f5c5SAndroid Build Coastguard Worker 
createPbufferSurface(const egl::SurfaceState & state,const egl::AttributeMap & attribs)278*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *DisplayVk::createPbufferSurface(const egl::SurfaceState &state,
279*8975f5c5SAndroid Build Coastguard Worker                                              const egl::AttributeMap &attribs)
280*8975f5c5SAndroid Build Coastguard Worker {
281*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer);
282*8975f5c5SAndroid Build Coastguard Worker     return new OffscreenSurfaceVk(state, mRenderer);
283*8975f5c5SAndroid Build Coastguard Worker }
284*8975f5c5SAndroid Build Coastguard Worker 
createPbufferFromClientBuffer(const egl::SurfaceState & state,EGLenum buftype,EGLClientBuffer clientBuffer,const egl::AttributeMap & attribs)285*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *DisplayVk::createPbufferFromClientBuffer(const egl::SurfaceState &state,
286*8975f5c5SAndroid Build Coastguard Worker                                                       EGLenum buftype,
287*8975f5c5SAndroid Build Coastguard Worker                                                       EGLClientBuffer clientBuffer,
288*8975f5c5SAndroid Build Coastguard Worker                                                       const egl::AttributeMap &attribs)
289*8975f5c5SAndroid Build Coastguard Worker {
290*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
291*8975f5c5SAndroid Build Coastguard Worker     return static_cast<SurfaceImpl *>(0);
292*8975f5c5SAndroid Build Coastguard Worker }
293*8975f5c5SAndroid Build Coastguard Worker 
createPixmapSurface(const egl::SurfaceState & state,NativePixmapType nativePixmap,const egl::AttributeMap & attribs)294*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *DisplayVk::createPixmapSurface(const egl::SurfaceState &state,
295*8975f5c5SAndroid Build Coastguard Worker                                             NativePixmapType nativePixmap,
296*8975f5c5SAndroid Build Coastguard Worker                                             const egl::AttributeMap &attribs)
297*8975f5c5SAndroid Build Coastguard Worker {
298*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
299*8975f5c5SAndroid Build Coastguard Worker     return static_cast<SurfaceImpl *>(0);
300*8975f5c5SAndroid Build Coastguard Worker }
301*8975f5c5SAndroid Build Coastguard Worker 
createImage(const egl::ImageState & state,const gl::Context * context,EGLenum target,const egl::AttributeMap & attribs)302*8975f5c5SAndroid Build Coastguard Worker ImageImpl *DisplayVk::createImage(const egl::ImageState &state,
303*8975f5c5SAndroid Build Coastguard Worker                                   const gl::Context *context,
304*8975f5c5SAndroid Build Coastguard Worker                                   EGLenum target,
305*8975f5c5SAndroid Build Coastguard Worker                                   const egl::AttributeMap &attribs)
306*8975f5c5SAndroid Build Coastguard Worker {
307*8975f5c5SAndroid Build Coastguard Worker     return new ImageVk(state, context);
308*8975f5c5SAndroid Build Coastguard Worker }
309*8975f5c5SAndroid Build Coastguard Worker 
createShareGroup(const egl::ShareGroupState & state)310*8975f5c5SAndroid Build Coastguard Worker ShareGroupImpl *DisplayVk::createShareGroup(const egl::ShareGroupState &state)
311*8975f5c5SAndroid Build Coastguard Worker {
312*8975f5c5SAndroid Build Coastguard Worker     return new ShareGroupVk(state, mRenderer);
313*8975f5c5SAndroid Build Coastguard Worker }
314*8975f5c5SAndroid Build Coastguard Worker 
isConfigFormatSupported(VkFormat format) const315*8975f5c5SAndroid Build Coastguard Worker bool DisplayVk::isConfigFormatSupported(VkFormat format) const
316*8975f5c5SAndroid Build Coastguard Worker {
317*8975f5c5SAndroid Build Coastguard Worker     // Requires VK_GOOGLE_surfaceless_query extension to be supported.
318*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer->getFeatures().supportsSurfacelessQueryExtension.enabled);
319*8975f5c5SAndroid Build Coastguard Worker 
320*8975f5c5SAndroid Build Coastguard Worker     // A format is considered supported if it is supported in atleast 1 colorspace.
321*8975f5c5SAndroid Build Coastguard Worker     using ColorspaceFormatSetItem =
322*8975f5c5SAndroid Build Coastguard Worker         const std::pair<const VkColorSpaceKHR, std::unordered_set<VkFormat>>;
323*8975f5c5SAndroid Build Coastguard Worker     for (ColorspaceFormatSetItem &colorspaceFormatSetItem : mSupportedColorspaceFormatsMap)
324*8975f5c5SAndroid Build Coastguard Worker     {
325*8975f5c5SAndroid Build Coastguard Worker         if (colorspaceFormatSetItem.second.count(format) > 0)
326*8975f5c5SAndroid Build Coastguard Worker         {
327*8975f5c5SAndroid Build Coastguard Worker             return true;
328*8975f5c5SAndroid Build Coastguard Worker         }
329*8975f5c5SAndroid Build Coastguard Worker     }
330*8975f5c5SAndroid Build Coastguard Worker 
331*8975f5c5SAndroid Build Coastguard Worker     return false;
332*8975f5c5SAndroid Build Coastguard Worker }
333*8975f5c5SAndroid Build Coastguard Worker 
isSurfaceFormatColorspacePairSupported(VkSurfaceKHR surface,VkFormat format,VkColorSpaceKHR colorspace) const334*8975f5c5SAndroid Build Coastguard Worker bool DisplayVk::isSurfaceFormatColorspacePairSupported(VkSurfaceKHR surface,
335*8975f5c5SAndroid Build Coastguard Worker                                                        VkFormat format,
336*8975f5c5SAndroid Build Coastguard Worker                                                        VkColorSpaceKHR colorspace) const
337*8975f5c5SAndroid Build Coastguard Worker {
338*8975f5c5SAndroid Build Coastguard Worker     if (mSupportedColorspaceFormatsMap.size() > 0)
339*8975f5c5SAndroid Build Coastguard Worker     {
340*8975f5c5SAndroid Build Coastguard Worker         return mSupportedColorspaceFormatsMap.count(colorspace) > 0 &&
341*8975f5c5SAndroid Build Coastguard Worker                mSupportedColorspaceFormatsMap.at(colorspace).count(format) > 0;
342*8975f5c5SAndroid Build Coastguard Worker     }
343*8975f5c5SAndroid Build Coastguard Worker     else
344*8975f5c5SAndroid Build Coastguard Worker     {
345*8975f5c5SAndroid Build Coastguard Worker         const angle::FeaturesVk &featuresVk = mRenderer->getFeatures();
346*8975f5c5SAndroid Build Coastguard Worker         std::vector<VkSurfaceFormat2KHR> surfaceFormats;
347*8975f5c5SAndroid Build Coastguard Worker         GetSupportedFormatColorspaces(mRenderer->getPhysicalDevice(), featuresVk, surface,
348*8975f5c5SAndroid Build Coastguard Worker                                       &surfaceFormats);
349*8975f5c5SAndroid Build Coastguard Worker 
350*8975f5c5SAndroid Build Coastguard Worker         if (!featuresVk.supportsSurfaceCapabilities2Extension.enabled)
351*8975f5c5SAndroid Build Coastguard Worker         {
352*8975f5c5SAndroid Build Coastguard Worker             if (surfaceFormats.size() == 1u &&
353*8975f5c5SAndroid Build Coastguard Worker                 surfaceFormats[0].surfaceFormat.format == VK_FORMAT_UNDEFINED)
354*8975f5c5SAndroid Build Coastguard Worker             {
355*8975f5c5SAndroid Build Coastguard Worker                 return true;
356*8975f5c5SAndroid Build Coastguard Worker             }
357*8975f5c5SAndroid Build Coastguard Worker         }
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker         for (const VkSurfaceFormat2KHR &surfaceFormat : surfaceFormats)
360*8975f5c5SAndroid Build Coastguard Worker         {
361*8975f5c5SAndroid Build Coastguard Worker             if (surfaceFormat.surfaceFormat.format == format &&
362*8975f5c5SAndroid Build Coastguard Worker                 surfaceFormat.surfaceFormat.colorSpace == colorspace)
363*8975f5c5SAndroid Build Coastguard Worker             {
364*8975f5c5SAndroid Build Coastguard Worker                 return true;
365*8975f5c5SAndroid Build Coastguard Worker             }
366*8975f5c5SAndroid Build Coastguard Worker         }
367*8975f5c5SAndroid Build Coastguard Worker     }
368*8975f5c5SAndroid Build Coastguard Worker 
369*8975f5c5SAndroid Build Coastguard Worker     return false;
370*8975f5c5SAndroid Build Coastguard Worker }
371*8975f5c5SAndroid Build Coastguard Worker 
isColorspaceSupported(VkColorSpaceKHR colorspace) const372*8975f5c5SAndroid Build Coastguard Worker bool DisplayVk::isColorspaceSupported(VkColorSpaceKHR colorspace) const
373*8975f5c5SAndroid Build Coastguard Worker {
374*8975f5c5SAndroid Build Coastguard Worker     return mSupportedColorspaceFormatsMap.count(colorspace) > 0;
375*8975f5c5SAndroid Build Coastguard Worker }
376*8975f5c5SAndroid Build Coastguard Worker 
initSupportedSurfaceFormatColorspaces()377*8975f5c5SAndroid Build Coastguard Worker void DisplayVk::initSupportedSurfaceFormatColorspaces()
378*8975f5c5SAndroid Build Coastguard Worker {
379*8975f5c5SAndroid Build Coastguard Worker     const angle::FeaturesVk &featuresVk = mRenderer->getFeatures();
380*8975f5c5SAndroid Build Coastguard Worker     if (featuresVk.supportsSurfacelessQueryExtension.enabled &&
381*8975f5c5SAndroid Build Coastguard Worker         featuresVk.supportsSurfaceCapabilities2Extension.enabled)
382*8975f5c5SAndroid Build Coastguard Worker     {
383*8975f5c5SAndroid Build Coastguard Worker         // Use the VK_GOOGLE_surfaceless_query extension to query supported surface formats and
384*8975f5c5SAndroid Build Coastguard Worker         // colorspaces by using a VK_NULL_HANDLE for the VkSurfaceKHR handle.
385*8975f5c5SAndroid Build Coastguard Worker         std::vector<VkSurfaceFormat2KHR> surfaceFormats;
386*8975f5c5SAndroid Build Coastguard Worker         GetSupportedFormatColorspaces(mRenderer->getPhysicalDevice(), featuresVk, VK_NULL_HANDLE,
387*8975f5c5SAndroid Build Coastguard Worker                                       &surfaceFormats);
388*8975f5c5SAndroid Build Coastguard Worker         for (const VkSurfaceFormat2KHR &surfaceFormat : surfaceFormats)
389*8975f5c5SAndroid Build Coastguard Worker         {
390*8975f5c5SAndroid Build Coastguard Worker             // Cache supported VkFormat and VkColorSpaceKHR for later use
391*8975f5c5SAndroid Build Coastguard Worker             VkFormat format            = surfaceFormat.surfaceFormat.format;
392*8975f5c5SAndroid Build Coastguard Worker             VkColorSpaceKHR colorspace = surfaceFormat.surfaceFormat.colorSpace;
393*8975f5c5SAndroid Build Coastguard Worker 
394*8975f5c5SAndroid Build Coastguard Worker             ASSERT(format != VK_FORMAT_UNDEFINED);
395*8975f5c5SAndroid Build Coastguard Worker 
396*8975f5c5SAndroid Build Coastguard Worker             mSupportedColorspaceFormatsMap[colorspace].insert(format);
397*8975f5c5SAndroid Build Coastguard Worker         }
398*8975f5c5SAndroid Build Coastguard Worker 
399*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mSupportedColorspaceFormatsMap.size() > 0);
400*8975f5c5SAndroid Build Coastguard Worker     }
401*8975f5c5SAndroid Build Coastguard Worker     else
402*8975f5c5SAndroid Build Coastguard Worker     {
403*8975f5c5SAndroid Build Coastguard Worker         mSupportedColorspaceFormatsMap.clear();
404*8975f5c5SAndroid Build Coastguard Worker     }
405*8975f5c5SAndroid Build Coastguard Worker }
406*8975f5c5SAndroid Build Coastguard Worker 
createContext(const gl::State & state,gl::ErrorSet * errorSet,const egl::Config * configuration,const gl::Context * shareContext,const egl::AttributeMap & attribs)407*8975f5c5SAndroid Build Coastguard Worker ContextImpl *DisplayVk::createContext(const gl::State &state,
408*8975f5c5SAndroid Build Coastguard Worker                                       gl::ErrorSet *errorSet,
409*8975f5c5SAndroid Build Coastguard Worker                                       const egl::Config *configuration,
410*8975f5c5SAndroid Build Coastguard Worker                                       const gl::Context *shareContext,
411*8975f5c5SAndroid Build Coastguard Worker                                       const egl::AttributeMap &attribs)
412*8975f5c5SAndroid Build Coastguard Worker {
413*8975f5c5SAndroid Build Coastguard Worker     return new ContextVk(state, errorSet, mRenderer);
414*8975f5c5SAndroid Build Coastguard Worker }
415*8975f5c5SAndroid Build Coastguard Worker 
createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType,const egl::AttributeMap & attribs)416*8975f5c5SAndroid Build Coastguard Worker StreamProducerImpl *DisplayVk::createStreamProducerD3DTexture(
417*8975f5c5SAndroid Build Coastguard Worker     egl::Stream::ConsumerType consumerType,
418*8975f5c5SAndroid Build Coastguard Worker     const egl::AttributeMap &attribs)
419*8975f5c5SAndroid Build Coastguard Worker {
420*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
421*8975f5c5SAndroid Build Coastguard Worker     return static_cast<StreamProducerImpl *>(0);
422*8975f5c5SAndroid Build Coastguard Worker }
423*8975f5c5SAndroid Build Coastguard Worker 
createSync()424*8975f5c5SAndroid Build Coastguard Worker EGLSyncImpl *DisplayVk::createSync()
425*8975f5c5SAndroid Build Coastguard Worker {
426*8975f5c5SAndroid Build Coastguard Worker     return new EGLSyncVk();
427*8975f5c5SAndroid Build Coastguard Worker }
428*8975f5c5SAndroid Build Coastguard Worker 
getMaxSupportedESVersion() const429*8975f5c5SAndroid Build Coastguard Worker gl::Version DisplayVk::getMaxSupportedESVersion() const
430*8975f5c5SAndroid Build Coastguard Worker {
431*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getMaxSupportedESVersion();
432*8975f5c5SAndroid Build Coastguard Worker }
433*8975f5c5SAndroid Build Coastguard Worker 
getMaxConformantESVersion() const434*8975f5c5SAndroid Build Coastguard Worker gl::Version DisplayVk::getMaxConformantESVersion() const
435*8975f5c5SAndroid Build Coastguard Worker {
436*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getMaxConformantESVersion();
437*8975f5c5SAndroid Build Coastguard Worker }
438*8975f5c5SAndroid Build Coastguard Worker 
validateImageClientBuffer(const gl::Context * context,EGLenum target,EGLClientBuffer clientBuffer,const egl::AttributeMap & attribs) const439*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayVk::validateImageClientBuffer(const gl::Context *context,
440*8975f5c5SAndroid Build Coastguard Worker                                                 EGLenum target,
441*8975f5c5SAndroid Build Coastguard Worker                                                 EGLClientBuffer clientBuffer,
442*8975f5c5SAndroid Build Coastguard Worker                                                 const egl::AttributeMap &attribs) const
443*8975f5c5SAndroid Build Coastguard Worker {
444*8975f5c5SAndroid Build Coastguard Worker     switch (target)
445*8975f5c5SAndroid Build Coastguard Worker     {
446*8975f5c5SAndroid Build Coastguard Worker         case EGL_VULKAN_IMAGE_ANGLE:
447*8975f5c5SAndroid Build Coastguard Worker         {
448*8975f5c5SAndroid Build Coastguard Worker             VkImage *vkImage = reinterpret_cast<VkImage *>(clientBuffer);
449*8975f5c5SAndroid Build Coastguard Worker             if (!vkImage || *vkImage == VK_NULL_HANDLE)
450*8975f5c5SAndroid Build Coastguard Worker             {
451*8975f5c5SAndroid Build Coastguard Worker                 return egl::EglBadParameter() << "clientBuffer is invalid.";
452*8975f5c5SAndroid Build Coastguard Worker             }
453*8975f5c5SAndroid Build Coastguard Worker 
454*8975f5c5SAndroid Build Coastguard Worker             GLenum internalFormat =
455*8975f5c5SAndroid Build Coastguard Worker                 static_cast<GLenum>(attribs.get(EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_NONE));
456*8975f5c5SAndroid Build Coastguard Worker             switch (internalFormat)
457*8975f5c5SAndroid Build Coastguard Worker             {
458*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA:
459*8975f5c5SAndroid Build Coastguard Worker                 case GL_BGRA_EXT:
460*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGB:
461*8975f5c5SAndroid Build Coastguard Worker                 case GL_RED_EXT:
462*8975f5c5SAndroid Build Coastguard Worker                 case GL_RG_EXT:
463*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGB10_A2_EXT:
464*8975f5c5SAndroid Build Coastguard Worker                 case GL_R16_EXT:
465*8975f5c5SAndroid Build Coastguard Worker                 case GL_RG16_EXT:
466*8975f5c5SAndroid Build Coastguard Worker                 case GL_NONE:
467*8975f5c5SAndroid Build Coastguard Worker                     break;
468*8975f5c5SAndroid Build Coastguard Worker                 default:
469*8975f5c5SAndroid Build Coastguard Worker                     return egl::EglBadParameter() << "Invalid EGLImage texture internal format: 0x"
470*8975f5c5SAndroid Build Coastguard Worker                                                   << std::hex << internalFormat;
471*8975f5c5SAndroid Build Coastguard Worker             }
472*8975f5c5SAndroid Build Coastguard Worker 
473*8975f5c5SAndroid Build Coastguard Worker             uint64_t hi = static_cast<uint64_t>(attribs.get(EGL_VULKAN_IMAGE_CREATE_INFO_HI_ANGLE));
474*8975f5c5SAndroid Build Coastguard Worker             uint64_t lo = static_cast<uint64_t>(attribs.get(EGL_VULKAN_IMAGE_CREATE_INFO_LO_ANGLE));
475*8975f5c5SAndroid Build Coastguard Worker             uint64_t info = ((hi & 0xffffffff) << 32) | (lo & 0xffffffff);
476*8975f5c5SAndroid Build Coastguard Worker             if (reinterpret_cast<const VkImageCreateInfo *>(info)->sType !=
477*8975f5c5SAndroid Build Coastguard Worker                 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
478*8975f5c5SAndroid Build Coastguard Worker             {
479*8975f5c5SAndroid Build Coastguard Worker                 return egl::EglBadParameter()
480*8975f5c5SAndroid Build Coastguard Worker                        << "EGL_VULKAN_IMAGE_CREATE_INFO_HI_ANGLE and "
481*8975f5c5SAndroid Build Coastguard Worker                           "EGL_VULKAN_IMAGE_CREATE_INFO_LO_ANGLE are not pointing to a "
482*8975f5c5SAndroid Build Coastguard Worker                           "valid VkImageCreateInfo structure.";
483*8975f5c5SAndroid Build Coastguard Worker             }
484*8975f5c5SAndroid Build Coastguard Worker 
485*8975f5c5SAndroid Build Coastguard Worker             return egl::NoError();
486*8975f5c5SAndroid Build Coastguard Worker         }
487*8975f5c5SAndroid Build Coastguard Worker         default:
488*8975f5c5SAndroid Build Coastguard Worker             return DisplayImpl::validateImageClientBuffer(context, target, clientBuffer, attribs);
489*8975f5c5SAndroid Build Coastguard Worker     }
490*8975f5c5SAndroid Build Coastguard Worker }
491*8975f5c5SAndroid Build Coastguard Worker 
createExternalImageSibling(const gl::Context * context,EGLenum target,EGLClientBuffer buffer,const egl::AttributeMap & attribs)492*8975f5c5SAndroid Build Coastguard Worker ExternalImageSiblingImpl *DisplayVk::createExternalImageSibling(const gl::Context *context,
493*8975f5c5SAndroid Build Coastguard Worker                                                                 EGLenum target,
494*8975f5c5SAndroid Build Coastguard Worker                                                                 EGLClientBuffer buffer,
495*8975f5c5SAndroid Build Coastguard Worker                                                                 const egl::AttributeMap &attribs)
496*8975f5c5SAndroid Build Coastguard Worker {
497*8975f5c5SAndroid Build Coastguard Worker     switch (target)
498*8975f5c5SAndroid Build Coastguard Worker     {
499*8975f5c5SAndroid Build Coastguard Worker         case EGL_VULKAN_IMAGE_ANGLE:
500*8975f5c5SAndroid Build Coastguard Worker             return new VkImageImageSiblingVk(buffer, attribs);
501*8975f5c5SAndroid Build Coastguard Worker         default:
502*8975f5c5SAndroid Build Coastguard Worker             return DisplayImpl::createExternalImageSibling(context, target, buffer, attribs);
503*8975f5c5SAndroid Build Coastguard Worker     }
504*8975f5c5SAndroid Build Coastguard Worker }
505*8975f5c5SAndroid Build Coastguard Worker 
generateExtensions(egl::DisplayExtensions * outExtensions) const506*8975f5c5SAndroid Build Coastguard Worker void DisplayVk::generateExtensions(egl::DisplayExtensions *outExtensions) const
507*8975f5c5SAndroid Build Coastguard Worker {
508*8975f5c5SAndroid Build Coastguard Worker     outExtensions->createContextRobustness  = getRenderer()->getNativeExtensions().robustnessAny();
509*8975f5c5SAndroid Build Coastguard Worker     outExtensions->surfaceOrientation       = true;
510*8975f5c5SAndroid Build Coastguard Worker     outExtensions->displayTextureShareGroup = true;
511*8975f5c5SAndroid Build Coastguard Worker     outExtensions->displaySemaphoreShareGroup        = true;
512*8975f5c5SAndroid Build Coastguard Worker     outExtensions->robustResourceInitializationANGLE = true;
513*8975f5c5SAndroid Build Coastguard Worker 
514*8975f5c5SAndroid Build Coastguard Worker     // The Vulkan implementation will always say that EGL_KHR_swap_buffers_with_damage is supported.
515*8975f5c5SAndroid Build Coastguard Worker     // When the Vulkan driver supports VK_KHR_incremental_present, it will use it.  Otherwise, it
516*8975f5c5SAndroid Build Coastguard Worker     // will ignore the hint and do a regular swap.
517*8975f5c5SAndroid Build Coastguard Worker     outExtensions->swapBuffersWithDamage = true;
518*8975f5c5SAndroid Build Coastguard Worker 
519*8975f5c5SAndroid Build Coastguard Worker     outExtensions->fenceSync            = true;
520*8975f5c5SAndroid Build Coastguard Worker     outExtensions->waitSync             = true;
521*8975f5c5SAndroid Build Coastguard Worker     outExtensions->globalFenceSyncANGLE = true;
522*8975f5c5SAndroid Build Coastguard Worker 
523*8975f5c5SAndroid Build Coastguard Worker     outExtensions->image                 = true;
524*8975f5c5SAndroid Build Coastguard Worker     outExtensions->imageBase             = true;
525*8975f5c5SAndroid Build Coastguard Worker     outExtensions->imagePixmap           = false;  // ANGLE does not support pixmaps
526*8975f5c5SAndroid Build Coastguard Worker     outExtensions->glTexture2DImage      = true;
527*8975f5c5SAndroid Build Coastguard Worker     outExtensions->glTextureCubemapImage = true;
528*8975f5c5SAndroid Build Coastguard Worker     outExtensions->glTexture3DImage      = getFeatures().supportsSampler2dViewOf3d.enabled;
529*8975f5c5SAndroid Build Coastguard Worker     outExtensions->glRenderbufferImage = true;
530*8975f5c5SAndroid Build Coastguard Worker     outExtensions->imageNativeBuffer     = getFeatures().supportsAndroidHardwareBuffer.enabled;
531*8975f5c5SAndroid Build Coastguard Worker     outExtensions->surfacelessContext = true;
532*8975f5c5SAndroid Build Coastguard Worker     outExtensions->glColorspace       = true;
533*8975f5c5SAndroid Build Coastguard Worker     outExtensions->imageGlColorspace =
534*8975f5c5SAndroid Build Coastguard Worker         outExtensions->glColorspace && getFeatures().supportsImageFormatList.enabled;
535*8975f5c5SAndroid Build Coastguard Worker 
536*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID)
537*8975f5c5SAndroid Build Coastguard Worker     outExtensions->getNativeClientBufferANDROID = true;
538*8975f5c5SAndroid Build Coastguard Worker     outExtensions->framebufferTargetANDROID     = true;
539*8975f5c5SAndroid Build Coastguard Worker 
540*8975f5c5SAndroid Build Coastguard Worker     // Only expose EGL_ANDROID_front_buffer_auto_refresh on Android and when Vulkan supports
541*8975f5c5SAndroid Build Coastguard Worker     // VK_EXT_swapchain_maintenance1 (supportsSwapchainMaintenance1 feature), since we know that
542*8975f5c5SAndroid Build Coastguard Worker     // VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR and VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR
543*8975f5c5SAndroid Build Coastguard Worker     // are compatible on Android (does not require swapchain recreation).
544*8975f5c5SAndroid Build Coastguard Worker     outExtensions->frontBufferAutoRefreshANDROID =
545*8975f5c5SAndroid Build Coastguard Worker         getFeatures().supportsSwapchainMaintenance1.enabled;
546*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_PLATFORM_ANDROID)
547*8975f5c5SAndroid Build Coastguard Worker 
548*8975f5c5SAndroid Build Coastguard Worker     // EGL_EXT_image_dma_buf_import is only exposed if EGL_EXT_image_dma_buf_import_modifiers can
549*8975f5c5SAndroid Build Coastguard Worker     // also be exposed.  The Vulkan extensions that support these EGL extensions are not split in
550*8975f5c5SAndroid Build Coastguard Worker     // the same way; both Vulkan extensions are needed for EGL_EXT_image_dma_buf_import, and with
551*8975f5c5SAndroid Build Coastguard Worker     // both Vulkan extensions, EGL_EXT_image_dma_buf_import_modifiers is also supportable.
552*8975f5c5SAndroid Build Coastguard Worker     outExtensions->imageDmaBufImportEXT =
553*8975f5c5SAndroid Build Coastguard Worker         getFeatures().supportsExternalMemoryDmaBufAndModifiers.enabled;
554*8975f5c5SAndroid Build Coastguard Worker     outExtensions->imageDmaBufImportModifiersEXT = outExtensions->imageDmaBufImportEXT;
555*8975f5c5SAndroid Build Coastguard Worker 
556*8975f5c5SAndroid Build Coastguard Worker     // Disable context priority when non-zero memory init is enabled. This enforces a queue order.
557*8975f5c5SAndroid Build Coastguard Worker     outExtensions->contextPriority = !getFeatures().allocateNonZeroMemory.enabled;
558*8975f5c5SAndroid Build Coastguard Worker     outExtensions->noConfigContext = true;
559*8975f5c5SAndroid Build Coastguard Worker 
560*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID) || defined(ANGLE_PLATFORM_LINUX)
561*8975f5c5SAndroid Build Coastguard Worker     outExtensions->nativeFenceSyncANDROID = getFeatures().supportsAndroidNativeFenceSync.enabled;
562*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_PLATFORM_ANDROID) || defined(ANGLE_PLATFORM_LINUX)
563*8975f5c5SAndroid Build Coastguard Worker 
564*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_GGP)
565*8975f5c5SAndroid Build Coastguard Worker     outExtensions->ggpStreamDescriptor = true;
566*8975f5c5SAndroid Build Coastguard Worker     outExtensions->swapWithFrameToken  = getFeatures().supportsGGPFrameToken.enabled;
567*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_PLATFORM_GGP)
568*8975f5c5SAndroid Build Coastguard Worker 
569*8975f5c5SAndroid Build Coastguard Worker     outExtensions->bufferAgeEXT = true;
570*8975f5c5SAndroid Build Coastguard Worker 
571*8975f5c5SAndroid Build Coastguard Worker     outExtensions->protectedContentEXT = (getFeatures().supportsProtectedMemory.enabled &&
572*8975f5c5SAndroid Build Coastguard Worker                                           getFeatures().supportsSurfaceProtectedSwapchains.enabled);
573*8975f5c5SAndroid Build Coastguard Worker 
574*8975f5c5SAndroid Build Coastguard Worker     outExtensions->createSurfaceSwapIntervalANGLE = true;
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker     outExtensions->mutableRenderBufferKHR =
577*8975f5c5SAndroid Build Coastguard Worker         getFeatures().supportsSharedPresentableImageExtension.enabled;
578*8975f5c5SAndroid Build Coastguard Worker 
579*8975f5c5SAndroid Build Coastguard Worker     outExtensions->vulkanImageANGLE = true;
580*8975f5c5SAndroid Build Coastguard Worker 
581*8975f5c5SAndroid Build Coastguard Worker     outExtensions->lockSurface3KHR = getFeatures().supportsLockSurfaceExtension.enabled;
582*8975f5c5SAndroid Build Coastguard Worker 
583*8975f5c5SAndroid Build Coastguard Worker     outExtensions->partialUpdateKHR = true;
584*8975f5c5SAndroid Build Coastguard Worker 
585*8975f5c5SAndroid Build Coastguard Worker     outExtensions->timestampSurfaceAttributeANGLE =
586*8975f5c5SAndroid Build Coastguard Worker         getFeatures().supportsTimestampSurfaceAttribute.enabled;
587*8975f5c5SAndroid Build Coastguard Worker 
588*8975f5c5SAndroid Build Coastguard Worker     outExtensions->eglColorspaceAttributePassthroughANGLE =
589*8975f5c5SAndroid Build Coastguard Worker         outExtensions->glColorspace && getFeatures().eglColorspaceAttributePassthrough.enabled;
590*8975f5c5SAndroid Build Coastguard Worker 
591*8975f5c5SAndroid Build Coastguard Worker     // If EGL_KHR_gl_colorspace extension is supported check if other colorspace extensions
592*8975f5c5SAndroid Build Coastguard Worker     // can be supported as well.
593*8975f5c5SAndroid Build Coastguard Worker     if (outExtensions->glColorspace)
594*8975f5c5SAndroid Build Coastguard Worker     {
595*8975f5c5SAndroid Build Coastguard Worker         if (isColorspaceSupported(VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT))
596*8975f5c5SAndroid Build Coastguard Worker         {
597*8975f5c5SAndroid Build Coastguard Worker             outExtensions->glColorspaceDisplayP3            = true;
598*8975f5c5SAndroid Build Coastguard Worker             outExtensions->glColorspaceDisplayP3Passthrough = true;
599*8975f5c5SAndroid Build Coastguard Worker         }
600*8975f5c5SAndroid Build Coastguard Worker 
601*8975f5c5SAndroid Build Coastguard Worker         outExtensions->glColorspaceDisplayP3Linear =
602*8975f5c5SAndroid Build Coastguard Worker             isColorspaceSupported(VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT);
603*8975f5c5SAndroid Build Coastguard Worker         outExtensions->glColorspaceScrgb =
604*8975f5c5SAndroid Build Coastguard Worker             isColorspaceSupported(VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT);
605*8975f5c5SAndroid Build Coastguard Worker         outExtensions->glColorspaceScrgbLinear =
606*8975f5c5SAndroid Build Coastguard Worker             isColorspaceSupported(VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT);
607*8975f5c5SAndroid Build Coastguard Worker         outExtensions->glColorspaceBt2020Linear =
608*8975f5c5SAndroid Build Coastguard Worker             isColorspaceSupported(VK_COLOR_SPACE_BT2020_LINEAR_EXT);
609*8975f5c5SAndroid Build Coastguard Worker         outExtensions->glColorspaceBt2020Pq =
610*8975f5c5SAndroid Build Coastguard Worker             isColorspaceSupported(VK_COLOR_SPACE_HDR10_ST2084_EXT);
611*8975f5c5SAndroid Build Coastguard Worker         outExtensions->glColorspaceBt2020Hlg = isColorspaceSupported(VK_COLOR_SPACE_HDR10_HLG_EXT);
612*8975f5c5SAndroid Build Coastguard Worker     }
613*8975f5c5SAndroid Build Coastguard Worker }
614*8975f5c5SAndroid Build Coastguard Worker 
generateCaps(egl::Caps * outCaps) const615*8975f5c5SAndroid Build Coastguard Worker void DisplayVk::generateCaps(egl::Caps *outCaps) const
616*8975f5c5SAndroid Build Coastguard Worker {
617*8975f5c5SAndroid Build Coastguard Worker     outCaps->textureNPOT = true;
618*8975f5c5SAndroid Build Coastguard Worker     outCaps->stencil8    = getRenderer()->getNativeExtensions().textureStencil8OES;
619*8975f5c5SAndroid Build Coastguard Worker }
620*8975f5c5SAndroid Build Coastguard Worker 
getWSILayer() const621*8975f5c5SAndroid Build Coastguard Worker const char *DisplayVk::getWSILayer() const
622*8975f5c5SAndroid Build Coastguard Worker {
623*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
624*8975f5c5SAndroid Build Coastguard Worker }
625*8975f5c5SAndroid Build Coastguard Worker 
handleError(VkResult result,const char * file,const char * function,unsigned int line)626*8975f5c5SAndroid Build Coastguard Worker void DisplayVk::handleError(VkResult result,
627*8975f5c5SAndroid Build Coastguard Worker                             const char *file,
628*8975f5c5SAndroid Build Coastguard Worker                             const char *function,
629*8975f5c5SAndroid Build Coastguard Worker                             unsigned int line)
630*8975f5c5SAndroid Build Coastguard Worker {
631*8975f5c5SAndroid Build Coastguard Worker     ASSERT(result != VK_SUCCESS);
632*8975f5c5SAndroid Build Coastguard Worker 
633*8975f5c5SAndroid Build Coastguard Worker     std::stringstream errorStream;
634*8975f5c5SAndroid Build Coastguard Worker     errorStream << "Internal Vulkan error (" << result << "): " << VulkanResultString(result)
635*8975f5c5SAndroid Build Coastguard Worker                 << ", in " << file << ", " << function << ":" << line << ".";
636*8975f5c5SAndroid Build Coastguard Worker     std::string errorString = errorStream.str();
637*8975f5c5SAndroid Build Coastguard Worker 
638*8975f5c5SAndroid Build Coastguard Worker     if (result == VK_ERROR_DEVICE_LOST)
639*8975f5c5SAndroid Build Coastguard Worker     {
640*8975f5c5SAndroid Build Coastguard Worker         WARN() << errorString;
641*8975f5c5SAndroid Build Coastguard Worker         mRenderer->notifyDeviceLost();
642*8975f5c5SAndroid Build Coastguard Worker     }
643*8975f5c5SAndroid Build Coastguard Worker 
644*8975f5c5SAndroid Build Coastguard Worker     // Note: the errorCode will be set later in angle::ToEGL where it's available.
645*8975f5c5SAndroid Build Coastguard Worker     *egl::Display::GetCurrentThreadErrorScratchSpace() = egl::Error(0, 0, std::move(errorString));
646*8975f5c5SAndroid Build Coastguard Worker }
647*8975f5c5SAndroid Build Coastguard Worker 
initializeFrontendFeatures(angle::FrontendFeatures * features) const648*8975f5c5SAndroid Build Coastguard Worker void DisplayVk::initializeFrontendFeatures(angle::FrontendFeatures *features) const
649*8975f5c5SAndroid Build Coastguard Worker {
650*8975f5c5SAndroid Build Coastguard Worker     mRenderer->initializeFrontendFeatures(features);
651*8975f5c5SAndroid Build Coastguard Worker }
652*8975f5c5SAndroid Build Coastguard Worker 
populateFeatureList(angle::FeatureList * features)653*8975f5c5SAndroid Build Coastguard Worker void DisplayVk::populateFeatureList(angle::FeatureList *features)
654*8975f5c5SAndroid Build Coastguard Worker {
655*8975f5c5SAndroid Build Coastguard Worker     mRenderer->getFeatures().populateFeatureList(features);
656*8975f5c5SAndroid Build Coastguard Worker }
657*8975f5c5SAndroid Build Coastguard Worker 
658*8975f5c5SAndroid Build Coastguard Worker // vk::GlobalOps
putBlob(const angle::BlobCacheKey & key,const angle::MemoryBuffer & value)659*8975f5c5SAndroid Build Coastguard Worker void DisplayVk::putBlob(const angle::BlobCacheKey &key, const angle::MemoryBuffer &value)
660*8975f5c5SAndroid Build Coastguard Worker {
661*8975f5c5SAndroid Build Coastguard Worker     getBlobCache()->putApplication(nullptr, key, value);
662*8975f5c5SAndroid Build Coastguard Worker }
663*8975f5c5SAndroid Build Coastguard Worker 
getBlob(const angle::BlobCacheKey & key,angle::BlobCacheValue * valueOut)664*8975f5c5SAndroid Build Coastguard Worker bool DisplayVk::getBlob(const angle::BlobCacheKey &key, angle::BlobCacheValue *valueOut)
665*8975f5c5SAndroid Build Coastguard Worker {
666*8975f5c5SAndroid Build Coastguard Worker     return getBlobCache()->get(nullptr, &mScratchBuffer, key, valueOut);
667*8975f5c5SAndroid Build Coastguard Worker }
668*8975f5c5SAndroid Build Coastguard Worker 
postMultiThreadWorkerTask(const std::shared_ptr<angle::Closure> & task)669*8975f5c5SAndroid Build Coastguard Worker std::shared_ptr<angle::WaitableEvent> DisplayVk::postMultiThreadWorkerTask(
670*8975f5c5SAndroid Build Coastguard Worker     const std::shared_ptr<angle::Closure> &task)
671*8975f5c5SAndroid Build Coastguard Worker {
672*8975f5c5SAndroid Build Coastguard Worker     return mState.multiThreadPool->postWorkerTask(task);
673*8975f5c5SAndroid Build Coastguard Worker }
674*8975f5c5SAndroid Build Coastguard Worker 
notifyDeviceLost()675*8975f5c5SAndroid Build Coastguard Worker void DisplayVk::notifyDeviceLost()
676*8975f5c5SAndroid Build Coastguard Worker {
677*8975f5c5SAndroid Build Coastguard Worker     mState.notifyDeviceLost();
678*8975f5c5SAndroid Build Coastguard Worker }
679*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
680