blob: 1926245b94f709a7f63bb74dd5cbe7806869e4b0 [file] [edit]
// Copyright 2020 The clvk 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.
#include "log.hpp"
#include "config.hpp"
#include "queue.hpp"
#include <cerrno>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <string>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#ifdef WIN32
#include <io.h>
#endif
#ifdef __ANDROID__
#include <android/log.h>
#endif
#define CASE(X) \
case X: \
return #X;
static int gLoggingLevel;
static uint64_t gLoggingGroupMask;
static bool gLoggingColour;
static FILE* gLoggingFile;
static uint64_t init_logging_groups() {
uint64_t mask = loggroup::all;
static std::unordered_map<std::string, loggroup> groups{
{"refcounting", loggroup::refcounting},
{"api", loggroup::api},
{"event", loggroup::event},
{"validation", loggroup::validation},
{"cfg", loggroup::cfg},
{"none", loggroup::none},
{"all", loggroup::all},
};
if (config.log_groups.set) {
std::stringstream sstr(config.log_groups());
bool first_group_enable_seen = false;
while (sstr.good()) {
std::string group_endis;
getline(sstr, group_endis, ',');
bool is_disable = false;
if (group_endis.rfind("-", 0) == 0) {
group_endis.erase(0, 1);
is_disable = true;
}
loggroup group;
if (groups.count(group_endis) != 0) {
group = groups.at(group_endis);
} else {
fprintf(stderr, "FATAL: Unknown log group '%s'.\n",
group_endis.c_str());
exit(EXIT_FAILURE);
}
if (is_disable) {
mask &= ~group;
} else {
if (!first_group_enable_seen) {
mask = 0;
first_group_enable_seen = true;
}
mask |= group;
}
}
}
return mask;
}
void init_logging() {
loglevel setting = static_cast<loglevel>(config.log());
if (config.log.set) {
if ((config.log < loglevel::fatal) || (config.log > loglevel::debug)) {
// FIXME handle all errors
fprintf(stderr, "FATAL: Unknown log level '%u'.\n", config.log());
exit(EXIT_FAILURE);
}
setting = static_cast<loglevel>(config.log());
}
gLoggingLevel = setting;
gLoggingGroupMask = init_logging_groups();
if (config.log_dest.set) {
std::string val(config.log_dest);
if (val == "stdout") {
gLoggingFile = stdout;
} else if (val == "stderr") {
gLoggingFile = stderr;
} else if (val.rfind("file:", 0) == 0) {
val.erase(0, strlen("file:"));
gLoggingFile = fopen(val.c_str(), "w+");
if (gLoggingFile == nullptr) {
fprintf(stderr, "FATAL: Could not open log file '%s': %s.\n",
val.c_str(), strerror(errno));
exit(EXIT_FAILURE);
}
} else {
fprintf(stderr, "FATAL: Unknown log destination '%s'.\n",
val.c_str());
exit(EXIT_FAILURE);
}
} else {
gLoggingFile = stderr;
}
bool isTTY = isatty(fileno(gLoggingFile));
if (isTTY) {
gLoggingColour = true;
} else {
gLoggingColour = false;
}
if (config.log_colour.set) {
gLoggingColour = config.log_colour;
}
}
void term_logging() {
if ((gLoggingFile != stdout) && (gLoggingFile != stderr)) {
fclose(gLoggingFile);
}
}
bool cvk_log_level_enabled(loglevel level) { return gLoggingLevel >= level; }
bool cvk_log_group_enabled(uint64_t group_mask) {
return gLoggingGroupMask & group_mask;
}
#ifdef __ANDROID__
void cvk_log_android(loglevel level, const char* fmt, va_list& args) {
static int loglevel_to_android[] = {
[loglevel::fatal] = android_LogPriority::ANDROID_LOG_FATAL,
[loglevel::error] = android_LogPriority::ANDROID_LOG_ERROR,
[loglevel::warn] = android_LogPriority::ANDROID_LOG_WARN,
[loglevel::info] = android_LogPriority::ANDROID_LOG_INFO,
[loglevel::debug] = android_LogPriority::ANDROID_LOG_DEBUG,
};
int prio;
if (level < 0 || level >= ARRAY_SIZE(loglevel_to_android)) {
prio = android_LogPriority::ANDROID_LOG_VERBOSE;
} else {
prio = loglevel_to_android[level];
}
__android_log_vprint(prio, "CLVK", fmt, args);
}
#endif
static const char colourRed[] = "\e[0;31m";
static const char colourYellow[] = "\e[0;33m";
static const char colourReset[] = "\e[0m";
void cvk_log_default(loglevel level, const char* fmt, va_list& args) {
const char* colourCode = nullptr;
if (gLoggingColour) {
switch (level) {
case loglevel::fatal:
case loglevel::error:
colourCode = colourRed;
break;
case loglevel::warn:
colourCode = colourYellow;
break;
case loglevel::info:
case loglevel::debug:
break;
}
if (colourCode != nullptr) {
fprintf(gLoggingFile, "%s", colourCode);
}
}
fprintf(gLoggingFile, "[CLVK] ");
vfprintf(gLoggingFile, fmt, args);
if ((gLoggingColour) && (colourCode != nullptr)) {
fprintf(gLoggingFile, "%s", colourReset);
}
// Force to flush error and fatal logs
if (level <= loglevel::error) {
fflush(gLoggingFile);
}
}
void cvk_log(uint64_t group_mask, loglevel level, const char* fmt, ...) {
if (!cvk_log_level_enabled(level)) {
return;
}
if (!cvk_log_group_enabled(group_mask) &&
(level > loglevel::warn || config.log_groups_only)) {
return;
}
va_list args;
va_start(args, fmt);
#ifdef __ANDROID__
if (gLoggingFile == stdout || gLoggingFile == stderr) {
cvk_log_android(level, fmt, args);
} else {
cvk_log_default(level, fmt, args);
}
#else
cvk_log_default(level, fmt, args);
#endif
va_end(args);
if (level == loglevel::fatal) {
exit(EXIT_FAILURE);
}
}
std::string pretty_size(uint64_t size) {
std::string ret;
static const char* units[] = {" B", "kB", "MB", "GB", "TB"};
int unit = 0;
float fsize = size;
while (fsize > 1024) {
unit++;
fsize /= 1024;
}
ret = std::to_string(fsize) + " " + units[unit];
return ret;
}
const char* vulkan_error_string(VkResult result) {
switch (result) {
CASE(VK_SUCCESS)
CASE(VK_NOT_READY)
CASE(VK_TIMEOUT)
CASE(VK_EVENT_SET)
CASE(VK_EVENT_RESET)
CASE(VK_INCOMPLETE)
CASE(VK_ERROR_OUT_OF_HOST_MEMORY)
CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY)
CASE(VK_ERROR_INITIALIZATION_FAILED)
CASE(VK_ERROR_DEVICE_LOST)
CASE(VK_ERROR_MEMORY_MAP_FAILED)
CASE(VK_ERROR_LAYER_NOT_PRESENT)
CASE(VK_ERROR_EXTENSION_NOT_PRESENT)
CASE(VK_ERROR_FEATURE_NOT_PRESENT)
CASE(VK_ERROR_INCOMPATIBLE_DRIVER)
CASE(VK_ERROR_TOO_MANY_OBJECTS)
CASE(VK_ERROR_FORMAT_NOT_SUPPORTED)
CASE(VK_ERROR_FRAGMENTED_POOL)
CASE(VK_ERROR_SURFACE_LOST_KHR)
CASE(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR)
CASE(VK_SUBOPTIMAL_KHR)
CASE(VK_ERROR_OUT_OF_DATE_KHR)
CASE(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR)
CASE(VK_ERROR_VALIDATION_FAILED_EXT)
CASE(VK_ERROR_INVALID_SHADER_NV)
CASE(VK_ERROR_INVALID_EXTERNAL_HANDLE)
CASE(VK_ERROR_FRAGMENTATION_EXT)
CASE(VK_ERROR_NOT_PERMITTED_EXT)
CASE(VK_ERROR_OUT_OF_POOL_MEMORY_KHR)
default:
return "Unknown vulkan error";
}
}
std::string vulkan_memory_property_flags_string(VkMemoryPropertyFlags flags) {
std::string str;
if (flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
str += "HOST_VISIBLE ";
}
if (flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
str += "HOST_COHERENT ";
}
if (flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
str += "HOST_CACHED ";
}
if (flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
str += "DEVICE_LOCAL ";
}
if (flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
str += "LAZILY_ALLOCATED ";
}
return str;
}
std::string vulkan_queue_flags_string(VkQueueFlags flags) {
std::string str;
if (flags & VK_QUEUE_GRAPHICS_BIT) {
str += "GRAPHICS ";
}
if (flags & VK_QUEUE_COMPUTE_BIT) {
str += "COMPUTE ";
}
if (flags & VK_QUEUE_TRANSFER_BIT) {
str += "TRANSFER ";
}
if (flags & VK_QUEUE_SPARSE_BINDING_BIT) {
str += "SPARSE_BINDING ";
}
return str;
}
std::string vulkan_physical_device_type_string(VkPhysicalDeviceType type) {
switch (type) {
case VK_PHYSICAL_DEVICE_TYPE_OTHER:
return "Other";
case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU:
return "Integrated GPU";
case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU:
return "Discrete GPU";
case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU:
return "Virtual GPU";
case VK_PHYSICAL_DEVICE_TYPE_CPU:
return "CPU";
default:
return "Unknown";
}
}
std::string vulkan_calibrateable_time_domain_string(VkTimeDomainEXT td) {
switch (td) {
case VK_TIME_DOMAIN_DEVICE_EXT:
return "Device";
case VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT:
return "Clock monotonic";
case VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT:
return "Clock monotonic raw";
case VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT:
return "Query performance counter";
default:
return "Unknown";
}
}
std::string vulkan_format_features_string(VkFormatFeatureFlags flags) {
std::string str;
if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
str += "SAMPLED_IMAGE ";
}
if (flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
str += "STORAGE_IMAGE ";
}
if (flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
str += "STORAGE_IMAGE_ATOMIC ";
}
if (flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
str += "UNIFORM_TEXEL_BUFFER ";
}
if (flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
str += "STORAGE_TEXEL_BUFFER ";
}
if (flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
str += "STORAGE_TEXEL_BUFFER_ATOMIC ";
}
if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
str += "SAMPLED_IMAGE_FILTER_LINEAR ";
}
if (flags & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) {
str += "TRANSFER_SRC ";
}
if (flags & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) {
str += "TRANSFER_DST ";
}
return str;
}
std::string vulkan_vendor_id_string(VkVendorId vid) {
switch (vid) {
case VK_VENDOR_ID_VIV:
return "Vivante";
case VK_VENDOR_ID_VSI:
return "VeriSilicon";
case VK_VENDOR_ID_KAZAN:
return "Kazan Software Renderer";
case VK_VENDOR_ID_CODEPLAY:
return "Codeplay Software Ltd.";
case VK_VENDOR_ID_MESA:
return "Mesa";
#ifdef VK_VENDOR_ID_POCL
case VK_VENDOR_ID_POCL:
return "PoCL";
#endif
#ifdef VK_VENDOR_ID_MOBILEYE
case VK_VENDOR_ID_MOBILEYE:
return "Mobileye";
#endif
default:
return "Unknown Khronos Vendor ID";
}
}
std::string cl_channel_order_to_string(cl_channel_order order) {
switch (order) {
CASE(CL_R)
CASE(CL_A)
CASE(CL_DEPTH)
CASE(CL_LUMINANCE)
CASE(CL_INTENSITY)
CASE(CL_RG)
CASE(CL_RA)
CASE(CL_Rx)
CASE(CL_RGB)
CASE(CL_RGx)
CASE(CL_RGBA)
CASE(CL_ARGB)
CASE(CL_BGRA)
CASE(CL_ABGR)
CASE(CL_RGBx)
CASE(CL_sRGB)
CASE(CL_sRGBA)
CASE(CL_sBGRA)
CASE(CL_sRGBx)
}
return "Unknown channel order";
}
std::string cl_channel_type_to_string(cl_channel_type type) {
switch (type) {
CASE(CL_SNORM_INT8)
CASE(CL_SNORM_INT16)
CASE(CL_UNORM_INT8)
CASE(CL_UNORM_INT16)
CASE(CL_UNORM_SHORT_565)
CASE(CL_UNORM_SHORT_555)
CASE(CL_UNORM_INT_101010)
CASE(CL_UNORM_INT_101010_2)
CASE(CL_SIGNED_INT8)
CASE(CL_SIGNED_INT16)
CASE(CL_SIGNED_INT32)
CASE(CL_UNSIGNED_INT8)
CASE(CL_UNSIGNED_INT16)
CASE(CL_UNSIGNED_INT32)
CASE(CL_HALF_FLOAT)
CASE(CL_FLOAT)
}
return "Unknown channel type";
}
const char* cl_command_type_to_string(cl_command_type type) {
switch (type) {
CASE(CL_COMMAND_NDRANGE_KERNEL);
CASE(CL_COMMAND_TASK);
CASE(CL_COMMAND_NATIVE_KERNEL);
CASE(CL_COMMAND_READ_BUFFER);
CASE(CL_COMMAND_WRITE_BUFFER);
CASE(CL_COMMAND_COPY_BUFFER);
CASE(CL_COMMAND_READ_IMAGE);
CASE(CL_COMMAND_WRITE_IMAGE);
CASE(CL_COMMAND_COPY_IMAGE);
CASE(CL_COMMAND_COPY_BUFFER_TO_IMAGE);
CASE(CL_COMMAND_COPY_IMAGE_TO_BUFFER);
CASE(CL_COMMAND_MAP_BUFFER);
CASE(CL_COMMAND_MAP_IMAGE);
CASE(CL_COMMAND_UNMAP_MEM_OBJECT);
CASE(CL_COMMAND_MARKER);
CASE(CL_COMMAND_ACQUIRE_GL_OBJECTS);
CASE(CL_COMMAND_RELEASE_GL_OBJECTS);
CASE(CL_COMMAND_SEMAPHORE_WAIT_KHR);
CASE(CL_COMMAND_SEMAPHORE_SIGNAL_KHR);
CASE(CLVK_COMMAND_BATCH);
CASE(CLVK_COMMAND_IMAGE_INIT);
default:
return "CL_COMMAND_UNKNOWN";
}
}
const char* cl_device_type_to_string(cl_device_type type) {
switch (type) {
CASE(CL_DEVICE_TYPE_CPU);
CASE(CL_DEVICE_TYPE_GPU);
CASE(CL_DEVICE_TYPE_ACCELERATOR);
CASE(CL_DEVICE_TYPE_CUSTOM);
CASE(CL_DEVICE_TYPE_DEFAULT);
CASE(CL_DEVICE_TYPE_ALL);
default:
return "CL_DEVICE_TYPE_UNKNOWN";
}
}
const char* cl_command_execution_status_to_string(cl_int status) {
switch (status) {
CASE(CL_COMPLETE);
CASE(CL_RUNNING);
CASE(CL_SUBMITTED);
CASE(CL_QUEUED);
default:
return "CL_COMMAND_EXECUTION_STATUS_UNKNOWN";
}
}
const char* spirv_capability_to_string(spv::Capability capability) {
switch (capability) {
CASE(spv::CapabilityMatrix);
CASE(spv::CapabilityShader);
CASE(spv::CapabilityGeometry);
CASE(spv::CapabilityTessellation);
CASE(spv::CapabilityAddresses);
CASE(spv::CapabilityLinkage);
CASE(spv::CapabilityKernel);
CASE(spv::CapabilityVector16);
CASE(spv::CapabilityFloat16Buffer);
CASE(spv::CapabilityFloat16);
CASE(spv::CapabilityFloat64);
CASE(spv::CapabilityInt64);
CASE(spv::CapabilityInt64Atomics);
CASE(spv::CapabilityImageBasic);
CASE(spv::CapabilityImageReadWrite);
CASE(spv::CapabilityImageMipmap);
CASE(spv::CapabilityPipes);
CASE(spv::CapabilityGroups);
CASE(spv::CapabilityDeviceEnqueue);
CASE(spv::CapabilityLiteralSampler);
CASE(spv::CapabilityAtomicStorage);
CASE(spv::CapabilityInt16);
CASE(spv::CapabilityTessellationPointSize);
CASE(spv::CapabilityGeometryPointSize);
CASE(spv::CapabilityImageGatherExtended);
CASE(spv::CapabilityStorageImageMultisample);
CASE(spv::CapabilityUniformBufferArrayDynamicIndexing);
CASE(spv::CapabilitySampledImageArrayDynamicIndexing);
CASE(spv::CapabilityStorageBufferArrayDynamicIndexing);
CASE(spv::CapabilityStorageImageArrayDynamicIndexing);
CASE(spv::CapabilityClipDistance);
CASE(spv::CapabilityCullDistance);
CASE(spv::CapabilityImageCubeArray);
CASE(spv::CapabilitySampleRateShading);
CASE(spv::CapabilityImageRect);
CASE(spv::CapabilitySampledRect);
CASE(spv::CapabilityGenericPointer);
CASE(spv::CapabilityInt8);
CASE(spv::CapabilityInputAttachment);
CASE(spv::CapabilitySparseResidency);
CASE(spv::CapabilityMinLod);
CASE(spv::CapabilitySampled1D);
CASE(spv::CapabilityImage1D);
CASE(spv::CapabilitySampledCubeArray);
CASE(spv::CapabilitySampledBuffer);
CASE(spv::CapabilityImageBuffer);
CASE(spv::CapabilityImageMSArray);
CASE(spv::CapabilityStorageImageExtendedFormats);
CASE(spv::CapabilityImageQuery);
CASE(spv::CapabilityDerivativeControl);
CASE(spv::CapabilityInterpolationFunction);
CASE(spv::CapabilityTransformFeedback);
CASE(spv::CapabilityGeometryStreams);
CASE(spv::CapabilityStorageImageReadWithoutFormat);
CASE(spv::CapabilityStorageImageWriteWithoutFormat);
CASE(spv::CapabilityMultiViewport);
CASE(spv::CapabilitySubgroupDispatch);
CASE(spv::CapabilityNamedBarrier);
CASE(spv::CapabilityPipeStorage);
CASE(spv::CapabilityGroupNonUniform);
CASE(spv::CapabilityGroupNonUniformVote);
CASE(spv::CapabilityGroupNonUniformArithmetic);
CASE(spv::CapabilityGroupNonUniformBallot);
CASE(spv::CapabilityGroupNonUniformShuffle);
CASE(spv::CapabilityGroupNonUniformShuffleRelative);
CASE(spv::CapabilityGroupNonUniformClustered);
CASE(spv::CapabilityGroupNonUniformQuad);
CASE(spv::CapabilityShaderLayer);
CASE(spv::CapabilityShaderViewportIndex);
CASE(spv::CapabilityUniformDecoration);
CASE(spv::CapabilityCoreBuiltinsARM);
CASE(spv::CapabilityFragmentShadingRateKHR);
CASE(spv::CapabilitySubgroupBallotKHR);
CASE(spv::CapabilityDrawParameters);
CASE(spv::CapabilityWorkgroupMemoryExplicitLayoutKHR);
CASE(spv::CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR);
CASE(spv::CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR);
CASE(spv::CapabilitySubgroupVoteKHR);
CASE(spv::CapabilityStorageBuffer16BitAccess);
CASE(spv::CapabilityStorageUniform16);
CASE(spv::CapabilityStoragePushConstant16);
CASE(spv::CapabilityStorageInputOutput16);
CASE(spv::CapabilityDeviceGroup);
CASE(spv::CapabilityMultiView);
CASE(spv::CapabilityVariablePointersStorageBuffer);
CASE(spv::CapabilityVariablePointers);
CASE(spv::CapabilityAtomicStorageOps);
CASE(spv::CapabilitySampleMaskPostDepthCoverage);
CASE(spv::CapabilityStorageBuffer8BitAccess);
CASE(spv::CapabilityUniformAndStorageBuffer8BitAccess);
CASE(spv::CapabilityStoragePushConstant8);
CASE(spv::CapabilityDenormPreserve);
CASE(spv::CapabilityDenormFlushToZero);
CASE(spv::CapabilitySignedZeroInfNanPreserve);
CASE(spv::CapabilityRoundingModeRTE);
CASE(spv::CapabilityRoundingModeRTZ);
CASE(spv::CapabilityRayQueryProvisionalKHR);
CASE(spv::CapabilityRayQueryKHR);
CASE(spv::CapabilityRayTraversalPrimitiveCullingKHR);
CASE(spv::CapabilityRayTracingKHR);
CASE(spv::CapabilityTextureSampleWeightedQCOM);
CASE(spv::CapabilityTextureBoxFilterQCOM);
CASE(spv::CapabilityTextureBlockMatchQCOM);
CASE(spv::CapabilityFloat16ImageAMD);
CASE(spv::CapabilityImageGatherBiasLodAMD);
CASE(spv::CapabilityFragmentMaskAMD);
CASE(spv::CapabilityStencilExportEXT);
CASE(spv::CapabilityImageReadWriteLodAMD);
CASE(spv::CapabilityInt64ImageEXT);
CASE(spv::CapabilityShaderClockKHR);
CASE(spv::CapabilitySampleMaskOverrideCoverageNV);
CASE(spv::CapabilityGeometryShaderPassthroughNV);
CASE(spv::CapabilityShaderViewportIndexLayerEXT);
CASE(spv::CapabilityShaderViewportMaskNV);
CASE(spv::CapabilityShaderStereoViewNV);
CASE(spv::CapabilityPerViewAttributesNV);
CASE(spv::CapabilityFragmentFullyCoveredEXT);
CASE(spv::CapabilityMeshShadingNV);
CASE(spv::CapabilityImageFootprintNV);
CASE(spv::CapabilityMeshShadingEXT);
CASE(spv::CapabilityFragmentBarycentricKHR);
CASE(spv::CapabilityComputeDerivativeGroupQuadsNV);
CASE(spv::CapabilityFragmentDensityEXT);
CASE(spv::CapabilityGroupNonUniformPartitionedNV);
CASE(spv::CapabilityShaderNonUniform);
CASE(spv::CapabilityRuntimeDescriptorArray);
CASE(spv::CapabilityInputAttachmentArrayDynamicIndexing);
CASE(spv::CapabilityUniformTexelBufferArrayDynamicIndexing);
CASE(spv::CapabilityStorageTexelBufferArrayDynamicIndexing);
CASE(spv::CapabilityUniformBufferArrayNonUniformIndexing);
CASE(spv::CapabilitySampledImageArrayNonUniformIndexing);
CASE(spv::CapabilityStorageBufferArrayNonUniformIndexing);
CASE(spv::CapabilityStorageImageArrayNonUniformIndexing);
CASE(spv::CapabilityInputAttachmentArrayNonUniformIndexing);
CASE(spv::CapabilityUniformTexelBufferArrayNonUniformIndexing);
CASE(spv::CapabilityStorageTexelBufferArrayNonUniformIndexing);
CASE(spv::CapabilityRayTracingNV);
CASE(spv::CapabilityRayTracingMotionBlurNV);
CASE(spv::CapabilityVulkanMemoryModel);
CASE(spv::CapabilityVulkanMemoryModelDeviceScope);
CASE(spv::CapabilityPhysicalStorageBufferAddresses);
CASE(spv::CapabilityComputeDerivativeGroupLinearNV);
CASE(spv::CapabilityRayTracingProvisionalKHR);
CASE(spv::CapabilityCooperativeMatrixNV);
CASE(spv::CapabilityFragmentShaderSampleInterlockEXT);
CASE(spv::CapabilityFragmentShaderShadingRateInterlockEXT);
CASE(spv::CapabilityShaderSMBuiltinsNV);
CASE(spv::CapabilityFragmentShaderPixelInterlockEXT);
CASE(spv::CapabilityDemoteToHelperInvocation);
CASE(spv::CapabilityRayTracingOpacityMicromapEXT);
CASE(spv::CapabilityShaderInvocationReorderNV);
CASE(spv::CapabilityBindlessTextureNV);
CASE(spv::CapabilitySubgroupShuffleINTEL);
CASE(spv::CapabilitySubgroupBufferBlockIOINTEL);
CASE(spv::CapabilitySubgroupImageBlockIOINTEL);
CASE(spv::CapabilitySubgroupImageMediaBlockIOINTEL);
CASE(spv::CapabilityRoundToInfinityINTEL);
CASE(spv::CapabilityFloatingPointModeINTEL);
CASE(spv::CapabilityIntegerFunctions2INTEL);
CASE(spv::CapabilityFunctionPointersINTEL);
CASE(spv::CapabilityIndirectReferencesINTEL);
CASE(spv::CapabilityAsmINTEL);
CASE(spv::CapabilityAtomicFloat32MinMaxEXT);
CASE(spv::CapabilityAtomicFloat64MinMaxEXT);
CASE(spv::CapabilityAtomicFloat16MinMaxEXT);
CASE(spv::CapabilityVectorComputeINTEL);
CASE(spv::CapabilityVectorAnyINTEL);
CASE(spv::CapabilityExpectAssumeKHR);
CASE(spv::CapabilitySubgroupAvcMotionEstimationINTEL);
CASE(spv::CapabilitySubgroupAvcMotionEstimationIntraINTEL);
CASE(spv::CapabilitySubgroupAvcMotionEstimationChromaINTEL);
CASE(spv::CapabilityVariableLengthArrayINTEL);
CASE(spv::CapabilityFunctionFloatControlINTEL);
CASE(spv::CapabilityFPGAMemoryAttributesINTEL);
CASE(spv::CapabilityFPFastMathModeINTEL);
CASE(spv::CapabilityArbitraryPrecisionIntegersINTEL);
CASE(spv::CapabilityArbitraryPrecisionFloatingPointINTEL);
CASE(spv::CapabilityUnstructuredLoopControlsINTEL);
CASE(spv::CapabilityFPGALoopControlsINTEL);
CASE(spv::CapabilityKernelAttributesINTEL);
CASE(spv::CapabilityFPGAKernelAttributesINTEL);
CASE(spv::CapabilityFPGAMemoryAccessesINTEL);
CASE(spv::CapabilityFPGAClusterAttributesINTEL);
CASE(spv::CapabilityLoopFuseINTEL);
CASE(spv::CapabilityFPGADSPControlINTEL);
CASE(spv::CapabilityMemoryAccessAliasingINTEL);
CASE(spv::CapabilityFPGAInvocationPipeliningAttributesINTEL);
CASE(spv::CapabilityFPGABufferLocationINTEL);
CASE(spv::CapabilityArbitraryPrecisionFixedPointINTEL);
CASE(spv::CapabilityUSMStorageClassesINTEL);
CASE(spv::CapabilityRuntimeAlignedAttributeINTEL);
CASE(spv::CapabilityIOPipesINTEL);
CASE(spv::CapabilityBlockingPipesINTEL);
CASE(spv::CapabilityFPGARegINTEL);
CASE(spv::CapabilityDotProductInputAll);
CASE(spv::CapabilityDotProductInput4x8Bit);
CASE(spv::CapabilityDotProductInput4x8BitPacked);
CASE(spv::CapabilityDotProduct);
CASE(spv::CapabilityRayCullMaskKHR);
CASE(spv::CapabilityBitInstructions);
CASE(spv::CapabilityGroupNonUniformRotateKHR);
CASE(spv::CapabilityAtomicFloat32AddEXT);
CASE(spv::CapabilityAtomicFloat64AddEXT);
CASE(spv::CapabilityLongCompositesINTEL);
CASE(spv::CapabilityOptNoneINTEL);
CASE(spv::CapabilityAtomicFloat16AddEXT);
CASE(spv::CapabilityDebugInfoModuleINTEL);
CASE(spv::CapabilityBFloat16ConversionINTEL);
CASE(spv::CapabilitySplitBarrierINTEL);
CASE(spv::CapabilityFPGAKernelAttributesv2INTEL);
CASE(spv::CapabilityFPGALatencyControlINTEL);
CASE(spv::CapabilityFPGAArgumentInterfacesINTEL);
CASE(spv::CapabilityGroupUniformArithmeticKHR);
CASE(spv::CapabilityMax);
default:
return "unknown SPIRV Capability";
}
}
const char* queue_global_priority_to_string(VkQueueGlobalPriorityKHR priority) {
switch (priority) {
CASE(VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR);
CASE(VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR);
CASE(VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR);
CASE(VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR);
default:
return "VK_QUEUE_GLOBAL_PRIORITY_UNKNOWN";
}
}