blob: 319d3faa09311cdcb90754781f6020cc2cca088a [file] [log] [blame]
#!/usr/bin/python3 -i
#
# Copyright (c) 2015-2025 The Khronos Group Inc.
# Copyright (c) 2015-2025 Valve Corporation
# Copyright (c) 2015-2025 LunarG, Inc.
# Copyright (c) 2015-2025 Google Inc.
# Copyright (c) 2023-2025 RasterGrid Kft.
#
# 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.
import os
from base_generator import BaseGenerator
# This class is a container for any source code, data, or other behavior that is necessary to
# customize the generator script for a specific target API variant (e.g. Vulkan SC). As such,
# all of these API-specific interfaces and their use in the generator script are part of the
# contract between this repository and its downstream users. Changing or removing any of these
# interfaces or their use in the generator script will have downstream effects and thus
# should be avoided unless absolutely necessary.
class APISpecific:
@staticmethod
def genAPIVersionEnum(targetApiName: str) -> str:
match targetApiName:
case 'vulkan':
return '''
_VK_VERSION_1_0 = (int)VK_API_VERSION_1_0,
'''
@staticmethod
def genAPIVersionSource(targetApiName: str) -> str:
match targetApiName:
# Vulkan specific APIVersion class and related utilities
case 'vulkan':
return '''
class APIVersion {
public:
APIVersion() : api_version_(VVL_UNRECOGNIZED_API_VERSION) {}
APIVersion(uint32_t api_version) : api_version_(api_version) {}
APIVersion& operator=(uint32_t api_version) {
api_version_ = api_version;
return *this;
}
bool Valid() const { return api_version_ != VVL_UNRECOGNIZED_API_VERSION; }
uint32_t Value() const { return api_version_; }
uint32_t Major() const { return VK_API_VERSION_MAJOR(api_version_); }
uint32_t Minor() const { return VK_API_VERSION_MINOR(api_version_); }
uint32_t Patch() const { return VK_API_VERSION_PATCH(api_version_); }
bool operator<(APIVersion api_version) const { return api_version_ < api_version.api_version_; }
bool operator<=(APIVersion api_version) const { return api_version_ <= api_version.api_version_; }
bool operator>(APIVersion api_version) const { return api_version_ > api_version.api_version_; }
bool operator>=(APIVersion api_version) const { return api_version_ >= api_version.api_version_; }
bool operator==(APIVersion api_version) const { return api_version_ == api_version.api_version_; }
bool operator!=(APIVersion api_version) const { return api_version_ != api_version.api_version_; }
private:
uint32_t api_version_;
};
static inline APIVersion NormalizeApiVersion(APIVersion specified_version) {
if (specified_version < VK_API_VERSION_1_1)
return VK_API_VERSION_1_0;
else if (specified_version < VK_API_VERSION_1_2)
return VK_API_VERSION_1_1;
else if (specified_version < VK_API_VERSION_1_3)
return VK_API_VERSION_1_2;
else if (specified_version < VK_API_VERSION_1_4)
return VK_API_VERSION_1_3;
else
return VK_API_VERSION_1_4;
}
'''
class ApiVersionOutputGenerator(BaseGenerator):
def __init__(self):
BaseGenerator.__init__(self)
def generate(self):
out = []
out.append(f'''// *** THIS FILE IS GENERATED - DO NOT EDIT ***
// See {os.path.basename(__file__)} for modifications
/***************************************************************************
*
* Copyright (c) 2015-2025 The Khronos Group Inc.
* Copyright (c) 2015-2025 Valve Corporation
* Copyright (c) 2015-2025 LunarG, Inc.
* Copyright (c) 2015-2025 Google Inc.
*
* 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.
****************************************************************************/\n''')
out.append('// NOLINTBEGIN') # Wrap for clang-tidy to ignore
out.append('''
#pragma once
#include <vulkan/vulkan.h>
#include <sstream>
#include <iomanip>
#define VVL_UNRECOGNIZED_API_VERSION 0xFFFFFFFF
namespace vvl {
// Need underscore prefix to not conflict with namespace, but still easy to match generation
enum class Version {
Empty = 0,''')
out.append(APISpecific.genAPIVersionEnum(self.targetApiName))
for version in self.vk.versions.values():
out.append(f' _{version.name} = (int){version.nameApi},')
out.append('};\n')
out.append('} // namespace vvl\n')
out.append(APISpecific.genAPIVersionSource(self.targetApiName))
out.append('''
// Convert integer API version to a string
static inline std::string StringAPIVersion(APIVersion version) {
std::ostringstream version_name;
if (!version.Valid()) {
return "<unrecognized>";
}
version_name << version.Major() << "." << version.Minor() << "." << version.Patch() << " (0x" << std::setfill('0')
<< std::setw(8) << std::hex << version.Value() << ")";
return version_name.str();
}
''')
out.append('// NOLINTEND') # Wrap for clang-tidy to ignore
self.write(''.join(out))