Commit 740db7fd by Michael Spang Committed by Commit Bot

Vulkan: Add support for loading layers from DisplayVk

Fuchsia needs a layer to support VK_KHR_swapchain. Add the ability for DisplayVk subclasses to request a layer in addition to an extension. BUG=angleproject:2475 TEST=angle_end2end_tests on Fuchsia Change-Id: If86c773d4bd4ebecaee4b1631d3d4975105fe849 Reviewed-on: https://chromium-review.googlesource.com/c/1456478Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent eb47e2c4
...@@ -33,7 +33,7 @@ DisplayVk::~DisplayVk() ...@@ -33,7 +33,7 @@ DisplayVk::~DisplayVk()
egl::Error DisplayVk::initialize(egl::Display *display) egl::Error DisplayVk::initialize(egl::Display *display)
{ {
ASSERT(mRenderer != nullptr && display != nullptr); ASSERT(mRenderer != nullptr && display != nullptr);
angle::Result result = mRenderer->initialize(this, display, getWSIName()); angle::Result result = mRenderer->initialize(this, display, getWSIExtension(), getWSILayer());
ANGLE_TRY(angle::ToEGL(result, this, EGL_NOT_INITIALIZED)); ANGLE_TRY(angle::ToEGL(result, this, EGL_NOT_INITIALIZED));
return egl::NoError(); return egl::NoError();
} }
...@@ -190,6 +190,11 @@ void DisplayVk::generateCaps(egl::Caps *outCaps) const ...@@ -190,6 +190,11 @@ void DisplayVk::generateCaps(egl::Caps *outCaps) const
outCaps->textureNPOT = true; outCaps->textureNPOT = true;
} }
const char *DisplayVk::getWSILayer() const
{
return nullptr;
}
bool DisplayVk::getScratchBuffer(size_t requstedSizeBytes, bool DisplayVk::getScratchBuffer(size_t requstedSizeBytes,
angle::MemoryBuffer **scratchBufferOut) const angle::MemoryBuffer **scratchBufferOut) const
{ {
......
...@@ -72,7 +72,8 @@ class DisplayVk : public DisplayImpl, public vk::Context ...@@ -72,7 +72,8 @@ class DisplayVk : public DisplayImpl, public vk::Context
gl::Version getMaxSupportedESVersion() const override; gl::Version getMaxSupportedESVersion() const override;
virtual const char *getWSIName() const = 0; virtual const char *getWSIExtension() const = 0;
virtual const char *getWSILayer() const;
// Determine if a config with given formats and sample counts is supported. This callback may // Determine if a config with given formats and sample counts is supported. This callback may
// modify the config to add or remove platform specific attributes such as nativeVisualID before // modify the config to add or remove platform specific attributes such as nativeVisualID before
......
...@@ -592,7 +592,8 @@ bool RendererVk::isDeviceLost() const ...@@ -592,7 +592,8 @@ bool RendererVk::isDeviceLost() const
angle::Result RendererVk::initialize(DisplayVk *displayVk, angle::Result RendererVk::initialize(DisplayVk *displayVk,
egl::Display *display, egl::Display *display,
const char *wsiName) const char *wsiExtension,
const char *wsiLayer)
{ {
mDisplay = display; mDisplay = display;
const egl::AttributeMap &attribs = mDisplay->getAttributeMap(); const egl::AttributeMap &attribs = mDisplay->getAttributeMap();
...@@ -624,19 +625,23 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk, ...@@ -624,19 +625,23 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk,
instanceExtensionProps.data())); instanceExtensionProps.data()));
} }
const char *const *enabledLayerNames = nullptr; VulkanLayerVector enabledLayerNames;
uint32_t enabledLayerCount = 0;
if (mEnableValidationLayers) if (mEnableValidationLayers)
{ {
bool layersRequested = bool layersRequested =
(attribs.get(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE, EGL_DONT_CARE) == EGL_TRUE); (attribs.get(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE, EGL_DONT_CARE) == EGL_TRUE);
mEnableValidationLayers = GetAvailableValidationLayers( mEnableValidationLayers =
instanceLayerProps, layersRequested, &enabledLayerNames, &enabledLayerCount); GetAvailableValidationLayers(instanceLayerProps, layersRequested, &enabledLayerNames);
}
if (wsiLayer)
{
enabledLayerNames.push_back(wsiLayer);
} }
std::vector<const char *> enabledInstanceExtensions; std::vector<const char *> enabledInstanceExtensions;
enabledInstanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); enabledInstanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
enabledInstanceExtensions.push_back(wsiName); enabledInstanceExtensions.push_back(wsiExtension);
bool enableDebugUtils = bool enableDebugUtils =
mEnableValidationLayers && mEnableValidationLayers &&
...@@ -695,8 +700,8 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk, ...@@ -695,8 +700,8 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk,
instanceInfo.enabledExtensionCount = static_cast<uint32_t>(enabledInstanceExtensions.size()); instanceInfo.enabledExtensionCount = static_cast<uint32_t>(enabledInstanceExtensions.size());
instanceInfo.ppEnabledExtensionNames = instanceInfo.ppEnabledExtensionNames =
enabledInstanceExtensions.empty() ? nullptr : enabledInstanceExtensions.data(); enabledInstanceExtensions.empty() ? nullptr : enabledInstanceExtensions.data();
instanceInfo.enabledLayerCount = enabledLayerCount; instanceInfo.enabledLayerCount = enabledLayerNames.size();
instanceInfo.ppEnabledLayerNames = enabledLayerNames; instanceInfo.ppEnabledLayerNames = enabledLayerNames.data();
ANGLE_VK_TRY(displayVk, vkCreateInstance(&instanceInfo, nullptr, &mInstance)); ANGLE_VK_TRY(displayVk, vkCreateInstance(&instanceInfo, nullptr, &mInstance));
...@@ -822,12 +827,11 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF ...@@ -822,12 +827,11 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
deviceExtensionProps.data())); deviceExtensionProps.data()));
} }
const char *const *enabledLayerNames = nullptr; VulkanLayerVector enabledLayerNames;
uint32_t enabledLayerCount = 0;
if (mEnableValidationLayers) if (mEnableValidationLayers)
{ {
mEnableValidationLayers = GetAvailableValidationLayers( mEnableValidationLayers =
deviceLayerProps, false, &enabledLayerNames, &enabledLayerCount); GetAvailableValidationLayers(deviceLayerProps, false, &enabledLayerNames);
} }
std::vector<const char *> enabledDeviceExtensions; std::vector<const char *> enabledDeviceExtensions;
...@@ -871,8 +875,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF ...@@ -871,8 +875,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
createInfo.flags = 0; createInfo.flags = 0;
createInfo.queueCreateInfoCount = 1; createInfo.queueCreateInfoCount = 1;
createInfo.pQueueCreateInfos = &queueCreateInfo; createInfo.pQueueCreateInfos = &queueCreateInfo;
createInfo.enabledLayerCount = enabledLayerCount; createInfo.enabledLayerCount = enabledLayerNames.size();
createInfo.ppEnabledLayerNames = enabledLayerNames; createInfo.ppEnabledLayerNames = enabledLayerNames.data();
createInfo.enabledExtensionCount = static_cast<uint32_t>(enabledDeviceExtensions.size()); createInfo.enabledExtensionCount = static_cast<uint32_t>(enabledDeviceExtensions.size());
createInfo.ppEnabledExtensionNames = createInfo.ppEnabledExtensionNames =
enabledDeviceExtensions.empty() ? nullptr : enabledDeviceExtensions.data(); enabledDeviceExtensions.empty() ? nullptr : enabledDeviceExtensions.data();
......
...@@ -45,7 +45,10 @@ class RendererVk : angle::NonCopyable ...@@ -45,7 +45,10 @@ class RendererVk : angle::NonCopyable
RendererVk(); RendererVk();
~RendererVk(); ~RendererVk();
angle::Result initialize(DisplayVk *displayVk, egl::Display *display, const char *wsiName); angle::Result initialize(DisplayVk *displayVk,
egl::Display *display,
const char *wsiExtension,
const char *wsiLayer);
void onDestroy(vk::Context *context); void onDestroy(vk::Context *context);
void notifyDeviceLost(); void notifyDeviceLost();
......
...@@ -58,7 +58,7 @@ bool DisplayVkAndroid::checkConfigSupport(egl::Config *config) ...@@ -58,7 +58,7 @@ bool DisplayVkAndroid::checkConfigSupport(egl::Config *config)
return true; return true;
} }
const char *DisplayVkAndroid::getWSIName() const const char *DisplayVkAndroid::getWSIExtension() const
{ {
return VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; return VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;
} }
......
...@@ -31,7 +31,7 @@ class DisplayVkAndroid : public DisplayVk ...@@ -31,7 +31,7 @@ class DisplayVkAndroid : public DisplayVk
egl::ConfigSet generateConfigs() override; egl::ConfigSet generateConfigs() override;
bool checkConfigSupport(egl::Config *config) override; bool checkConfigSupport(egl::Config *config) override;
const char *getWSIName() const override; const char *getWSIExtension() const override;
}; };
} // namespace rx } // namespace rx
......
...@@ -63,8 +63,6 @@ const char *g_VkValidationLayerNames[] = { ...@@ -63,8 +63,6 @@ const char *g_VkValidationLayerNames[] = {
"VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation",
"VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_core_validation", "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_core_validation",
"VK_LAYER_GOOGLE_unique_objects"}; "VK_LAYER_GOOGLE_unique_objects"};
const uint32_t g_VkNumValidationLayerNames =
sizeof(g_VkValidationLayerNames) / sizeof(g_VkValidationLayerNames[0]);
bool HasValidationLayer(const std::vector<VkLayerProperties> &layerProps, const char *layerName) bool HasValidationLayer(const std::vector<VkLayerProperties> &layerProps, const char *layerName)
{ {
...@@ -204,18 +202,18 @@ const char *VulkanResultString(VkResult result) ...@@ -204,18 +202,18 @@ const char *VulkanResultString(VkResult result)
bool GetAvailableValidationLayers(const std::vector<VkLayerProperties> &layerProps, bool GetAvailableValidationLayers(const std::vector<VkLayerProperties> &layerProps,
bool mustHaveLayers, bool mustHaveLayers,
const char *const **enabledLayerNames, VulkanLayerVector *enabledLayerNames)
uint32_t *enabledLayerCount)
{ {
if (HasStandardValidationLayer(layerProps)) if (HasStandardValidationLayer(layerProps))
{ {
*enabledLayerNames = &g_VkStdValidationLayerName; enabledLayerNames->push_back(g_VkStdValidationLayerName);
*enabledLayerCount = 1;
} }
else if (HasValidationLayers(layerProps)) else if (HasValidationLayers(layerProps))
{ {
*enabledLayerNames = g_VkValidationLayerNames; for (const char *layerName : g_VkValidationLayerNames)
*enabledLayerCount = g_VkNumValidationLayerNames; {
enabledLayerNames->push_back(layerName);
}
} }
else else
{ {
...@@ -229,8 +227,6 @@ bool GetAvailableValidationLayers(const std::vector<VkLayerProperties> &layerPro ...@@ -229,8 +227,6 @@ bool GetAvailableValidationLayers(const std::vector<VkLayerProperties> &layerPro
WARN() << "Vulkan validation layers are missing."; WARN() << "Vulkan validation layers are missing.";
} }
*enabledLayerNames = nullptr;
*enabledLayerCount = 0;
return false; return false;
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <limits> #include <limits>
#include "common/FixedVector.h"
#include "common/Optional.h" #include "common/Optional.h"
#include "common/PackedEnums.h" #include "common/PackedEnums.h"
#include "common/debug.h" #include "common/debug.h"
...@@ -69,11 +70,14 @@ namespace rx ...@@ -69,11 +70,14 @@ namespace rx
ANGLE_GL_OBJECTS_X(ANGLE_PRE_DECLARE_VK_OBJECT) ANGLE_GL_OBJECTS_X(ANGLE_PRE_DECLARE_VK_OBJECT)
const char *VulkanResultString(VkResult result); const char *VulkanResultString(VkResult result);
constexpr size_t kMaxVulkanLayers = 20;
using VulkanLayerVector = angle::FixedVector<const char *, kMaxVulkanLayers>;
// Verify that validation layers are available. // Verify that validation layers are available.
bool GetAvailableValidationLayers(const std::vector<VkLayerProperties> &layerProps, bool GetAvailableValidationLayers(const std::vector<VkLayerProperties> &layerProps,
bool mustHaveLayers, bool mustHaveLayers,
const char *const **enabledLayerNames, VulkanLayerVector *enabledLayerNames);
uint32_t *enabledLayerCount);
extern const char *g_VkLoaderLayersPathEnv; extern const char *g_VkLoaderLayersPathEnv;
extern const char *g_VkICDPathEnv; extern const char *g_VkICDPathEnv;
......
...@@ -47,7 +47,7 @@ bool DisplayVkWin32::checkConfigSupport(egl::Config *config) ...@@ -47,7 +47,7 @@ bool DisplayVkWin32::checkConfigSupport(egl::Config *config)
return true; return true;
} }
const char *DisplayVkWin32::getWSIName() const const char *DisplayVkWin32::getWSIExtension() const
{ {
return VK_KHR_WIN32_SURFACE_EXTENSION_NAME; return VK_KHR_WIN32_SURFACE_EXTENSION_NAME;
} }
......
...@@ -29,7 +29,7 @@ class DisplayVkWin32 : public DisplayVk ...@@ -29,7 +29,7 @@ class DisplayVkWin32 : public DisplayVk
egl::ConfigSet generateConfigs() override; egl::ConfigSet generateConfigs() override;
bool checkConfigSupport(egl::Config *config) override; bool checkConfigSupport(egl::Config *config) override;
const char *getWSIName() const override; const char *getWSIExtension() const override;
}; };
} // namespace rx } // namespace rx
......
...@@ -110,7 +110,7 @@ bool DisplayVkXcb::checkConfigSupport(egl::Config *config) ...@@ -110,7 +110,7 @@ bool DisplayVkXcb::checkConfigSupport(egl::Config *config)
return true; return true;
} }
const char *DisplayVkXcb::getWSIName() const const char *DisplayVkXcb::getWSIExtension() const
{ {
return VK_KHR_XCB_SURFACE_EXTENSION_NAME; return VK_KHR_XCB_SURFACE_EXTENSION_NAME;
} }
......
...@@ -35,7 +35,7 @@ class DisplayVkXcb : public DisplayVk ...@@ -35,7 +35,7 @@ class DisplayVkXcb : public DisplayVk
egl::ConfigSet generateConfigs() override; egl::ConfigSet generateConfigs() override;
bool checkConfigSupport(egl::Config *config) override; bool checkConfigSupport(egl::Config *config) override;
const char *getWSIName() const override; const char *getWSIExtension() const override;
private: private:
xcb_connection_t *mXcbConnection; xcb_connection_t *mXcbConnection;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment