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()
egl::Error DisplayVk::initialize(egl::Display *display)
{
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));
return egl::NoError();
}
......@@ -190,6 +190,11 @@ void DisplayVk::generateCaps(egl::Caps *outCaps) const
outCaps->textureNPOT = true;
}
const char *DisplayVk::getWSILayer() const
{
return nullptr;
}
bool DisplayVk::getScratchBuffer(size_t requstedSizeBytes,
angle::MemoryBuffer **scratchBufferOut) const
{
......
......@@ -72,7 +72,8 @@ class DisplayVk : public DisplayImpl, public vk::Context
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
// modify the config to add or remove platform specific attributes such as nativeVisualID before
......
......@@ -592,7 +592,8 @@ bool RendererVk::isDeviceLost() const
angle::Result RendererVk::initialize(DisplayVk *displayVk,
egl::Display *display,
const char *wsiName)
const char *wsiExtension,
const char *wsiLayer)
{
mDisplay = display;
const egl::AttributeMap &attribs = mDisplay->getAttributeMap();
......@@ -624,19 +625,23 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk,
instanceExtensionProps.data()));
}
const char *const *enabledLayerNames = nullptr;
uint32_t enabledLayerCount = 0;
VulkanLayerVector enabledLayerNames;
if (mEnableValidationLayers)
{
bool layersRequested =
(attribs.get(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE, EGL_DONT_CARE) == EGL_TRUE);
mEnableValidationLayers = GetAvailableValidationLayers(
instanceLayerProps, layersRequested, &enabledLayerNames, &enabledLayerCount);
mEnableValidationLayers =
GetAvailableValidationLayers(instanceLayerProps, layersRequested, &enabledLayerNames);
}
if (wsiLayer)
{
enabledLayerNames.push_back(wsiLayer);
}
std::vector<const char *> enabledInstanceExtensions;
enabledInstanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
enabledInstanceExtensions.push_back(wsiName);
enabledInstanceExtensions.push_back(wsiExtension);
bool enableDebugUtils =
mEnableValidationLayers &&
......@@ -695,8 +700,8 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk,
instanceInfo.enabledExtensionCount = static_cast<uint32_t>(enabledInstanceExtensions.size());
instanceInfo.ppEnabledExtensionNames =
enabledInstanceExtensions.empty() ? nullptr : enabledInstanceExtensions.data();
instanceInfo.enabledLayerCount = enabledLayerCount;
instanceInfo.ppEnabledLayerNames = enabledLayerNames;
instanceInfo.enabledLayerCount = enabledLayerNames.size();
instanceInfo.ppEnabledLayerNames = enabledLayerNames.data();
ANGLE_VK_TRY(displayVk, vkCreateInstance(&instanceInfo, nullptr, &mInstance));
......@@ -822,12 +827,11 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
deviceExtensionProps.data()));
}
const char *const *enabledLayerNames = nullptr;
uint32_t enabledLayerCount = 0;
VulkanLayerVector enabledLayerNames;
if (mEnableValidationLayers)
{
mEnableValidationLayers = GetAvailableValidationLayers(
deviceLayerProps, false, &enabledLayerNames, &enabledLayerCount);
mEnableValidationLayers =
GetAvailableValidationLayers(deviceLayerProps, false, &enabledLayerNames);
}
std::vector<const char *> enabledDeviceExtensions;
......@@ -871,8 +875,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
createInfo.flags = 0;
createInfo.queueCreateInfoCount = 1;
createInfo.pQueueCreateInfos = &queueCreateInfo;
createInfo.enabledLayerCount = enabledLayerCount;
createInfo.ppEnabledLayerNames = enabledLayerNames;
createInfo.enabledLayerCount = enabledLayerNames.size();
createInfo.ppEnabledLayerNames = enabledLayerNames.data();
createInfo.enabledExtensionCount = static_cast<uint32_t>(enabledDeviceExtensions.size());
createInfo.ppEnabledExtensionNames =
enabledDeviceExtensions.empty() ? nullptr : enabledDeviceExtensions.data();
......
......@@ -45,7 +45,10 @@ class RendererVk : angle::NonCopyable
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 notifyDeviceLost();
......
......@@ -58,7 +58,7 @@ bool DisplayVkAndroid::checkConfigSupport(egl::Config *config)
return true;
}
const char *DisplayVkAndroid::getWSIName() const
const char *DisplayVkAndroid::getWSIExtension() const
{
return VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;
}
......
......@@ -31,7 +31,7 @@ class DisplayVkAndroid : public DisplayVk
egl::ConfigSet generateConfigs() override;
bool checkConfigSupport(egl::Config *config) override;
const char *getWSIName() const override;
const char *getWSIExtension() const override;
};
} // namespace rx
......
......@@ -63,8 +63,6 @@ const char *g_VkValidationLayerNames[] = {
"VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation",
"VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_core_validation",
"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)
{
......@@ -204,18 +202,18 @@ const char *VulkanResultString(VkResult result)
bool GetAvailableValidationLayers(const std::vector<VkLayerProperties> &layerProps,
bool mustHaveLayers,
const char *const **enabledLayerNames,
uint32_t *enabledLayerCount)
VulkanLayerVector *enabledLayerNames)
{
if (HasStandardValidationLayer(layerProps))
{
*enabledLayerNames = &g_VkStdValidationLayerName;
*enabledLayerCount = 1;
enabledLayerNames->push_back(g_VkStdValidationLayerName);
}
else if (HasValidationLayers(layerProps))
{
*enabledLayerNames = g_VkValidationLayerNames;
*enabledLayerCount = g_VkNumValidationLayerNames;
for (const char *layerName : g_VkValidationLayerNames)
{
enabledLayerNames->push_back(layerName);
}
}
else
{
......@@ -229,8 +227,6 @@ bool GetAvailableValidationLayers(const std::vector<VkLayerProperties> &layerPro
WARN() << "Vulkan validation layers are missing.";
}
*enabledLayerNames = nullptr;
*enabledLayerCount = 0;
return false;
}
......
......@@ -12,6 +12,7 @@
#include <limits>
#include "common/FixedVector.h"
#include "common/Optional.h"
#include "common/PackedEnums.h"
#include "common/debug.h"
......@@ -69,11 +70,14 @@ namespace rx
ANGLE_GL_OBJECTS_X(ANGLE_PRE_DECLARE_VK_OBJECT)
const char *VulkanResultString(VkResult result);
constexpr size_t kMaxVulkanLayers = 20;
using VulkanLayerVector = angle::FixedVector<const char *, kMaxVulkanLayers>;
// Verify that validation layers are available.
bool GetAvailableValidationLayers(const std::vector<VkLayerProperties> &layerProps,
bool mustHaveLayers,
const char *const **enabledLayerNames,
uint32_t *enabledLayerCount);
VulkanLayerVector *enabledLayerNames);
extern const char *g_VkLoaderLayersPathEnv;
extern const char *g_VkICDPathEnv;
......
......@@ -47,7 +47,7 @@ bool DisplayVkWin32::checkConfigSupport(egl::Config *config)
return true;
}
const char *DisplayVkWin32::getWSIName() const
const char *DisplayVkWin32::getWSIExtension() const
{
return VK_KHR_WIN32_SURFACE_EXTENSION_NAME;
}
......
......@@ -29,7 +29,7 @@ class DisplayVkWin32 : public DisplayVk
egl::ConfigSet generateConfigs() override;
bool checkConfigSupport(egl::Config *config) override;
const char *getWSIName() const override;
const char *getWSIExtension() const override;
};
} // namespace rx
......
......@@ -110,7 +110,7 @@ bool DisplayVkXcb::checkConfigSupport(egl::Config *config)
return true;
}
const char *DisplayVkXcb::getWSIName() const
const char *DisplayVkXcb::getWSIExtension() const
{
return VK_KHR_XCB_SURFACE_EXTENSION_NAME;
}
......
......@@ -35,7 +35,7 @@ class DisplayVkXcb : public DisplayVk
egl::ConfigSet generateConfigs() override;
bool checkConfigSupport(egl::Config *config) override;
const char *getWSIName() const override;
const char *getWSIExtension() const override;
private:
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