// // Copyright 2018 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // DisplayVkAndroid.cpp: // Implements the class methods for DisplayVkAndroid. // #include "libANGLE/renderer/vulkan/android/DisplayVkAndroid.h" #include #include #include #include "common/version.h" #include "libANGLE/renderer/vulkan/RendererVk.h" #include "libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.h" #include "libANGLE/renderer/vulkan/android/WindowSurfaceVkAndroid.h" #include "libANGLE/renderer/vulkan/vk_caps_utils.h" namespace rx { DisplayVkAndroid::DisplayVkAndroid(const egl::DisplayState &state) : DisplayVk(state) {} egl::Error DisplayVkAndroid::initialize(egl::Display *display) { ANGLE_TRY(DisplayVk::initialize(display)); std::stringstream strstr; strstr << "Version (" << ANGLE_VERSION_STRING << "), "; strstr << "Renderer (" << mRenderer->getRendererDescription() << ")"; __android_log_print(ANDROID_LOG_INFO, "ANGLE", "%s", strstr.str().c_str()); return egl::NoError(); } bool DisplayVkAndroid::isValidNativeWindow(EGLNativeWindowType window) const { return (ANativeWindow_getFormat(window) >= 0); } SurfaceImpl *DisplayVkAndroid::createWindowSurfaceVk(const egl::SurfaceState &state, EGLNativeWindowType window) { return new WindowSurfaceVkAndroid(state, window); } egl::ConfigSet DisplayVkAndroid::generateConfigs() { // TODO (Issue 4062): Add conditional support for GL_RGB10_A2 and GL_RGBA16F when the // Android Vulkan loader adds conditional support for them. constexpr GLenum kColorFormats[] = {GL_RGBA8, GL_RGB8, GL_RGB565}; return egl_vk::GenerateConfigs(kColorFormats, egl_vk::kConfigDepthStencilFormats, this); } bool DisplayVkAndroid::checkConfigSupport(egl::Config *config) { // TODO(geofflang): Test for native support and modify the config accordingly. // anglebug.com/2692 return true; } egl::Error DisplayVkAndroid::validateImageClientBuffer(const gl::Context *context, EGLenum target, EGLClientBuffer clientBuffer, const egl::AttributeMap &attribs) const { switch (target) { case EGL_NATIVE_BUFFER_ANDROID: return HardwareBufferImageSiblingVkAndroid::ValidateHardwareBuffer(mRenderer, clientBuffer); default: return DisplayVk::validateImageClientBuffer(context, target, clientBuffer, attribs); } } ExternalImageSiblingImpl *DisplayVkAndroid::createExternalImageSibling( const gl::Context *context, EGLenum target, EGLClientBuffer buffer, const egl::AttributeMap &attribs) { switch (target) { case EGL_NATIVE_BUFFER_ANDROID: return new HardwareBufferImageSiblingVkAndroid(buffer); default: return DisplayVk::createExternalImageSibling(context, target, buffer, attribs); } } const char *DisplayVkAndroid::getWSIExtension() const { return VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; } bool IsVulkanAndroidDisplayAvailable() { return true; } DisplayImpl *CreateVulkanAndroidDisplay(const egl::DisplayState &state) { return new DisplayVkAndroid(state); } } // namespace rx