Commit 6a89d227 by Jamie Madill Committed by Commit Bot

Vulkan: Refactor format table.

This moves the Vulkan format table to dynamically generated, but keeps it easily indexed. Because Vulkan format support is not able to be fully determined until runtime, we'll need a dynamic way to build the table. The most straight-forward way seems to be to keep a copy of the full table in the Renderer. Initializing it once at startup makes it a bit slower to init, but saves us from any threading shenanigans with lazy init when (and if) we ever support multi- threaded Contexts. BUG=angleproject:2207 Change-Id: Ib1ac879daa562c7ad1a965390be401fa2314e42c Reviewed-on: https://chromium-review.googlesource.com/742374 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent d10cf69e
......@@ -139,4 +139,6 @@ enum class Format::ID
S8_UINT
};
constexpr uint32_t kNumANGLEFormats = 125;
} // namespace angle
......@@ -32,6 +32,8 @@ enum class Format::ID
{angle_format_enum}
}};
constexpr uint32_t kNumANGLEFormats = {num_angle_formats};
}} // namespace angle
"""
......@@ -254,11 +256,13 @@ with open('Format_table_autogen.cpp', 'wt') as out_file:
out_file.close()
enum_data = gen_enum_string(all_angle)
num_angle_formats = len(all_angle)
output_h = template_autogen_h.format(
script_name = sys.argv[0],
copyright_year = date.today().year,
angle_format_enum = enum_data,
data_source_name = data_source_name)
data_source_name = data_source_name,
num_angle_formats = num_angle_formats)
with open('Format_ID_autogen.inl', 'wt') as out_file:
out_file.write(output_h)
out_file.close()
......@@ -343,6 +343,9 @@ vk::Error RendererVk::initialize(const egl::AttributeMap &attribs, const char *w
mGlslangWrapper = GlslangWrapper::GetReference();
// Initialize the format table.
mFormatTable.initialize(mPhysicalDevice, &mNativeTextureCaps);
return vk::NoError();
}
......
......@@ -15,6 +15,7 @@
#include "common/angleutils.h"
#include "libANGLE/Caps.h"
#include "libANGLE/renderer/vulkan/formatutilsvk.h"
#include "libANGLE/renderer/vulkan/renderervk_utils.h"
namespace egl
......@@ -105,6 +106,12 @@ class RendererVk : angle::NonCopyable
// This is necessary to update the cached current RenderPass Framebuffer.
void onReleaseRenderPass(const FramebufferVk *framebufferVk);
// TODO(jmadill): We could pass angle::Format::ID here.
const vk::Format &getFormat(GLenum internalFormat) const
{
return mFormatTable[internalFormat];
}
private:
void ensureCapsInitialized() const;
void generateCaps(gl::Caps *outCaps,
......@@ -143,6 +150,7 @@ class RendererVk : angle::NonCopyable
std::vector<vk::FenceAndSerial> mInFlightFences;
std::vector<vk::GarbageObject> mGarbage;
vk::MemoryProperties mMemoryProperties;
vk::FormatTable mFormatTable;
// TODO(jmadill): Don't keep a single renderpass in the Renderer.
FramebufferVk *mCurrentRenderPassFramebuffer;
......
......@@ -24,10 +24,10 @@ namespace rx
namespace
{
const vk::Format &GetVkFormatFromConfig(const egl::Config &config)
const vk::Format &GetVkFormatFromConfig(RendererVk *renderer, const egl::Config &config)
{
// TODO(jmadill): Properly handle format interpretation.
return vk::Format::Get(GL_BGRA8_EXT);
return renderer->getFormat(GL_BGRA8_EXT);
}
VkPresentModeKHR GetDesiredPresentMode(const std::vector<VkPresentModeKHR> &presentModes,
......@@ -301,7 +301,7 @@ vk::Error WindowSurfaceVk::initializeImpl(RendererVk *renderer)
ANGLE_VK_TRY(vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, mSurface, &surfaceFormatCount,
surfaceFormats.data()));
mRenderTarget.format = &GetVkFormatFromConfig(*mState.config);
mRenderTarget.format = &GetVkFormatFromConfig(renderer, *mState.config);
auto nativeFormat = mRenderTarget.format->native;
if (surfaceFormatCount == 1u && surfaceFormats[0].format == VK_FORMAT_UNDEFINED)
......@@ -345,7 +345,7 @@ vk::Error WindowSurfaceVk::initializeImpl(RendererVk *renderer)
swapchainInfo.clipped = VK_TRUE;
swapchainInfo.oldSwapchain = VK_NULL_HANDLE;
const auto &device = renderer->getDevice();
VkDevice device = renderer->getDevice();
ANGLE_VK_TRY(vkCreateSwapchainKHR(device, &swapchainInfo, nullptr, &mSwapchain));
// Intialize the swapchain image views.
......
......@@ -51,6 +51,7 @@ gl::Error TextureVk::setImage(const gl::Context *context,
{
ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer();
VkDevice device = contextVk->getDevice();
// TODO(jmadill): support multi-level textures.
ASSERT(level == 0);
......@@ -74,9 +75,7 @@ gl::Error TextureVk::setImage(const gl::Context *context,
// Convert internalFormat to sized internal format.
const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat, type);
const vk::Format &vkFormat = vk::Format::Get(formatInfo.sizedInternalFormat);
VkDevice device = contextVk->getDevice();
const vk::Format &vkFormat = renderer->getFormat(formatInfo.sizedInternalFormat);
if (!mImage.valid())
{
......@@ -203,7 +202,7 @@ gl::Error TextureVk::setImage(const gl::Context *context,
formatInfo.computeSkipBytes(inputRowPitch, inputDepthPitch, unpack, applySkipImages),
inputSkipBytes);
auto loadFunction = vkFormat.getLoadFunctions()(type);
auto loadFunction = vkFormat.loadFunctions(type);
uint8_t *mapPointer = nullptr;
ANGLE_TRY(stagingImage.getDeviceMemory().map(device, 0, VK_WHOLE_SIZE, 0, &mapPointer));
......
......@@ -16,14 +16,45 @@ namespace rx
namespace vk
{
Format::Format()
: internalFormat(GL_NONE),
formatID(angle::Format::ID::NONE),
native(VK_FORMAT_UNDEFINED),
dataInitializerFunction(nullptr),
loadFunctions()
{
}
const angle::Format &Format::format() const
{
return angle::Format::Get(formatID);
}
LoadFunctionMap Format::getLoadFunctions() const
FormatTable::FormatTable()
{
}
FormatTable::~FormatTable()
{
}
void FormatTable::initialize(VkPhysicalDevice physicalDevice, gl::TextureCapsMap *textureCapsMap)
{
for (size_t formatIndex = 0; formatIndex < angle::kNumANGLEFormats; ++formatIndex)
{
angle::Format::ID formatID = static_cast<angle::Format::ID>(formatIndex);
const angle::Format &angleFormat = angle::Format::Get(formatID);
mFormatData[formatIndex].initialize(physicalDevice, angleFormat);
mFormatData[formatIndex].loadFunctions =
GetLoadFunctionsMap(mFormatData[formatIndex].internalFormat, formatID);
}
}
const Format &FormatTable::operator[](GLenum internalFormat) const
{
return GetLoadFunctionsMap(internalFormat, formatID);
angle::Format::ID formatID = angle::Format::InternalFormatToID(internalFormat);
return mFormatData[static_cast<size_t>(formatID)];
}
// TODO(jmadill): This is temporary. Figure out how to handle format conversions.
......
......@@ -11,9 +11,17 @@
#include <vulkan/vulkan.h>
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/Format.h"
#include "libANGLE/renderer/renderer_utils.h"
#include <array>
namespace gl
{
class TextureCapsMap;
} // namespace gl
namespace rx
{
......@@ -22,32 +30,35 @@ namespace vk
struct Format final : private angle::NonCopyable
{
constexpr Format(GLenum internalFormat,
angle::Format::ID formatID,
VkFormat native,
InitializeTextureDataFunction initFunction);
Format();
static const Format &Get(GLenum internalFormat);
// This is an auto-generated method in vk_format_table_autogen.cpp.
void initialize(VkPhysicalDevice physicalDevice, const angle::Format &angleFormat);
const angle::Format &format() const;
LoadFunctionMap getLoadFunctions() const;
GLenum internalFormat;
angle::Format::ID formatID;
VkFormat native;
InitializeTextureDataFunction dataInitializerFunction;
LoadFunctionMap loadFunctions;
};
constexpr Format::Format(GLenum internalFormat,
angle::Format::ID formatID,
VkFormat native,
InitializeTextureDataFunction initFunction)
: internalFormat(internalFormat),
formatID(formatID),
native(native),
dataInitializerFunction(initFunction)
class FormatTable final : angle::NonCopyable
{
}
public:
FormatTable();
~FormatTable();
// Also initializes the TextureCapsMap.
void initialize(VkPhysicalDevice physicalDevice, gl::TextureCapsMap *textureCapsMap);
const Format &operator[](GLenum internalFormat) const;
private:
// The table data is indexed by angle::Format::ID.
std::array<Format, angle::kNumANGLEFormats> mFormatData;
};
// TODO(jmadill): This is temporary. Figure out how to handle format conversions.
VkFormat GetNativeVertexFormat(gl::VertexFormatType vertexFormat);
......
......@@ -41,21 +41,15 @@ namespace rx
namespace vk
{{
// static
const Format &Format::Get(GLenum internalFormat)
void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &angleFormat)
{{
// clang-format off
switch (internalFormat)
switch (angleFormat.id)
{{
{format_case_data}
default:
UNREACHABLE();
break;
}}
// clang-format on
UNREACHABLE();
static const Format noInfo(GL_NONE, angle::Format::ID::NONE, VK_FORMAT_UNDEFINED, nullptr);
return noInfo;
}}
}} // namespace vk
......@@ -63,57 +57,49 @@ const Format &Format::Get(GLenum internalFormat)
}} // namespace rx
"""
format_entry_template = """{space}{{
{space} static constexpr Format info({internalFormat},
{space} angle::Format::ID::{formatName},
{space} {vkFormat},
{space} {initializer});
{space} return info;
{space}}}
empty_format_entry_template = """{space}case angle::Format::ID::{formatName}:
{space} // This format is not implemented in Vulkan.
{space} break;
"""
def parse_format_case(internal_format, format_name, native_format):
table_data = ""
parsed = {
"space": " ",
"internalFormat": internal_format,
"formatName": format_name,
"vkFormat": native_format,
}
# Derived values.
parsed["initializer"] = angle_format.get_internal_format_initializer(
internal_format, format_name)
return format_entry_template.format(**parsed)
def parse_json_into_cases(json_map, vk_map):
table_data = ''
for internal_format, format_name in sorted(json_map.iteritems()):
format_entry_template = """{space}case angle::Format::ID::{formatName}:
{space}{{
{space} internalFormat = {internalFormat};
{space} formatID = angle::Format::ID::{formatName};
{space} native = {vkFormat};
{space} dataInitializerFunction = {initializer};
{space} break;
{space}}}
"""
if format_name not in vk_map:
continue
def gen_format_case(angle, internal_format, vk_map):
native_format = vk_map[format_name]
if angle not in vk_map or angle == 'NONE':
return empty_format_entry_template.format(
space = ' ',
formatName = angle)
table_data += ' case ' + internal_format + ':\n'
table_data += parse_format_case(internal_format, format_name, native_format)
vk_format_name = vk_map[angle]
initializer = angle_format.get_internal_format_initializer(
internal_format, vk_format_name)
return table_data
return format_entry_template.format(
space = ' ',
internalFormat = internal_format,
formatName = angle,
vkFormat = vk_format_name,
initializer = initializer)
input_file_name = 'vk_format_map.json'
out_file_name = 'vk_format_table'
json_map = angle_format.load_without_override()
angle_to_gl = angle_format.load_inverse_table(os.path.join('..', 'angle_format_map.json'))
vk_map = angle_format.load_json(input_file_name)
vk_cases = [gen_format_case(angle, gl, vk_map) for angle, gl in sorted(angle_to_gl.iteritems())]
format_case_data = parse_json_into_cases(json_map, vk_map)
output_cpp = template_table_autogen_cpp.format(
copyright_year = date.today().year,
format_case_data = format_case_data,
format_case_data = "\n".join(vk_cases),
script_name = __file__,
out_file_name = out_file_name,
input_file_name = input_file_name)
......
......@@ -22,845 +22,1004 @@ namespace rx
namespace vk
{
// static
const Format &Format::Get(GLenum internalFormat)
void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &angleFormat)
{
// clang-format off
switch (internalFormat)
switch (angleFormat.id)
{
case GL_BGR565_ANGLEX:
{
static constexpr Format info(GL_BGR565_ANGLEX,
angle::Format::ID::B5G6R5_UNORM,
VK_FORMAT_B5G6R5_UNORM_PACK16,
nullptr);
return info;
}
case GL_BGR5_A1_ANGLEX:
{
static constexpr Format info(GL_BGR5_A1_ANGLEX,
angle::Format::ID::B5G5R5A1_UNORM,
VK_FORMAT_B5G5R5A1_UNORM_PACK16,
nullptr);
return info;
}
case GL_BGRA4_ANGLEX:
{
static constexpr Format info(GL_BGRA4_ANGLEX,
angle::Format::ID::B4G4R4A4_UNORM,
VK_FORMAT_B4G4R4A4_UNORM_PACK16,
nullptr);
return info;
}
case GL_BGRA8_EXT:
{
static constexpr Format info(GL_BGRA8_EXT,
angle::Format::ID::B8G8R8A8_UNORM,
VK_FORMAT_B8G8R8A8_UNORM,
nullptr);
return info;
}
case GL_COMPRESSED_R11_EAC:
{
static constexpr Format info(GL_COMPRESSED_R11_EAC,
angle::Format::ID::EAC_R11_UNORM_BLOCK,
VK_FORMAT_EAC_R11_UNORM_BLOCK,
nullptr);
return info;
}
case GL_COMPRESSED_RG11_EAC:
case angle::Format::ID::A16_FLOAT:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::A32_FLOAT:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::A8_UNORM:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::ASTC_10x10_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RG11_EAC,
angle::Format::ID::EAC_R11G11_UNORM_BLOCK,
VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
formatID = angle::Format::ID::ASTC_10x10_SRGB_BLOCK;
native = VK_FORMAT_ASTC_10x10_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGB8_ETC2:
case angle::Format::ID::ASTC_10x10_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGB8_ETC2,
angle::Format::ID::ETC2_R8G8B8_UNORM_BLOCK,
VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
formatID = angle::Format::ID::ASTC_10x10_UNORM_BLOCK;
native = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
case angle::Format::ID::ASTC_10x5_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
angle::Format::ID::ETC2_R8G8B8A1_UNORM_BLOCK,
VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
formatID = angle::Format::ID::ASTC_10x5_SRGB_BLOCK;
native = VK_FORMAT_ASTC_10x5_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA8_ETC2_EAC:
case angle::Format::ID::ASTC_10x5_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA8_ETC2_EAC,
angle::Format::ID::ETC2_R8G8B8A8_UNORM_BLOCK,
VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
formatID = angle::Format::ID::ASTC_10x5_UNORM_BLOCK;
native = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
case angle::Format::ID::ASTC_10x6_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x10_KHR,
angle::Format::ID::ASTC_10x10_UNORM_BLOCK,
VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
formatID = angle::Format::ID::ASTC_10x6_SRGB_BLOCK;
native = VK_FORMAT_ASTC_10x6_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
case angle::Format::ID::ASTC_10x6_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x5_KHR,
angle::Format::ID::ASTC_10x5_UNORM_BLOCK,
VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
formatID = angle::Format::ID::ASTC_10x6_UNORM_BLOCK;
native = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
case angle::Format::ID::ASTC_10x8_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x6_KHR,
angle::Format::ID::ASTC_10x6_UNORM_BLOCK,
VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
formatID = angle::Format::ID::ASTC_10x8_SRGB_BLOCK;
native = VK_FORMAT_ASTC_10x8_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
case angle::Format::ID::ASTC_10x8_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x8_KHR,
angle::Format::ID::ASTC_10x8_UNORM_BLOCK,
VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
formatID = angle::Format::ID::ASTC_10x8_UNORM_BLOCK;
native = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
case angle::Format::ID::ASTC_12x10_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_12x10_KHR,
angle::Format::ID::ASTC_12x10_UNORM_BLOCK,
VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
formatID = angle::Format::ID::ASTC_12x10_SRGB_BLOCK;
native = VK_FORMAT_ASTC_12x10_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
case angle::Format::ID::ASTC_12x10_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_12x12_KHR,
angle::Format::ID::ASTC_12x12_UNORM_BLOCK,
VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
formatID = angle::Format::ID::ASTC_12x10_UNORM_BLOCK;
native = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
case angle::Format::ID::ASTC_12x12_SRGB_BLOCK:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::ASTC_12x12_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_4x4_KHR,
angle::Format::ID::ASTC_4x4_UNORM_BLOCK,
VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
formatID = angle::Format::ID::ASTC_12x12_UNORM_BLOCK;
native = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
case angle::Format::ID::ASTC_4x4_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_5x4_KHR,
angle::Format::ID::ASTC_5x4_UNORM_BLOCK,
VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
formatID = angle::Format::ID::ASTC_4x4_SRGB_BLOCK;
native = VK_FORMAT_ASTC_4x4_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
case angle::Format::ID::ASTC_4x4_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_5x5_KHR,
angle::Format::ID::ASTC_5x5_UNORM_BLOCK,
VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
formatID = angle::Format::ID::ASTC_4x4_UNORM_BLOCK;
native = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
case angle::Format::ID::ASTC_5x4_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_6x5_KHR,
angle::Format::ID::ASTC_6x5_UNORM_BLOCK,
VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
formatID = angle::Format::ID::ASTC_5x4_SRGB_BLOCK;
native = VK_FORMAT_ASTC_5x4_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
case angle::Format::ID::ASTC_5x4_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_6x6_KHR,
angle::Format::ID::ASTC_6x6_UNORM_BLOCK,
VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
formatID = angle::Format::ID::ASTC_5x4_UNORM_BLOCK;
native = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
case angle::Format::ID::ASTC_5x5_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_8x5_KHR,
angle::Format::ID::ASTC_8x5_UNORM_BLOCK,
VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
formatID = angle::Format::ID::ASTC_5x5_SRGB_BLOCK;
native = VK_FORMAT_ASTC_5x5_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
case angle::Format::ID::ASTC_5x5_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_8x6_KHR,
angle::Format::ID::ASTC_8x6_UNORM_BLOCK,
VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
formatID = angle::Format::ID::ASTC_5x5_UNORM_BLOCK;
native = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
case angle::Format::ID::ASTC_6x5_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_8x8_KHR,
angle::Format::ID::ASTC_8x8_UNORM_BLOCK,
VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
formatID = angle::Format::ID::ASTC_6x5_SRGB_BLOCK;
native = VK_FORMAT_ASTC_6x5_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case angle::Format::ID::ASTC_6x5_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
angle::Format::ID::BC1_RGBA_UNORM_BLOCK,
VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
formatID = angle::Format::ID::ASTC_6x5_UNORM_BLOCK;
native = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case angle::Format::ID::ASTC_6x6_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
angle::Format::ID::BC1_RGB_UNORM_BLOCK,
VK_FORMAT_BC1_RGB_UNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
formatID = angle::Format::ID::ASTC_6x6_SRGB_BLOCK;
native = VK_FORMAT_ASTC_6x6_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SIGNED_R11_EAC:
case angle::Format::ID::ASTC_6x6_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SIGNED_R11_EAC,
angle::Format::ID::EAC_R11_SNORM_BLOCK,
VK_FORMAT_EAC_R11_SNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
formatID = angle::Format::ID::ASTC_6x6_UNORM_BLOCK;
native = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SIGNED_RG11_EAC:
case angle::Format::ID::ASTC_8x5_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SIGNED_RG11_EAC,
angle::Format::ID::EAC_R11G11_SNORM_BLOCK,
VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
formatID = angle::Format::ID::ASTC_8x5_SRGB_BLOCK;
native = VK_FORMAT_ASTC_8x5_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
case angle::Format::ID::ASTC_8x5_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,
angle::Format::ID::ASTC_10x10_SRGB_BLOCK,
VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
formatID = angle::Format::ID::ASTC_8x5_UNORM_BLOCK;
native = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
case angle::Format::ID::ASTC_8x6_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,
angle::Format::ID::ASTC_10x5_SRGB_BLOCK,
VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
formatID = angle::Format::ID::ASTC_8x6_SRGB_BLOCK;
native = VK_FORMAT_ASTC_8x6_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
case angle::Format::ID::ASTC_8x6_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,
angle::Format::ID::ASTC_10x6_SRGB_BLOCK,
VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
formatID = angle::Format::ID::ASTC_8x6_UNORM_BLOCK;
native = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
case angle::Format::ID::ASTC_8x8_SRGB_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,
angle::Format::ID::ASTC_10x8_SRGB_BLOCK,
VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
formatID = angle::Format::ID::ASTC_8x8_SRGB_BLOCK;
native = VK_FORMAT_ASTC_8x8_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
case angle::Format::ID::ASTC_8x8_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,
angle::Format::ID::ASTC_12x10_SRGB_BLOCK,
VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
formatID = angle::Format::ID::ASTC_8x8_UNORM_BLOCK;
native = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
case angle::Format::ID::B4G4R4A4_UNORM:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,
angle::Format::ID::ASTC_4x4_SRGB_BLOCK,
VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_BGRA4_ANGLEX;
formatID = angle::Format::ID::B4G4R4A4_UNORM;
native = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
case angle::Format::ID::B5G5R5A1_UNORM:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,
angle::Format::ID::ASTC_5x4_SRGB_BLOCK,
VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_BGR5_A1_ANGLEX;
formatID = angle::Format::ID::B5G5R5A1_UNORM;
native = VK_FORMAT_B5G5R5A1_UNORM_PACK16;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
case angle::Format::ID::B5G6R5_UNORM:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,
angle::Format::ID::ASTC_5x5_SRGB_BLOCK,
VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_BGR565_ANGLEX;
formatID = angle::Format::ID::B5G6R5_UNORM;
native = VK_FORMAT_B5G6R5_UNORM_PACK16;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
case angle::Format::ID::B8G8R8A8_UNORM:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,
angle::Format::ID::ASTC_6x5_SRGB_BLOCK,
VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_BGRA8_EXT;
formatID = angle::Format::ID::B8G8R8A8_UNORM;
native = VK_FORMAT_B8G8R8A8_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
case angle::Format::ID::B8G8R8X8_UNORM:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::BC1_RGBA_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,
angle::Format::ID::ASTC_6x6_SRGB_BLOCK,
VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
formatID = angle::Format::ID::BC1_RGBA_UNORM_BLOCK;
native = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
case angle::Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::BC1_RGB_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,
angle::Format::ID::ASTC_8x5_SRGB_BLOCK,
VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
formatID = angle::Format::ID::BC1_RGB_UNORM_BLOCK;
native = VK_FORMAT_BC1_RGB_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
case angle::Format::ID::BC1_RGB_UNORM_SRGB_BLOCK:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::BC2_RGBA_UNORM_BLOCK:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::BC2_RGBA_UNORM_SRGB_BLOCK:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::BC3_RGBA_UNORM_BLOCK:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::BC3_RGBA_UNORM_SRGB_BLOCK:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::D16_UNORM:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,
angle::Format::ID::ASTC_8x6_SRGB_BLOCK,
VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_DEPTH_COMPONENT16;
formatID = angle::Format::ID::D16_UNORM;
native = VK_FORMAT_D16_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
case angle::Format::ID::D24_UNORM:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::D24_UNORM_S8_UINT:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,
angle::Format::ID::ASTC_8x8_SRGB_BLOCK,
VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_DEPTH24_STENCIL8;
formatID = angle::Format::ID::D24_UNORM_S8_UINT;
native = VK_FORMAT_D24_UNORM_S8_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
case angle::Format::ID::D32_FLOAT:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
angle::Format::ID::ETC2_R8G8B8A8_SRGB_BLOCK,
VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_DEPTH_COMPONENT32F;
formatID = angle::Format::ID::D32_FLOAT;
native = VK_FORMAT_D32_SFLOAT;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_ETC2:
case angle::Format::ID::D32_FLOAT_S8X24_UINT:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::D32_UNORM:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::EAC_R11G11_SNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_ETC2,
angle::Format::ID::ETC2_R8G8B8_SRGB_BLOCK,
VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SIGNED_RG11_EAC;
formatID = angle::Format::ID::EAC_R11G11_SNORM_BLOCK;
native = VK_FORMAT_EAC_R11G11_SNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
case angle::Format::ID::EAC_R11G11_UNORM_BLOCK:
{
static constexpr Format info(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
angle::Format::ID::ETC2_R8G8B8A1_SRGB_BLOCK,
VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RG11_EAC;
formatID = angle::Format::ID::EAC_R11G11_UNORM_BLOCK;
native = VK_FORMAT_EAC_R11G11_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_DEPTH24_STENCIL8:
case angle::Format::ID::EAC_R11_SNORM_BLOCK:
{
static constexpr Format info(GL_DEPTH24_STENCIL8,
angle::Format::ID::D24_UNORM_S8_UINT,
VK_FORMAT_D24_UNORM_S8_UINT,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SIGNED_R11_EAC;
formatID = angle::Format::ID::EAC_R11_SNORM_BLOCK;
native = VK_FORMAT_EAC_R11_SNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_DEPTH_COMPONENT16:
case angle::Format::ID::EAC_R11_UNORM_BLOCK:
{
static constexpr Format info(GL_DEPTH_COMPONENT16,
angle::Format::ID::D16_UNORM,
VK_FORMAT_D16_UNORM,
nullptr);
return info;
internalFormat = GL_COMPRESSED_R11_EAC;
formatID = angle::Format::ID::EAC_R11_UNORM_BLOCK;
native = VK_FORMAT_EAC_R11_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_DEPTH_COMPONENT32F:
case angle::Format::ID::ETC2_R8G8B8A1_SRGB_BLOCK:
{
static constexpr Format info(GL_DEPTH_COMPONENT32F,
angle::Format::ID::D32_FLOAT,
VK_FORMAT_D32_SFLOAT,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
formatID = angle::Format::ID::ETC2_R8G8B8A1_SRGB_BLOCK;
native = VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
case angle::Format::ID::ETC2_R8G8B8A1_UNORM_BLOCK:
{
static constexpr Format info(GL_ETC1_RGB8_LOSSY_DECODE_ANGLE,
angle::Format::ID::NONE,
VK_FORMAT_UNDEFINED,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
formatID = angle::Format::ID::ETC2_R8G8B8A1_UNORM_BLOCK;
native = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
dataInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
break;
}
case GL_ETC1_RGB8_OES:
case angle::Format::ID::ETC2_R8G8B8A8_SRGB_BLOCK:
{
static constexpr Format info(GL_ETC1_RGB8_OES,
angle::Format::ID::NONE,
VK_FORMAT_UNDEFINED,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
formatID = angle::Format::ID::ETC2_R8G8B8A8_SRGB_BLOCK;
native = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_NONE:
case angle::Format::ID::ETC2_R8G8B8A8_UNORM_BLOCK:
{
static constexpr Format info(GL_NONE,
angle::Format::ID::NONE,
VK_FORMAT_UNDEFINED,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC;
formatID = angle::Format::ID::ETC2_R8G8B8A8_UNORM_BLOCK;
native = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_R16F:
case angle::Format::ID::ETC2_R8G8B8_SRGB_BLOCK:
{
static constexpr Format info(GL_R16F,
angle::Format::ID::R16_FLOAT,
VK_FORMAT_R16_SFLOAT,
nullptr);
return info;
internalFormat = GL_COMPRESSED_SRGB8_ETC2;
formatID = angle::Format::ID::ETC2_R8G8B8_SRGB_BLOCK;
native = VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_R16I:
case angle::Format::ID::ETC2_R8G8B8_UNORM_BLOCK:
{
static constexpr Format info(GL_R16I,
angle::Format::ID::R16_SINT,
VK_FORMAT_R16_SINT,
nullptr);
return info;
internalFormat = GL_COMPRESSED_RGB8_ETC2;
formatID = angle::Format::ID::ETC2_R8G8B8_UNORM_BLOCK;
native = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
dataInitializerFunction = nullptr;
break;
}
case GL_R16UI:
case angle::Format::ID::L16A16_FLOAT:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::L16_FLOAT:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::L32A32_FLOAT:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::L32_FLOAT:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::L8A8_UNORM:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::L8_UNORM:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::NONE:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::R10G10B10A2_UINT:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::R10G10B10A2_UNORM:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::R11G11B10_FLOAT:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::R16G16B16A16_FLOAT:
{
static constexpr Format info(GL_R16UI,
angle::Format::ID::R16_UINT,
VK_FORMAT_R16_UINT,
nullptr);
return info;
internalFormat = GL_RGBA16F;
formatID = angle::Format::ID::R16G16B16A16_FLOAT;
native = VK_FORMAT_R16G16B16A16_SFLOAT;
dataInitializerFunction = nullptr;
break;
}
case GL_R16_EXT:
case angle::Format::ID::R16G16B16A16_SINT:
{
static constexpr Format info(GL_R16_EXT,
angle::Format::ID::R16_UNORM,
VK_FORMAT_R16_UNORM,
nullptr);
return info;
internalFormat = GL_RGBA16I;
formatID = angle::Format::ID::R16G16B16A16_SINT;
native = VK_FORMAT_R16G16B16A16_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_R16_SNORM_EXT:
case angle::Format::ID::R16G16B16A16_SNORM:
{
static constexpr Format info(GL_R16_SNORM_EXT,
angle::Format::ID::R16_SNORM,
VK_FORMAT_R16_SNORM,
nullptr);
return info;
internalFormat = GL_RGBA16_SNORM_EXT;
formatID = angle::Format::ID::R16G16B16A16_SNORM;
native = VK_FORMAT_R16G16B16A16_SNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_R32F:
case angle::Format::ID::R16G16B16A16_UINT:
{
static constexpr Format info(GL_R32F,
angle::Format::ID::R32_FLOAT,
VK_FORMAT_R32_SFLOAT,
nullptr);
return info;
internalFormat = GL_RGBA16UI;
formatID = angle::Format::ID::R16G16B16A16_UINT;
native = VK_FORMAT_R16G16B16A16_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_R32I:
case angle::Format::ID::R16G16B16A16_UNORM:
{
static constexpr Format info(GL_R32I,
angle::Format::ID::R32_SINT,
VK_FORMAT_R32_SINT,
nullptr);
return info;
internalFormat = GL_RGBA16_EXT;
formatID = angle::Format::ID::R16G16B16A16_UNORM;
native = VK_FORMAT_R16G16B16A16_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_R32UI:
case angle::Format::ID::R16G16B16_FLOAT:
{
static constexpr Format info(GL_R32UI,
angle::Format::ID::R32_UINT,
VK_FORMAT_R32_UINT,
nullptr);
return info;
internalFormat = GL_RGB16F;
formatID = angle::Format::ID::R16G16B16_FLOAT;
native = VK_FORMAT_R16G16B16_SFLOAT;
dataInitializerFunction = nullptr;
break;
}
case GL_R8:
case angle::Format::ID::R16G16B16_SINT:
{
static constexpr Format info(GL_R8,
angle::Format::ID::R8_UNORM,
VK_FORMAT_R8_UNORM,
nullptr);
return info;
internalFormat = GL_RGB16I;
formatID = angle::Format::ID::R16G16B16_SINT;
native = VK_FORMAT_R16G16B16_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_R8I:
case angle::Format::ID::R16G16B16_SNORM:
{
static constexpr Format info(GL_R8I,
angle::Format::ID::R8_SINT,
VK_FORMAT_R8_SINT,
nullptr);
return info;
internalFormat = GL_RGB16_SNORM_EXT;
formatID = angle::Format::ID::R16G16B16_SNORM;
native = VK_FORMAT_R16G16B16_SNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_R8UI:
case angle::Format::ID::R16G16B16_UINT:
{
static constexpr Format info(GL_R8UI,
angle::Format::ID::R8_UINT,
VK_FORMAT_R8_UINT,
nullptr);
return info;
internalFormat = GL_RGB16UI;
formatID = angle::Format::ID::R16G16B16_UINT;
native = VK_FORMAT_R16G16B16_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_R8_SNORM:
case angle::Format::ID::R16G16B16_UNORM:
{
static constexpr Format info(GL_R8_SNORM,
angle::Format::ID::R8_SNORM,
VK_FORMAT_R8_SNORM,
nullptr);
return info;
internalFormat = GL_RGB16_EXT;
formatID = angle::Format::ID::R16G16B16_UNORM;
native = VK_FORMAT_R16G16B16_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RG16F:
case angle::Format::ID::R16G16_FLOAT:
{
static constexpr Format info(GL_RG16F,
angle::Format::ID::R16G16_FLOAT,
VK_FORMAT_R16G16_SFLOAT,
nullptr);
return info;
internalFormat = GL_RG16F;
formatID = angle::Format::ID::R16G16_FLOAT;
native = VK_FORMAT_R16G16_SFLOAT;
dataInitializerFunction = nullptr;
break;
}
case GL_RG16I:
case angle::Format::ID::R16G16_SINT:
{
static constexpr Format info(GL_RG16I,
angle::Format::ID::R16G16_SINT,
VK_FORMAT_R16G16_SINT,
nullptr);
return info;
internalFormat = GL_RG16I;
formatID = angle::Format::ID::R16G16_SINT;
native = VK_FORMAT_R16G16_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RG16UI:
case angle::Format::ID::R16G16_SNORM:
{
static constexpr Format info(GL_RG16UI,
angle::Format::ID::R16G16_UINT,
VK_FORMAT_R16G16_UINT,
nullptr);
return info;
internalFormat = GL_RG16_SNORM_EXT;
formatID = angle::Format::ID::R16G16_SNORM;
native = VK_FORMAT_R16G16_SNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RG16_EXT:
case angle::Format::ID::R16G16_UINT:
{
static constexpr Format info(GL_RG16_EXT,
angle::Format::ID::R16G16_UNORM,
VK_FORMAT_R16G16_UNORM,
nullptr);
return info;
internalFormat = GL_RG16UI;
formatID = angle::Format::ID::R16G16_UINT;
native = VK_FORMAT_R16G16_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RG16_SNORM_EXT:
case angle::Format::ID::R16G16_UNORM:
{
static constexpr Format info(GL_RG16_SNORM_EXT,
angle::Format::ID::R16G16_SNORM,
VK_FORMAT_R16G16_SNORM,
nullptr);
return info;
internalFormat = GL_RG16_EXT;
formatID = angle::Format::ID::R16G16_UNORM;
native = VK_FORMAT_R16G16_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RG32F:
case angle::Format::ID::R16_FLOAT:
{
static constexpr Format info(GL_RG32F,
angle::Format::ID::R32G32_FLOAT,
VK_FORMAT_R32G32_SFLOAT,
nullptr);
return info;
internalFormat = GL_R16F;
formatID = angle::Format::ID::R16_FLOAT;
native = VK_FORMAT_R16_SFLOAT;
dataInitializerFunction = nullptr;
break;
}
case GL_RG32I:
case angle::Format::ID::R16_SINT:
{
static constexpr Format info(GL_RG32I,
angle::Format::ID::R32G32_SINT,
VK_FORMAT_R32G32_SINT,
nullptr);
return info;
internalFormat = GL_R16I;
formatID = angle::Format::ID::R16_SINT;
native = VK_FORMAT_R16_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RG32UI:
case angle::Format::ID::R16_SNORM:
{
static constexpr Format info(GL_RG32UI,
angle::Format::ID::R32G32_UINT,
VK_FORMAT_R32G32_UINT,
nullptr);
return info;
internalFormat = GL_R16_SNORM_EXT;
formatID = angle::Format::ID::R16_SNORM;
native = VK_FORMAT_R16_SNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RG8:
case angle::Format::ID::R16_UINT:
{
static constexpr Format info(GL_RG8,
angle::Format::ID::R8G8_UNORM,
VK_FORMAT_R8G8_UNORM,
nullptr);
return info;
internalFormat = GL_R16UI;
formatID = angle::Format::ID::R16_UINT;
native = VK_FORMAT_R16_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RG8I:
case angle::Format::ID::R16_UNORM:
{
static constexpr Format info(GL_RG8I,
angle::Format::ID::R8G8_SINT,
VK_FORMAT_R8G8_SINT,
nullptr);
return info;
internalFormat = GL_R16_EXT;
formatID = angle::Format::ID::R16_UNORM;
native = VK_FORMAT_R16_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RG8UI:
case angle::Format::ID::R32G32B32A32_FLOAT:
{
static constexpr Format info(GL_RG8UI,
angle::Format::ID::R8G8_UINT,
VK_FORMAT_R8G8_UINT,
nullptr);
return info;
internalFormat = GL_RGBA32F;
formatID = angle::Format::ID::R32G32B32A32_FLOAT;
native = VK_FORMAT_R32G32B32A32_SFLOAT;
dataInitializerFunction = nullptr;
break;
}
case GL_RG8_SNORM:
case angle::Format::ID::R32G32B32A32_SINT:
{
static constexpr Format info(GL_RG8_SNORM,
angle::Format::ID::R8G8_SNORM,
VK_FORMAT_R8G8_SNORM,
nullptr);
return info;
internalFormat = GL_RGBA32I;
formatID = angle::Format::ID::R32G32B32A32_SINT;
native = VK_FORMAT_R32G32B32A32_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB:
case angle::Format::ID::R32G32B32A32_UINT:
{
static constexpr Format info(GL_RGB,
angle::Format::ID::R8G8B8_UNORM,
VK_FORMAT_R8G8B8_UNORM,
nullptr);
return info;
internalFormat = GL_RGBA32UI;
formatID = angle::Format::ID::R32G32B32A32_UINT;
native = VK_FORMAT_R32G32B32A32_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB16F:
case angle::Format::ID::R32G32B32_FLOAT:
{
static constexpr Format info(GL_RGB16F,
angle::Format::ID::R16G16B16_FLOAT,
VK_FORMAT_R16G16B16_SFLOAT,
nullptr);
return info;
internalFormat = GL_RGB32F;
formatID = angle::Format::ID::R32G32B32_FLOAT;
native = VK_FORMAT_R32G32B32_SFLOAT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB16I:
case angle::Format::ID::R32G32B32_SINT:
{
static constexpr Format info(GL_RGB16I,
angle::Format::ID::R16G16B16_SINT,
VK_FORMAT_R16G16B16_SINT,
nullptr);
return info;
internalFormat = GL_RGB32I;
formatID = angle::Format::ID::R32G32B32_SINT;
native = VK_FORMAT_R32G32B32_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB16UI:
case angle::Format::ID::R32G32B32_UINT:
{
static constexpr Format info(GL_RGB16UI,
angle::Format::ID::R16G16B16_UINT,
VK_FORMAT_R16G16B16_UINT,
nullptr);
return info;
internalFormat = GL_RGB32UI;
formatID = angle::Format::ID::R32G32B32_UINT;
native = VK_FORMAT_R32G32B32_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB16_EXT:
case angle::Format::ID::R32G32_FLOAT:
{
static constexpr Format info(GL_RGB16_EXT,
angle::Format::ID::R16G16B16_UNORM,
VK_FORMAT_R16G16B16_UNORM,
nullptr);
return info;
internalFormat = GL_RG32F;
formatID = angle::Format::ID::R32G32_FLOAT;
native = VK_FORMAT_R32G32_SFLOAT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB16_SNORM_EXT:
case angle::Format::ID::R32G32_SINT:
{
static constexpr Format info(GL_RGB16_SNORM_EXT,
angle::Format::ID::R16G16B16_SNORM,
VK_FORMAT_R16G16B16_SNORM,
nullptr);
return info;
internalFormat = GL_RG32I;
formatID = angle::Format::ID::R32G32_SINT;
native = VK_FORMAT_R32G32_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB32F:
case angle::Format::ID::R32G32_UINT:
{
static constexpr Format info(GL_RGB32F,
angle::Format::ID::R32G32B32_FLOAT,
VK_FORMAT_R32G32B32_SFLOAT,
nullptr);
return info;
internalFormat = GL_RG32UI;
formatID = angle::Format::ID::R32G32_UINT;
native = VK_FORMAT_R32G32_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB32I:
case angle::Format::ID::R32_FLOAT:
{
static constexpr Format info(GL_RGB32I,
angle::Format::ID::R32G32B32_SINT,
VK_FORMAT_R32G32B32_SINT,
nullptr);
return info;
internalFormat = GL_R32F;
formatID = angle::Format::ID::R32_FLOAT;
native = VK_FORMAT_R32_SFLOAT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB32UI:
case angle::Format::ID::R32_SINT:
{
static constexpr Format info(GL_RGB32UI,
angle::Format::ID::R32G32B32_UINT,
VK_FORMAT_R32G32B32_UINT,
nullptr);
return info;
internalFormat = GL_R32I;
formatID = angle::Format::ID::R32_SINT;
native = VK_FORMAT_R32_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB565:
case angle::Format::ID::R32_UINT:
{
static constexpr Format info(GL_RGB565,
angle::Format::ID::R5G6B5_UNORM,
VK_FORMAT_R5G6B5_UNORM_PACK16,
nullptr);
return info;
internalFormat = GL_R32UI;
formatID = angle::Format::ID::R32_UINT;
native = VK_FORMAT_R32_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB5_A1:
case angle::Format::ID::R4G4B4A4_UNORM:
{
static constexpr Format info(GL_RGB5_A1,
angle::Format::ID::R5G5B5A1_UNORM,
VK_FORMAT_R5G5B5A1_UNORM_PACK16,
nullptr);
return info;
internalFormat = GL_RGBA4;
formatID = angle::Format::ID::R4G4B4A4_UNORM;
native = VK_FORMAT_R4G4B4A4_UNORM_PACK16;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB8:
case angle::Format::ID::R5G5B5A1_UNORM:
{
static constexpr Format info(GL_RGB8,
angle::Format::ID::R8G8B8_UNORM,
VK_FORMAT_R8G8B8_UNORM,
nullptr);
return info;
internalFormat = GL_RGB5_A1;
formatID = angle::Format::ID::R5G5B5A1_UNORM;
native = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB8I:
case angle::Format::ID::R5G6B5_UNORM:
{
static constexpr Format info(GL_RGB8I,
angle::Format::ID::R8G8B8_SINT,
VK_FORMAT_R8G8B8_SINT,
nullptr);
return info;
internalFormat = GL_RGB565;
formatID = angle::Format::ID::R5G6B5_UNORM;
native = VK_FORMAT_R5G6B5_UNORM_PACK16;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB8UI:
case angle::Format::ID::R8G8B8A8_SINT:
{
static constexpr Format info(GL_RGB8UI,
angle::Format::ID::R8G8B8_UINT,
VK_FORMAT_R8G8B8_UINT,
nullptr);
return info;
internalFormat = GL_RGBA8I;
formatID = angle::Format::ID::R8G8B8A8_SINT;
native = VK_FORMAT_R8G8B8A8_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGB8_SNORM:
case angle::Format::ID::R8G8B8A8_SNORM:
{
static constexpr Format info(GL_RGB8_SNORM,
angle::Format::ID::R8G8B8_SNORM,
VK_FORMAT_R8G8B8_SNORM,
nullptr);
return info;
internalFormat = GL_RGBA8_SNORM;
formatID = angle::Format::ID::R8G8B8A8_SNORM;
native = VK_FORMAT_R8G8B8A8_SNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA:
case angle::Format::ID::R8G8B8A8_UINT:
{
static constexpr Format info(GL_RGBA,
angle::Format::ID::R8G8B8A8_UNORM,
VK_FORMAT_R8G8B8A8_UNORM,
nullptr);
return info;
internalFormat = GL_RGBA8UI;
formatID = angle::Format::ID::R8G8B8A8_UINT;
native = VK_FORMAT_R8G8B8A8_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA16F:
case angle::Format::ID::R8G8B8A8_UNORM:
{
static constexpr Format info(GL_RGBA16F,
angle::Format::ID::R16G16B16A16_FLOAT,
VK_FORMAT_R16G16B16A16_SFLOAT,
nullptr);
return info;
internalFormat = GL_RGBA8;
formatID = angle::Format::ID::R8G8B8A8_UNORM;
native = VK_FORMAT_R8G8B8A8_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA16I:
case angle::Format::ID::R8G8B8A8_UNORM_SRGB:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::R8G8B8_SINT:
{
static constexpr Format info(GL_RGBA16I,
angle::Format::ID::R16G16B16A16_SINT,
VK_FORMAT_R16G16B16A16_SINT,
nullptr);
return info;
internalFormat = GL_RGB8I;
formatID = angle::Format::ID::R8G8B8_SINT;
native = VK_FORMAT_R8G8B8_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA16UI:
case angle::Format::ID::R8G8B8_SNORM:
{
static constexpr Format info(GL_RGBA16UI,
angle::Format::ID::R16G16B16A16_UINT,
VK_FORMAT_R16G16B16A16_UINT,
nullptr);
return info;
internalFormat = GL_RGB8_SNORM;
formatID = angle::Format::ID::R8G8B8_SNORM;
native = VK_FORMAT_R8G8B8_SNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA16_EXT:
case angle::Format::ID::R8G8B8_UINT:
{
static constexpr Format info(GL_RGBA16_EXT,
angle::Format::ID::R16G16B16A16_UNORM,
VK_FORMAT_R16G16B16A16_UNORM,
nullptr);
return info;
internalFormat = GL_RGB8UI;
formatID = angle::Format::ID::R8G8B8_UINT;
native = VK_FORMAT_R8G8B8_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA16_SNORM_EXT:
case angle::Format::ID::R8G8B8_UNORM:
{
static constexpr Format info(GL_RGBA16_SNORM_EXT,
angle::Format::ID::R16G16B16A16_SNORM,
VK_FORMAT_R16G16B16A16_SNORM,
nullptr);
return info;
internalFormat = GL_RGB8;
formatID = angle::Format::ID::R8G8B8_UNORM;
native = VK_FORMAT_R8G8B8_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA32F:
case angle::Format::ID::R8G8B8_UNORM_SRGB:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::R8G8_SINT:
{
static constexpr Format info(GL_RGBA32F,
angle::Format::ID::R32G32B32A32_FLOAT,
VK_FORMAT_R32G32B32A32_SFLOAT,
nullptr);
return info;
internalFormat = GL_RG8I;
formatID = angle::Format::ID::R8G8_SINT;
native = VK_FORMAT_R8G8_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA32I:
case angle::Format::ID::R8G8_SNORM:
{
static constexpr Format info(GL_RGBA32I,
angle::Format::ID::R32G32B32A32_SINT,
VK_FORMAT_R32G32B32A32_SINT,
nullptr);
return info;
internalFormat = GL_RG8_SNORM;
formatID = angle::Format::ID::R8G8_SNORM;
native = VK_FORMAT_R8G8_SNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA32UI:
case angle::Format::ID::R8G8_UINT:
{
static constexpr Format info(GL_RGBA32UI,
angle::Format::ID::R32G32B32A32_UINT,
VK_FORMAT_R32G32B32A32_UINT,
nullptr);
return info;
internalFormat = GL_RG8UI;
formatID = angle::Format::ID::R8G8_UINT;
native = VK_FORMAT_R8G8_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA4:
case angle::Format::ID::R8G8_UNORM:
{
static constexpr Format info(GL_RGBA4,
angle::Format::ID::R4G4B4A4_UNORM,
VK_FORMAT_R4G4B4A4_UNORM_PACK16,
nullptr);
return info;
internalFormat = GL_RG8;
formatID = angle::Format::ID::R8G8_UNORM;
native = VK_FORMAT_R8G8_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA8:
case angle::Format::ID::R8_SINT:
{
static constexpr Format info(GL_RGBA8,
angle::Format::ID::R8G8B8A8_UNORM,
VK_FORMAT_R8G8B8A8_UNORM,
nullptr);
return info;
internalFormat = GL_R8I;
formatID = angle::Format::ID::R8_SINT;
native = VK_FORMAT_R8_SINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA8I:
case angle::Format::ID::R8_SNORM:
{
static constexpr Format info(GL_RGBA8I,
angle::Format::ID::R8G8B8A8_SINT,
VK_FORMAT_R8G8B8A8_SINT,
nullptr);
return info;
internalFormat = GL_R8_SNORM;
formatID = angle::Format::ID::R8_SNORM;
native = VK_FORMAT_R8_SNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA8UI:
case angle::Format::ID::R8_UINT:
{
static constexpr Format info(GL_RGBA8UI,
angle::Format::ID::R8G8B8A8_UINT,
VK_FORMAT_R8G8B8A8_UINT,
nullptr);
return info;
internalFormat = GL_R8UI;
formatID = angle::Format::ID::R8_UINT;
native = VK_FORMAT_R8_UINT;
dataInitializerFunction = nullptr;
break;
}
case GL_RGBA8_SNORM:
case angle::Format::ID::R8_UNORM:
{
static constexpr Format info(GL_RGBA8_SNORM,
angle::Format::ID::R8G8B8A8_SNORM,
VK_FORMAT_R8G8B8A8_SNORM,
nullptr);
return info;
internalFormat = GL_R8;
formatID = angle::Format::ID::R8_UNORM;
native = VK_FORMAT_R8_UNORM;
dataInitializerFunction = nullptr;
break;
}
case GL_STENCIL_INDEX8:
case angle::Format::ID::R9G9B9E5_SHAREDEXP:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::S8_UINT:
{
static constexpr Format info(GL_STENCIL_INDEX8,
angle::Format::ID::S8_UINT,
VK_FORMAT_S8_UINT,
nullptr);
return info;
internalFormat = GL_STENCIL_INDEX8;
formatID = angle::Format::ID::S8_UINT;
native = VK_FORMAT_S8_UINT;
dataInitializerFunction = nullptr;
break;
}
default:
UNREACHABLE();
break;
}
// clang-format on
UNREACHABLE();
static const Format noInfo(GL_NONE, angle::Format::ID::NONE, VK_FORMAT_UNDEFINED, nullptr);
return noInfo;
}
} // namespace vk
......
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