mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-10-26 19:50:30 +00:00
Reland after a refactor of how the extension handling work in the Vulkan
backend.
The original author is David Turner <david.turner.dev@gmail.com>.
Certain Vulkan ICDs (Intel ones notably) will compile SPIR-V
shaders with an liberal, compiler-selected, subgroup size (i.e.
either 8, 16 or 32). For more context, see [1].
This can be a problem for compute, when one shader stores data
in device memory using a subgroup-size dependent layout, to be
consumed by a another shader. Problems arise when the compiler
decides to compile both shaders with different subgroup sizes.
To work-around this, the VK_EXT_subgroup_size_control device
extension was introduced recently: it allows the device to
report the min/max subgroup sizes it provides, and allows
the Vulkan program to control the subgroup size precisely
if it wants to.
This patch adds support to the Vulkan backend to report and
enable the extension if it is available. Note that:
- This changes the definition of VulkanDeviceKnobs to
make room for the required pNext-linked chains of
extensions.
- A helper class, PNextChainBuilder is also provided in
UtilsVulkan.h to make it easy to build pNext-linked
extension struct chains at runtime, as required when
probing device propertires/features, or when
creating a new VkDevice handle.
- This modifies VulkanDeviceInfo::GatherDeviceInfo() to
use PNextChainBuilder to query extension features and properties
in a single call to vkGetPhysicalDevice{Properties,Features}2.
Apart from that, there is no change in behaviour in this CL.
I.e. a later CL might force a specific subgroup size for
consistency, or introduce a new API to let Dawn clients
select a fixed subgroup size.
[1] https://bugs.freedesktop.org/show_bug.cgi?id=108875
Bug: dawn:464
Change-Id: I01e5c28e7dac66f0a57bf35532eb192912b254fa
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/23201
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
91 lines
3.2 KiB
C++
91 lines
3.2 KiB
C++
// Copyright 2017 The Dawn Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef DAWNNATIVE_VULKAN_VULKANINFO_H_
|
|
#define DAWNNATIVE_VULKAN_VULKANINFO_H_
|
|
|
|
#include "common/vulkan_platform.h"
|
|
#include "dawn_native/Error.h"
|
|
#include "dawn_native/vulkan/VulkanExtensions.h"
|
|
|
|
#include <vector>
|
|
|
|
namespace dawn_native { namespace vulkan {
|
|
|
|
class Adapter;
|
|
class Backend;
|
|
|
|
extern const char kLayerNameKhronosValidation[];
|
|
extern const char kLayerNameLunargVKTrace[];
|
|
extern const char kLayerNameRenderDocCapture[];
|
|
extern const char kLayerNameFuchsiaImagePipeSwapchain[];
|
|
|
|
// Global information - gathered before the instance is created
|
|
struct VulkanGlobalKnobs {
|
|
// Layers
|
|
bool validation = false;
|
|
bool vktrace = false;
|
|
bool renderDocCapture = false;
|
|
bool fuchsiaImagePipeSwapchain = false;
|
|
|
|
bool HasExt(InstanceExt ext) const;
|
|
InstanceExtSet extensions;
|
|
};
|
|
|
|
struct VulkanGlobalInfo : VulkanGlobalKnobs {
|
|
std::vector<VkLayerProperties> layers;
|
|
uint32_t apiVersion;
|
|
// TODO(cwallez@chromium.org): layer instance extensions
|
|
};
|
|
|
|
// Device information - gathered before the device is created.
|
|
struct VulkanDeviceKnobs {
|
|
VkPhysicalDeviceFeatures features;
|
|
VkPhysicalDeviceShaderFloat16Int8FeaturesKHR shaderFloat16Int8Features;
|
|
VkPhysicalDevice16BitStorageFeaturesKHR _16BitStorageFeatures;
|
|
VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroupSizeControlFeatures;
|
|
|
|
bool HasExt(DeviceExt ext) const;
|
|
DeviceExtSet extensions;
|
|
};
|
|
|
|
struct VulkanDeviceInfo : VulkanDeviceKnobs {
|
|
VkPhysicalDeviceProperties properties;
|
|
VkPhysicalDeviceSubgroupSizeControlPropertiesEXT subgroupSizeControlProperties;
|
|
|
|
std::vector<VkQueueFamilyProperties> queueFamilies;
|
|
|
|
std::vector<VkMemoryType> memoryTypes;
|
|
std::vector<VkMemoryHeap> memoryHeaps;
|
|
|
|
std::vector<VkLayerProperties> layers;
|
|
// TODO(cwallez@chromium.org): layer instance extensions
|
|
};
|
|
|
|
struct VulkanSurfaceInfo {
|
|
VkSurfaceCapabilitiesKHR capabilities;
|
|
std::vector<VkSurfaceFormatKHR> formats;
|
|
std::vector<VkPresentModeKHR> presentModes;
|
|
std::vector<bool> supportedQueueFamilies;
|
|
};
|
|
|
|
ResultOrError<VulkanGlobalInfo> GatherGlobalInfo(const Backend& backend);
|
|
ResultOrError<std::vector<VkPhysicalDevice>> GetPhysicalDevices(const Backend& backend);
|
|
ResultOrError<VulkanDeviceInfo> GatherDeviceInfo(const Adapter& adapter);
|
|
ResultOrError<VulkanSurfaceInfo> GatherSurfaceInfo(const Adapter& adapter,
|
|
VkSurfaceKHR surface);
|
|
}} // namespace dawn_native::vulkan
|
|
|
|
#endif // DAWNNATIVE_VULKAN_VULKANINFO_H_
|