blob: b7bd113b644c22125b543f8bbca3666662638823 [file] [log] [blame]
// Copyright 2019 Google LLC
//
// 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
//
// https://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.
// Utilities for working with layers and extensions.
#ifndef THIRD_PARTY_MLIR_EDGE_IREE_HAL_VULKAN_EXTENSIBILITY_UTIL_H_
#define THIRD_PARTY_MLIR_EDGE_IREE_HAL_VULKAN_EXTENSIBILITY_UTIL_H_
#include <vulkan/vulkan.h>
#include "third_party/absl/types/span.h"
#include "third_party/mlir_edge/iree/base/status.h"
#include "third_party/mlir_edge/iree/hal/vulkan/dynamic_symbols.h"
namespace iree {
namespace hal {
namespace vulkan {
// Describes required and optional extensibility points.
struct ExtensibilitySpec {
// A list of required and optional layers.
std::vector<const char*> required_layers;
std::vector<const char*> optional_layers;
// A list of required and optional extensions.
// Prefer using the _EXTENSION_NAME macros to make tracking easier (such as
// 'VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME').
std::vector<const char*> required_extensions;
std::vector<const char*> optional_extensions;
};
// Returns a list of layer names available for instances.
// Fails if any required_layers are unavailable.
StatusOr<std::vector<const char*>> MatchAvailableInstanceLayers(
const ExtensibilitySpec& extensibility_spec, const DynamicSymbols& syms);
// Returns a list of extension names available for instances.
// Fails if any required_extensions are unavailable.
StatusOr<std::vector<const char*>> MatchAvailableInstanceExtensions(
const ExtensibilitySpec& extensibility_spec, const DynamicSymbols& syms);
// Returns a list of layer names available for the given |physical_device|.
// Fails if any required_layers are unavailable.
StatusOr<std::vector<const char*>> MatchAvailableDeviceLayers(
VkPhysicalDevice physical_device,
const ExtensibilitySpec& extensibility_spec, const DynamicSymbols& syms);
// Returns a list of extension names available for the given |physical_device|.
// Fails if any required_extensions are unavailable.
StatusOr<std::vector<const char*>> MatchAvailableDeviceExtensions(
VkPhysicalDevice physical_device,
const ExtensibilitySpec& extensibility_spec, const DynamicSymbols& syms);
// Bits for enabled instance extensions.
// We must use this to query support instead of just detecting symbol names as
// ICDs will resolve the functions sometimes even if they don't support the
// extension (or we didn't ask for it to be enabled).
struct InstanceExtensions {
// VK_EXT_debug_report is enabled and a callback is regsitered.
// https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/chap44.html#VK_EXT_debug_report
bool debug_report : 1;
// VK_EXT_debug_utils is enabled and a debug messenger is registered.
// https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/chap44.html#VK_EXT_debug_utils
bool debug_utils : 1;
};
// Returns a bitfield with all of the provided extension names.
InstanceExtensions PopulateEnabledInstanceExtensions(
absl::Span<const char* const> extension_names);
// Bits for enabled device extensions.
// We must use this to query support instead of just detecting symbol names as
// ICDs will resolve the functions sometimes even if they don't support the
// extension (or we didn't ask for it to be enabled).
struct DeviceExtensions {
// VK_KHR_push_descriptor is enabled and vkCmdPushDescriptorSetKHR is valid.
bool push_descriptors : 1;
};
// Returns a bitfield with all of the provided extension names.
DeviceExtensions PopulateEnabledDeviceExtensions(
absl::Span<const char* const> extension_names);
} // namespace vulkan
} // namespace hal
} // namespace iree
#endif // THIRD_PARTY_MLIR_EDGE_IREE_HAL_VULKAN_EXTENSIBILITY_UTIL_H_