# HG changeset patch # User sam # Date 1721645388 -25200 # Node ID 7e55fde39ca87cfa14a8341c1ec85159dd09c920 # Parent e8b3dc80e48ef580591ba2bf5019de3bb0c76556 did: prepare for gltf importer and cleanup old engine code diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/gltf.nim --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semiconginev2/gltf.nim Mon Jul 22 17:49:48 2024 +0700 @@ -0,0 +1,359 @@ +type + glTFHeader = object + magic: uint32 + version: uint32 + length: uint32 + glTFData = object + structuredContent: JsonNode + binaryBufferData: seq[uint8] + +const + JSON_CHUNK = 0x4E4F534A + BINARY_CHUNK = 0x004E4942 + ACCESSOR_TYPE_MAP = { + 5120: Int8, + 5121: UInt8, + 5122: Int16, + 5123: UInt16, + 5125: UInt32, + 5126: Float32, + }.toTable + SAMPLER_FILTER_MODE_MAP = { + 9728: VK_FILTER_NEAREST, + 9729: VK_FILTER_LINEAR, + 9984: VK_FILTER_NEAREST, + 9985: VK_FILTER_LINEAR, + 9986: VK_FILTER_NEAREST, + 9987: VK_FILTER_LINEAR, + }.toTable + SAMPLER_WRAP_MODE_MAP = { + 33071: VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + 33648: VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT, + 10497: VK_SAMPLER_ADDRESS_MODE_REPEAT + }.toTable + GLTF_MATERIAL_MAPPING = { + "color": "baseColorFactor", + "emissiveColor": "emissiveFactor", + "metallic": "metallicFactor", + "roughness", "roughnessFactor", + "baseTexture": "baseColorTexture", + "metallicRoughnessTexture": "metallicRoughnessTexture", + "normalTexture": "normalTexture", + "occlusionTexture": "occlusionTexture", + "emissiveTexture": "emissiveTexture", + }.toTable + +proc getGPUType(accessor: JsonNode, attribute: string): DataType = + # TODO: no full support for all datatypes that glTF may provide + # semicongine/core/gpu_data should maybe generated with macros to allow for all combinations + let componentType = ACCESSOR_TYPE_MAP[accessor["componentType"].getInt()] + let theType = accessor["type"].getStr() + case theType + of "SCALAR": + return componentType + of "VEC2": + case componentType + of UInt32: return Vec2U32 + of Float32: return Vec2F32 + else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") + of "VEC3": + case componentType + of UInt32: return Vec3U32 + of Float32: return Vec3F32 + else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") + of "VEC4": + case componentType + of UInt32: return Vec4U32 + of Float32: return Vec4F32 + else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") + of "MAT2": + case componentType + of Float32: return Vec4F32 + else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") + of "MAT3": + case componentType + of Float32: return Vec4F32 + else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") + of "MAT4": + case componentType + of Float32: return Vec4F32 + else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") + +proc getBufferViewData(bufferView: JsonNode, mainBuffer: seq[uint8], baseBufferOffset = 0): seq[uint8] = + assert bufferView["buffer"].getInt() == 0, "Currently no external buffers supported" + + result = newSeq[uint8](bufferView["byteLength"].getInt()) + let bufferOffset = bufferView["byteOffset"].getInt() + baseBufferOffset + var dstPointer = addr result[0] + + if bufferView.hasKey("byteStride"): + raise newException(Exception, "Unsupported feature: byteStride in buffer view") + copyMem(dstPointer, addr mainBuffer[bufferOffset], result.len) + +proc getAccessorData(root: JsonNode, accessor: JsonNode, mainBuffer: seq[uint8]): DataList = + result = InitDataList(thetype = accessor.getGPUType("??")) + result.SetLen(accessor["count"].getInt()) + + let bufferView = root["bufferViews"][accessor["bufferView"].getInt()] + assert bufferView["buffer"].getInt() == 0, "Currently no external buffers supported" + + if accessor.hasKey("sparse"): + raise newException(Exception, "Sparce accessors are currently not implemented") + + let accessorOffset = if accessor.hasKey("byteOffset"): accessor["byteOffset"].getInt() else: 0 + let length = bufferView["byteLength"].getInt() + let bufferOffset = bufferView["byteOffset"].getInt() + accessorOffset + var dstPointer = result.GetPointer() + + if bufferView.hasKey("byteStride"): + warn "Congratulations, you try to test a feature (loading buffer data with stride attributes) that we have no idea where it is used and how it can be tested (need a coresponding *.glb file)." + # we don't support stride, have to convert stuff here... does this even work? + for i in 0 ..< int(result.len): + copyMem(dstPointer, addr mainBuffer[bufferOffset + i * bufferView["byteStride"].getInt()], int(result.thetype.Size)) + dstPointer = cast[pointer](cast[uint](dstPointer) + result.thetype.Size) + else: + copyMem(dstPointer, addr mainBuffer[bufferOffset], length) + +proc loadImage(root: JsonNode, imageIndex: int, mainBuffer: seq[uint8]): Image[RGBAPixel] = + if root["images"][imageIndex].hasKey("uri"): + raise newException(Exception, "Unsupported feature: Load images from external files") + + let bufferView = root["bufferViews"][root["images"][imageIndex]["bufferView"].getInt()] + let imgData = newStringStream(cast[string](getBufferViewData(bufferView, mainBuffer))) + + let imageType = root["images"][imageIndex]["mimeType"].getStr() + case imageType + of "image/bmp": + result = ReadBMP(imgData) + of "image/png": + result = ReadPNG(imgData) + else: + raise newException(Exception, "Unsupported feature: Load image of type " & imageType) + +proc loadTexture(root: JsonNode, textureIndex: int, mainBuffer: seq[uint8]): Texture = + let textureNode = root["textures"][textureIndex] + result = Texture(isGrayscale: false) + result.colorImage = loadImage(root, textureNode["source"].getInt(), mainBuffer) + result.name = root["images"][textureNode["source"].getInt()]["name"].getStr() + if result.name == "": + result.name = &"Texture{textureIndex}" + + if textureNode.hasKey("sampler"): + let sampler = root["samplers"][textureNode["sampler"].getInt()] + if sampler.hasKey("magFilter"): + result.sampler.magnification = SAMPLER_FILTER_MODE_MAP[sampler["magFilter"].getInt()] + if sampler.hasKey("minFilter"): + result.sampler.minification = SAMPLER_FILTER_MODE_MAP[sampler["minFilter"].getInt()] + if sampler.hasKey("wrapS"): + result.sampler.wrapModeS = SAMPLER_WRAP_MODE_MAP[sampler["wrapS"].getInt()] + if sampler.hasKey("wrapT"): + result.sampler.wrapModeT = SAMPLER_WRAP_MODE_MAP[sampler["wrapS"].getInt()] + + +proc loadMaterial(root: JsonNode, materialNode: JsonNode, defaultMaterial: MaterialType, mainBuffer: seq[uint8]): MaterialData = + let pbr = materialNode["pbrMetallicRoughness"] + var attributes: Table[string, DataList] + + # color + if defaultMaterial.attributes.contains("color"): + attributes["color"] = InitDataList(thetype = Vec4F32) + if pbr.hasKey(GLTF_MATERIAL_MAPPING["color"]): + attributes["color"] = @[NewVec4f( + pbr[GLTF_MATERIAL_MAPPING["color"]][0].getFloat(), + pbr[GLTF_MATERIAL_MAPPING["color"]][1].getFloat(), + pbr[GLTF_MATERIAL_MAPPING["color"]][2].getFloat(), + pbr[GLTF_MATERIAL_MAPPING["color"]][3].getFloat(), + )] + else: + attributes["color"] = @[NewVec4f(1, 1, 1, 1)] + + # pbr material values + for factor in ["metallic", "roughness"]: + if defaultMaterial.attributes.contains(factor): + attributes[factor] = InitDataList(thetype = Float32) + if pbr.hasKey(GLTF_MATERIAL_MAPPING[factor]): + attributes[factor] = @[float32(pbr[GLTF_MATERIAL_MAPPING[factor]].getFloat())] + else: + attributes[factor] = @[0.5'f32] + + # pbr material textures + for texture in ["baseTexture", "metallicRoughnessTexture"]: + if defaultMaterial.attributes.contains(texture): + attributes[texture] = InitDataList(thetype = TextureType) + # attributes[texture & "Index"] = InitDataList(thetype=UInt8) + if pbr.hasKey(GLTF_MATERIAL_MAPPING[texture]): + attributes[texture] = @[loadTexture(root, pbr[GLTF_MATERIAL_MAPPING[texture]]["index"].getInt(), mainBuffer)] + else: + attributes[texture] = @[EMPTY_TEXTURE] + + # generic material textures + for texture in ["normalTexture", "occlusionTexture", "emissiveTexture"]: + if defaultMaterial.attributes.contains(texture): + attributes[texture] = InitDataList(thetype = TextureType) + # attributes[texture & "Index"] = InitDataList(thetype=UInt8) + if materialNode.hasKey(GLTF_MATERIAL_MAPPING[texture]): + attributes[texture] = @[loadTexture(root, materialNode[texture]["index"].getInt(), mainBuffer)] + else: + attributes[texture] = @[EMPTY_TEXTURE] + + # emissiv color + if defaultMaterial.attributes.contains("emissiveColor"): + attributes["emissiveColor"] = InitDataList(thetype = Vec3F32) + if materialNode.hasKey(GLTF_MATERIAL_MAPPING["emissiveColor"]): + attributes["emissiveColor"] = @[NewVec3f( + materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][0].getFloat(), + materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][1].getFloat(), + materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][2].getFloat(), + )] + else: + attributes["emissiveColor"] = @[NewVec3f(1'f32, 1'f32, 1'f32)] + + result = InitMaterialData(theType = defaultMaterial, name = materialNode["name"].getStr(), attributes = attributes) + +proc loadMesh(meshname: string, root: JsonNode, primitiveNode: JsonNode, materials: seq[MaterialData], mainBuffer: seq[uint8]): Mesh = + if primitiveNode.hasKey("mode") and primitiveNode["mode"].getInt() != 4: + raise newException(Exception, "Currently only TRIANGLE mode is supported for geometry mode") + + var indexType = None + let indexed = primitiveNode.hasKey("indices") + if indexed: + # TODO: Tiny indices + var indexCount = root["accessors"][primitiveNode["indices"].getInt()]["count"].getInt() + if indexCount < int(high(uint16)): + indexType = Small + else: + indexType = Big + + result = Mesh( + instanceTransforms: @[Unit4F32], + indexType: indexType, + name: meshname, + vertexCount: 0, + ) + + for attribute, accessor in primitiveNode["attributes"].pairs: + let data = root.getAccessorData(root["accessors"][accessor.getInt()], mainBuffer) + if result.vertexCount == 0: + result.vertexCount = data.len + assert data.len == result.vertexCount + result[].InitVertexAttribute(attribute.toLowerAscii, data) + + if primitiveNode.hasKey("material"): + let materialId = primitiveNode["material"].getInt() + result[].material = materials[materialId] + else: + result[].material = EMPTY_MATERIAL.InitMaterialData() + + if primitiveNode.hasKey("indices"): + assert result[].indexType != None + let data = root.getAccessorData(root["accessors"][primitiveNode["indices"].getInt()], mainBuffer) + var tri: seq[int] + case data.thetype + of UInt16: + for entry in data[uint16][]: + tri.add int(entry) + if tri.len == 3: + # FYI gltf uses counter-clockwise indexing + result[].AppendIndicesData(tri[0], tri[1], tri[2]) + tri.setLen(0) + of UInt32: + for entry in data[uint32][]: + tri.add int(entry) + if tri.len == 3: + # FYI gltf uses counter-clockwise indexing + result[].AppendIndicesData(tri[0], tri[1], tri[2]) + tri.setLen(0) + else: + raise newException(Exception, &"Unsupported index data type: {data.thetype}") + # TODO: getting from gltf to vulkan system is still messed up somehow, see other TODO + Transform[Vec3f](result[], "position", Scale(1, -1, 1)) + +proc loadNode(root: JsonNode, node: JsonNode, materials: seq[MaterialData], mainBuffer: var seq[uint8]): MeshTree = + result = MeshTree() + # mesh + if node.hasKey("mesh"): + let mesh = root["meshes"][node["mesh"].getInt()] + for primitive in mesh["primitives"]: + result.children.add MeshTree(mesh: loadMesh(mesh["name"].getStr(), root, primitive, materials, mainBuffer)) + + # transformation + if node.hasKey("matrix"): + var mat: Mat4 + for i in 0 ..< node["matrix"].len: + mat[i] = node["matrix"][i].getFloat() + result.transform = mat + else: + var (t, r, s) = (Unit4F32, Unit4F32, Unit4F32) + if node.hasKey("translation"): + t = Translate( + float32(node["translation"][0].getFloat()), + float32(node["translation"][1].getFloat()), + float32(node["translation"][2].getFloat()) + ) + if node.hasKey("rotation"): + t = Rotate( + float32(node["rotation"][3].getFloat()), + NewVec3f( + float32(node["rotation"][0].getFloat()), + float32(node["rotation"][1].getFloat()), + float32(node["rotation"][2].getFloat()) + ) + ) + if node.hasKey("scale"): + t = Scale( + float32(node["scale"][0].getFloat()), + float32(node["scale"][1].getFloat()), + float32(node["scale"][2].getFloat()) + ) + result.transform = t * r * s + result.transform = Scale(1, -1, 1) * result.transform + + # children + if node.hasKey("children"): + for childNode in node["children"]: + result.children.add loadNode(root, root["nodes"][childNode.getInt()], materials, mainBuffer) + +proc loadMeshTree(root: JsonNode, scenenode: JsonNode, materials: seq[MaterialData], mainBuffer: var seq[uint8]): MeshTree = + result = MeshTree() + for nodeId in scenenode["nodes"]: + result.children.add loadNode(root, root["nodes"][nodeId.getInt()], materials, mainBuffer) + # TODO: getting from gltf to vulkan system is still messed up somehow (i.e. not consistent for different files), see other TODO + # result.transform = Scale(1, -1, 1) + result.updateTransforms() + + +proc ReadglTF*(stream: Stream, defaultMaterial: MaterialType): seq[MeshTree] = + var + header: glTFHeader + data: glTFData + + for name, value in fieldPairs(header): + stream.read(value) + + assert header.magic == 0x46546C67 + assert header.version == 2 + + var chunkLength = stream.readUint32() + assert stream.readUint32() == JSON_CHUNK + data.structuredContent = parseJson(stream.readStr(int(chunkLength))) + + chunkLength = stream.readUint32() + assert stream.readUint32() == BINARY_CHUNK + data.binaryBufferData.setLen(chunkLength) + assert stream.readData(addr data.binaryBufferData[0], int(chunkLength)) == int(chunkLength) + + # check that the refered buffer is the same as the binary chunk + # external binary buffers are not supported + assert data.structuredContent["buffers"].len == 1 + assert not data.structuredContent["buffers"][0].hasKey("uri") + let bufferLenDiff = int(chunkLength) - data.structuredContent["buffers"][0]["byteLength"].getInt() + assert 0 <= bufferLenDiff and bufferLenDiff <= 3 # binary buffer may be aligned to 4 bytes + + debug "Loading mesh: ", data.structuredContent.pretty + + var materials: seq[MaterialData] + for materialnode in data.structuredContent["materials"]: + materials.add data.structuredContent.loadMaterial(materialnode, defaultMaterial, data.binaryBufferData) + + for scenedata in data.structuredContent["scenes"]: + result.add data.structuredContent.loadMeshTree(scenedata, materials, data.binaryBufferData) diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/audiotypes.nim --- a/semiconginev2/old/core/audiotypes.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -import std/math - -# in order to generate sound files that are directly usable with the engine, -# convert an audio file to a raw PCM signed 16 bit little endian file with 2 channels and 48kHz: -# -# ffmpeg -i -f s16le -ac 2 -ar 44100 -acodec pcm_s16le - -const AUDIO_SAMPLE_RATE* = 44100 - -type - Level* = 0'f .. 1'f - Sample* = array[2, int16] - SoundData* = seq[Sample] - Sound* = ref SoundData - -proc sinewave(f: float): proc(x: float): float = - proc ret(x: float): float = - sin(x * 2 * Pi * f) - result = ret - -proc SineSoundData*(f: float, len: float, rate: int, amplitude = 0.5'f32): SoundData = - let dt = 1'f / float(rate) - var sine = sinewave(f) - for i in 0 ..< int(float(rate) * len): - let t = dt * float(i) - let value = int16(sine(t) * float(high(int16)) * amplitude) - result.add [value, value] - -proc NewSound*(data: SoundData): Sound = - result = new Sound - result[] = data diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/buildconfig.nim --- a/semiconginev2/old/core/buildconfig.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -import std/strutils -import std/logging -import std/os - -import ./constants - -# checks required build options: -static: - assert compileOption("threads"), ENGINENAME & " requires --threads=on" - assert defined(nimPreviewHashRef), ENGINENAME & " requires -d:nimPreviewHashRef" - - if defined(release) or defined(windows): - assert compileOption("app", "gui"), ENGINENAME & " requires --app=gui for release builds and all windows builds" - - - if defined(linux): - assert defined(VK_USE_PLATFORM_XLIB_KHR), ENGINENAME & " requires --d:VK_USE_PLATFORM_XLIB_KHR for linux builds" - elif defined(windows): - assert defined(VK_USE_PLATFORM_WIN32_KHR), ENGINENAME & " requires --d:VK_USE_PLATFORM_WIN32_KHR for windows builds" - else: - assert false, "trying to build on unsupported platform" - -# build configuration -# ===================== - -# compile-time defines, usefull for build-dependent settings -# can be overriden with compiler flags, e.g. -d:Foo=42 -d:Bar=false -# pramas: {.intdefine.} {.strdefine.} {.booldefine.} - -# root of where settings files will be searched -# must be relative (to the directory of the binary) -const DEBUG* {.booldefine.} = not defined(release) -const CONFIGROOT* {.strdefine.}: string = "." -assert not isAbsolute(CONFIGROOT) - -const CONFIGEXTENSION* {.strdefine.}: string = "ini" - -# by default enable hot-reload of runtime-configuration only in debug builds -const CONFIGHOTRELOAD* {.booldefine.}: bool = DEBUG - -# milliseconds to wait between checks for settings hotreload -const CONFIGHOTRELOADINTERVAL* {.intdefine.}: int = 1000 - -# log level -const LOGLEVEL {.strdefine.}: string = "Warn" -const ENGINE_LOGLEVEL* = parseEnum[Level]("lvl" & LOGLEVEL) - -# resource bundleing settings, need to be configured per project -const PACKAGETYPE* {.strdefine.}: string = "exe" # dir, zip, exe -static: - assert PACKAGETYPE in ["dir", "zip", "exe"], ENGINENAME & " requires one of -d:PACKAGETYPE=dir -d:PACKAGETYPE=zip -d:PACKAGETYPE=exe" diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/color.nim --- a/semiconginev2/old/core/color.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -import std/math -import std/parseutils -import std/strformat - -import ./vector - - -func ColorToHex*(color: Vec3f): string = - &"{int(color.r * 255):02X}{int(color.g * 255):02X}{int(color.b * 255):02X}" - -func ColorToHex*(color: Vec4f): string = - &"{int(color.r * 255):02X}{int(color.g * 255):02X}{int(color.b * 255):02X}{int(color.a * 255):02X}" - -func AsPixel*(color: Vec3f): array[4, uint8] = - [uint8(color.r * 255), uint8(color.g * 255), uint8(color.b * 255), 255'u8] -func AsPixel*(color: Vec4f): array[4, uint8] = - [uint8(color.r * 255), uint8(color.g * 255), uint8(color.b * 255), uint8(color.a * 255)] - -func ToRGBA*(value: string): Vec4f = - assert value != "" - var hex = value - if hex[0] == '#': - hex = hex[1 .. ^1] - # when 3 or 6 -> set alpha to 1.0 - assert hex.len == 3 or hex.len == 6 or hex.len == 4 or hex.len == 8 - if hex.len == 3: - hex = hex & "f" - if hex.len == 4: - hex = hex[0] & hex[0] & hex[1] & hex[1] & hex[2] & hex[2] & hex[3] & hex[3] - if hex.len == 6: - hex = hex & "ff" - assert hex.len == 8 - var r, g, b, a: uint8 - discard parseHex(hex[0 .. 1], r) - discard parseHex(hex[2 .. 3], g) - discard parseHex(hex[4 .. 5], b) - discard parseHex(hex[6 .. 7], a) - return Vec4f([float32(r), float32(g), float32(b), float32(a)]) / 255'f - - -func Linear2srgb*(value: SomeFloat): SomeFloat = - clamp( - if (value < 0.0031308): value * 12.92 - else: pow(value, 1.0 / 2.4) * 1.055 - 0.055, - 0, - 1, - ) -func Srgb2linear*(value: SomeFloat): SomeFloat = - clamp( - if (value < 0.04045): value / 12.92 - else: pow((value + 0.055) / 1.055, 2.4), - 0, - 1, - ) -func Linear2srgb*(value: uint8): uint8 = # also covers GrayPixel - uint8(round(Linear2srgb(float(value) / 255.0) * 255)) -func Srgb2linear*(value: uint8): uint8 = # also covers GrayPixel - uint8(round(Srgb2linear(float(value) / 255.0) * 255)) - -func ToSRGB*(value: Vec4f): Vec4f = - NewVec4f( - Linear2srgb(value.r), - Linear2srgb(value.g), - Linear2srgb(value.b), - value.a, - ) -func FromSRGB*(value: Vec4f): Vec4f = - NewVec4f( - Srgb2linear(value.r), - Srgb2linear(value.g), - Srgb2linear(value.b), - value.a, - ) - -const - Black* = ToRGBA "#000000FF" - Silver* = ToRGBA "#C0C0C0FF" - Gray* = ToRGBA "#808080FF" - White* = ToRGBA "#FFFFFFFF" - Maroon* = ToRGBA "#800000FF" - Red* = ToRGBA "#FF0000FF" - Purple* = ToRGBA "#800080FF" - Fuchsia* = ToRGBA "#FF00FFFF" - Green* = ToRGBA "#008000FF" - Lime* = ToRGBA "#00FF00FF" - Olive* = ToRGBA "#808000FF" - Yellow* = ToRGBA "#FFFF00FF" - Navy* = ToRGBA "#000080FF" - Blue* = ToRGBA "#0000FFFF" - Teal* = ToRGBA "#008080FF" - Aqua* = ToRGBA "#00FFFFFF" diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/constants.nim --- a/semiconginev2/old/core/constants.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -const - RESOURCEROOT*: string = "resources" - ENGINENAME* = "semicongine" - ENGINEVERSION* = "0.0.1" - TRANSFORM_ATTRIB* = "transform" - MATERIALINDEX_ATTRIBUTE* = "materialIndex" - ASPECT_RATIO_ATTRIBUTE* = "aspect_ratio" diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/dynamic_arrays.nim --- a/semiconginev2/old/core/dynamic_arrays.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,733 +0,0 @@ -import std/hashes -import std/tables -import std/strformat - -import ./gpu_types -import ./vector -import ./matrix -import ./utils -import ./imagetypes - -type - DataList* = object - len*: int - case theType*: DataType - of Float32: float32: ref seq[float32] - of Float64: float64: ref seq[float64] - of Int8: int8: ref seq[int8] - of Int16: int16: ref seq[int16] - of Int32: int32: ref seq[int32] - of Int64: int64: ref seq[int64] - of UInt8: uint8: ref seq[uint8] - of UInt16: uint16: ref seq[uint16] - of UInt32: uint32: ref seq[uint32] - of UInt64: uint64: ref seq[uint64] - of Vec2I32: vec2i32: ref seq[TVec2[int32]] - of Vec2I64: vec2i64: ref seq[TVec2[int64]] - of Vec3I32: vec3i32: ref seq[TVec3[int32]] - of Vec3I64: vec3i64: ref seq[TVec3[int64]] - of Vec4I32: vec4i32: ref seq[TVec4[int32]] - of Vec4I64: vec4i64: ref seq[TVec4[int64]] - of Vec2U32: vec2u32: ref seq[TVec2[uint32]] - of Vec2U64: vec2u64: ref seq[TVec2[uint64]] - of Vec3U32: vec3u32: ref seq[TVec3[uint32]] - of Vec3U64: vec3u64: ref seq[TVec3[uint64]] - of Vec4U32: vec4u32: ref seq[TVec4[uint32]] - of Vec4U64: vec4u64: ref seq[TVec4[uint64]] - of Vec2F32: vec2f32: ref seq[TVec2[float32]] - of Vec2F64: vec2f64: ref seq[TVec2[float64]] - of Vec3F32: vec3f32: ref seq[TVec3[float32]] - of Vec3F64: vec3f64: ref seq[TVec3[float64]] - of Vec4F32: vec4f32: ref seq[TVec4[float32]] - of Vec4F64: vec4f64: ref seq[TVec4[float64]] - of Mat2F32: mat2f32: ref seq[TMat2[float32]] - of Mat2F64: mat2f64: ref seq[TMat2[float64]] - of Mat23F32: mat23f32: ref seq[TMat23[float32]] - of Mat23F64: mat23f64: ref seq[TMat23[float64]] - of Mat32F32: mat32f32: ref seq[TMat32[float32]] - of Mat32F64: mat32f64: ref seq[TMat32[float64]] - of Mat3F32: mat3f32: ref seq[TMat3[float32]] - of Mat3F64: mat3f64: ref seq[TMat3[float64]] - of Mat34F32: mat34f32: ref seq[TMat34[float32]] - of Mat34F64: mat34f64: ref seq[TMat34[float64]] - of Mat43F32: mat43f32: ref seq[TMat43[float32]] - of Mat43F64: mat43f64: ref seq[TMat43[float64]] - of Mat4F32: mat4f32: ref seq[TMat4[float32]] - of Mat4F64: mat4f64: ref seq[TMat4[float64]] - of TextureType: texture: ref seq[Texture] - -func Size*(value: DataList): uint64 = - value.theType.Size * value.len.uint64 - -func hash*(value: DataList): Hash = - case value.theType - of Float32: hash(value.float32) - of Float64: hash(value.float64) - of Int8: hash(value.int8) - of Int16: hash(value.int16) - of Int32: hash(value.int32) - of Int64: hash(value.int64) - of UInt8: hash(value.uint8) - of UInt16: hash(value.uint16) - of UInt32: hash(value.uint32) - of UInt64: hash(value.uint64) - of Vec2I32: hash(value.vec2i32) - of Vec2I64: hash(value.vec2i64) - of Vec3I32: hash(value.vec3i32) - of Vec3I64: hash(value.vec3i64) - of Vec4I32: hash(value.vec4i32) - of Vec4I64: hash(value.vec4i64) - of Vec2U32: hash(value.vec2u32) - of Vec2U64: hash(value.vec2u64) - of Vec3U32: hash(value.vec3u32) - of Vec3U64: hash(value.vec3u64) - of Vec4U32: hash(value.vec4u32) - of Vec4U64: hash(value.vec4u64) - of Vec2F32: hash(value.vec2f32) - of Vec2F64: hash(value.vec2f64) - of Vec3F32: hash(value.vec3f32) - of Vec3F64: hash(value.vec3f64) - of Vec4F32: hash(value.vec4f32) - of Vec4F64: hash(value.vec4f64) - of Mat2F32: hash(value.mat2f32) - of Mat2F64: hash(value.mat2f64) - of Mat23F32: hash(value.mat23f32) - of Mat23F64: hash(value.mat23f64) - of Mat32F32: hash(value.mat32f32) - of Mat32F64: hash(value.mat32f64) - of Mat3F32: hash(value.mat3f32) - of Mat3F64: hash(value.mat3f64) - of Mat34F32: hash(value.mat34f32) - of Mat34F64: hash(value.mat34f64) - of Mat43F32: hash(value.mat43f32) - of Mat43F64: hash(value.mat43f64) - of Mat4F32: hash(value.mat4f32) - of Mat4F64: hash(value.mat4f64) - of TextureType: hash(value.texture) - -func `==`*(a, b: DataList): bool = - if a.theType != b.theType: - return false - case a.theType - of Float32: return a.float32 == b.float32 - of Float64: return a.float64 == b.float64 - of Int8: return a.int8 == b.int8 - of Int16: return a.int16 == b.int16 - of Int32: return a.int32 == b.int32 - of Int64: return a.int64 == b.int64 - of UInt8: return a.uint8 == b.uint8 - of UInt16: return a.uint16 == b.uint16 - of UInt32: return a.uint32 == b.uint32 - of UInt64: return a.uint64 == b.uint64 - of Vec2I32: return a.vec2i32 == b.vec2i32 - of Vec2I64: return a.vec2i64 == b.vec2i64 - of Vec3I32: return a.vec3i32 == b.vec3i32 - of Vec3I64: return a.vec3i64 == b.vec3i64 - of Vec4I32: return a.vec4i32 == b.vec4i32 - of Vec4I64: return a.vec4i64 == b.vec4i64 - of Vec2U32: return a.vec2u32 == b.vec2u32 - of Vec2U64: return a.vec2u64 == b.vec2u64 - of Vec3U32: return a.vec3u32 == b.vec3u32 - of Vec3U64: return a.vec3u64 == b.vec3u64 - of Vec4U32: return a.vec4u32 == b.vec4u32 - of Vec4U64: return a.vec4u64 == b.vec4u64 - of Vec2F32: return a.vec2f32 == b.vec2f32 - of Vec2F64: return a.vec2f64 == b.vec2f64 - of Vec3F32: return a.vec3f32 == b.vec3f32 - of Vec3F64: return a.vec3f64 == b.vec3f64 - of Vec4F32: return a.vec4f32 == b.vec4f32 - of Vec4F64: return a.vec4f64 == b.vec4f64 - of Mat2F32: return a.mat2f32 == b.mat2f32 - of Mat2F64: return a.mat2f64 == b.mat2f64 - of Mat23F32: return a.mat23f32 == b.mat23f32 - of Mat23F64: return a.mat23f64 == b.mat23f64 - of Mat32F32: return a.mat32f32 == b.mat32f32 - of Mat32F64: return a.mat32f64 == b.mat32f64 - of Mat3F32: return a.mat3f32 == b.mat3f32 - of Mat3F64: return a.mat3f64 == b.mat3f64 - of Mat34F32: return a.mat34f32 == b.mat34f32 - of Mat34F64: return a.mat34f64 == b.mat34f64 - of Mat43F32: return a.mat43f32 == b.mat43f32 - of Mat43F64: return a.mat43f64 == b.mat43f64 - of Mat4F32: return a.mat4f32 == b.mat4f32 - of Mat4F64: return a.mat4f64 == b.mat4f64 - of TextureType: a.texture == b.texture - -proc SetLen*(value: var DataList, len: int) = - value.len = len - case value.theType - of Float32: value.float32[].setLen(len) - of Float64: value.float64[].setLen(len) - of Int8: value.int8[].setLen(len) - of Int16: value.int16[].setLen(len) - of Int32: value.int32[].setLen(len) - of Int64: value.int64[].setLen(len) - of UInt8: value.uint8[].setLen(len) - of UInt16: value.uint16[].setLen(len) - of UInt32: value.uint32[].setLen(len) - of UInt64: value.uint64[].setLen(len) - of Vec2I32: value.vec2i32[].setLen(len) - of Vec2I64: value.vec2i64[].setLen(len) - of Vec3I32: value.vec3i32[].setLen(len) - of Vec3I64: value.vec3i64[].setLen(len) - of Vec4I32: value.vec4i32[].setLen(len) - of Vec4I64: value.vec4i64[].setLen(len) - of Vec2U32: value.vec2u32[].setLen(len) - of Vec2U64: value.vec2u64[].setLen(len) - of Vec3U32: value.vec3u32[].setLen(len) - of Vec3U64: value.vec3u64[].setLen(len) - of Vec4U32: value.vec4u32[].setLen(len) - of Vec4U64: value.vec4u64[].setLen(len) - of Vec2F32: value.vec2f32[].setLen(len) - of Vec2F64: value.vec2f64[].setLen(len) - of Vec3F32: value.vec3f32[].setLen(len) - of Vec3F64: value.vec3f64[].setLen(len) - of Vec4F32: value.vec4f32[].setLen(len) - of Vec4F64: value.vec4f64[].setLen(len) - of Mat2F32: value.mat2f32[].setLen(len) - of Mat2F64: value.mat2f64[].setLen(len) - of Mat23F32: value.mat23f32[].setLen(len) - of Mat23F64: value.mat23f64[].setLen(len) - of Mat32F32: value.mat32f32[].setLen(len) - of Mat32F64: value.mat32f64[].setLen(len) - of Mat3F32: value.mat3f32[].setLen(len) - of Mat3F64: value.mat3f64[].setLen(len) - of Mat34F32: value.mat34f32[].setLen(len) - of Mat34F64: value.mat34f64[].setLen(len) - of Mat43F32: value.mat43f32[].setLen(len) - of Mat43F64: value.mat43f64[].setLen(len) - of Mat4F32: value.mat4f32[].setLen(len) - of Mat4F64: value.mat4f64[].setLen(len) - of TextureType: discard - - -proc setValues[T: GPUType|int|uint|float](value: var DataList, data: openArray[T]) = - value.SetLen(data.len) - when T is float32: value.float32[] = @data - elif T is float64: value.float64[] = @data - elif T is int8: value.int8[] = @data - elif T is int16: value.int16[] = @data - elif T is int32: value.int32[] = @data - elif T is int64: value.int64[] = @data - elif T is uint8: value.uint8[] = @data - elif T is uint16: value.uint16[] = @data - elif T is uint32: value.uint32[] = @data - elif T is uint64: value.uint64[] = @data - elif T is int and sizeof(int) == sizeof(int32): value.int32[] = @data - elif T is int and sizeof(int) == sizeof(int64): value.int64[] = @data - elif T is uint and sizeof(uint) == sizeof(uint32): value.uint32[] = @data - elif T is uint and sizeof(uint) == sizeof(uint64): value.uint64[] = @data - elif T is float and sizeof(float) == sizeof(float32): value.float32[] = @data - elif T is float and sizeof(float) == sizeof(float64): value.float64[] = @data - elif T is TVec2[int32]: value.vec2i32[] = @data - elif T is TVec2[int64]: value.vec2i64[] = @data - elif T is TVec3[int32]: value.vec3i32[] = @data - elif T is TVec3[int64]: value.vec3i64[] = @data - elif T is TVec4[int32]: value.vec4i32[] = @data - elif T is TVec4[int64]: value.vec4i64[] = @data - elif T is TVec2[uint32]: value.vec2u32[] = @data - elif T is TVec2[uint64]: value.vec2u64[] = @data - elif T is TVec3[uint32]: value.vec3u32[] = @data - elif T is TVec3[uint64]: value.vec3u64[] = @data - elif T is TVec4[uint32]: value.vec4u32[] = @data - elif T is TVec4[uint64]: value.vec4u64[] = @data - elif T is TVec2[float32]: value.vec2f32[] = @data - elif T is TVec2[float64]: value.vec2f64[] = @data - elif T is TVec3[float32]: value.vec3f32[] = @data - elif T is TVec3[float64]: value.vec3f64[] = @data - elif T is TVec4[float32]: value.vec4f32[] = @data - elif T is TVec4[float64]: value.vec4f64[] = @data - elif T is TMat2[float32]: value.mat2f32[] = @data - elif T is TMat2[float64]: value.mat2f64[] = @data - elif T is TMat23[float32]: value.mat23f32[] = @data - elif T is TMat23[float64]: value.mat23f64[] = @data - elif T is TMat32[float32]: value.mat32f32[] = @data - elif T is TMat32[float64]: value.mat32f64[] = @data - elif T is TMat3[float32]: value.mat3f32[] = @data - elif T is TMat3[float64]: value.mat3f64[] = @data - elif T is TMat34[float32]: value.mat34f32[] = @data - elif T is TMat34[float64]: value.mat34f64[] = @data - elif T is TMat43[float32]: value.mat43f32[] = @data - elif T is TMat43[float64]: value.mat43f64[] = @data - elif T is TMat4[float32]: value.mat4f32[] = @data - elif T is TMat4[float64]: value.mat4f64[] = @data - elif T is Texture: value.texture[] = @data - else: {.error: "Virtual datatype has no values".} - -proc setValue[T: GPUType|int|uint|float](value: var DataList, i: int, data: T) = - assert i < value.len - when T is float32: value.float32[i] = data - elif T is float64: value.float64[i] = data - elif T is int8: value.int8[i] = data - elif T is int16: value.int16[i] = data - elif T is int32: value.int32[i] = data - elif T is int64: value.int64[i] = data - elif T is uint8: value.uint8[i] = data - elif T is uint16: value.uint16[i] = data - elif T is uint32: value.uint32[i] = data - elif T is uint64: value.uint64[i] = data - elif T is int and sizeof(int) == sizeof(int32): value.int32[i] = data - elif T is int and sizeof(int) == sizeof(int64): value.int64[i] = data - elif T is uint and sizeof(uint) == sizeof(uint32): value.uint32[i] = data - elif T is uint and sizeof(uint) == sizeof(uint64): value.uint64[i] = data - elif T is float and sizeof(float) == sizeof(float32): value.float32[i] = data - elif T is float and sizeof(float) == sizeof(float64): value.float64[i] = data - elif T is TVec2[int32]: value.vec2i32[i] = data - elif T is TVec2[int64]: value.vec2i64[i] = data - elif T is TVec3[int32]: value.vec3i32[i] = data - elif T is TVec3[int64]: value.vec3i64[i] = data - elif T is TVec4[int32]: value.vec4i32[i] = data - elif T is TVec4[int64]: value.vec4i64[i] = data - elif T is TVec2[uint32]: value.vec2u32[i] = data - elif T is TVec2[uint64]: value.vec2u64[i] = data - elif T is TVec3[uint32]: value.vec3u32[i] = data - elif T is TVec3[uint64]: value.vec3u64[i] = data - elif T is TVec4[uint32]: value.vec4u32[i] = data - elif T is TVec4[uint64]: value.vec4u64[i] = data - elif T is TVec2[float32]: value.vec2f32[i] = data - elif T is TVec2[float64]: value.vec2f64[i] = data - elif T is TVec3[float32]: value.vec3f32[i] = data - elif T is TVec3[float64]: value.vec3f64[i] = data - elif T is TVec4[float32]: value.vec4f32[i] = data - elif T is TVec4[float64]: value.vec4f64[i] = data - elif T is TMat2[float32]: value.mat2f32[i] = data - elif T is TMat2[float64]: value.mat2f64[i] = data - elif T is TMat23[float32]: value.mat23f32[i] = data - elif T is TMat23[float64]: value.mat23f64[i] = data - elif T is TMat32[float32]: value.mat32f32[i] = data - elif T is TMat32[float64]: value.mat32f64[i] = data - elif T is TMat3[float32]: value.mat3f32[i] = data - elif T is TMat3[float64]: value.mat3f64[i] = data - elif T is TMat34[float32]: value.mat34f32[i] = data - elif T is TMat34[float64]: value.mat34f64[i] = data - elif T is TMat43[float32]: value.mat43f32[i] = data - elif T is TMat43[float64]: value.mat43f64[i] = data - elif T is TMat4[float32]: value.mat4f32[i] = data - elif T is TMat4[float64]: value.mat4f64[i] = data - elif T is Texture: value.texture[i] = data - else: {.error: "Virtual datatype has no values".} - -proc InitDataList*(theType: DataType, len = 0): DataList = - result = DataList(theType: theType) - case result.theType - of Float32: result.float32 = new seq[float32] - of Float64: result.float64 = new seq[float64] - of Int8: result.int8 = new seq[int8] - of Int16: result.int16 = new seq[int16] - of Int32: result.int32 = new seq[int32] - of Int64: result.int64 = new seq[int64] - of UInt8: result.uint8 = new seq[uint8] - of UInt16: result.uint16 = new seq[uint16] - of UInt32: result.uint32 = new seq[uint32] - of UInt64: result.uint64 = new seq[uint64] - of Vec2I32: result.vec2i32 = new seq[TVec2[int32]] - of Vec2I64: result.vec2i64 = new seq[TVec2[int64]] - of Vec3I32: result.vec3i32 = new seq[TVec3[int32]] - of Vec3I64: result.vec3i64 = new seq[TVec3[int64]] - of Vec4I32: result.vec4i32 = new seq[TVec4[int32]] - of Vec4I64: result.vec4i64 = new seq[TVec4[int64]] - of Vec2U32: result.vec2u32 = new seq[TVec2[uint32]] - of Vec2U64: result.vec2u64 = new seq[TVec2[uint64]] - of Vec3U32: result.vec3u32 = new seq[TVec3[uint32]] - of Vec3U64: result.vec3u64 = new seq[TVec3[uint64]] - of Vec4U32: result.vec4u32 = new seq[TVec4[uint32]] - of Vec4U64: result.vec4u64 = new seq[TVec4[uint64]] - of Vec2F32: result.vec2f32 = new seq[TVec2[float32]] - of Vec2F64: result.vec2f64 = new seq[TVec2[float64]] - of Vec3F32: result.vec3f32 = new seq[TVec3[float32]] - of Vec3F64: result.vec3f64 = new seq[TVec3[float64]] - of Vec4F32: result.vec4f32 = new seq[TVec4[float32]] - of Vec4F64: result.vec4f64 = new seq[TVec4[float64]] - of Mat2F32: result.mat2f32 = new seq[TMat2[float32]] - of Mat2F64: result.mat2f64 = new seq[TMat2[float64]] - of Mat23F32: result.mat23f32 = new seq[TMat23[float32]] - of Mat23F64: result.mat23f64 = new seq[TMat23[float64]] - of Mat32F32: result.mat32f32 = new seq[TMat32[float32]] - of Mat32F64: result.mat32f64 = new seq[TMat32[float64]] - of Mat3F32: result.mat3f32 = new seq[TMat3[float32]] - of Mat3F64: result.mat3f64 = new seq[TMat3[float64]] - of Mat34F32: result.mat34f32 = new seq[TMat34[float32]] - of Mat34F64: result.mat34f64 = new seq[TMat34[float64]] - of Mat43F32: result.mat43f32 = new seq[TMat43[float32]] - of Mat43F64: result.mat43f64 = new seq[TMat43[float64]] - of Mat4F32: result.mat4f32 = new seq[TMat4[float32]] - of Mat4F64: result.mat4f64 = new seq[TMat4[float64]] - of TextureType: result.texture = new seq[Texture] - result.SetLen(len) - -proc InitDataList*[T: GPUType](len = 1): DataList = - result = InitDataList(GetDataType[T]()) - result.SetLen(len) - -proc InitDataList*[T: GPUType](data: openArray[T]): DataList = - result = InitDataList(GetDataType[T]()) - result.setValues(@data) - -func getValues[T: GPUType|int|uint|float](value: DataList): ref seq[T] = - when T is float32: value.float32 - elif T is float64: value.float64 - elif T is int8: value.int8 - elif T is int16: value.int16 - elif T is int32: value.int32 - elif T is int64: value.int64 - elif T is uint8: value.uint8 - elif T is uint16: value.uint16 - elif T is uint32: value.uint32 - elif T is uint64: value.uint64 - elif T is int and sizeof(int) == sizeof(int32): value.int32 - elif T is int and sizeof(int) == sizeof(int64): value.int64 - elif T is uint and sizeof(uint) == sizeof(uint32): value.uint32 - elif T is uint and sizeof(uint) == sizeof(uint64): value.uint64 - elif T is float and sizeof(float) == sizeof(float32): value.float32 - elif T is float and sizeof(float) == sizeof(float64): value.float64 - elif T is TVec2[int32]: value.vec2i32 - elif T is TVec2[int64]: value.vec2i64 - elif T is TVec3[int32]: value.vec3i32 - elif T is TVec3[int64]: value.vec3i64 - elif T is TVec4[int32]: value.vec4i32 - elif T is TVec4[int64]: value.vec4i64 - elif T is TVec2[uint32]: value.vec2u32 - elif T is TVec2[uint64]: value.vec2u64 - elif T is TVec3[uint32]: value.vec3u32 - elif T is TVec3[uint64]: value.vec3u64 - elif T is TVec4[uint32]: value.vec4u32 - elif T is TVec4[uint64]: value.vec4u64 - elif T is TVec2[float32]: value.vec2f32 - elif T is TVec2[float64]: value.vec2f64 - elif T is TVec3[float32]: value.vec3f32 - elif T is TVec3[float64]: value.vec3f64 - elif T is TVec4[float32]: value.vec4f32 - elif T is TVec4[float64]: value.vec4f64 - elif T is TMat2[float32]: value.mat2f32 - elif T is TMat2[float64]: value.mat2f64 - elif T is TMat23[float32]: value.mat23f - elif T is TMat23[float64]: value.mat23f64 - elif T is TMat32[float32]: value.mat32f32 - elif T is TMat32[float64]: value.mat32f64 - elif T is TMat3[float32]: value.mat3f32 - elif T is TMat3[float64]: value.mat3f64 - elif T is TMat34[float32]: value.mat34f32 - elif T is TMat34[float64]: value.mat34f64 - elif T is TMat43[float32]: value.mat43f32 - elif T is TMat43[float64]: value.mat43f64 - elif T is TMat4[float32]: value.mat4f32 - elif T is TMat4[float64]: value.mat4f64 - elif T is Texture: value.texture - else: {.error: "Virtual datatype has no values".} - -func getValue[T: GPUType|int|uint|float](value: DataList, i: int): T = - when T is float32: value.float32[i] - elif T is float64: value.float64[i] - elif T is int8: value.int8[i] - elif T is int16: value.int16[i] - elif T is int32: value.int32[i] - elif T is int64: value.int64[i] - elif T is uint8: value.uint8[i] - elif T is uint16: value.uint16[i] - elif T is uint32: value.uint32[i] - elif T is uint64: value.uint64[i] - elif T is int and sizeof(int) == sizeof(int32): value.int32[i] - elif T is int and sizeof(int) == sizeof(int64): value.int64[i] - elif T is uint and sizeof(uint) == sizeof(uint32): value.uint32[i] - elif T is uint and sizeof(uint) == sizeof(uint64): value.uint64[i] - elif T is float and sizeof(float) == sizeof(float32): value.float32[i] - elif T is float and sizeof(float) == sizeof(float64): value.float64[i] - elif T is TVec2[int32]: value.vec2i32[i] - elif T is TVec2[int64]: value.vec2i64[i] - elif T is TVec3[int32]: value.vec3i32[i] - elif T is TVec3[int64]: value.vec3i64[i] - elif T is TVec4[int32]: value.vec4i32[i] - elif T is TVec4[int64]: value.vec4i64[i] - elif T is TVec2[uint32]: value.vec2u32[i] - elif T is TVec2[uint64]: value.vec2u64[i] - elif T is TVec3[uint32]: value.vec3u32[i] - elif T is TVec3[uint64]: value.vec3u64[i] - elif T is TVec4[uint32]: value.vec4u32[i] - elif T is TVec4[uint64]: value.vec4u64[i] - elif T is TVec2[float32]: value.vec2f32[i] - elif T is TVec2[float64]: value.vec2f64[i] - elif T is TVec3[float32]: value.vec3f32[i] - elif T is TVec3[float64]: value.vec3f64[i] - elif T is TVec4[float32]: value.vec4f32[i] - elif T is TVec4[float64]: value.vec4f64[i] - elif T is TMat2[float32]: value.mat2f32[i] - elif T is TMat2[float64]: value.mat2f64[i] - elif T is TMat23[float32]: value.mat23f[i] - elif T is TMat23[float64]: value.mat23f64[i] - elif T is TMat32[float32]: value.mat32f32[i] - elif T is TMat32[float64]: value.mat32f64[i] - elif T is TMat3[float32]: value.mat3f32[i] - elif T is TMat3[float64]: value.mat3f64[i] - elif T is TMat34[float32]: value.mat34f32[i] - elif T is TMat34[float64]: value.mat34f64[i] - elif T is TMat43[float32]: value.mat43f32[i] - elif T is TMat43[float64]: value.mat43f64[i] - elif T is TMat4[float32]: value.mat4f32[i] - elif T is TMat4[float64]: value.mat4f64[i] - elif T is Texture: value.texture[i] - else: {.error: "Virtual datatype has no values".} - -template `[]`*(list: DataList, t: typedesc): ref seq[t] = - getValues[t](list) -template `[]`*(list: DataList, i: int, t: typedesc): untyped = - getValue[t](list, i) - -# since we use this often with tables, add this for an easy assignment -template `[]`*(table: Table[string, DataList], key: string, t: typedesc): ref seq[t] = - getValues[t](table[key]) -template `[]=`*[T](table: var Table[string, DataList], key: string, values: openArray[T]) = - if table.contains(key): - table[key].setValues(values) - else: - table[key] = InitDataList(values) - -template `[]=`*[T](list: var DataList, values: openArray[T]) = - list.setValues(values) -template `[]=`*[T](list: var DataList, i: int, value: T) = - list.setValue(i, value) - -func GetPointer*(value: var DataList): pointer = - if value.len == 0: - result = nil - case value.theType - of Float32: result = value.float32[].ToCPointer - of Float64: result = value.float64[].ToCPointer - of Int8: result = value.int8[].ToCPointer - of Int16: result = value.int16[].ToCPointer - of Int32: result = value.int32[].ToCPointer - of Int64: result = value.int64[].ToCPointer - of UInt8: result = value.uint8[].ToCPointer - of UInt16: result = value.uint16[].ToCPointer - of UInt32: result = value.uint32[].ToCPointer - of UInt64: result = value.uint64[].ToCPointer - of Vec2I32: result = value.vec2i32[].ToCPointer - of Vec2I64: result = value.vec2i64[].ToCPointer - of Vec3I32: result = value.vec3i32[].ToCPointer - of Vec3I64: result = value.vec3i64[].ToCPointer - of Vec4I32: result = value.vec4i32[].ToCPointer - of Vec4I64: result = value.vec4i64[].ToCPointer - of Vec2U32: result = value.vec2u32[].ToCPointer - of Vec2U64: result = value.vec2u64[].ToCPointer - of Vec3U32: result = value.vec3u32[].ToCPointer - of Vec3U64: result = value.vec3u64[].ToCPointer - of Vec4U32: result = value.vec4u32[].ToCPointer - of Vec4U64: result = value.vec4u64[].ToCPointer - of Vec2F32: result = value.vec2f32[].ToCPointer - of Vec2F64: result = value.vec2f64[].ToCPointer - of Vec3F32: result = value.vec3f32[].ToCPointer - of Vec3F64: result = value.vec3f64[].ToCPointer - of Vec4F32: result = value.vec4f32[].ToCPointer - of Vec4F64: result = value.vec4f64[].ToCPointer - of Mat2F32: result = value.mat2f32[].ToCPointer - of Mat2F64: result = value.mat2f64[].ToCPointer - of Mat23F32: result = value.mat23f32[].ToCPointer - of Mat23F64: result = value.mat23f64[].ToCPointer - of Mat32F32: result = value.mat32f32[].ToCPointer - of Mat32F64: result = value.mat32f64[].ToCPointer - of Mat3F32: result = value.mat3f32[].ToCPointer - of Mat3F64: result = value.mat3f64[].ToCPointer - of Mat34F32: result = value.mat34f32[].ToCPointer - of Mat34F64: result = value.mat34f64[].ToCPointer - of Mat43F32: result = value.mat43f32[].ToCPointer - of Mat43F64: result = value.mat43f64[].ToCPointer - of Mat4F32: result = value.mat4f32[].ToCPointer - of Mat4F64: result = value.mat4f64[].ToCPointer - of TextureType: nil - -proc AppendValues*[T: GPUType|int|uint|float](value: var DataList, data: openArray[T]) = - value.len += data.len - when T is float32: value.float32[].add @data - elif T is float64: value.float64[].add @data - elif T is int8: value.int8[].add @data - elif T is int16: value.int16[].add @data - elif T is int32: value.int32[].add @data - elif T is int64: value.int64[].add @data - elif T is uint8: value.uint8[].add @data - elif T is uint16: value.uint16[].add @data - elif T is uint32: value.uint32[].add @data - elif T is uint64: value.uint64[].add @data - elif T is int and sizeof(int) == sizeof(int32): value.int32[].add @data - elif T is int and sizeof(int) == sizeof(int64): value.int64[].add @data - elif T is uint and sizeof(uint) == sizeof(uint32): value.uint32[].add @data - elif T is uint and sizeof(uint) == sizeof(uint64): value.uint64[].add @data - elif T is float and sizeof(float) == sizeof(float32): value.float32[].add @data - elif T is float and sizeof(float) == sizeof(float64): value.float64[].add @data - elif T is TVec2[int32]: value.vec2i32[].add @data - elif T is TVec2[int64]: value.vec2i64[].add @data - elif T is TVec3[int32]: value.vec3i32[].add @data - elif T is TVec3[int64]: value.vec3i64[].add @data - elif T is TVec4[int32]: value.vec4i32[].add @data - elif T is TVec4[int64]: value.vec4i64[].add @data - elif T is TVec2[uint32]: value.vec2u32[].add @data - elif T is TVec2[uint64]: value.vec2u64[].add @data - elif T is TVec3[uint32]: value.vec3u32[].add @data - elif T is TVec3[uint64]: value.vec3u64[].add @data - elif T is TVec4[uint32]: value.vec4u32[].add @data - elif T is TVec4[uint64]: value.vec4u64[].add @data - elif T is TVec2[float32]: value.vec2f32[].add @data - elif T is TVec2[float64]: value.vec2f64[].add @data - elif T is TVec3[float32]: value.vec3f32[].add @data - elif T is TVec3[float64]: value.vec3f64[].add @data - elif T is TVec4[float32]: value.vec4f32[].add @data - elif T is TVec4[float64]: value.vec4f64[].add @data - elif T is TMat2[float32]: value.mat2f32[].add @data - elif T is TMat2[float64]: value.mat2f64[].add @data - elif T is TMat23[float32]: value.mat23f32[].add @data - elif T is TMat23[float64]: value.mat23f64[].add @data - elif T is TMat32[float32]: value.mat32f32[].add @data - elif T is TMat32[float64]: value.mat32f64[].add @data - elif T is TMat3[float32]: value.mat3f32[].add @data - elif T is TMat3[float64]: value.mat3f64[].add @data - elif T is TMat34[float32]: value.mat34f32[].add @data - elif T is TMat34[float64]: value.mat34f64[].add @data - elif T is TMat43[float32]: value.mat43f32[].add @data - elif T is TMat43[float64]: value.mat43f64[].add @data - elif T is TMat4[float32]: value.mat4f32[].add @data - elif T is TMat4[float64]: value.mat4f64[].add @data - elif T is Texture: value.texture[].add @data - else: {.error: "Virtual datatype has no values".} - -proc AppendValues*(value: var DataList, data: DataList) = - assert value.theType == data.theType, &"Expected datalist of type {value.theType} but got {data.theType}" - value.len += data.len - case value.theType: - of Float32: value.float32[].add data.float32[] - of Float64: value.float64[].add data.float64[] - of Int8: value.int8[].add data.int8[] - of Int16: value.int16[].add data.int16[] - of Int32: value.int32[].add data.int32[] - of Int64: value.int64[].add data.int64[] - of UInt8: value.uint8[].add data.uint8[] - of UInt16: value.uint16[].add data.uint16[] - of UInt32: value.uint32[].add data.uint32[] - of UInt64: value.uint64[].add data.uint64[] - of Vec2I32: value.vec2i32[].add data.vec2i32[] - of Vec2I64: value.vec2i64[].add data.vec2i64[] - of Vec3I32: value.vec3i32[].add data.vec3i32[] - of Vec3I64: value.vec3i64[].add data.vec3i64[] - of Vec4I32: value.vec4i32[].add data.vec4i32[] - of Vec4I64: value.vec4i64[].add data.vec4i64[] - of Vec2U32: value.vec2u32[].add data.vec2u32[] - of Vec2U64: value.vec2u64[].add data.vec2u64[] - of Vec3U32: value.vec3u32[].add data.vec3u32[] - of Vec3U64: value.vec3u64[].add data.vec3u64[] - of Vec4U32: value.vec4u32[].add data.vec4u32[] - of Vec4U64: value.vec4u64[].add data.vec4u64[] - of Vec2F32: value.vec2f32[].add data.vec2f32[] - of Vec2F64: value.vec2f64[].add data.vec2f64[] - of Vec3F32: value.vec3f32[].add data.vec3f32[] - of Vec3F64: value.vec3f64[].add data.vec3f64[] - of Vec4F32: value.vec4f32[].add data.vec4f32[] - of Vec4F64: value.vec4f64[].add data.vec4f64[] - of Mat2F32: value.mat2f32[].add data.mat2f32[] - of Mat2F64: value.mat2f64[].add data.mat2f64[] - of Mat23F32: value.mat23f32[].add data.mat23f32[] - of Mat23F64: value.mat23f64[].add data.mat23f64[] - of Mat32F32: value.mat32f32[].add data.mat32f32[] - of Mat32F64: value.mat32f64[].add data.mat32f64[] - of Mat3F32: value.mat3f32[].add data.mat3f32[] - of Mat3F64: value.mat3f64[].add data.mat3f64[] - of Mat34F32: value.mat34f32[].add data.mat34f32[] - of Mat34F64: value.mat34f64[].add data.mat34f64[] - of Mat43F32: value.mat43f32[].add data.mat43f32[] - of Mat43F64: value.mat43f64[].add data.mat43f64[] - of Mat4F32: value.mat4f32[].add data.mat4f32[] - of Mat4F64: value.mat4f64[].add data.mat4f64[] - of TextureType: value.texture[].add data.texture[] - -proc AppendFrom*(a: var DataList, i: int, b: DataList, j: int) = - assert a.theType == b.theType - case a.theType - of Float32: a.float32[i] = b.float32[j] - of Float64: a.float64[i] = b.float64[j] - of Int8: a.int8[i] = b.int8[j] - of Int16: a.int16[i] = b.int16[j] - of Int32: a.int32[i] = b.int32[j] - of Int64: a.int64[i] = b.int64[j] - of UInt8: a.uint8[i] = b.uint8[j] - of UInt16: a.uint16[i] = b.uint16[j] - of UInt32: a.uint32[i] = b.uint32[j] - of UInt64: a.uint64[i] = b.uint64[j] - of Vec2I32: a.vec2i32[i] = b.vec2i32[j] - of Vec2I64: a.vec2i64[i] = b.vec2i64[j] - of Vec3I32: a.vec3i32[i] = b.vec3i32[j] - of Vec3I64: a.vec3i64[i] = b.vec3i64[j] - of Vec4I32: a.vec4i32[i] = b.vec4i32[j] - of Vec4I64: a.vec4i64[i] = b.vec4i64[j] - of Vec2U32: a.vec2u32[i] = b.vec2u32[j] - of Vec2U64: a.vec2u64[i] = b.vec2u64[j] - of Vec3U32: a.vec3u32[i] = b.vec3u32[j] - of Vec3U64: a.vec3u64[i] = b.vec3u64[j] - of Vec4U32: a.vec4u32[i] = b.vec4u32[j] - of Vec4U64: a.vec4u64[i] = b.vec4u64[j] - of Vec2F32: a.vec2f32[i] = b.vec2f32[j] - of Vec2F64: a.vec2f64[i] = b.vec2f64[j] - of Vec3F32: a.vec3f32[i] = b.vec3f32[j] - of Vec3F64: a.vec3f64[i] = b.vec3f64[j] - of Vec4F32: a.vec4f32[i] = b.vec4f32[j] - of Vec4F64: a.vec4f64[i] = b.vec4f64[j] - of Mat2F32: a.mat2f32[i] = b.mat2f32[j] - of Mat2F64: a.mat2f64[i] = b.mat2f64[j] - of Mat23F32: a.mat23f32[i] = b.mat23f32[j] - of Mat23F64: a.mat23f64[i] = b.mat23f64[j] - of Mat32F32: a.mat32f32[i] = b.mat32f32[j] - of Mat32F64: a.mat32f64[i] = b.mat32f64[j] - of Mat3F32: a.mat3f32[i] = b.mat3f32[j] - of Mat3F64: a.mat3f64[i] = b.mat3f64[j] - of Mat34F32: a.mat34f32[i] = b.mat34f32[j] - of Mat34F64: a.mat34f64[i] = b.mat34f64[j] - of Mat43F32: a.mat43f32[i] = b.mat43f32[j] - of Mat43F64: a.mat43f64[i] = b.mat43f64[j] - of Mat4F32: a.mat4f32[i] = b.mat4f32[j] - of Mat4F64: a.mat4f64[i] = b.mat4f64[j] - of TextureType: a.texture[i] = b.texture[j] - -proc Copy*(datalist: DataList): DataList = - result = InitDataList(datalist.theType) - result.AppendValues(datalist) - -func `$`*(list: DataList): string = - case list.theType - of Float32: $list.float32[] - of Float64: $list.float64[] - of Int8: $list.int8[] - of Int16: $list.int16[] - of Int32: $list.int32[] - of Int64: $list.int64[] - of UInt8: $list.uint8[] - of UInt16: $list.uint16[] - of UInt32: $list.uint32[] - of UInt64: $list.uint64[] - of Vec2I32: $list.vec2i32[] - of Vec2I64: $list.vec2i64[] - of Vec3I32: $list.vec3i32[] - of Vec3I64: $list.vec3i64[] - of Vec4I32: $list.vec4i32[] - of Vec4I64: $list.vec4i64[] - of Vec2U32: $list.vec2u32[] - of Vec2U64: $list.vec2u64[] - of Vec3U32: $list.vec3u32[] - of Vec3U64: $list.vec3u64[] - of Vec4U32: $list.vec4u32[] - of Vec4U64: $list.vec4u64[] - of Vec2F32: $list.vec2f32[] - of Vec2F64: $list.vec2f64[] - of Vec3F32: $list.vec3f32[] - of Vec3F64: $list.vec3f64[] - of Vec4F32: $list.vec4f32[] - of Vec4F64: $list.vec4f64[] - of Mat2F32: $list.mat2f32[] - of Mat2F64: $list.mat2f64[] - of Mat23F32: $list.mat23f32[] - of Mat23F64: $list.mat23f64[] - of Mat32F32: $list.mat32f32[] - of Mat32F64: $list.mat32f64[] - of Mat3F32: $list.mat3f32[] - of Mat3F64: $list.mat3f64[] - of Mat34F32: $list.mat34f32[] - of Mat34F64: $list.mat34f64[] - of Mat43F32: $list.mat43f32[] - of Mat43F64: $list.mat43f64[] - of Mat4F32: $list.mat4f32[] - of Mat4F64: $list.mat4f64[] - of TextureType: $list.texture[] diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/fonttypes.nim --- a/semiconginev2/old/core/fonttypes.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -type - GlyphInfo* = object - uvs*: array[4, Vec2f] - dimension*: Vec2f - topOffset*: float32 - leftOffset*: float32 - advance*: float32 - Font* = object - name*: string # used to reference fontAtlas will be referenced in shader - glyphs*: Table[Rune, GlyphInfo] - fontAtlas*: Texture - maxHeight*: int - kerning*: Table[(Rune, Rune), float32] - fontscale*: float32 - lineHeight*: float32 - lineAdvance*: float32 - capHeight*: float32 - xHeight*: float32 diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/gpu_types.nim --- a/semiconginev2/old/core/gpu_types.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,418 +0,0 @@ -import std/strformat -import std/tables - -import ./vulkanapi -import ./vector -import ./matrix -import ./imagetypes - -type - GPUType* = float32 | float64 | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | TVec2[int32] | TVec2[int64] | TVec3[int32] | TVec3[int64] | TVec4[int32] | TVec4[int64] | TVec2[uint32] | TVec2[uint64] | TVec3[uint32] | TVec3[uint64] | TVec4[uint32] | TVec4[uint64] | TVec2[float32] | TVec2[float64] | TVec3[float32] | TVec3[float64] | TVec4[float32] | TVec4[float64] | TMat2[float32] | TMat2[float64] | TMat23[float32] | TMat23[float64] | TMat32[float32] | TMat32[float64] | TMat3[float32] | TMat3[float64] | TMat34[float32] | TMat34[float64] | TMat43[float32] | TMat43[float64] | TMat4[float32] | TMat4[float64] | Texture - DataType* = enum - Float32 - Float64 - Int8 - Int16 - Int32 - Int64 - UInt8 - UInt16 - UInt32 - UInt64 - Vec2I32 - Vec2I64 - Vec3I32 - Vec3I64 - Vec4I32 - Vec4I64 - Vec2U32 - Vec2U64 - Vec3U32 - Vec3U64 - Vec4U32 - Vec4U64 - Vec2F32 - Vec2F64 - Vec3F32 - Vec3F64 - Vec4F32 - Vec4F64 - Mat2F32 - Mat2F64 - Mat23F32 - Mat23F64 - Mat32F32 - Mat32F64 - Mat3F32 - Mat3F64 - Mat34F32 - Mat34F64 - Mat43F32 - Mat43F64 - Mat4F32 - Mat4F64 - TextureType - MemoryPerformanceHint* = enum - PreferFastRead, PreferFastWrite - ShaderAttribute* = object - name*: string - theType*: DataType - arrayCount*: uint32 - perInstance*: bool - noInterpolation: bool - memoryPerformanceHint*: MemoryPerformanceHint - -proc `$`*(attr: ShaderAttribute): string = - result = attr.name - if attr.perInstance: - result &= "*" - result &= &"[{attr.theType}" - if attr.arrayCount > 0: - result &= &", {attr.arrayCount}" - result &= "]" - -func VertexInputs*(attributes: seq[ShaderAttribute]): seq[ShaderAttribute] = - for attr in attributes: - if attr.perInstance == false: - result.add attr - -func InstanceInputs*(attributes: seq[ShaderAttribute]): seq[ShaderAttribute] = - for attr in attributes: - if attr.perInstance == false: - result.add attr - -func NumberOfVertexInputAttributeDescriptors*(theType: DataType): uint = - case theType: - of Mat2F32, Mat2F64, Mat23F32, Mat23F64: 2 - of Mat32F32, Mat32F64, Mat3F32, Mat3F64, Mat34F32, Mat34F64: 3 - of Mat43F32, Mat43F64, Mat4F32, Mat4F64: 4 - else: 1 - -func Size*(theType: DataType): uint64 = - case theType: - of Float32: 4 - of Float64: 8 - of Int8: 1 - of Int16: 2 - of Int32: 4 - of Int64: 8 - of UInt8: 1 - of UInt16: 2 - of UInt32: 4 - of UInt64: 8 - of Vec2I32: 8 - of Vec2I64: 16 - of Vec3I32: 12 - of Vec3I64: 24 - of Vec4I32: 16 - of Vec4I64: 32 - of Vec2U32: 8 - of Vec2U64: 16 - of Vec3U32: 12 - of Vec3U64: 24 - of Vec4U32: 16 - of Vec4U64: 32 - of Vec2F32: 8 - of Vec2F64: 16 - of Vec3F32: 12 - of Vec3F64: 24 - of Vec4F32: 16 - of Vec4F64: 32 - of Mat2F32: 16 - of Mat2F64: 32 - of Mat23F32: 24 - of Mat23F64: 48 - of Mat32F32: 24 - of Mat32F64: 48 - of Mat3F32: 36 - of Mat3F64: 72 - of Mat34F32: 48 - of Mat34F64: 92 - of Mat43F32: 48 - of Mat43F64: 92 - of Mat4F32: 64 - of Mat4F64: 128 - of TextureType: 0 - -func Size*(attribute: ShaderAttribute, perDescriptor = false): uint64 = - if perDescriptor: - attribute.theType.Size div attribute.theType.NumberOfVertexInputAttributeDescriptors - else: - if attribute.arrayCount == 0: - attribute.theType.Size - else: - attribute.theType.Size * attribute.arrayCount - -func Size*(theType: seq[ShaderAttribute]): uint64 = - for attribute in theType: - result += attribute.Size - -func GetDataType*[T: GPUType|int|uint|float](): DataType = - when T is float32: Float32 - elif T is float64: Float64 - elif T is int8: Int8 - elif T is int16: Int16 - elif T is int32: Int32 - elif T is int64: Int64 - elif T is uint8: UInt8 - elif T is uint16: UInt16 - elif T is uint32: UInt32 - elif T is uint64: UInt64 - elif T is int and sizeof(int) == sizeof(int64): Int64 - elif T is int and sizeof(int) == sizeof(int32): Int32 - elif T is uint and sizeof(uint) == sizeof(uint64): UInt64 - elif T is uint and sizeof(uint) == sizeof(uint32): UInt32 - elif T is float and sizeof(float) == sizeof(float32): Float32 - elif T is float and sizeof(float) == sizeof(float64): Float64 - elif T is TVec2[int32]: Vec2I32 - elif T is TVec2[int64]: Vec2I64 - elif T is TVec3[int32]: Vec3I32 - elif T is TVec3[int64]: Vec3I64 - elif T is TVec4[int32]: Vec4I32 - elif T is TVec4[int64]: Vec4I64 - elif T is TVec2[uint32]: Vec2U32 - elif T is TVec2[uint64]: Vec2U64 - elif T is TVec3[uint32]: Vec3U32 - elif T is TVec3[uint64]: Vec3U64 - elif T is TVec4[uint32]: Vec4U32 - elif T is TVec4[uint64]: Vec4U64 - elif T is TVec2[float32]: Vec2F32 - elif T is TVec2[float64]: Vec2F64 - elif T is TVec3[float32]: Vec3F32 - elif T is TVec3[float64]: Vec3F64 - elif T is TVec4[float32]: Vec4F32 - elif T is TVec4[float64]: Vec4F64 - elif T is TMat2[float32]: Mat2F32 - elif T is TMat2[float64]: Mat2F64 - elif T is TMat23[float32]: Mat23F32 - elif T is TMat23[float64]: Mat23F64 - elif T is TMat32[float32]: Mat32F32 - elif T is TMat32[float64]: Mat32F64 - elif T is TMat3[float32]: Mat3F32 - elif T is TMat3[float64]: Mat3F64 - elif T is TMat34[float32]: Mat34F32 - elif T is TMat34[float64]: Mat34F64 - elif T is TMat43[float32]: Mat43F32 - elif T is TMat43[float64]: Mat43F64 - elif T is TMat4[float32]: Mat4F32 - elif T is TMat4[float64]: Mat4F64 - elif T is Texture: TextureType - else: - static: - raise newException(Exception, &"Unsupported data type for GPU data: {name(T)}") - -func Attr*[T: GPUType]( - name: string, - perInstance = false, - arrayCount = 0'u32, - noInterpolation = false, - memoryPerformanceHint = PreferFastRead, -): auto = - ShaderAttribute( - name: name, - theType: GetDataType[T](), - perInstance: perInstance, - arrayCount: arrayCount, - noInterpolation: noInterpolation, - memoryPerformanceHint: memoryPerformanceHint, - ) - -const TYPEMAP = { - Float32: VK_FORMAT_R32_SFLOAT, - Float64: VK_FORMAT_R64_SFLOAT, - Int8: VK_FORMAT_R8_SINT, - Int16: VK_FORMAT_R16_SINT, - Int32: VK_FORMAT_R32_SINT, - Int64: VK_FORMAT_R64_SINT, - UInt8: VK_FORMAT_R8_UINT, - UInt16: VK_FORMAT_R16_UINT, - UInt32: VK_FORMAT_R32_UINT, - UInt64: VK_FORMAT_R64_UINT, - Vec2I32: VK_FORMAT_R32G32_SINT, - Vec2I64: VK_FORMAT_R64G64_SINT, - Vec3I32: VK_FORMAT_R32G32B32_SINT, - Vec3I64: VK_FORMAT_R64G64B64_SINT, - Vec4I32: VK_FORMAT_R32G32B32A32_SINT, - Vec4I64: VK_FORMAT_R64G64B64A64_SINT, - Vec2U32: VK_FORMAT_R32G32_UINT, - Vec2U64: VK_FORMAT_R64G64_UINT, - Vec3U32: VK_FORMAT_R32G32B32_UINT, - Vec3U64: VK_FORMAT_R64G64B64_UINT, - Vec4U32: VK_FORMAT_R32G32B32A32_UINT, - Vec4U64: VK_FORMAT_R64G64B64A64_UINT, - Vec2F32: VK_FORMAT_R32G32_SFLOAT, - Vec2F64: VK_FORMAT_R64G64_SFLOAT, - Vec3F32: VK_FORMAT_R32G32B32_SFLOAT, - Vec3F64: VK_FORMAT_R64G64B64_SFLOAT, - Vec4F32: VK_FORMAT_R32G32B32A32_SFLOAT, - Vec4F64: VK_FORMAT_R64G64B64A64_SFLOAT, - Mat2F32: VK_FORMAT_R32G32_SFLOAT, - Mat2F64: VK_FORMAT_R64G64_SFLOAT, - Mat23F32: VK_FORMAT_R32G32B32_SFLOAT, - Mat23F64: VK_FORMAT_R64G64B64_SFLOAT, - Mat32F32: VK_FORMAT_R32G32_SFLOAT, - Mat32F64: VK_FORMAT_R64G64_SFLOAT, - Mat3F32: VK_FORMAT_R32G32B32_SFLOAT, - Mat3F64: VK_FORMAT_R64G64B64_SFLOAT, - Mat34F32: VK_FORMAT_R32G32B32A32_SFLOAT, - Mat34F64: VK_FORMAT_R64G64B64A64_SFLOAT, - Mat43F32: VK_FORMAT_R32G32B32_SFLOAT, - Mat43F64: VK_FORMAT_R64G64B64_SFLOAT, - Mat4F32: VK_FORMAT_R32G32B32A32_SFLOAT, - Mat4F64: VK_FORMAT_R64G64B64A64_SFLOAT, -}.toTable - -func GetVkFormat*(theType: DataType): VkFormat = - TYPEMAP[theType] - -# from https://registry.khronos.org/vulkan/specs/1.3-extensions/html/chap15.html -func NLocationSlots*(theType: DataType): int = - #[ - single location: - 16-bit scalar and vector types, and - 32-bit scalar and vector types, and - 64-bit scalar and 2-component vector types. - two locations - 64-bit three- and four-component vectors - ]# - case theType: - of Float32: 1 - of Float64: 1 - of Int8: 1 - of Int16: 1 - of Int32: 1 - of Int64: 1 - of UInt8: 1 - of UInt16: 1 - of UInt32: 1 - of UInt64: 1 - of Vec2I32: 1 - of Vec2I64: 1 - of Vec3I32: 1 - of Vec3I64: 2 - of Vec4I32: 1 - of Vec4I64: 2 - of Vec2U32: 1 - of Vec2U64: 1 - of Vec3U32: 1 - of Vec3U64: 2 - of Vec4U32: 1 - of Vec4U64: 2 - of Vec2F32: 1 - of Vec2F64: 1 - of Vec3F32: 1 - of Vec3F64: 2 - of Vec4F32: 1 - of Vec4F64: 2 - of Mat2F32: 1 - of Mat2F64: 1 - of Mat23F32: 1 - of Mat23F64: 2 - of Mat32F32: 1 - of Mat32F64: 1 - of Mat3F32: 1 - of Mat3F64: 2 - of Mat34F32: 1 - of Mat34F64: 2 - of Mat43F32: 1 - of Mat43F64: 2 - of Mat4F32: 1 - of Mat4F64: 2 - of TextureType: 1 - -func GlslType*(theType: DataType): string = - # todo: likely not correct as we would need to enable some - # extensions somewhere (Vulkan/GLSL compiler?) to have - # everything work as intended. Or maybe the GPU driver does - # some automagic conversion stuf.. - case theType: - of Float32: "float" - of Float64: "double" - of Int8, Int16, Int32, Int64: "int" - of UInt8, UInt16, UInt32, UInt64: "uint" - of Vec2I32: "ivec2" - of Vec2I64: "ivec2" - of Vec3I32: "ivec3" - of Vec3I64: "ivec3" - of Vec4I32: "ivec4" - of Vec4I64: "ivec4" - of Vec2U32: "uvec2" - of Vec2U64: "uvec2" - of Vec3U32: "uvec3" - of Vec3U64: "uvec3" - of Vec4U32: "uvec4" - of Vec4U64: "uvec4" - of Vec2F32: "vec2" - of Vec2F64: "dvec2" - of Vec3F32: "vec3" - of Vec3F64: "dvec3" - of Vec4F32: "vec4" - of Vec4F64: "dvec4" - of Mat2F32: "mat2" - of Mat2F64: "dmat2" - of Mat23F32: "mat23" - of Mat23F64: "dmat23" - of Mat32F32: "mat32" - of Mat32F64: "dmat32" - of Mat3F32: "mat3" - of Mat3F64: "dmat3" - of Mat34F32: "mat34" - of Mat34F64: "dmat34" - of Mat43F32: "mat43" - of Mat43F64: "dmat43" - of Mat4F32: "mat4" - of Mat4F64: "dmat4" - of TextureType: "sampler2D" - -func GlslInput*(group: openArray[ShaderAttribute]): seq[string] = - if group.len == 0: - return @[] - var i = 0 - for attribute in group: - assert attribute.arrayCount == 0, "arrays not supported for shader vertex attributes" - let flat = if attribute.noInterpolation: "flat " else: "" - result.add &"layout(location = {i}) {flat}in {attribute.theType.GlslType} {attribute.name};" - for j in 0 ..< attribute.theType.NumberOfVertexInputAttributeDescriptors: - i += attribute.theType.NLocationSlots - -func GlslUniforms*(group: openArray[ShaderAttribute], blockName = "Uniforms", binding: int): seq[string] = - if group.len == 0: - return @[] - for uniform in group: - if uniform.arrayCount > 0: - assert uniform.theType.Size mod 16 == 0, &"Uniform '{uniform.name}': Array elements in a uniform block must align to 16 but current size is {uniform.theType.Size} (until we can two different shaders)" - # TODO: read the lines below, having at least std430 would be nice... - # currently only a single uniform block supported, therefore binding = 0 - # Also, we might need to figure out how we can ship std430 on newer hardware and normal on older? - # result.add(&"layout(std430, binding = {binding}) uniform T{blockName} {{") - result.add(&"layout(binding = {binding}) uniform T{blockName} {{") - var last_size = high(uint64) - for attribute in group: - assert attribute.Size <= last_size, &"The attribute '{attribute.name}' is bigger than the attribute before, which is not allowed" # using smaller uniform-types first will lead to problems (I think due to alignment, there is also some stuff on the internet about this ;) - var arrayDecl = "" - if attribute.arrayCount > 0: - arrayDecl = &"[{attribute.arrayCount}]" - result.add(&" {attribute.theType.GlslType} {attribute.name}{arrayDecl};") - last_size = attribute.Size - result.add(&"}} {blockName};") - -func GlslSamplers*(group: openArray[ShaderAttribute], basebinding: int): seq[string] = - if group.len == 0: - return @[] - var thebinding = basebinding - for attribute in group: - var arrayDecl = "" - if attribute.arrayCount > 0: - arrayDecl = &"[{attribute.arrayCount}]" - result.add(&"layout(binding = {thebinding}) uniform {attribute.theType.GlslType} {attribute.name}{arrayDecl};") - inc thebinding - -func GlslOutput*(group: openArray[ShaderAttribute]): seq[string] = - if group.len == 0: - return @[] - var i = 0 - for attribute in group: - assert attribute.arrayCount == 0, "arrays not supported for outputs" - let flat = if attribute.noInterpolation: "flat " else: "" - result.add &"layout(location = {i}) {flat}out {attribute.theType.GlslType} {attribute.name};" - i += 1 diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/imagetypes.nim --- a/semiconginev2/old/core/imagetypes.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -import std/strformat - -import ./vulkanapi -import ./vector -import ./color - -type - RGBAPixel* = array[4, uint8] - GrayPixel* = uint8 - Pixel* = RGBAPixel or GrayPixel - Image*[T: Pixel] = object - width*: uint32 - height*: uint32 - imagedata*: seq[T] - # Image*[T: Pixel] = ref ImageObject[T] - - Sampler* = object - magnification*: VkFilter = VK_FILTER_LINEAR - minification*: VkFilter = VK_FILTER_LINEAR - wrapModeS*: VkSamplerAddressMode = VK_SAMPLER_ADDRESS_MODE_REPEAT - wrapModeT*: VkSamplerAddressMode = VK_SAMPLER_ADDRESS_MODE_REPEAT - Texture* = object - name*: string - case isGrayscale*: bool = false - of false: colorImage*: Image[RGBAPixel] - of true: grayImage*: Image[GrayPixel] - sampler*: Sampler - -proc `==`*(a, b: Texture): bool = - if a.isGrayscale != b.isGrayscale or a.name != b.name or a.sampler != b.sampler: - return false - elif a.isGrayscale: - return a.grayImage == b.grayImage - else: - return a.colorImage == b.colorImage - -converter ToRGBA*(p: RGBAPixel): Vec4f = - NewVec4f(float32(p[0]) / 255'f32, float32(p[1]) / 255'f32, float32(p[2]) / 255'f32, float32(p[3]) / 255'f32) -converter ToGrayscale*(p: GrayPixel): float32 = - float32(p) / 255'f32 - -# colorspace conversion functions - -func Linear2srgb*(value: RGBAPixel): RGBAPixel = - [Linear2srgb(value[0]), Linear2srgb(value[1]), Linear2srgb(value[2]), value[3]] -func Srgb2linear*(value: RGBAPixel): RGBAPixel = - [Srgb2linear(value[0]), Srgb2linear(value[1]), Srgb2linear(value[2]), value[3]] - -proc AsSRGB*[T](image: Image[T]): Image[T] = - result = Image[T](width: image.width, height: image.height, imagedata: newSeq[T](image.imagedata.len)) - for i in 0 .. image.imagedata.len: - result.imagedata[i] = Linear2srgb(image.imagedata[i]) - -proc AsLinear*[T](image: Image[T]): Image[T] = - result = Image[T](width: image.width, height: image.height, imagedata: newSeq[T](image.imagedata.len)) - for i in 0 ..< image.imagedata.len: - result.imagedata[i] = Srgb2linear(image.imagedata[i]) - -proc `$`*(image: Image): string = - &"{image.width}x{image.height}" - -proc `$`*(texture: Texture): string = - if texture.isGrayscale: - &"{texture.name} {texture.grayImage} (gray)" - else: - &"{texture.name} {texture.colorImage} (color)" - -proc `[]`*(image: Image, x, y: uint32): Pixel = - assert x < image.width, &"{x} < {image.width} is not true" - assert y < image.height, &"{y} < {image.height} is not true" - - image[].imagedata[y * image.width + x] - -proc `[]=`*(image: var Image, x, y: uint32, value: Pixel) = - assert x < image.width - assert y < image.height - - image[].imagedata[y * image.width + x] = value - -proc NewImage*[T: Pixel](width, height: uint32, imagedata: openArray[T] = []): Image[T] = - assert width > 0 and height > 0 - assert imagedata.len.uint32 == width * height or imagedata.len == 0 - - result.imagedata = (if imagedata.len == 0: newSeq[T](width * height) else: @imagedata) - assert width * height == result.imagedata.len.uint32 - - result.width = width - result.height = height - -const - LINEAR_SAMPLER* = Sampler( - magnification: VK_FILTER_LINEAR, - minification: VK_FILTER_LINEAR, - wrapModeS: VK_SAMPLER_ADDRESS_MODE_REPEAT, - wrapModeT: VK_SAMPLER_ADDRESS_MODE_REPEAT, - ) - NEAREST_SAMPLER* = Sampler( - magnification: VK_FILTER_NEAREST, - minification: VK_FILTER_NEAREST, - wrapModeS: VK_SAMPLER_ADDRESS_MODE_REPEAT, - wrapModeT: VK_SAMPLER_ADDRESS_MODE_REPEAT, - ) -let - INVALID_TEXTURE* = Texture(name: "Invalid texture", isGrayscale: false, colorImage: NewImage(1, 1, @[[255'u8, 0'u8, 255'u8, 255'u8]]), sampler: NEAREST_SAMPLER) - EMPTY_TEXTURE* = Texture(name: "Empty texture", isGrayscale: false, colorImage: NewImage(1, 1, @[[255'u8, 255'u8, 255'u8, 255'u8]]), sampler: NEAREST_SAMPLER) diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/matrix.nim --- a/semiconginev2/old/core/matrix.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,476 +0,0 @@ -import std/math -import std/macros -import std/random -import std/strutils -import std/strformat -import std/typetraits - -import ./vector - -export math - -type - # layout is row-first - # having an object instead of directly aliasing the array seems a bit ugly at - # first, but is necessary to be able to work correctly with distinguished - # types (i.e. TMat23 and TMat32 would be an alias for the same type array[6, T] - # which prevents the type system from identifying the correct type at times) - # - # Though, great news is that objects have zero overhead! - TMat2*[T: SomeNumber] = object - data*: array[4, T] - TMat23*[T: SomeNumber] = object - data*: array[6, T] - TMat32*[T: SomeNumber] = object - data*: array[6, T] - TMat3*[T: SomeNumber] = object - data*: array[9, T] - TMat34*[T: SomeNumber] = object - data*: array[12, T] - TMat43*[T: SomeNumber] = object - data*: array[12, T] - TMat4*[T: SomeNumber] = object - data*: array[16, T] - TMat* = TMat2|TMat3|TMat4|TMat23|TMat32|TMat34|TMat43 - Mat2* = TMat2[float32] - Mat23* = TMat23[float32] - Mat32* = TMat32[float32] - Mat3* = TMat3[float32] - Mat34* = TMat34[float32] - Mat43* = TMat43[float32] - Mat4* = TMat4[float32] - -func MakeUnit2*[T: SomeNumber](): auto {.compiletime.} = TMat2[T](data: [ - T(1), T(0), - T(0), T(1), -]) -func MakeUnit3*[T: SomeNumber](): auto {.compiletime.} = TMat3[T](data: [ - T(1), T(0), T(0), - T(0), T(1), T(0), - T(0), T(0), T(1), -]) -func MakeUnit4*[T: SomeNumber](): auto {.compiletime.} = TMat4[T](data: [ - T(1), T(0), T(0), T(0), - T(0), T(1), T(0), T(0), - T(0), T(0), T(1), T(0), - T(0), T(0), T(0), T(1), -]) - -# generates constants: Unit -# Also for Y, Z, R, G, B -# not sure if this is necessary or even a good idea... -macro generateAllConsts() = - result = newStmtList() - for theType in ["int", "int8", "int16", "int32", "int64", "float", "float32", "float64"]: - var typename = theType[0 .. 0] - if theType[^2].isDigit: - typename = typename & theType[^2] - if theType[^1].isDigit: - typename = typename & theType[^1] - result.add(newConstStmt( - postfix(ident("Unit2" & typename), "*"), - newCall(nnkBracketExpr.newTree(ident("MakeUnit2"), ident(theType))) - )) - result.add(newConstStmt( - postfix(ident("Unit3" & typename), "*"), - newCall(nnkBracketExpr.newTree(ident("MakeUnit3"), ident(theType))) - )) - result.add(newConstStmt( - postfix(ident("Unit4" & typename), "*"), - newCall(nnkBracketExpr.newTree(ident("MakeUnit4"), ident(theType))) - )) - -generateAllConsts() - -const Unit2* = MakeUnit2[float32]() -const Unit3* = MakeUnit3[float32]() -const Unit4* = MakeUnit4[float32]() - -template RowCount*(m: typedesc): int = - when m is TMat2: 2 - elif m is TMat23: 2 - elif m is TMat32: 3 - elif m is TMat3: 3 - elif m is TMat34: 3 - elif m is TMat43: 4 - elif m is TMat4: 4 -template ColumnCount*(m: typedesc): int = - when m is TMat2: 2 - elif m is TMat23: 3 - elif m is TMat32: 2 - elif m is TMat3: 3 - elif m is TMat34: 4 - elif m is TMat43: 3 - elif m is TMat4: 4 -template matlen(m: typedesc): int = - when m is TMat2: 4 - elif m is TMat23: 6 - elif m is TMat32: 6 - elif m is TMat3: 9 - elif m is TMat34: 12 - elif m is TMat43: 12 - elif m is TMat4: 16 - - -func toString[T](value: T): string = - var - strvalues: seq[string] - maxwidth = 0 - - for n in value.data: - let strval = &"{float(n):.4f}" - strvalues.add(strval) - if strval.len > maxwidth: - maxwidth = strval.len - - for i in 0 ..< strvalues.len: - let filler = " ".repeat(maxwidth - strvalues[i].len) - if i mod T.ColumnCount == T.ColumnCount - 1: - result &= filler & strvalues[i] & "\n" - else: - if i mod T.ColumnCount == 0: - result &= " " - result &= filler & strvalues[i] & " " - -func `$`*(v: TMat2[SomeNumber]): string = toString[TMat2[SomeNumber]](v) -func `$`*(v: TMat23[SomeNumber]): string = toString[TMat23[SomeNumber]](v) -func `$`*(v: TMat32[SomeNumber]): string = toString[TMat32[SomeNumber]](v) -func `$`*(v: TMat3[SomeNumber]): string = toString[TMat3[SomeNumber]](v) -func `$`*(v: TMat34[SomeNumber]): string = toString[TMat34[SomeNumber]](v) -func `$`*(v: TMat43[SomeNumber]): string = toString[TMat43[SomeNumber]](v) -func `$`*(v: TMat4[SomeNumber]): string = toString[TMat4[SomeNumber]](v) - -func `[]`*[T: TMat](m: T, row, col: int): auto = m.data[col + row * T.ColumnCount] -func `[]=`*[T: TMat, U](m: var T, row, col: int, value: U) = m.data[col + row * T.ColumnCount] = value -func `[]`*[T: TMat](m: T, i: int): auto = m.data[i] -func `[]=`*[T: TMat, U](m: var T, i: int, value: U) = m.data[i] = value - -func Row*[T: TMat2](m: T, i: 0..1): auto = TVec2([m[i, 0], m[i, 1]]) -func Row*[T: TMat32](m: T, i: 0..2): auto = TVec2([m[i, 0], m[i, 1]]) -func Row*[T: TMat23](m: T, i: 0..1): auto = TVec3([m[i, 0], m[i, 1], m[i, 2]]) -func Row*[T: TMat3](m: T, i: 0..2): auto = TVec3([m[i, 0], m[i, 1], m[i, 2]]) -func Row*[T: TMat43](m: T, i: 0..3): auto = TVec3([m[i, 0], m[i, 1], m[i, 2]]) -func Row*[T: TMat34](m: T, i: 0..2): auto = TVec4([m[i, 0], m[i, 1], m[i, 2], m[i, 3]]) -func Row*[T: TMat4](m: T, i: 0..3): auto = TVec4([m[i, 0], m[i, 1], m[i, 2], m[i, 3]]) - -func Col*[T: TMat2](m: T, i: 0..1): auto = TVec2([m[0, i], m[1, i]]) -func Col*[T: TMat23](m: T, i: 0..2): auto = TVec2([m[0, i], m[1, i]]) -func Col*[T: TMat32](m: T, i: 0..1): auto = TVec3([m[0, i], m[1, i], m[2, i]]) -func Col*[T: TMat3](m: T, i: 0..2): auto = TVec3([m[0, i], m[1, i], m[2, i]]) -func Col*[T: TMat34](m: T, i: 0..3): auto = TVec3([m[0, i], m[1, i], m[2, i]]) -func Col*[T: TMat43](m: T, i: 0..2): auto = TVec4([m[0, i], m[1, i], m[2, i], m[3, i]]) -func Col*[T: TMat4](m: T, i: 0..3): auto = TVec4([m[0, i], m[1, i], m[2, i], m[3, i]]) - -proc createMatMatMultiplicationOperator(leftType: typedesc, rightType: typedesc, outType: typedesc): NimNode = - var data = nnkBracket.newTree() - for i in 0 ..< RowCount(leftType): - for j in 0 ..< rightType.ColumnCount: - data.add(newCall( - ident("sum"), - infix( - newCall(newDotExpr(ident("a"), ident("Row")), newLit(i)), - "*", - newCall(newDotExpr(ident("b"), ident("Col")), newLit(j)) - ) - )) - - return newProc( - postfix(nnkAccQuoted.newTree(ident("*")), "*"), - params = [ - ident("auto"), - newIdentDefs(ident("a"), ident(leftType.name)), - newIdentDefs(ident("b"), ident(rightType.name)) - ], - body = nnkObjConstr.newTree(ident(outType.name), nnkExprColonExpr.newTree(ident("data"), data)), - procType = nnkFuncDef, - ) - -proc createMatMatAdditionOperator(theType: typedesc): NimNode = - var data = nnkBracket.newTree() - for i in 0 ..< matlen(theType): - data.add( - infix( - nnkBracketExpr.newTree(ident("a"), newLit(i)), - "+", - nnkBracketExpr.newTree(ident("b"), newLit(i)), - )) - - return newProc( - postfix(nnkAccQuoted.newTree(ident("+")), "*"), - params = [ - ident("auto"), - newIdentDefs(ident("a"), ident(theType.name)), - newIdentDefs(ident("b"), ident(theType.name)) - ], - body = nnkObjConstr.newTree(ident(theType.name), nnkExprColonExpr.newTree(ident("data"), data)), - procType = nnkFuncDef, - ) - -proc createVecMatMultiplicationOperator(matType: typedesc, vecType: typedesc): NimNode = - var data = nnkBracket.newTree() - for i in 0 ..< matType.RowCount: - data.add(newCall( - ident("sum"), - infix( - ident("v"), - "*", - newCall(newDotExpr(ident("m"), ident("Row")), newLit(i)) - ) - )) - - let resultVec = newCall( - nnkBracketExpr.newTree(ident(vecType.name), ident("T")), - data, - ) - let name = postfix(nnkAccQuoted.newTree(ident("*")), "*") - let genericParams = nnkGenericParams.newTree(nnkIdentDefs.newTree(ident("T"), ident("SomeNumber"), newEmptyNode())) - let formalParams = nnkFormalParams.newTree( - ident("auto"), - newIdentDefs(ident("m"), nnkBracketExpr.newTree(ident(matType.name), ident("T"))), - newIdentDefs(ident("v"), nnkBracketExpr.newTree(ident(vecType.name), ident("T"))), - ) - - return nnkFuncDef.newTree( - name, - newEmptyNode(), - genericParams, - formalParams, - newEmptyNode(), - newEmptyNode(), - resultVec - ) - - -proc createMatScalarOperator(matType: typedesc, op: string): NimNode = - result = newStmtList() - - var data = nnkBracket.newTree() - for i in 0 ..< matType.RowCount * matType.ColumnCount: - data.add(infix(nnkBracketExpr.newTree(newDotExpr(ident("a"), ident("data")), newLit(i)), op, ident("b"))) - result.add(newProc( - postfix(nnkAccQuoted.newTree(ident(op)), "*"), - params = [ - ident("auto"), - newIdentDefs(ident("a"), ident(matType.name)), - newIdentDefs(ident("b"), ident("SomeNumber")), - ], - body = nnkObjConstr.newTree(ident(matType.name), nnkExprColonExpr.newTree(ident("data"), data)), - procType = nnkFuncDef, - )) - result.add(newProc( - postfix(nnkAccQuoted.newTree(ident(op)), "*"), - params = [ - ident("auto"), - newIdentDefs(ident("b"), ident("SomeNumber")), - newIdentDefs(ident("a"), ident(matType.name)), - ], - body = nnkObjConstr.newTree(ident(matType.name), nnkExprColonExpr.newTree(ident("data"), data)), - procType = nnkFuncDef, - )) - if op == "-": - var data2 = nnkBracket.newTree() - for i in 0 ..< matType.RowCount * matType.ColumnCount: - data2.add(prefix(nnkBracketExpr.newTree(newDotExpr(ident("a"), ident("data")), newLit(i)), op)) - result.add(newProc( - postfix(nnkAccQuoted.newTree(ident(op)), "*"), - params = [ - ident("auto"), - newIdentDefs(ident("a"), ident(matType.name)), - ], - body = nnkObjConstr.newTree(ident(matType.name), nnkExprColonExpr.newTree(ident("data"), data2)), - procType = nnkFuncDef, - )) - -macro createAllMultiplicationOperators() = - result = newStmtList() - - for op in ["+", "-", "*", "/"]: - result.add(createMatScalarOperator(TMat2, op)) - result.add(createMatScalarOperator(TMat23, op)) - result.add(createMatScalarOperator(TMat32, op)) - result.add(createMatScalarOperator(TMat3, op)) - result.add(createMatScalarOperator(TMat34, op)) - result.add(createMatScalarOperator(TMat43, op)) - result.add(createMatScalarOperator(TMat4, op)) - - result.add(createMatMatMultiplicationOperator(TMat2, TMat2, TMat2)) - result.add(createMatMatMultiplicationOperator(TMat2, TMat23, TMat23)) - result.add(createMatMatMultiplicationOperator(TMat23, TMat32, TMat2)) - result.add(createMatMatMultiplicationOperator(TMat23, TMat3, TMat23)) - result.add(createMatMatMultiplicationOperator(TMat32, TMat2, TMat32)) - result.add(createMatMatMultiplicationOperator(TMat32, TMat23, TMat3)) - result.add(createMatMatMultiplicationOperator(TMat3, TMat32, TMat32)) - result.add(createMatMatMultiplicationOperator(TMat3, TMat3, TMat3)) - result.add(createMatMatMultiplicationOperator(TMat3, TMat34, TMat34)) - result.add(createMatMatMultiplicationOperator(TMat43, TMat3, TMat43)) - result.add(createMatMatMultiplicationOperator(TMat43, TMat34, TMat4)) - result.add(createMatMatMultiplicationOperator(TMat4, TMat43, TMat43)) - result.add(createMatMatMultiplicationOperator(TMat4, TMat4, TMat4)) - - result.add(createMatMatAdditionOperator(TMat2)) - result.add(createMatMatAdditionOperator(TMat23)) - result.add(createMatMatAdditionOperator(TMat32)) - result.add(createMatMatAdditionOperator(TMat3)) - result.add(createMatMatAdditionOperator(TMat34)) - result.add(createMatMatAdditionOperator(TMat43)) - result.add(createMatMatAdditionOperator(TMat4)) - - result.add(createVecMatMultiplicationOperator(TMat2, TVec2)) - result.add(createVecMatMultiplicationOperator(TMat3, TVec3)) - result.add(createVecMatMultiplicationOperator(TMat4, TVec4)) - -createAllMultiplicationOperators() - -func `*`*(mat: Mat4, vec: Vec3f): Vec3f = - (mat * vec.ToVec4(1)).ToVec3 - -func Transposed*[T](m: TMat2[T]): TMat2[T] = TMat2[T](data: [ - m[0, 0], m[1, 0], - m[0, 1], m[1, 1], -]) -func Transposed*[T](m: TMat23[T]): TMat32[T] = TMat32[T](data: [ - m[0, 0], m[1, 0], - m[0, 1], m[1, 1], - m[0, 2], m[1, 2], -]) -func Transposed*[T](m: TMat32[T]): TMat23[T] = TMat23[T](data: [ - m[0, 0], m[1, 0], m[2, 0], - m[0, 1], m[1, 1], m[2, 1], -]) -func Transposed*[T](m: TMat3[T]): TMat3[T] = TMat3[T](data: [ - m[0, 0], m[1, 0], m[2, 0], - m[0, 1], m[1, 1], m[2, 1], - m[0, 2], m[1, 2], m[2, 2], -]) -func Transposed*[T](m: TMat43[T]): TMat34[T] = TMat34[T](data: [ - m[0, 0], m[1, 0], m[2, 0], m[3, 0], - m[0, 1], m[1, 1], m[2, 1], m[3, 1], - m[0, 2], m[1, 2], m[2, 2], m[3, 2], -]) -func Transposed*[T](m: TMat34[T]): TMat43[T] = TMat43[T](data: [ - m[0, 0], m[1, 0], m[2, 0], - m[0, 1], m[1, 1], m[2, 1], - m[0, 2], m[1, 2], m[2, 2], - m[0, 3], m[1, 3], m[2, 3], -]) -func Transposed*[T](m: TMat4[T]): TMat4[T] = TMat4[T](data: [ - m[0, 0], m[1, 0], m[2, 0], m[3, 0], - m[0, 1], m[1, 1], m[2, 1], m[3, 1], - m[0, 2], m[1, 2], m[2, 2], m[3, 2], - m[0, 3], m[1, 3], m[2, 3], m[3, 3], -]) - -func Translate2d*[T](x, y: T): TMat3[T] = TMat3[T](data: [ - T(1), T(0), x, - T(0), T(1), y, - T(0), T(0), T(1), -]) -func Scale2d*[T](sx, sy: T): TMat3[T] = TMat3[T](data: [ - sx, T(0), T(0), - T(0), sy, T(0), - T(0), T(0), T(1), -]) -func Rotate2d*[T](angle: T): TMat3[T] = TMat3[T](data: [ - cos(angle), -sin(angle), T(0), - sin(angle), cos(angle), T(0), - T(0), T(0), T(1), -]) -func Translate*(x = 0'f32, y = 0'f32, z = 0'f32): TMat4[float32] = Mat4(data: [ - 1'f32, 0'f32, 0'f32, x, - 0'f32, 1'f32, 0'f32, y, - 0'f32, 0'f32, 1'f32, z, - 0'f32, 0'f32, 0'f32, 1'f32, -]) -func Translate*[T: TVec3](v: T): TMat4[float32] = Translate(v[0], v[1], v[2]) -func Scale*(x = 1'f32, y = 1'f32, z = 1'f32): Mat4 = Mat4(data: [ - x, 0'f32, 0'f32, 0'f32, - 0'f32, y, 0'f32, 0'f32, - 0'f32, 0'f32, z, 0'f32, - 0'f32, 0'f32, 0'f32, 1'f32, -]) -func Scale*[T: TVec3](v: T): TMat4[float32] = Scale(v[0], v[1], v[2]) -func Rotate*(angle: float32, a: Vec3f): Mat4 = - let - cosa = cos(angle) - sina = sin(angle) - x = a[0] - y = a[1] - z = a[2] - Mat4(data: [ - x * x * (1 - cosa) + cosa, y * x * (1 - cosa) - z * sina, z * x * (1 - cosa) + y * sina, 0'f32, - x * y * (1 - cosa) + z * sina, y * y * (1 - cosa) + cosa, z * y * (1 - cosa) - x * sina, 0'f32, - x * z * (1 - cosa) - y * sina, y * z * (1 - cosa) + x * sina, z * z * (1 - cosa) + cosa, 0'f32, - 0'f32, 0'f32, 0'f32, 1'f32, - ]) - -func asMat3(m: Mat4): auto = - Mat3(data: [ - m[0, 0], m[0, 1], m[0, 2], - m[1, 0], m[1, 1], m[1, 2], - m[2, 0], m[2, 1], m[2, 2], - ]) - - -func Inversed*(m: Mat4): Mat4 = - var m3 = m.asMat3.Transposed - m3[0, 0] = 1'f32 / m3[0, 0] - m3[1, 1] = 1'f32 / m3[1, 1] - m3[2, 2] = 1'f32 / m3[2, 2] - let col3 = -(m3 * m.Col(3).xyz) - return Mat4(data: [ - m3[0, 0], m3[0, 1], m3[0, 2], col3.x, - m3[1, 0], m3[1, 1], m3[1, 2], col3.y, - m3[2, 0], m3[2, 1], m3[2, 2], col3.z, - 0, 0, 0, 1, - ]) - - -# call e.g. TMat32[int]().randomized() to get a random matrix -template makeRandomInit(mattype: typedesc) = - proc Randomized*[T: SomeInteger](m: mattype[T]): mattype[T] = - for i in 0 ..< result.data.len: - result.data[i] = rand(low(typeof(m.data[0])) .. high(typeof(m.data[0]))) - proc Randomized*[T: SomeFloat](m: mattype[T]): mattype[T] = - for i in 0 ..< result.data.len: - result.data[i] = rand(T(1.0)) - -makeRandomInit(TMat2) -makeRandomInit(TMat23) -makeRandomInit(TMat32) -makeRandomInit(TMat3) -makeRandomInit(TMat34) -makeRandomInit(TMat43) -makeRandomInit(TMat4) - -func Perspective*(fovy, aspect, zNear, zFar: float32): Mat4 = - let tanHalfFovy = tan(fovy / 2) - return Mat4(data: [ - 1 / (aspect * tanHalfFovy), 0, 0, 0, - 0, 1 / tanHalfFovy, 0, 0, - 0, 0, zFar / (zFar - zNear), -(zFar * zNear) / (zFar - zNear), - 0, 0, 1, 1, - ]) - -func Ortho*(left, right, top, bottom, zNear, zFar: float32): Mat4 = - Mat4(data: [ - 2 / (right - left), 0, 0, -(right + left) / (right - left), - 0, 2 / (bottom - top), 0, -(bottom + top) / (bottom - top), - 0, 0, 1 / (zFar - zNear), zNear / (zFar - zNear), - 0, 0, 0, 1, - ]) - -# create an orthographic perspective that will map from -1 .. 1 on all axis and keep a 1:1 aspect ratio -# the smaller dimension (width or height) will always be 1 and the larger dimension will be larger, to keep the ratio -func OrthoWindowAspect*(windowAspect: float32): Mat4 = - if windowAspect < 1: - let space = 2 * (1 / windowAspect - 1) / 2 - Ortho(-1, 1, -1 - space, 1 + space, 0, 1) - else: - let space = 2 * (windowAspect - 1) / 2 - Ortho(-1 - space, 1 + space, -1, 1, 0, 1) - -func Position*(mat: Mat4): Vec3f {.deprecated.} = - mat.Col(3).ToVec3 - -func Scaling*(mat: Mat4): Vec3f {.deprecated.} = - NewVec4f(mat[0, 0], mat[1, 1], mat[2, 2]) diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/utils.nim --- a/semiconginev2/old/core/utils.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -import std/typetraits -import std/strutils -import std/paths -import std/os -import std/strformat - -type - HorizontalAlignment* = enum - Left - Center - Right - VerticalAlignment* = enum - Top - Center - Bottom - -func CleanString*(str: openArray[char]): string = - for i in 0 ..< len(str): - if str[i] == char(0): - result = join(str[0 ..< i]) - break - -func ToCPointer*[T](list: openArray[T]): ptr T = - if list.len > 0: addr(list[0]) else: nil - -proc StaticExecChecked*(command: string, input = ""): string {.compileTime.} = - let (output, exitcode) = gorgeEx( - command = command, - input = input) - if exitcode != 0: - raise newException(Exception, &"Running '{command}' produced exit code: {exitcode}" & output) - return output - -proc AppName*(): string = - return string(Path(getAppFilename()).splitFile.name) - -func Size*[T: seq](list: T): uint64 = - uint64(list.len * sizeof(get(genericParams(typeof(list)), 0))) diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/vector.nim --- a/semiconginev2/old/core/vector.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,377 +0,0 @@ -import std/random -import std/math -import std/strutils -import std/strformat -import std/macros -import std/typetraits -import std/tables - -import ./vulkanapi - -type - TVec1*[T: SomeNumber] = array[1, T] - TVec2*[T: SomeNumber] = array[2, T] - TVec3*[T: SomeNumber] = array[3, T] - TVec4*[T: SomeNumber] = array[4, T] - TVec* = TVec1|TVec2|TVec3|TVec4 - Vec1f* = TVec1[float32] - Vec2f* = TVec2[float32] - Vec3f* = TVec3[float32] - Vec4f* = TVec4[float32] - Vec1i* = TVec1[int32] - Vec2i* = TVec2[int32] - Vec3i* = TVec3[int32] - Vec4i* = TVec4[int32] - Vec1u* = TVec1[uint32] - Vec2u* = TVec2[uint32] - Vec3u* = TVec3[uint32] - Vec4u* = TVec4[uint32] - -converter ToVec1*[T: SomeNumber](orig: TVec3[T]|TVec4[T]): TVec1[T] = - TVec1[T]([orig[0]]) -converter ToVec2*[T: SomeNumber](orig: TVec3[T]|TVec4[T]): TVec2[T] = - TVec2[T]([orig[0], orig[1]]) -converter ToVec3*[T: SomeNumber](orig: TVec4[T]): TVec3[T] = - TVec3[T]([orig[0], orig[1], orig[2]]) - -func ToVec4*[T: SomeNumber](orig: TVec3[T], value: T = default(T)): TVec4[T] = - TVec4[T]([orig[0], orig[1], orig[2], value]) -func ToVec3*[T: SomeNumber](orig: TVec2[T], value: T = default(T)): TVec3[T] = - TVec3[T]([orig[0], orig[1], value]) -func ToVec2*[T: SomeNumber](orig: TVec1[T], value: T = default(T)): TVec2[T] = - TVec2[T]([orig[0], value]) - -# define some often used constants -func ConstOne1[T: SomeNumber](): auto {.compiletime.} = TVec1[T]([T(1)]) -func ConstOne2[T: SomeNumber](): auto {.compiletime.} = TVec2[T]([T(1), T(1)]) -func ConstOne3[T: SomeNumber](): auto {.compiletime.} = TVec3[T]([T(1), T(1), T(1)]) -func ConstOne4[T: SomeNumber](): auto {.compiletime.} = TVec4[T]([T(1), T(1), T(1), T(1)]) -func ConstX[T: SomeNumber](): auto {.compiletime.} = TVec3[T]([T(1), T(0), T(0)]) -func ConstY[T: SomeNumber](): auto {.compiletime.} = TVec3[T]([T(0), T(1), T(0)]) -func ConstZ[T: SomeNumber](): auto {.compiletime.} = TVec3[T]([T(0), T(0), T(1)]) -func ConstR[T: SomeNumber](): auto {.compiletime.} = TVec3[T]([T(1), T(0), T(0)]) -func ConstG[T: SomeNumber](): auto {.compiletime.} = TVec3[T]([T(0), T(1), T(0)]) -func ConstB[T: SomeNumber](): auto {.compiletime.} = TVec3[T]([T(0), T(0), T(1)]) - -func NewVec2f*(x = 0'f32, y = 0'f32): auto = - Vec2f([x, y]) -func NewVec3f*(x = 0'f32, y = 0'f32, z = 0'f32): auto = - Vec3f([x, y, z]) -func NewVec4f*(x = 0'f32, y = 0'f32, z = 0'f32, a = 0'f32): auto = - Vec4f([x, y, z, a]) -func NewVec2i*(x = 0'i32, y = 0'i32): auto = - Vec2i([x, y]) -func NewVec3i*(x = 0'i32, y = 0'i32, z = 0'i32): auto = - Vec3i([x, y, z]) -func NewVec4i*(x = 0'i32, y = 0'i32, z = 0'i32, a = 0'i32): auto = - Vec4i([x, y, z, a]) -func NewVec2u*(x = 0'u32, y = 0'u32): auto = - Vec2u([x, y]) -func NewVec3u*(x = 0'u32, y = 0'u32, z = 0'u32): auto = - Vec3u([x, y, z]) -func NewVec4u*(x = 0'u32, y = 0'u32, z = 0'u32, a = 0'u32): auto = - Vec4u([x, y, z, a]) - -# generates constants: Xf, Xf32, Xf64, Xi, Xi8, Xi16, Xi32, Xi64 -# Also for Y, Z, R, G, B and One -# not sure if this is necessary or even a good idea... -macro generateAllConsts() = - result = newStmtList() - for component in ["X", "Y", "Z", "R", "G", "B", "One2", "One3", "One4"]: - for theType in ["int", "int8", "int16", "int32", "int64", "float", "float32", "float64"]: - var typename = theType[0 .. 0] - if theType[^2].isDigit: - typename = typename & theType[^2] - if theType[^1].isDigit: - typename = typename & theType[^1] - result.add( - newConstStmt( - postfix(ident(component & typename), "*"), - newCall(nnkBracketExpr.newTree(ident("Const" & component), ident(theType))) - ) - ) - -generateAllConsts() - -const X* = ConstX[float32]() -const Y* = ConstY[float32]() -const Z* = ConstZ[float32]() -const One1* = ConstOne1[float32]() -const One2* = ConstOne2[float32]() -const One3* = ConstOne3[float32]() -const One4* = ConstOne4[float32]() - -func NewVec1*[T](x: T): auto = TVec1([x]) -func NewVec2*[T](x, y: T): auto = TVec2([x, y]) -func NewVec3*[T](x, y, z: T): auto = TVec3([x, y, z]) -func NewVec4*[T](x, y, z, w: T): auto = TVec4([x, y, z, w]) - -func To*[T](v: TVec1): auto = TVec1([T(v[0])]) -func To*[T](v: TVec2): auto = TVec2([T(v[0]), T(v[1])]) -func To*[T](v: TVec3): auto = TVec3([T(v[0]), T(v[1]), T(v[2])]) -func To*[T](v: TVec4): auto = TVec4([T(v[0]), T(v[1]), T(v[2]), T(v[3])]) - -func toString[T](value: T): string = - var items: seq[string] - for item in value: - items.add(&"{item.float:.5f}") - & "(" & join(items, " ") & ")" - -func `$`*(v: TVec1[SomeNumber]): string = toString[TVec1[SomeNumber]](v) -func `$`*(v: TVec2[SomeNumber]): string = toString[TVec2[SomeNumber]](v) -func `$`*(v: TVec3[SomeNumber]): string = toString[TVec3[SomeNumber]](v) -func `$`*(v: TVec4[SomeNumber]): string = toString[TVec4[SomeNumber]](v) - -func Length*(vec: TVec1): auto = vec[0] -func Length*(vec: TVec2[SomeFloat]): auto = sqrt(vec[0] * vec[0] + vec[1] * vec[1]) -func Length*(vec: TVec2[SomeInteger]): auto = sqrt(float(vec[0] * vec[0] + vec[1] * vec[1])) -func Length*(vec: TVec3[SomeFloat]): auto = sqrt(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]) -func Length*(vec: TVec3[SomeInteger]): auto = sqrt(float(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2])) -func Length*(vec: TVec4[SomeFloat]): auto = sqrt(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2] + vec[3] * vec[3]) -func Length*(vec: TVec4[SomeInteger]): auto = sqrt(float(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2] + vec[3] * vec[3])) - -func Normal*[T: SomeFloat](vec: TVec2[T]): auto = - TVec2[T]([vec[1], -vec[0]]) - -func Normalized*[T: SomeFloat](vec: TVec1[T]): auto = - return T(1) -func Normalized*[T: SomeFloat](vec: TVec2[T]): auto = - let l = vec.Length - if l == 0: vec - else: TVec2[T]([vec[0] / l, vec[1] / l]) -func Normalized*[T: SomeFloat](vec: TVec3[T]): auto = - let l = vec.Length - if l == 0: return vec - else: TVec3[T]([vec[0] / l, vec[1] / l, vec[2] / l]) -func Normalized*[T: SomeFloat](vec: TVec4[T]): auto = - let l = vec.Length - if l == 0: return vec - else: TVec4[T]([vec[0] / l, vec[1] / l, vec[2] / l, vec[3] / l]) - -# scalar operations -func `+`*(a: TVec1, b: SomeNumber): auto = TVec1([a[0] + b]) -func `+`*(a: TVec2, b: SomeNumber): auto = TVec2([a[0] + b, a[1] + b]) -func `+`*(a: TVec3, b: SomeNumber): auto = TVec3([a[0] + b, a[1] + b, a[2] + b]) -func `+`*(a: TVec4, b: SomeNumber): auto = TVec4([a[0] + b, a[1] + b, a[2] + b, a[3] + b]) -func `-`*(a: TVec1, b: SomeNumber): auto = TVec1([a[0] - b]) -func `-`*(a: TVec2, b: SomeNumber): auto = TVec2([a[0] - b, a[1] - b]) -func `-`*(a: TVec3, b: SomeNumber): auto = TVec3([a[0] - b, a[1] - b, a[2] - b]) -func `-`*(a: TVec4, b: SomeNumber): auto = TVec4([a[0] - b, a[1] - b, a[2] - b, - a[3] - b]) -func `*`*(a: TVec1, b: SomeNumber): auto = TVec1([a[0] * b]) -func `*`*(a: TVec2, b: SomeNumber): auto = TVec2([a[0] * b, a[1] * b]) -func `*`*(a: TVec3, b: SomeNumber): auto = TVec3([a[0] * b, a[1] * b, a[2] * b]) -func `*`*(a: TVec4, b: SomeNumber): auto = TVec4([a[0] * b, a[1] * b, a[2] * b, - a[3] * b]) -func `/`*[T: SomeInteger](a: TVec1[T], b: SomeInteger): auto = TVec1([a[0] div b]) -func `/`*[T: SomeFloat](a: TVec1[T], b: SomeFloat): auto = TVec1([a[0] / b]) -func `/`*[T: SomeInteger](a: TVec2[T], b: SomeInteger): auto = TVec2([a[0] div b, a[1] div b]) -func `/`*[T: SomeFloat](a: TVec2[T], b: SomeFloat): auto = TVec2([a[0] / b, a[1] / b]) -func `/`*[T: SomeInteger](a: TVec3[T], b: SomeInteger): auto = TVec3([a[0] div b, a[1] div b, a[2] div b]) -func `/`*[T: SomeFloat](a: TVec3[T], b: SomeFloat): auto = TVec3([a[0] / b, a[1] / b, a[2] / b]) -func `/`*[T: SomeInteger](a: TVec4[T], b: SomeInteger): auto = TVec4([a[0] div b, a[1] div b, a[2] div b, a[3] div b]) -func `/`*[T: SomeFloat](a: TVec4[T], b: SomeFloat): auto = TVec4([a[0] / b, a[1] / b, a[2] / b, a[3] / b]) - -func `+`*(a: SomeNumber, b: TVec1): auto = TVec1([a + b[0]]) -func `+`*(a: SomeNumber, b: TVec2): auto = TVec2([a + b[0], a + b[1]]) -func `+`*(a: SomeNumber, b: TVec3): auto = TVec3([a + b[0], a + b[1], a + b[2]]) -func `+`*(a: SomeNumber, b: TVec4): auto = TVec4([a + b[0], a + b[1], a + b[2], a + b[3]]) -func `-`*(a: SomeNumber, b: TVec1): auto = TVec1([a - b[0]]) -func `-`*(a: SomeNumber, b: TVec2): auto = TVec2([a - b[0], a - b[1]]) -func `-`*(a: SomeNumber, b: TVec3): auto = TVec3([a - b[0], a - b[1], a - b[2]]) -func `-`*(a: SomeNumber, b: TVec4): auto = TVec4([a - b[0], a - b[1], a - b[2], a - b[3]]) -func `*`*(a: SomeNumber, b: TVec1): auto = TVec1([a * b[0]]) -func `*`*(a: SomeNumber, b: TVec2): auto = TVec2([a * b[0], a * b[1]]) -func `*`*(a: SomeNumber, b: TVec3): auto = TVec3([a * b[0], a * b[1], a * b[2]]) -func `*`*(a: SomeNumber, b: TVec4): auto = TVec4([a * b[0], a * b[1], a * b[2], a * b[3]]) -func `/`*[T: SomeInteger](a: SomeInteger, b: TVec1[T]): auto = TVec1([a div b[0]]) -func `/`*[T: SomeFloat](a: SomeFloat, b: TVec1[T]): auto = TVec1([a / b[0]]) -func `/`*[T: SomeInteger](a: SomeInteger, b: TVec2[T]): auto = TVec2([a div b[0], a div b[1]]) -func `/`*[T: SomeFloat](a: SomeFloat, b: TVec2[T]): auto = TVec2([a / b[0], a / b[1]]) -func `/`*[T: SomeInteger](a: SomeInteger, b: TVec3[T]): auto = TVec3([a div b[0], a div b[1], a div b[2]]) -func `/`*[T: SomeFloat](a: SomeFloat, b: TVec3[T]): auto = TVec3([a / b[0], a / b[1], a / b[2]]) -func `/`*[T: SomeInteger](a: SomeInteger, b: TVec4[T]): auto = TVec4([a div b[ - 0], a div b[1], a div b[2], a div b[3]]) -func `/`*[T: SomeFloat](a: SomeFloat, b: TVec4[T]): auto = TVec4([a / b[0], a / - b[1], a / b[2], a / b[3]]) - -# compontent-wise operations -func `+`*(a, b: TVec1): auto = TVec1([a[0] + b[0]]) -func `+`*(a, b: TVec2): auto = TVec2([a[0] + b[0], a[1] + b[1]]) -func `+`*(a, b: TVec3): auto = TVec3([a[0] + b[0], a[1] + b[1], a[2] + b[2]]) -func `+`*(a, b: TVec4): auto = TVec4([a[0] + b[0], a[1] + b[1], a[2] + b[2], a[3] + b[3]]) -func `-`*(a: TVec1): auto = TVec1([-a[0]]) -func `-`*(a: TVec2): auto = TVec2([-a[0], -a[1]]) -func `-`*(a: TVec3): auto = TVec3([-a[0], -a[1], -a[2]]) -func `-`*(a: TVec4): auto = TVec4([-a[0], -a[1], -a[2], -a[3]]) -func `-`*(a, b: TVec1): auto = TVec1([a[0] - b[0]]) -func `-`*(a, b: TVec2): auto = TVec2([a[0] - b[0], a[1] - b[1]]) -func `-`*(a, b: TVec3): auto = TVec3([a[0] - b[0], a[1] - b[1], a[2] - b[2]]) -func `-`*(a, b: TVec4): auto = TVec4([a[0] - b[0], a[1] - b[1], a[2] - b[2], a[3] - b[3]]) -func `*`*(a, b: TVec1): auto = TVec1([a[0] * b[0]]) -func `*`*(a, b: TVec2): auto = TVec2([a[0] * b[0], a[1] * b[1]]) -func `*`*(a, b: TVec3): auto = TVec3([a[0] * b[0], a[1] * b[1], a[2] * b[2]]) -func `*`*(a, b: TVec4): auto = TVec4([a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3]]) -func `/`*[T: SomeInteger](a, b: TVec1[T]): auto = TVec1([a[0] div b[0]]) -func `/`*[T: SomeFloat](a, b: TVec1[T]): auto = TVec1([a[0] / b[0]]) -func `/`*[T: SomeInteger](a, b: TVec2[T]): auto = TVec2([a[0] div b[0], a[1] div b[1]]) -func `/`*[T: SomeFloat](a, b: TVec2[T]): auto = TVec2([a[0] / b[0], a[1] / b[1]]) -func `/`*[T: SomeInteger](a, b: TVec3[T]): auto = TVec3([a[0] div b[0], a[1] div b[1], a[2] div b[2]]) -func `/`*[T: SomeFloat](a, b: TVec3[T]): auto = TVec3([a[0] / b[0], a[1] / b[1], a[2] / b[2]]) -func `/`*[T: SomeInteger](a, b: TVec4[T]): auto = TVec4([a[0] div b[0], a[1] div b[1], a[2] div b[2], a[3] div b[3]]) -func `/`*[T: SomeFloat](a, b: TVec4[T]): auto = TVec4([a[0] / b[0], a[1] / b[1], a[2] / b[2], a[3] / b[3]]) - -# assignment operations, scalar -func `+=`*(a: var TVec1, b: SomeNumber) = a = a + b -func `+=`*(a: var TVec2, b: SomeNumber) = a = a + b -func `+=`*(a: var TVec3, b: SomeNumber) = a = a + b -func `+=`*(a: var TVec4, b: SomeNumber) = a = a + b -func `-=`*(a: var TVec1, b: SomeNumber) = a = a - b -func `-=`*(a: var TVec2, b: SomeNumber) = a = a - b -func `-=`*(a: var TVec3, b: SomeNumber) = a = a - b -func `-=`*(a: var TVec4, b: SomeNumber) = a = a - b -func `*=`*(a: var TVec1, b: SomeNumber) = a = a * b -func `*=`*(a: var TVec2, b: SomeNumber) = a = a * b -func `*=`*(a: var TVec3, b: SomeNumber) = a = a * b -func `*=`*(a: var TVec4, b: SomeNumber) = a = a * b -func `/=`*(a: var TVec1, b: SomeNumber) = a = a / b -func `/=`*(a: var TVec2, b: SomeNumber) = a = a / b -func `/=`*(a: var TVec3, b: SomeNumber) = a = a / b -func `/=`*(a: var TVec4, b: SomeNumber) = a = a / b -# assignment operations, vector -func `+=`*(a: var TVec1, b: TVec1) = a = a + b -func `+=`*(a: var TVec2, b: TVec2) = a = a + b -func `+=`*(a: var TVec3, b: TVec3) = a = a + b -func `+=`*(a: var TVec4, b: TVec4) = a = a + b -func `-=`*(a: var TVec1, b: TVec1) = a = a - b -func `-=`*(a: var TVec2, b: TVec2) = a = a - b -func `-=`*(a: var TVec3, b: TVec3) = a = a - b -func `-=`*(a: var TVec4, b: TVec4) = a = a - b -func `*=`*(a: var TVec1, b: TVec1) = a = a * b -func `*=`*(a: var TVec2, b: TVec2) = a = a * b -func `*=`*(a: var TVec3, b: TVec3) = a = a * b -func `*=`*(a: var TVec4, b: TVec4) = a = a * b -func `/=`*(a: var TVec1, b: TVec1) = a = a / b -func `/=`*(a: var TVec2, b: TVec2) = a = a / b -func `/=`*(a: var TVec3, b: TVec3) = a = a / b -func `/=`*(a: var TVec4, b: TVec4) = a = a / b - - -# special operations -func Pow*(a: TVec1, b: SomeNumber): auto = - TVec1([pow(a[0], b)]) -func Pow*(a: TVec2, b: SomeNumber): auto = - TVec2([pow(a[0], b), pow(a[1], b)]) -func Pow*(a: TVec3, b: SomeNumber): auto = - TVec3([pow(a[0], b), pow(a[1], b), pow(a[2], b)]) -func Pow*(a: TVec4, b: SomeNumber): auto = - TVec4([pow(a[0], b), pow(a[1], b), pow(a[2], b), pow(a[3], b)]) -func Dot*(a, b: TVec1): auto = a[0] * b[0] -func Dot*(a, b: TVec2): auto = a[0] * b[0] + a[1] * b[1] -func Dot*(a, b: TVec3): auto = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] -func Dot*(a, b: TVec4): auto = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3] -func Cross*(a, b: TVec3): auto = TVec3([ - a[1] * b[2] - a[2] * b[1], - a[2] * b[0] - a[0] * b[2], - a[0] * b[1] - a[1] * b[0], -]) - - -# macro to allow creation of new vectors by specifying vector components as attributes -# e.g. myVec.xxy will return a new Vec3 that contains the components x, x an y of the original vector -# (instead of x, y, z for a simple copy) -proc vectorAttributeAccessor(accessor: string): seq[NimNode] = - const ACCESSOR_INDICES = { - 'x': 0, - 'y': 1, - 'z': 2, - 'w': 3, - 'r': 0, - 'g': 1, - 'b': 2, - 'a': 3, - }.toTable - var getterCode, setterCode: NimNode - let accessorvalue = accessor - - if accessorvalue.len == 0: - raise newException(Exception, "empty attribute") - elif accessorvalue.len == 1: - getterCode = nnkBracketExpr.newTree(ident("vec"), newLit(ACCESSOR_INDICES[accessorvalue[0]])) - setterCode = nnkStmtList.newTree( - nnkAsgn.newTree( - nnkBracketExpr.newTree(ident("vec"), newLit(ACCESSOR_INDICES[accessorvalue[0]])), ident("value")) - ) - if accessorvalue.len > 1: - var attrs = nnkBracket.newTree() - for attrname in accessorvalue: - attrs.add(nnkBracketExpr.newTree(ident("vec"), newLit(ACCESSOR_INDICES[attrname]))) - getterCode = nnkCall.newTree(ident("TVec" & $accessorvalue.len), attrs) - setterCode = nnkStmtList.newTree() - var i = 0 - for attrname in accessorvalue: - setterCode.add nnkAsgn.newTree( - nnkBracketExpr.newTree(ident("vec"), newLit(ACCESSOR_INDICES[attrname])), - nnkBracketExpr.newTree(ident("value"), newLit(i)), - ) - inc i - - result.add newProc( - name = nnkPostfix.newTree(ident("*"), ident(accessor)), - params = [ident("auto"), nnkIdentDefs.newTree(ident("vec"), ident("TVec"), newEmptyNode())], - body = newStmtList(getterCode), - procType = nnkFuncDef, - ) - - result.add nnkFuncDef.newTree( - nnkPostfix.newTree( - newIdentNode("*"), - nnkAccQuoted.newTree(newIdentNode(accessor), newIdentNode("=")) - ), - newEmptyNode(), - nnkGenericParams.newTree(nnkIdentDefs.newTree(newIdentNode("T"), newEmptyNode(), newEmptyNode())), - nnkFormalParams.newTree( - newEmptyNode(), - nnkIdentDefs.newTree(newIdentNode("vec"), nnkVarTy.newTree(newIdentNode("TVec")), newEmptyNode()), - nnkIdentDefs.newTree(newIdentNode("value"), newIdentNode("T"), newEmptyNode()) - ), - newEmptyNode(), - newEmptyNode(), - setterCode - ) - -macro createVectorAttribAccessorFuncs() = - const COORD_ATTRS = ["x", "y", "z", "w"] - const COLOR_ATTRS = ["r", "g", "b", "a"] - result = nnkStmtList.newTree() - for attlist in [COORD_ATTRS, COLOR_ATTRS]: - for i in attlist: - result.add(vectorAttributeAccessor(i)) - for j in attlist: - result.add(vectorAttributeAccessor(i & j)) - for k in attlist: - result.add(vectorAttributeAccessor(i & j & k)) - for l in attlist: - result.add(vectorAttributeAccessor(i & j & k & l)) - -createVectorAttribAccessorFuncs() - -# call e.g. Vec2[int]().randomized() to get a random matrix -template makeRandomInit(mattype: typedesc) = - proc Randomized*[T: SomeInteger](m: mattype[T]): mattype[T] = - for i in 0 ..< result.len: - result[i] = rand(low(typeof(m[0])) .. high(typeof(m[0]))) - proc Randomized*[T: SomeFloat](m: mattype[T]): mattype[T] = - for i in 0 ..< result.len: - result[i] = rand(1.0) - -makeRandomInit(TVec1) -makeRandomInit(TVec2) -makeRandomInit(TVec3) -makeRandomInit(TVec4) - -converter Vec2VkExtent*(vec: TVec2[uint32]): VkExtent2D = VkExtent2D(width: vec[0], height: vec[1]) -converter Vec3VkExtent*(vec: TVec2[uint32]): VkExtent3D = VkExtent3D(width: vec[0], height: vec[1], depth: vec[2]) - -func AngleBetween*(a, b: Vec3f): float32 = - arccos(a.Dot(b) / (a.Length * b.Length)) diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/core/vulkanapi.nim --- a/semiconginev2/old/core/vulkanapi.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12067 +0,0 @@ -import std/dynlib -import std/tables -import std/strutils -import std/logging -import std/typetraits -import std/macros -type - VkHandle* = distinct uint - VkNonDispatchableHandle* = distinct uint -when defined(linux): - let vulkanLib* = loadLib("libvulkan.so.1") -when defined(windows): - let vulkanLib* = loadLib("vulkan-1.dll") -if vulkanLib == nil: - raise newException(Exception, "Unable to load vulkan library") -func VK_MAKE_API_VERSION*(variant: uint32, major: uint32, minor: uint32, patch: uint32): uint32 {.compileTime.} = - (variant shl 29) or (major shl 22) or (minor shl 12) or patch - -template checkVkResult*(call: untyped) = - when defined(release): - discard call - else: - # yes, a bit cheap, but this is only for nice debug output - var callstr = astToStr(call).replace("\n", "") - while callstr.find(" ") >= 0: - callstr = callstr.replace(" ", " ") - debug "Calling vulkan: ", callstr - let value = call - if value != VK_SUCCESS: - error "Vulkan error: ", astToStr(call), " returned ", $value - raise newException(Exception, "Vulkan error: " & astToStr(call) & - " returned " & $value) -# custom enum iteration (for enum values > 2^16) -macro enumFullRange(a: typed): untyped = - newNimNode(nnkBracket).add(a.getType[1][1..^1]) - -iterator items*[T: HoleyEnum](E: typedesc[T]): T = - for a in enumFullRange(E): yield a -const - VK_MAX_PHYSICAL_DEVICE_NAME_SIZE*: uint32 = 256 - VK_UUID_SIZE*: uint32 = 16 - VK_LUID_SIZE*: uint32 = 8 - VK_LUID_SIZE_KHR* = VK_LUID_SIZE - VK_MAX_EXTENSION_NAME_SIZE*: uint32 = 256 - VK_MAX_DESCRIPTION_SIZE*: uint32 = 256 - VK_MAX_MEMORY_TYPES*: uint32 = 32 - VK_MAX_MEMORY_HEAPS*: uint32 = 16 - VK_LOD_CLAMP_NONE*: float32 = 1000.0F - VK_REMAINING_MIP_LEVELS*: uint32 = not 0'u32 - VK_REMAINING_ARRAY_LAYERS*: uint32 = not 0'u32 - VK_REMAINING_3D_SLICES_EXT*: uint32 = not 0'u32 - VK_WHOLE_SIZE*: uint64 = not 0'u64 - VK_ATTACHMENT_UNUSED*: uint32 = not 0'u32 - VK_TRUE*: uint32 = 1 - VK_FALSE*: uint32 = 0 - VK_QUEUE_FAMILY_IGNORED*: uint32 = not 0'u32 - VK_QUEUE_FAMILY_EXTERNAL*: uint32 = not 1'u32 - VK_QUEUE_FAMILY_EXTERNAL_KHR* = VK_QUEUE_FAMILY_EXTERNAL - VK_QUEUE_FAMILY_FOREIGN_EXT*: uint32 = not 2'u32 - VK_SUBPASS_EXTERNAL*: uint32 = not 0'u32 - VK_MAX_DEVICE_GROUP_SIZE*: uint32 = 32 - VK_MAX_DEVICE_GROUP_SIZE_KHR* = VK_MAX_DEVICE_GROUP_SIZE - VK_MAX_DRIVER_NAME_SIZE*: uint32 = 256 - VK_MAX_DRIVER_NAME_SIZE_KHR* = VK_MAX_DRIVER_NAME_SIZE - VK_MAX_DRIVER_INFO_SIZE*: uint32 = 256 - VK_MAX_DRIVER_INFO_SIZE_KHR* = VK_MAX_DRIVER_INFO_SIZE - VK_SHADER_UNUSED_KHR*: uint32 = not 0'u32 - VK_SHADER_UNUSED_NV* = VK_SHADER_UNUSED_KHR - VK_MAX_GLOBAL_PRIORITY_SIZE_KHR*: uint32 = 16 - VK_MAX_GLOBAL_PRIORITY_SIZE_EXT* = VK_MAX_GLOBAL_PRIORITY_SIZE_KHR - VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT*: uint32 = 32 -type - ANativeWindow* = object - AHardwareBuffer* = object - CAMetalLayer* = object - MTLDevice_id* = object - MTLCommandQueue_id* = object - MTLBuffer_id* = object - MTLTexture_id* = object - MTLSharedEvent_id* = object - IOSurfaceRef* = object - VkSampleMask* = uint32 - VkBool32* = uint32 - VkFlags* = uint32 - VkFlags64* = uint64 - VkDeviceSize* = uint64 - VkDeviceAddress* = uint64 - VkInstance* = distinct VkHandle - VkPhysicalDevice* = distinct VkHandle - VkDevice* = distinct VkHandle - VkQueue* = distinct VkHandle - VkCommandBuffer* = distinct VkHandle - VkDeviceMemory* = distinct VkNonDispatchableHandle - VkCommandPool* = distinct VkNonDispatchableHandle - VkBuffer* = distinct VkNonDispatchableHandle - VkBufferView* = distinct VkNonDispatchableHandle - VkImage* = distinct VkNonDispatchableHandle - VkImageView* = distinct VkNonDispatchableHandle - VkShaderModule* = distinct VkNonDispatchableHandle - VkPipeline* = distinct VkNonDispatchableHandle - VkPipelineLayout* = distinct VkNonDispatchableHandle - VkSampler* = distinct VkNonDispatchableHandle - VkDescriptorSet* = distinct VkNonDispatchableHandle - VkDescriptorSetLayout* = distinct VkNonDispatchableHandle - VkDescriptorPool* = distinct VkNonDispatchableHandle - VkFence* = distinct VkNonDispatchableHandle - VkSemaphore* = distinct VkNonDispatchableHandle - VkEvent* = distinct VkNonDispatchableHandle - VkQueryPool* = distinct VkNonDispatchableHandle - VkFramebuffer* = distinct VkNonDispatchableHandle - VkRenderPass* = distinct VkNonDispatchableHandle - VkPipelineCache* = distinct VkNonDispatchableHandle - VkIndirectCommandsLayoutNV* = distinct VkNonDispatchableHandle - VkDescriptorUpdateTemplate* = distinct VkNonDispatchableHandle - VkSamplerYcbcrConversion* = distinct VkNonDispatchableHandle - VkValidationCacheEXT* = distinct VkNonDispatchableHandle - VkAccelerationStructureKHR* = distinct VkNonDispatchableHandle - VkAccelerationStructureNV* = distinct VkNonDispatchableHandle - VkPerformanceConfigurationINTEL* = distinct VkNonDispatchableHandle - VkBufferCollectionFUCHSIA* = distinct VkNonDispatchableHandle - VkDeferredOperationKHR* = distinct VkNonDispatchableHandle - VkPrivateDataSlot* = distinct VkNonDispatchableHandle - VkCuModuleNVX* = distinct VkNonDispatchableHandle - VkCuFunctionNVX* = distinct VkNonDispatchableHandle - VkOpticalFlowSessionNV* = distinct VkNonDispatchableHandle - VkMicromapEXT* = distinct VkNonDispatchableHandle - VkDisplayKHR* = distinct VkNonDispatchableHandle - VkDisplayModeKHR* = distinct VkNonDispatchableHandle - VkSurfaceKHR* = distinct VkNonDispatchableHandle - VkSwapchainKHR* = distinct VkNonDispatchableHandle - VkDebugReportCallbackEXT* = distinct VkNonDispatchableHandle - VkDebugUtilsMessengerEXT* = distinct VkNonDispatchableHandle - VkVideoSessionKHR* = distinct VkNonDispatchableHandle - VkVideoSessionParametersKHR* = distinct VkNonDispatchableHandle - VkSemaphoreSciSyncPoolNV* = distinct VkNonDispatchableHandle - VkRemoteAddressNV* = pointer -proc `$`*(handle: VkInstance): string = "VkInstance(" & $(uint(handle)) & ")" -proc Valid*(handle: VkInstance): bool = uint(handle) != 0 -proc Reset*(handle: var VkInstance) = handle = VkInstance(0) -proc `==`*(a, b: VkInstance): bool = uint(a) == uint(b) -proc `$`*(handle: VkPhysicalDevice): string = "VkPhysicalDevice(" & $(uint(handle)) & ")" -proc Valid*(handle: VkPhysicalDevice): bool = uint(handle) != 0 -proc Reset*(handle: var VkPhysicalDevice) = handle = VkPhysicalDevice(0) -proc `==`*(a, b: VkPhysicalDevice): bool = uint(a) == uint(b) -proc `$`*(handle: VkDevice): string = "VkDevice(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDevice): bool = uint(handle) != 0 -proc Reset*(handle: var VkDevice) = handle = VkDevice(0) -proc `==`*(a, b: VkDevice): bool = uint(a) == uint(b) -proc `$`*(handle: VkQueue): string = "VkQueue(" & $(uint(handle)) & ")" -proc Valid*(handle: VkQueue): bool = uint(handle) != 0 -proc Reset*(handle: var VkQueue) = handle = VkQueue(0) -proc `==`*(a, b: VkQueue): bool = uint(a) == uint(b) -proc `$`*(handle: VkCommandBuffer): string = "VkCommandBuffer(" & $(uint(handle)) & ")" -proc Valid*(handle: VkCommandBuffer): bool = uint(handle) != 0 -proc Reset*(handle: var VkCommandBuffer) = handle = VkCommandBuffer(0) -proc `==`*(a, b: VkCommandBuffer): bool = uint(a) == uint(b) -proc `$`*(handle: VkDeviceMemory): string = "VkDeviceMemory(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDeviceMemory): bool = uint(handle) != 0 -proc Reset*(handle: var VkDeviceMemory) = handle = VkDeviceMemory(0) -proc `==`*(a, b: VkDeviceMemory): bool = uint(a) == uint(b) -proc `$`*(handle: VkCommandPool): string = "VkCommandPool(" & $(uint(handle)) & ")" -proc Valid*(handle: VkCommandPool): bool = uint(handle) != 0 -proc Reset*(handle: var VkCommandPool) = handle = VkCommandPool(0) -proc `==`*(a, b: VkCommandPool): bool = uint(a) == uint(b) -proc `$`*(handle: VkBuffer): string = "VkBuffer(" & $(uint(handle)) & ")" -proc Valid*(handle: VkBuffer): bool = uint(handle) != 0 -proc Reset*(handle: var VkBuffer) = handle = VkBuffer(0) -proc `==`*(a, b: VkBuffer): bool = uint(a) == uint(b) -proc `$`*(handle: VkBufferView): string = "VkBufferView(" & $(uint(handle)) & ")" -proc Valid*(handle: VkBufferView): bool = uint(handle) != 0 -proc Reset*(handle: var VkBufferView) = handle = VkBufferView(0) -proc `==`*(a, b: VkBufferView): bool = uint(a) == uint(b) -proc `$`*(handle: VkImage): string = "VkImage(" & $(uint(handle)) & ")" -proc Valid*(handle: VkImage): bool = uint(handle) != 0 -proc Reset*(handle: var VkImage) = handle = VkImage(0) -proc `==`*(a, b: VkImage): bool = uint(a) == uint(b) -proc `$`*(handle: VkImageView): string = "VkImageView(" & $(uint(handle)) & ")" -proc Valid*(handle: VkImageView): bool = uint(handle) != 0 -proc Reset*(handle: var VkImageView) = handle = VkImageView(0) -proc `==`*(a, b: VkImageView): bool = uint(a) == uint(b) -proc `$`*(handle: VkShaderModule): string = "VkShaderModule(" & $(uint(handle)) & ")" -proc Valid*(handle: VkShaderModule): bool = uint(handle) != 0 -proc Reset*(handle: var VkShaderModule) = handle = VkShaderModule(0) -proc `==`*(a, b: VkShaderModule): bool = uint(a) == uint(b) -proc `$`*(handle: VkPipeline): string = "VkPipeline(" & $(uint(handle)) & ")" -proc Valid*(handle: VkPipeline): bool = uint(handle) != 0 -proc Reset*(handle: var VkPipeline) = handle = VkPipeline(0) -proc `==`*(a, b: VkPipeline): bool = uint(a) == uint(b) -proc `$`*(handle: VkPipelineLayout): string = "VkPipelineLayout(" & $(uint(handle)) & ")" -proc Valid*(handle: VkPipelineLayout): bool = uint(handle) != 0 -proc Reset*(handle: var VkPipelineLayout) = handle = VkPipelineLayout(0) -proc `==`*(a, b: VkPipelineLayout): bool = uint(a) == uint(b) -proc `$`*(handle: VkSampler): string = "VkSampler(" & $(uint(handle)) & ")" -proc Valid*(handle: VkSampler): bool = uint(handle) != 0 -proc Reset*(handle: var VkSampler) = handle = VkSampler(0) -proc `==`*(a, b: VkSampler): bool = uint(a) == uint(b) -proc `$`*(handle: VkDescriptorSet): string = "VkDescriptorSet(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDescriptorSet): bool = uint(handle) != 0 -proc Reset*(handle: var VkDescriptorSet) = handle = VkDescriptorSet(0) -proc `==`*(a, b: VkDescriptorSet): bool = uint(a) == uint(b) -proc `$`*(handle: VkDescriptorSetLayout): string = "VkDescriptorSetLayout(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDescriptorSetLayout): bool = uint(handle) != 0 -proc Reset*(handle: var VkDescriptorSetLayout) = handle = VkDescriptorSetLayout(0) -proc `==`*(a, b: VkDescriptorSetLayout): bool = uint(a) == uint(b) -proc `$`*(handle: VkDescriptorPool): string = "VkDescriptorPool(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDescriptorPool): bool = uint(handle) != 0 -proc Reset*(handle: var VkDescriptorPool) = handle = VkDescriptorPool(0) -proc `==`*(a, b: VkDescriptorPool): bool = uint(a) == uint(b) -proc `$`*(handle: VkFence): string = "VkFence(" & $(uint(handle)) & ")" -proc Valid*(handle: VkFence): bool = uint(handle) != 0 -proc Reset*(handle: var VkFence) = handle = VkFence(0) -proc `==`*(a, b: VkFence): bool = uint(a) == uint(b) -proc `$`*(handle: VkSemaphore): string = "VkSemaphore(" & $(uint(handle)) & ")" -proc Valid*(handle: VkSemaphore): bool = uint(handle) != 0 -proc Reset*(handle: var VkSemaphore) = handle = VkSemaphore(0) -proc `==`*(a, b: VkSemaphore): bool = uint(a) == uint(b) -proc `$`*(handle: VkEvent): string = "VkEvent(" & $(uint(handle)) & ")" -proc Valid*(handle: VkEvent): bool = uint(handle) != 0 -proc Reset*(handle: var VkEvent) = handle = VkEvent(0) -proc `==`*(a, b: VkEvent): bool = uint(a) == uint(b) -proc `$`*(handle: VkQueryPool): string = "VkQueryPool(" & $(uint(handle)) & ")" -proc Valid*(handle: VkQueryPool): bool = uint(handle) != 0 -proc Reset*(handle: var VkQueryPool) = handle = VkQueryPool(0) -proc `==`*(a, b: VkQueryPool): bool = uint(a) == uint(b) -proc `$`*(handle: VkFramebuffer): string = "VkFramebuffer(" & $(uint(handle)) & ")" -proc Valid*(handle: VkFramebuffer): bool = uint(handle) != 0 -proc Reset*(handle: var VkFramebuffer) = handle = VkFramebuffer(0) -proc `==`*(a, b: VkFramebuffer): bool = uint(a) == uint(b) -proc `$`*(handle: VkRenderPass): string = "VkRenderPass(" & $(uint(handle)) & ")" -proc Valid*(handle: VkRenderPass): bool = uint(handle) != 0 -proc Reset*(handle: var VkRenderPass) = handle = VkRenderPass(0) -proc `==`*(a, b: VkRenderPass): bool = uint(a) == uint(b) -proc `$`*(handle: VkPipelineCache): string = "VkPipelineCache(" & $(uint(handle)) & ")" -proc Valid*(handle: VkPipelineCache): bool = uint(handle) != 0 -proc Reset*(handle: var VkPipelineCache) = handle = VkPipelineCache(0) -proc `==`*(a, b: VkPipelineCache): bool = uint(a) == uint(b) -proc `$`*(handle: VkIndirectCommandsLayoutNV): string = "VkIndirectCommandsLayoutNV(" & $(uint(handle)) & ")" -proc Valid*(handle: VkIndirectCommandsLayoutNV): bool = uint(handle) != 0 -proc Reset*(handle: var VkIndirectCommandsLayoutNV) = handle = VkIndirectCommandsLayoutNV(0) -proc `==`*(a, b: VkIndirectCommandsLayoutNV): bool = uint(a) == uint(b) -proc `$`*(handle: VkDescriptorUpdateTemplate): string = "VkDescriptorUpdateTemplate(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDescriptorUpdateTemplate): bool = uint(handle) != 0 -proc Reset*(handle: var VkDescriptorUpdateTemplate) = handle = VkDescriptorUpdateTemplate(0) -proc `==`*(a, b: VkDescriptorUpdateTemplate): bool = uint(a) == uint(b) -proc `$`*(handle: VkSamplerYcbcrConversion): string = "VkSamplerYcbcrConversion(" & $(uint(handle)) & ")" -proc Valid*(handle: VkSamplerYcbcrConversion): bool = uint(handle) != 0 -proc Reset*(handle: var VkSamplerYcbcrConversion) = handle = VkSamplerYcbcrConversion(0) -proc `==`*(a, b: VkSamplerYcbcrConversion): bool = uint(a) == uint(b) -proc `$`*(handle: VkValidationCacheEXT): string = "VkValidationCacheEXT(" & $(uint(handle)) & ")" -proc Valid*(handle: VkValidationCacheEXT): bool = uint(handle) != 0 -proc Reset*(handle: var VkValidationCacheEXT) = handle = VkValidationCacheEXT(0) -proc `==`*(a, b: VkValidationCacheEXT): bool = uint(a) == uint(b) -proc `$`*(handle: VkAccelerationStructureKHR): string = "VkAccelerationStructureKHR(" & $(uint(handle)) & ")" -proc Valid*(handle: VkAccelerationStructureKHR): bool = uint(handle) != 0 -proc Reset*(handle: var VkAccelerationStructureKHR) = handle = VkAccelerationStructureKHR(0) -proc `==`*(a, b: VkAccelerationStructureKHR): bool = uint(a) == uint(b) -proc `$`*(handle: VkAccelerationStructureNV): string = "VkAccelerationStructureNV(" & $(uint(handle)) & ")" -proc Valid*(handle: VkAccelerationStructureNV): bool = uint(handle) != 0 -proc Reset*(handle: var VkAccelerationStructureNV) = handle = VkAccelerationStructureNV(0) -proc `==`*(a, b: VkAccelerationStructureNV): bool = uint(a) == uint(b) -proc `$`*(handle: VkPerformanceConfigurationINTEL): string = "VkPerformanceConfigurationINTEL(" & $(uint(handle)) & ")" -proc Valid*(handle: VkPerformanceConfigurationINTEL): bool = uint(handle) != 0 -proc Reset*(handle: var VkPerformanceConfigurationINTEL) = handle = VkPerformanceConfigurationINTEL(0) -proc `==`*(a, b: VkPerformanceConfigurationINTEL): bool = uint(a) == uint(b) -proc `$`*(handle: VkBufferCollectionFUCHSIA): string = "VkBufferCollectionFUCHSIA(" & $(uint(handle)) & ")" -proc Valid*(handle: VkBufferCollectionFUCHSIA): bool = uint(handle) != 0 -proc Reset*(handle: var VkBufferCollectionFUCHSIA) = handle = VkBufferCollectionFUCHSIA(0) -proc `==`*(a, b: VkBufferCollectionFUCHSIA): bool = uint(a) == uint(b) -proc `$`*(handle: VkDeferredOperationKHR): string = "VkDeferredOperationKHR(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDeferredOperationKHR): bool = uint(handle) != 0 -proc Reset*(handle: var VkDeferredOperationKHR) = handle = VkDeferredOperationKHR(0) -proc `==`*(a, b: VkDeferredOperationKHR): bool = uint(a) == uint(b) -proc `$`*(handle: VkPrivateDataSlot): string = "VkPrivateDataSlot(" & $(uint(handle)) & ")" -proc Valid*(handle: VkPrivateDataSlot): bool = uint(handle) != 0 -proc Reset*(handle: var VkPrivateDataSlot) = handle = VkPrivateDataSlot(0) -proc `==`*(a, b: VkPrivateDataSlot): bool = uint(a) == uint(b) -proc `$`*(handle: VkCuModuleNVX): string = "VkCuModuleNVX(" & $(uint(handle)) & ")" -proc Valid*(handle: VkCuModuleNVX): bool = uint(handle) != 0 -proc Reset*(handle: var VkCuModuleNVX) = handle = VkCuModuleNVX(0) -proc `==`*(a, b: VkCuModuleNVX): bool = uint(a) == uint(b) -proc `$`*(handle: VkCuFunctionNVX): string = "VkCuFunctionNVX(" & $(uint(handle)) & ")" -proc Valid*(handle: VkCuFunctionNVX): bool = uint(handle) != 0 -proc Reset*(handle: var VkCuFunctionNVX) = handle = VkCuFunctionNVX(0) -proc `==`*(a, b: VkCuFunctionNVX): bool = uint(a) == uint(b) -proc `$`*(handle: VkOpticalFlowSessionNV): string = "VkOpticalFlowSessionNV(" & $(uint(handle)) & ")" -proc Valid*(handle: VkOpticalFlowSessionNV): bool = uint(handle) != 0 -proc Reset*(handle: var VkOpticalFlowSessionNV) = handle = VkOpticalFlowSessionNV(0) -proc `==`*(a, b: VkOpticalFlowSessionNV): bool = uint(a) == uint(b) -proc `$`*(handle: VkMicromapEXT): string = "VkMicromapEXT(" & $(uint(handle)) & ")" -proc Valid*(handle: VkMicromapEXT): bool = uint(handle) != 0 -proc Reset*(handle: var VkMicromapEXT) = handle = VkMicromapEXT(0) -proc `==`*(a, b: VkMicromapEXT): bool = uint(a) == uint(b) -proc `$`*(handle: VkDisplayKHR): string = "VkDisplayKHR(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDisplayKHR): bool = uint(handle) != 0 -proc Reset*(handle: var VkDisplayKHR) = handle = VkDisplayKHR(0) -proc `==`*(a, b: VkDisplayKHR): bool = uint(a) == uint(b) -proc `$`*(handle: VkDisplayModeKHR): string = "VkDisplayModeKHR(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDisplayModeKHR): bool = uint(handle) != 0 -proc Reset*(handle: var VkDisplayModeKHR) = handle = VkDisplayModeKHR(0) -proc `==`*(a, b: VkDisplayModeKHR): bool = uint(a) == uint(b) -proc `$`*(handle: VkSurfaceKHR): string = "VkSurfaceKHR(" & $(uint(handle)) & ")" -proc Valid*(handle: VkSurfaceKHR): bool = uint(handle) != 0 -proc Reset*(handle: var VkSurfaceKHR) = handle = VkSurfaceKHR(0) -proc `==`*(a, b: VkSurfaceKHR): bool = uint(a) == uint(b) -proc `$`*(handle: VkSwapchainKHR): string = "VkSwapchainKHR(" & $(uint(handle)) & ")" -proc Valid*(handle: VkSwapchainKHR): bool = uint(handle) != 0 -proc Reset*(handle: var VkSwapchainKHR) = handle = VkSwapchainKHR(0) -proc `==`*(a, b: VkSwapchainKHR): bool = uint(a) == uint(b) -proc `$`*(handle: VkDebugReportCallbackEXT): string = "VkDebugReportCallbackEXT(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDebugReportCallbackEXT): bool = uint(handle) != 0 -proc Reset*(handle: var VkDebugReportCallbackEXT) = handle = VkDebugReportCallbackEXT(0) -proc `==`*(a, b: VkDebugReportCallbackEXT): bool = uint(a) == uint(b) -proc `$`*(handle: VkDebugUtilsMessengerEXT): string = "VkDebugUtilsMessengerEXT(" & $(uint(handle)) & ")" -proc Valid*(handle: VkDebugUtilsMessengerEXT): bool = uint(handle) != 0 -proc Reset*(handle: var VkDebugUtilsMessengerEXT) = handle = VkDebugUtilsMessengerEXT(0) -proc `==`*(a, b: VkDebugUtilsMessengerEXT): bool = uint(a) == uint(b) -proc `$`*(handle: VkVideoSessionKHR): string = "VkVideoSessionKHR(" & $(uint(handle)) & ")" -proc Valid*(handle: VkVideoSessionKHR): bool = uint(handle) != 0 -proc Reset*(handle: var VkVideoSessionKHR) = handle = VkVideoSessionKHR(0) -proc `==`*(a, b: VkVideoSessionKHR): bool = uint(a) == uint(b) -proc `$`*(handle: VkVideoSessionParametersKHR): string = "VkVideoSessionParametersKHR(" & $(uint(handle)) & ")" -proc Valid*(handle: VkVideoSessionParametersKHR): bool = uint(handle) != 0 -proc Reset*(handle: var VkVideoSessionParametersKHR) = handle = VkVideoSessionParametersKHR(0) -proc `==`*(a, b: VkVideoSessionParametersKHR): bool = uint(a) == uint(b) -proc `$`*(handle: VkSemaphoreSciSyncPoolNV): string = "VkSemaphoreSciSyncPoolNV(" & $(uint(handle)) & ")" -proc Valid*(handle: VkSemaphoreSciSyncPoolNV): bool = uint(handle) != 0 -proc Reset*(handle: var VkSemaphoreSciSyncPoolNV) = handle = VkSemaphoreSciSyncPoolNV(0) -proc `==`*(a, b: VkSemaphoreSciSyncPoolNV): bool = uint(a) == uint(b) -type - VkFramebufferCreateFlags* = distinct VkFlags - VkQueryPoolCreateFlags* = distinct VkFlags - VkRenderPassCreateFlags* = distinct VkFlags - VkSamplerCreateFlags* = distinct VkFlags - VkPipelineLayoutCreateFlags* = distinct VkFlags - VkPipelineCacheCreateFlags* = distinct VkFlags - VkPipelineDepthStencilStateCreateFlags* = distinct VkFlags - VkPipelineDynamicStateCreateFlags* = distinct VkFlags - VkPipelineColorBlendStateCreateFlags* = distinct VkFlags - VkPipelineMultisampleStateCreateFlags* = distinct VkFlags - VkPipelineRasterizationStateCreateFlags* = distinct VkFlags - VkPipelineViewportStateCreateFlags* = distinct VkFlags - VkPipelineTessellationStateCreateFlags* = distinct VkFlags - VkPipelineInputAssemblyStateCreateFlags* = distinct VkFlags - VkPipelineVertexInputStateCreateFlags* = distinct VkFlags - VkPipelineShaderStageCreateFlags* = distinct VkFlags - VkDescriptorSetLayoutCreateFlags* = distinct VkFlags - VkBufferViewCreateFlags* = distinct VkFlags - VkInstanceCreateFlags* = distinct VkFlags - VkDeviceCreateFlags* = distinct VkFlags - VkDeviceQueueCreateFlags* = distinct VkFlags - VkQueueFlags* = distinct VkFlags - VkMemoryPropertyFlags* = distinct VkFlags - VkMemoryHeapFlags* = distinct VkFlags - VkAccessFlags* = distinct VkFlags - VkBufferUsageFlags* = distinct VkFlags - VkBufferCreateFlags* = distinct VkFlags - VkShaderStageFlags* = distinct VkFlags - VkImageUsageFlags* = distinct VkFlags - VkImageCreateFlags* = distinct VkFlags - VkImageViewCreateFlags* = distinct VkFlags - VkPipelineCreateFlags* = distinct VkFlags - VkColorComponentFlags* = distinct VkFlags - VkFenceCreateFlags* = distinct VkFlags - VkSemaphoreCreateFlags* = distinct VkFlags - VkFormatFeatureFlags* = distinct VkFlags - VkQueryControlFlags* = distinct VkFlags - VkQueryResultFlags* = distinct VkFlags - VkShaderModuleCreateFlags* = distinct VkFlags - VkEventCreateFlags* = distinct VkFlags - VkCommandPoolCreateFlags* = distinct VkFlags - VkCommandPoolResetFlags* = distinct VkFlags - VkCommandBufferResetFlags* = distinct VkFlags - VkCommandBufferUsageFlags* = distinct VkFlags - VkQueryPipelineStatisticFlags* = distinct VkFlags - VkMemoryMapFlags* = distinct VkFlags - VkImageAspectFlags* = distinct VkFlags - VkSparseMemoryBindFlags* = distinct VkFlags - VkSparseImageFormatFlags* = distinct VkFlags - VkSubpassDescriptionFlags* = distinct VkFlags - VkPipelineStageFlags* = distinct VkFlags - VkSampleCountFlags* = distinct VkFlags - VkAttachmentDescriptionFlags* = distinct VkFlags - VkStencilFaceFlags* = distinct VkFlags - VkCullModeFlags* = distinct VkFlags - VkDescriptorPoolCreateFlags* = distinct VkFlags - VkDescriptorPoolResetFlags* = distinct VkFlags - VkDependencyFlags* = distinct VkFlags - VkSubgroupFeatureFlags* = distinct VkFlags - VkIndirectCommandsLayoutUsageFlagsNV* = distinct VkFlags - VkIndirectStateFlagsNV* = distinct VkFlags - VkGeometryFlagsKHR* = distinct VkFlags - VkGeometryInstanceFlagsKHR* = distinct VkFlags - VkBuildAccelerationStructureFlagsKHR* = distinct VkFlags - VkPrivateDataSlotCreateFlags* = distinct VkFlags - VkAccelerationStructureCreateFlagsKHR* = distinct VkFlags - VkDescriptorUpdateTemplateCreateFlags* = distinct VkFlags - VkPipelineCreationFeedbackFlags* = distinct VkFlags - VkPerformanceCounterDescriptionFlagsKHR* = distinct VkFlags - VkAcquireProfilingLockFlagsKHR* = distinct VkFlags - VkSemaphoreWaitFlags* = distinct VkFlags - VkPipelineCompilerControlFlagsAMD* = distinct VkFlags - VkShaderCorePropertiesFlagsAMD* = distinct VkFlags - VkDeviceDiagnosticsConfigFlagsNV* = distinct VkFlags - VkRefreshObjectFlagsKHR* = distinct VkFlags - VkAccessFlags2* = distinct VkFlags64 - VkPipelineStageFlags2* = distinct VkFlags64 - VkAccelerationStructureMotionInfoFlagsNV* = distinct VkFlags - VkAccelerationStructureMotionInstanceFlagsNV* = distinct VkFlags - VkFormatFeatureFlags2* = distinct VkFlags64 - VkRenderingFlags* = distinct VkFlags - VkMemoryDecompressionMethodFlagsNV* = distinct VkFlags64 - VkBuildMicromapFlagsEXT* = distinct VkFlags - VkMicromapCreateFlagsEXT* = distinct VkFlags - VkDirectDriverLoadingFlagsLUNARG* = distinct VkFlags - VkCompositeAlphaFlagsKHR* = distinct VkFlags - VkDisplayPlaneAlphaFlagsKHR* = distinct VkFlags - VkSurfaceTransformFlagsKHR* = distinct VkFlags - VkSwapchainCreateFlagsKHR* = distinct VkFlags - VkDisplayModeCreateFlagsKHR* = distinct VkFlags - VkDisplaySurfaceCreateFlagsKHR* = distinct VkFlags - VkAndroidSurfaceCreateFlagsKHR* = distinct VkFlags - VkViSurfaceCreateFlagsNN* = distinct VkFlags - VkWaylandSurfaceCreateFlagsKHR* = distinct VkFlags - VkWin32SurfaceCreateFlagsKHR* = distinct VkFlags - VkXlibSurfaceCreateFlagsKHR* = distinct VkFlags - VkXcbSurfaceCreateFlagsKHR* = distinct VkFlags - VkDirectFBSurfaceCreateFlagsEXT* = distinct VkFlags - VkIOSSurfaceCreateFlagsMVK* = distinct VkFlags - VkMacOSSurfaceCreateFlagsMVK* = distinct VkFlags - VkMetalSurfaceCreateFlagsEXT* = distinct VkFlags - VkImagePipeSurfaceCreateFlagsFUCHSIA* = distinct VkFlags - VkStreamDescriptorSurfaceCreateFlagsGGP* = distinct VkFlags - VkHeadlessSurfaceCreateFlagsEXT* = distinct VkFlags - VkScreenSurfaceCreateFlagsQNX* = distinct VkFlags - VkPeerMemoryFeatureFlags* = distinct VkFlags - VkMemoryAllocateFlags* = distinct VkFlags - VkDeviceGroupPresentModeFlagsKHR* = distinct VkFlags - VkDebugReportFlagsEXT* = distinct VkFlags - VkCommandPoolTrimFlags* = distinct VkFlags - VkExternalMemoryHandleTypeFlagsNV* = distinct VkFlags - VkExternalMemoryFeatureFlagsNV* = distinct VkFlags - VkExternalMemoryHandleTypeFlags* = distinct VkFlags - VkExternalMemoryFeatureFlags* = distinct VkFlags - VkExternalSemaphoreHandleTypeFlags* = distinct VkFlags - VkExternalSemaphoreFeatureFlags* = distinct VkFlags - VkSemaphoreImportFlags* = distinct VkFlags - VkExternalFenceHandleTypeFlags* = distinct VkFlags - VkExternalFenceFeatureFlags* = distinct VkFlags - VkFenceImportFlags* = distinct VkFlags - VkSurfaceCounterFlagsEXT* = distinct VkFlags - VkPipelineViewportSwizzleStateCreateFlagsNV* = distinct VkFlags - VkPipelineDiscardRectangleStateCreateFlagsEXT* = distinct VkFlags - VkPipelineCoverageToColorStateCreateFlagsNV* = distinct VkFlags - VkPipelineCoverageModulationStateCreateFlagsNV* = distinct VkFlags - VkPipelineCoverageReductionStateCreateFlagsNV* = distinct VkFlags - VkValidationCacheCreateFlagsEXT* = distinct VkFlags - VkDebugUtilsMessageSeverityFlagsEXT* = distinct VkFlags - VkDebugUtilsMessageTypeFlagsEXT* = distinct VkFlags - VkDebugUtilsMessengerCreateFlagsEXT* = distinct VkFlags - VkDebugUtilsMessengerCallbackDataFlagsEXT* = distinct VkFlags - VkDeviceMemoryReportFlagsEXT* = distinct VkFlags - VkPipelineRasterizationConservativeStateCreateFlagsEXT* = distinct VkFlags - VkDescriptorBindingFlags* = distinct VkFlags - VkConditionalRenderingFlagsEXT* = distinct VkFlags - VkResolveModeFlags* = distinct VkFlags - VkPipelineRasterizationStateStreamCreateFlagsEXT* = distinct VkFlags - VkPipelineRasterizationDepthClipStateCreateFlagsEXT* = distinct VkFlags - VkSwapchainImageUsageFlagsANDROID* = distinct VkFlags - VkToolPurposeFlags* = distinct VkFlags - VkSubmitFlags* = distinct VkFlags - VkImageFormatConstraintsFlagsFUCHSIA* = distinct VkFlags - VkImageConstraintsInfoFlagsFUCHSIA* = distinct VkFlags - VkGraphicsPipelineLibraryFlagsEXT* = distinct VkFlags - VkImageCompressionFlagsEXT* = distinct VkFlags - VkImageCompressionFixedRateFlagsEXT* = distinct VkFlags - VkExportMetalObjectTypeFlagsEXT* = distinct VkFlags - VkDeviceAddressBindingFlagsEXT* = distinct VkFlags - VkOpticalFlowGridSizeFlagsNV* = distinct VkFlags - VkOpticalFlowUsageFlagsNV* = distinct VkFlags - VkOpticalFlowSessionCreateFlagsNV* = distinct VkFlags - VkOpticalFlowExecuteFlagsNV* = distinct VkFlags - VkPresentScalingFlagsEXT* = distinct VkFlags - VkPresentGravityFlagsEXT* = distinct VkFlags - VkVideoCodecOperationFlagsKHR* = distinct VkFlags - VkVideoCapabilityFlagsKHR* = distinct VkFlags - VkVideoSessionCreateFlagsKHR* = distinct VkFlags - VkVideoSessionParametersCreateFlagsKHR* = distinct VkFlags - VkVideoBeginCodingFlagsKHR* = distinct VkFlags - VkVideoEndCodingFlagsKHR* = distinct VkFlags - VkVideoCodingControlFlagsKHR* = distinct VkFlags - VkVideoDecodeUsageFlagsKHR* = distinct VkFlags - VkVideoDecodeCapabilityFlagsKHR* = distinct VkFlags - VkVideoDecodeFlagsKHR* = distinct VkFlags - VkVideoDecodeH264PictureLayoutFlagsKHR* = distinct VkFlags - VkVideoEncodeFlagsKHR* = distinct VkFlags - VkVideoEncodeUsageFlagsKHR* = distinct VkFlags - VkVideoEncodeContentFlagsKHR* = distinct VkFlags - VkVideoEncodeCapabilityFlagsKHR* = distinct VkFlags - VkVideoEncodeRateControlFlagsKHR* = distinct VkFlags - VkVideoEncodeRateControlModeFlagsKHR* = distinct VkFlags - VkVideoChromaSubsamplingFlagsKHR* = distinct VkFlags - VkVideoComponentBitDepthFlagsKHR* = distinct VkFlags - VkVideoEncodeH264CapabilityFlagsEXT* = distinct VkFlags - VkVideoEncodeH264InputModeFlagsEXT* = distinct VkFlags - VkVideoEncodeH264OutputModeFlagsEXT* = distinct VkFlags - VkVideoEncodeH265CapabilityFlagsEXT* = distinct VkFlags - VkVideoEncodeH265InputModeFlagsEXT* = distinct VkFlags - VkVideoEncodeH265OutputModeFlagsEXT* = distinct VkFlags - VkVideoEncodeH265CtbSizeFlagsEXT* = distinct VkFlags - VkVideoEncodeH265TransformBlockSizeFlagsEXT* = distinct VkFlags -let vkGetInstanceProcAddr = cast[proc(instance: VkInstance, name: cstring): pointer {.stdcall.}](checkedSymAddr(vulkanLib, "vkGetInstanceProcAddr")) -type - VkImageLayout* {.size: sizeof(cint).} = enum - VK_IMAGE_LAYOUT_UNDEFINED = 0 - VK_IMAGE_LAYOUT_GENERAL = 1 - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2 - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3 - VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4 - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5 - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6 - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7 - VK_IMAGE_LAYOUT_PREINITIALIZED = 8 - VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002 - VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000 - VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001 - VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002 - VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000 - VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000 - VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001 - VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR = 1000164003 - VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000 - VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000 - VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001 - VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002 - VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003 - VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR = 1000299000 - VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR = 1000299001 - VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002 - VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL = 1000314000 - VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL = 1000314001 - VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT = 1000339000 - VkAttachmentLoadOp* {.size: sizeof(cint).} = enum - VK_ATTACHMENT_LOAD_OP_LOAD = 0 - VK_ATTACHMENT_LOAD_OP_CLEAR = 1 - VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2 - VK_ATTACHMENT_LOAD_OP_NONE_EXT = 1000400000 - VkAttachmentStoreOp* {.size: sizeof(cint).} = enum - VK_ATTACHMENT_STORE_OP_STORE = 0 - VK_ATTACHMENT_STORE_OP_DONT_CARE = 1 - VK_ATTACHMENT_STORE_OP_NONE = 1000301000 - VkImageType* {.size: sizeof(cint).} = enum - VK_IMAGE_TYPE_1D = 0 - VK_IMAGE_TYPE_2D = 1 - VK_IMAGE_TYPE_3D = 2 - VkImageTiling* {.size: sizeof(cint).} = enum - VK_IMAGE_TILING_OPTIMAL = 0 - VK_IMAGE_TILING_LINEAR = 1 - VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT = 1000158000 - VkImageViewType* {.size: sizeof(cint).} = enum - VK_IMAGE_VIEW_TYPE_1D = 0 - VK_IMAGE_VIEW_TYPE_2D = 1 - VK_IMAGE_VIEW_TYPE_3D = 2 - VK_IMAGE_VIEW_TYPE_CUBE = 3 - VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4 - VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5 - VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6 - VkCommandBufferLevel* {.size: sizeof(cint).} = enum - VK_COMMAND_BUFFER_LEVEL_PRIMARY = 0 - VK_COMMAND_BUFFER_LEVEL_SECONDARY = 1 - VkComponentSwizzle* {.size: sizeof(cint).} = enum - VK_COMPONENT_SWIZZLE_IDENTITY = 0 - VK_COMPONENT_SWIZZLE_ZERO = 1 - VK_COMPONENT_SWIZZLE_ONE = 2 - VK_COMPONENT_SWIZZLE_R = 3 - VK_COMPONENT_SWIZZLE_G = 4 - VK_COMPONENT_SWIZZLE_B = 5 - VK_COMPONENT_SWIZZLE_A = 6 - VkDescriptorType* {.size: sizeof(cint).} = enum - VK_DESCRIPTOR_TYPE_SAMPLER = 0 - VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = 1 - VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = 2 - VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = 3 - VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = 4 - VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = 5 - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = 6 - VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = 7 - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 8 - VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 9 - VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 10 - VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK = 1000138000 - VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000 - VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000 - VK_DESCRIPTOR_TYPE_MUTABLE_EXT = 1000351000 - VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM = 1000440000 - VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM = 1000440001 - VkQueryType* {.size: sizeof(cint).} = enum - VK_QUERY_TYPE_OCCLUSION = 0 - VK_QUERY_TYPE_PIPELINE_STATISTICS = 1 - VK_QUERY_TYPE_TIMESTAMP = 2 - VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR = 1000023000 - VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004 - VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000 - VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000 - VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR = 1000150001 - VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV = 1000165000 - VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL = 1000210000 - VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR = 1000299000 - VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT = 1000328000 - VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT = 1000382000 - VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR = 1000386000 - VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR = 1000386001 - VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT = 1000396000 - VK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT = 1000396001 - VkBorderColor* {.size: sizeof(cint).} = enum - VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0 - VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = 1 - VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = 2 - VK_BORDER_COLOR_INT_OPAQUE_BLACK = 3 - VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = 4 - VK_BORDER_COLOR_INT_OPAQUE_WHITE = 5 - VK_BORDER_COLOR_FLOAT_CUSTOM_EXT = 1000287003 - VK_BORDER_COLOR_INT_CUSTOM_EXT = 1000287004 - VkPipelineBindPoint* {.size: sizeof(cint).} = enum - VK_PIPELINE_BIND_POINT_GRAPHICS = 0 - VK_PIPELINE_BIND_POINT_COMPUTE = 1 - VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR = 1000165000 - VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI = 1000369003 - VkPipelineCacheHeaderVersion* {.size: sizeof(cint).} = enum - VK_PIPELINE_CACHE_HEADER_VERSION_ONE_ENUM = 1 - VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE_ENUM = 1000298001 - VkPipelineCacheCreateFlagBits* {.size: sizeof(cint).} = enum - VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT = 0b00000000000000000000000000000001 - VK_PIPELINE_CACHE_CREATE_RESERVED_1_BIT_EXT = 0b00000000000000000000000000000010 - VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkPipelineCacheCreateFlagBits]): VkPipelineCacheCreateFlags = - for flag in flags: - result = VkPipelineCacheCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPipelineCacheCreateFlags): seq[VkPipelineCacheCreateFlagBits] = - for value in VkPipelineCacheCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPipelineCacheCreateFlags): bool = cint(a) == cint(b) -type - VkPrimitiveTopology* {.size: sizeof(cint).} = enum - VK_PRIMITIVE_TOPOLOGY_POINT_LIST = 0 - VK_PRIMITIVE_TOPOLOGY_LINE_LIST = 1 - VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = 2 - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = 3 - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = 4 - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = 5 - VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY = 6 - VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY = 7 - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY = 8 - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY = 9 - VK_PRIMITIVE_TOPOLOGY_PATCH_LIST = 10 - VkSharingMode* {.size: sizeof(cint).} = enum - VK_SHARING_MODE_EXCLUSIVE = 0 - VK_SHARING_MODE_CONCURRENT = 1 - VkIndexType* {.size: sizeof(cint).} = enum - VK_INDEX_TYPE_UINT16 = 0 - VK_INDEX_TYPE_UINT32 = 1 - VK_INDEX_TYPE_NONE_KHR = 1000165000 - VK_INDEX_TYPE_UINT8_EXT = 1000265000 - VkFilter* {.size: sizeof(cint).} = enum - VK_FILTER_NEAREST = 0 - VK_FILTER_LINEAR = 1 - VK_FILTER_CUBIC_EXT = 1000015000 - VkSamplerMipmapMode* {.size: sizeof(cint).} = enum - VK_SAMPLER_MIPMAP_MODE_NEAREST = 0 - VK_SAMPLER_MIPMAP_MODE_LINEAR = 1 - VkSamplerAddressMode* {.size: sizeof(cint).} = enum - VK_SAMPLER_ADDRESS_MODE_REPEAT = 0 - VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1 - VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2 - VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3 - VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4 - VkCompareOp* {.size: sizeof(cint).} = enum - VK_COMPARE_OP_NEVER = 0 - VK_COMPARE_OP_LESS = 1 - VK_COMPARE_OP_EQUAL = 2 - VK_COMPARE_OP_LESS_OR_EQUAL = 3 - VK_COMPARE_OP_GREATER = 4 - VK_COMPARE_OP_NOT_EQUAL = 5 - VK_COMPARE_OP_GREATER_OR_EQUAL = 6 - VK_COMPARE_OP_ALWAYS = 7 - VkPolygonMode* {.size: sizeof(cint).} = enum - VK_POLYGON_MODE_FILL = 0 - VK_POLYGON_MODE_LINE = 1 - VK_POLYGON_MODE_POINT = 2 - VK_POLYGON_MODE_FILL_RECTANGLE_NV = 1000153000 - VkFrontFace* {.size: sizeof(cint).} = enum - VK_FRONT_FACE_COUNTER_CLOCKWISE = 0 - VK_FRONT_FACE_CLOCKWISE = 1 - VkBlendFactor* {.size: sizeof(cint).} = enum - VK_BLEND_FACTOR_ZERO = 0 - VK_BLEND_FACTOR_ONE = 1 - VK_BLEND_FACTOR_SRC_COLOR = 2 - VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR = 3 - VK_BLEND_FACTOR_DST_COLOR = 4 - VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR = 5 - VK_BLEND_FACTOR_SRC_ALPHA = 6 - VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA = 7 - VK_BLEND_FACTOR_DST_ALPHA = 8 - VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA = 9 - VK_BLEND_FACTOR_CONSTANT_COLOR = 10 - VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR = 11 - VK_BLEND_FACTOR_CONSTANT_ALPHA = 12 - VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA = 13 - VK_BLEND_FACTOR_SRC_ALPHA_SATURATE = 14 - VK_BLEND_FACTOR_SRC1_COLOR = 15 - VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR = 16 - VK_BLEND_FACTOR_SRC1_ALPHA = 17 - VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA = 18 - VkBlendOp* {.size: sizeof(cint).} = enum - VK_BLEND_OP_ADD = 0 - VK_BLEND_OP_SUBTRACT = 1 - VK_BLEND_OP_REVERSE_SUBTRACT = 2 - VK_BLEND_OP_MIN = 3 - VK_BLEND_OP_MAX = 4 - VK_BLEND_OP_ZERO_EXT = 1000148000 - VK_BLEND_OP_SRC_EXT = 1000148001 - VK_BLEND_OP_DST_EXT = 1000148002 - VK_BLEND_OP_SRC_OVER_EXT = 1000148003 - VK_BLEND_OP_DST_OVER_EXT = 1000148004 - VK_BLEND_OP_SRC_IN_EXT = 1000148005 - VK_BLEND_OP_DST_IN_EXT = 1000148006 - VK_BLEND_OP_SRC_OUT_EXT = 1000148007 - VK_BLEND_OP_DST_OUT_EXT = 1000148008 - VK_BLEND_OP_SRC_ATOP_EXT = 1000148009 - VK_BLEND_OP_DST_ATOP_EXT = 1000148010 - VK_BLEND_OP_XOR_EXT = 1000148011 - VK_BLEND_OP_MULTIPLY_EXT = 1000148012 - VK_BLEND_OP_SCREEN_EXT = 1000148013 - VK_BLEND_OP_OVERLAY_EXT = 1000148014 - VK_BLEND_OP_DARKEN_EXT = 1000148015 - VK_BLEND_OP_LIGHTEN_EXT = 1000148016 - VK_BLEND_OP_COLORDODGE_EXT = 1000148017 - VK_BLEND_OP_COLORBURN_EXT = 1000148018 - VK_BLEND_OP_HARDLIGHT_EXT = 1000148019 - VK_BLEND_OP_SOFTLIGHT_EXT = 1000148020 - VK_BLEND_OP_DIFFERENCE_EXT = 1000148021 - VK_BLEND_OP_EXCLUSION_EXT = 1000148022 - VK_BLEND_OP_INVERT_EXT = 1000148023 - VK_BLEND_OP_INVERT_RGB_EXT = 1000148024 - VK_BLEND_OP_LINEARDODGE_EXT = 1000148025 - VK_BLEND_OP_LINEARBURN_EXT = 1000148026 - VK_BLEND_OP_VIVIDLIGHT_EXT = 1000148027 - VK_BLEND_OP_LINEARLIGHT_EXT = 1000148028 - VK_BLEND_OP_PINLIGHT_EXT = 1000148029 - VK_BLEND_OP_HARDMIX_EXT = 1000148030 - VK_BLEND_OP_HSL_HUE_EXT = 1000148031 - VK_BLEND_OP_HSL_SATURATION_EXT = 1000148032 - VK_BLEND_OP_HSL_COLOR_EXT = 1000148033 - VK_BLEND_OP_HSL_LUMINOSITY_EXT = 1000148034 - VK_BLEND_OP_PLUS_EXT = 1000148035 - VK_BLEND_OP_PLUS_CLAMPED_EXT = 1000148036 - VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT = 1000148037 - VK_BLEND_OP_PLUS_DARKER_EXT = 1000148038 - VK_BLEND_OP_MINUS_EXT = 1000148039 - VK_BLEND_OP_MINUS_CLAMPED_EXT = 1000148040 - VK_BLEND_OP_CONTRAST_EXT = 1000148041 - VK_BLEND_OP_INVERT_OVG_EXT = 1000148042 - VK_BLEND_OP_RED_EXT = 1000148043 - VK_BLEND_OP_GREEN_EXT = 1000148044 - VK_BLEND_OP_BLUE_EXT = 1000148045 - VkStencilOp* {.size: sizeof(cint).} = enum - VK_STENCIL_OP_KEEP = 0 - VK_STENCIL_OP_ZERO = 1 - VK_STENCIL_OP_REPLACE = 2 - VK_STENCIL_OP_INCREMENT_AND_CLAMP = 3 - VK_STENCIL_OP_DECREMENT_AND_CLAMP = 4 - VK_STENCIL_OP_INVERT = 5 - VK_STENCIL_OP_INCREMENT_AND_WRAP = 6 - VK_STENCIL_OP_DECREMENT_AND_WRAP = 7 - VkLogicOp* {.size: sizeof(cint).} = enum - VK_LOGIC_OP_CLEAR = 0 - VK_LOGIC_OP_AND = 1 - VK_LOGIC_OP_AND_REVERSE = 2 - VK_LOGIC_OP_COPY = 3 - VK_LOGIC_OP_AND_INVERTED = 4 - VK_LOGIC_OP_NO_OP = 5 - VK_LOGIC_OP_XOR = 6 - VK_LOGIC_OP_OR = 7 - VK_LOGIC_OP_NOR = 8 - VK_LOGIC_OP_EQUIVALENT = 9 - VK_LOGIC_OP_INVERT = 10 - VK_LOGIC_OP_OR_REVERSE = 11 - VK_LOGIC_OP_COPY_INVERTED = 12 - VK_LOGIC_OP_OR_INVERTED = 13 - VK_LOGIC_OP_NAND = 14 - VK_LOGIC_OP_SET = 15 - VkInternalAllocationType* {.size: sizeof(cint).} = enum - VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE = 0 - VkSystemAllocationScope* {.size: sizeof(cint).} = enum - VK_SYSTEM_ALLOCATION_SCOPE_COMMAND = 0 - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT = 1 - VK_SYSTEM_ALLOCATION_SCOPE_CACHE = 2 - VK_SYSTEM_ALLOCATION_SCOPE_DEVICE = 3 - VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE = 4 - VkPhysicalDeviceType* {.size: sizeof(cint).} = enum - VK_PHYSICAL_DEVICE_TYPE_OTHER = 0 - VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = 1 - VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = 2 - VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = 3 - VK_PHYSICAL_DEVICE_TYPE_CPU = 4 - VkVertexInputRate* {.size: sizeof(cint).} = enum - VK_VERTEX_INPUT_RATE_VERTEX = 0 - VK_VERTEX_INPUT_RATE_INSTANCE = 1 - VkFormat* {.size: sizeof(cint).} = enum - VK_FORMAT_UNDEFINED = 0 - VK_FORMAT_R4G4_UNORM_PACK8 = 1 - VK_FORMAT_R4G4B4A4_UNORM_PACK16 = 2 - VK_FORMAT_B4G4R4A4_UNORM_PACK16 = 3 - VK_FORMAT_R5G6B5_UNORM_PACK16 = 4 - VK_FORMAT_B5G6R5_UNORM_PACK16 = 5 - VK_FORMAT_R5G5B5A1_UNORM_PACK16 = 6 - VK_FORMAT_B5G5R5A1_UNORM_PACK16 = 7 - VK_FORMAT_A1R5G5B5_UNORM_PACK16 = 8 - VK_FORMAT_R8_UNORM = 9 - VK_FORMAT_R8_SNORM = 10 - VK_FORMAT_R8_USCALED = 11 - VK_FORMAT_R8_SSCALED = 12 - VK_FORMAT_R8_UINT = 13 - VK_FORMAT_R8_SINT = 14 - VK_FORMAT_R8_SRGB = 15 - VK_FORMAT_R8G8_UNORM = 16 - VK_FORMAT_R8G8_SNORM = 17 - VK_FORMAT_R8G8_USCALED = 18 - VK_FORMAT_R8G8_SSCALED = 19 - VK_FORMAT_R8G8_UINT = 20 - VK_FORMAT_R8G8_SINT = 21 - VK_FORMAT_R8G8_SRGB = 22 - VK_FORMAT_R8G8B8_UNORM = 23 - VK_FORMAT_R8G8B8_SNORM = 24 - VK_FORMAT_R8G8B8_USCALED = 25 - VK_FORMAT_R8G8B8_SSCALED = 26 - VK_FORMAT_R8G8B8_UINT = 27 - VK_FORMAT_R8G8B8_SINT = 28 - VK_FORMAT_R8G8B8_SRGB = 29 - VK_FORMAT_B8G8R8_UNORM = 30 - VK_FORMAT_B8G8R8_SNORM = 31 - VK_FORMAT_B8G8R8_USCALED = 32 - VK_FORMAT_B8G8R8_SSCALED = 33 - VK_FORMAT_B8G8R8_UINT = 34 - VK_FORMAT_B8G8R8_SINT = 35 - VK_FORMAT_B8G8R8_SRGB = 36 - VK_FORMAT_R8G8B8A8_UNORM = 37 - VK_FORMAT_R8G8B8A8_SNORM = 38 - VK_FORMAT_R8G8B8A8_USCALED = 39 - VK_FORMAT_R8G8B8A8_SSCALED = 40 - VK_FORMAT_R8G8B8A8_UINT = 41 - VK_FORMAT_R8G8B8A8_SINT = 42 - VK_FORMAT_R8G8B8A8_SRGB = 43 - VK_FORMAT_B8G8R8A8_UNORM = 44 - VK_FORMAT_B8G8R8A8_SNORM = 45 - VK_FORMAT_B8G8R8A8_USCALED = 46 - VK_FORMAT_B8G8R8A8_SSCALED = 47 - VK_FORMAT_B8G8R8A8_UINT = 48 - VK_FORMAT_B8G8R8A8_SINT = 49 - VK_FORMAT_B8G8R8A8_SRGB = 50 - VK_FORMAT_A8B8G8R8_UNORM_PACK32 = 51 - VK_FORMAT_A8B8G8R8_SNORM_PACK32 = 52 - VK_FORMAT_A8B8G8R8_USCALED_PACK32 = 53 - VK_FORMAT_A8B8G8R8_SSCALED_PACK32 = 54 - VK_FORMAT_A8B8G8R8_UINT_PACK32 = 55 - VK_FORMAT_A8B8G8R8_SINT_PACK32 = 56 - VK_FORMAT_A8B8G8R8_SRGB_PACK32 = 57 - VK_FORMAT_A2R10G10B10_UNORM_PACK32 = 58 - VK_FORMAT_A2R10G10B10_SNORM_PACK32 = 59 - VK_FORMAT_A2R10G10B10_USCALED_PACK32 = 60 - VK_FORMAT_A2R10G10B10_SSCALED_PACK32 = 61 - VK_FORMAT_A2R10G10B10_UINT_PACK32 = 62 - VK_FORMAT_A2R10G10B10_SINT_PACK32 = 63 - VK_FORMAT_A2B10G10R10_UNORM_PACK32 = 64 - VK_FORMAT_A2B10G10R10_SNORM_PACK32 = 65 - VK_FORMAT_A2B10G10R10_USCALED_PACK32 = 66 - VK_FORMAT_A2B10G10R10_SSCALED_PACK32 = 67 - VK_FORMAT_A2B10G10R10_UINT_PACK32 = 68 - VK_FORMAT_A2B10G10R10_SINT_PACK32 = 69 - VK_FORMAT_R16_UNORM = 70 - VK_FORMAT_R16_SNORM = 71 - VK_FORMAT_R16_USCALED = 72 - VK_FORMAT_R16_SSCALED = 73 - VK_FORMAT_R16_UINT = 74 - VK_FORMAT_R16_SINT = 75 - VK_FORMAT_R16_SFLOAT = 76 - VK_FORMAT_R16G16_UNORM = 77 - VK_FORMAT_R16G16_SNORM = 78 - VK_FORMAT_R16G16_USCALED = 79 - VK_FORMAT_R16G16_SSCALED = 80 - VK_FORMAT_R16G16_UINT = 81 - VK_FORMAT_R16G16_SINT = 82 - VK_FORMAT_R16G16_SFLOAT = 83 - VK_FORMAT_R16G16B16_UNORM = 84 - VK_FORMAT_R16G16B16_SNORM = 85 - VK_FORMAT_R16G16B16_USCALED = 86 - VK_FORMAT_R16G16B16_SSCALED = 87 - VK_FORMAT_R16G16B16_UINT = 88 - VK_FORMAT_R16G16B16_SINT = 89 - VK_FORMAT_R16G16B16_SFLOAT = 90 - VK_FORMAT_R16G16B16A16_UNORM = 91 - VK_FORMAT_R16G16B16A16_SNORM = 92 - VK_FORMAT_R16G16B16A16_USCALED = 93 - VK_FORMAT_R16G16B16A16_SSCALED = 94 - VK_FORMAT_R16G16B16A16_UINT = 95 - VK_FORMAT_R16G16B16A16_SINT = 96 - VK_FORMAT_R16G16B16A16_SFLOAT = 97 - VK_FORMAT_R32_UINT = 98 - VK_FORMAT_R32_SINT = 99 - VK_FORMAT_R32_SFLOAT = 100 - VK_FORMAT_R32G32_UINT = 101 - VK_FORMAT_R32G32_SINT = 102 - VK_FORMAT_R32G32_SFLOAT = 103 - VK_FORMAT_R32G32B32_UINT = 104 - VK_FORMAT_R32G32B32_SINT = 105 - VK_FORMAT_R32G32B32_SFLOAT = 106 - VK_FORMAT_R32G32B32A32_UINT = 107 - VK_FORMAT_R32G32B32A32_SINT = 108 - VK_FORMAT_R32G32B32A32_SFLOAT = 109 - VK_FORMAT_R64_UINT = 110 - VK_FORMAT_R64_SINT = 111 - VK_FORMAT_R64_SFLOAT = 112 - VK_FORMAT_R64G64_UINT = 113 - VK_FORMAT_R64G64_SINT = 114 - VK_FORMAT_R64G64_SFLOAT = 115 - VK_FORMAT_R64G64B64_UINT = 116 - VK_FORMAT_R64G64B64_SINT = 117 - VK_FORMAT_R64G64B64_SFLOAT = 118 - VK_FORMAT_R64G64B64A64_UINT = 119 - VK_FORMAT_R64G64B64A64_SINT = 120 - VK_FORMAT_R64G64B64A64_SFLOAT = 121 - VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122 - VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = 123 - VK_FORMAT_D16_UNORM = 124 - VK_FORMAT_X8_D24_UNORM_PACK32 = 125 - VK_FORMAT_D32_SFLOAT = 126 - VK_FORMAT_S8_UINT = 127 - VK_FORMAT_D16_UNORM_S8_UINT = 128 - VK_FORMAT_D24_UNORM_S8_UINT = 129 - VK_FORMAT_D32_SFLOAT_S8_UINT = 130 - VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131 - VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132 - VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133 - VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134 - VK_FORMAT_BC2_UNORM_BLOCK = 135 - VK_FORMAT_BC2_SRGB_BLOCK = 136 - VK_FORMAT_BC3_UNORM_BLOCK = 137 - VK_FORMAT_BC3_SRGB_BLOCK = 138 - VK_FORMAT_BC4_UNORM_BLOCK = 139 - VK_FORMAT_BC4_SNORM_BLOCK = 140 - VK_FORMAT_BC5_UNORM_BLOCK = 141 - VK_FORMAT_BC5_SNORM_BLOCK = 142 - VK_FORMAT_BC6H_UFLOAT_BLOCK = 143 - VK_FORMAT_BC6H_SFLOAT_BLOCK = 144 - VK_FORMAT_BC7_UNORM_BLOCK = 145 - VK_FORMAT_BC7_SRGB_BLOCK = 146 - VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147 - VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = 148 - VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = 149 - VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = 150 - VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = 151 - VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = 152 - VK_FORMAT_EAC_R11_UNORM_BLOCK = 153 - VK_FORMAT_EAC_R11_SNORM_BLOCK = 154 - VK_FORMAT_EAC_R11G11_UNORM_BLOCK = 155 - VK_FORMAT_EAC_R11G11_SNORM_BLOCK = 156 - VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157 - VK_FORMAT_ASTC_4x4_SRGB_BLOCK = 158 - VK_FORMAT_ASTC_5x4_UNORM_BLOCK = 159 - VK_FORMAT_ASTC_5x4_SRGB_BLOCK = 160 - VK_FORMAT_ASTC_5x5_UNORM_BLOCK = 161 - VK_FORMAT_ASTC_5x5_SRGB_BLOCK = 162 - VK_FORMAT_ASTC_6x5_UNORM_BLOCK = 163 - VK_FORMAT_ASTC_6x5_SRGB_BLOCK = 164 - VK_FORMAT_ASTC_6x6_UNORM_BLOCK = 165 - VK_FORMAT_ASTC_6x6_SRGB_BLOCK = 166 - VK_FORMAT_ASTC_8x5_UNORM_BLOCK = 167 - VK_FORMAT_ASTC_8x5_SRGB_BLOCK = 168 - VK_FORMAT_ASTC_8x6_UNORM_BLOCK = 169 - VK_FORMAT_ASTC_8x6_SRGB_BLOCK = 170 - VK_FORMAT_ASTC_8x8_UNORM_BLOCK = 171 - VK_FORMAT_ASTC_8x8_SRGB_BLOCK = 172 - VK_FORMAT_ASTC_10x5_UNORM_BLOCK = 173 - VK_FORMAT_ASTC_10x5_SRGB_BLOCK = 174 - VK_FORMAT_ASTC_10x6_UNORM_BLOCK = 175 - VK_FORMAT_ASTC_10x6_SRGB_BLOCK = 176 - VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177 - VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178 - VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179 - VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180 - VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181 - VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182 - VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183 - VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184 - VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000 - VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001 - VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002 - VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003 - VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004 - VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005 - VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006 - VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007 - VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK = 1000066000 - VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK = 1000066001 - VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK = 1000066002 - VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK = 1000066003 - VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK = 1000066004 - VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK = 1000066005 - VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK = 1000066006 - VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK = 1000066007 - VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK = 1000066008 - VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK = 1000066009 - VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK = 1000066010 - VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK = 1000066011 - VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK = 1000066012 - VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK = 1000066013 - VK_FORMAT_G8B8G8R8_422_UNORM = 1000156000 - VK_FORMAT_B8G8R8G8_422_UNORM = 1000156001 - VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM = 1000156002 - VK_FORMAT_G8_B8R8_2PLANE_420_UNORM = 1000156003 - VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM = 1000156004 - VK_FORMAT_G8_B8R8_2PLANE_422_UNORM = 1000156005 - VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM = 1000156006 - VK_FORMAT_R10X6_UNORM_PACK16 = 1000156007 - VK_FORMAT_R10X6G10X6_UNORM_2PACK16 = 1000156008 - VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 = 1000156009 - VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 = 1000156010 - VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 = 1000156011 - VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16 = 1000156012 - VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16 = 1000156013 - VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16 = 1000156014 - VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16 = 1000156015 - VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16 = 1000156016 - VK_FORMAT_R12X4_UNORM_PACK16 = 1000156017 - VK_FORMAT_R12X4G12X4_UNORM_2PACK16 = 1000156018 - VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 = 1000156019 - VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 = 1000156020 - VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 = 1000156021 - VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16 = 1000156022 - VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16 = 1000156023 - VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16 = 1000156024 - VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16 = 1000156025 - VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16 = 1000156026 - VK_FORMAT_G16B16G16R16_422_UNORM = 1000156027 - VK_FORMAT_B16G16R16G16_422_UNORM = 1000156028 - VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM = 1000156029 - VK_FORMAT_G16_B16R16_2PLANE_420_UNORM = 1000156030 - VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM = 1000156031 - VK_FORMAT_G16_B16R16_2PLANE_422_UNORM = 1000156032 - VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM = 1000156033 - VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT = 1000288000 - VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT = 1000288001 - VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT = 1000288002 - VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT = 1000288003 - VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT = 1000288004 - VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT = 1000288005 - VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT = 1000288006 - VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT = 1000288007 - VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT = 1000288008 - VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT = 1000288009 - VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT = 1000288010 - VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT = 1000288011 - VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT = 1000288012 - VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT = 1000288013 - VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT = 1000288014 - VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT = 1000288015 - VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT = 1000288016 - VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT = 1000288017 - VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT = 1000288018 - VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT = 1000288019 - VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT = 1000288020 - VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT = 1000288021 - VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT = 1000288022 - VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT = 1000288023 - VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT = 1000288024 - VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT = 1000288025 - VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT = 1000288026 - VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT = 1000288027 - VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT = 1000288028 - VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT = 1000288029 - VK_FORMAT_G8_B8R8_2PLANE_444_UNORM = 1000330000 - VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16 = 1000330001 - VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16 = 1000330002 - VK_FORMAT_G16_B16R16_2PLANE_444_UNORM = 1000330003 - VK_FORMAT_A4R4G4B4_UNORM_PACK16 = 1000340000 - VK_FORMAT_A4B4G4R4_UNORM_PACK16 = 1000340001 - VK_FORMAT_R16G16_S10_5_NV = 1000464000 - VkStructureType* {.size: sizeof(cint).} = enum - VK_STRUCTURE_TYPE_APPLICATION_INFO = 0 - VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = 1 - VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO = 2 - VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO = 3 - VK_STRUCTURE_TYPE_SUBMIT_INFO = 4 - VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO = 5 - VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = 6 - VK_STRUCTURE_TYPE_BIND_SPARSE_INFO = 7 - VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = 8 - VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = 9 - VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = 10 - VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = 11 - VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = 12 - VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = 13 - VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = 14 - VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = 15 - VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = 16 - VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 17 - VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 18 - VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 19 - VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 20 - VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 21 - VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 22 - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO = 23 - VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 24 - VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 25 - VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 26 - VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = 27 - VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 28 - VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 29 - VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 30 - VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 31 - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 32 - VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 33 - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO = 34 - VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 35 - VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 36 - VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 37 - VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 38 - VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO = 39 - VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO = 40 - VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO = 41 - VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = 42 - VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 43 - VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 44 - VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 45 - VK_STRUCTURE_TYPE_MEMORY_BARRIER = 46 - VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO = 47 - VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO = 48 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES = 49 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES = 51 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES = 52 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES = 53 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES = 54 - VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000 - VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001 - VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR = 1000002000 - VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR = 1000002001 - VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR = 1000003000 - VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000 - VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000 - VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000 - VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR = 1000008000 - VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000 - VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID = 1000010000 - VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID = 1000010001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID = 1000010002 - VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT = 1000011000 - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD = 1000018000 - VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000 - VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001 - VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002 - VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR = 1000023000 - VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR = 1000023001 - VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR = 1000023002 - VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR = 1000023003 - VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR = 1000023004 - VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR = 1000023005 - VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000023006 - VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR = 1000023007 - VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR = 1000023008 - VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR = 1000023009 - VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR = 1000023010 - VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR = 1000023011 - VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR = 1000023012 - VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR = 1000023013 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014 - VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR = 1000023015 - VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR = 1000023016 - VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR = 1000024000 - VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR = 1000024001 - VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR = 1000024002 - VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000 - VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001 - VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT = 1000028000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT = 1000028001 - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT = 1000028002 - VK_STRUCTURE_TYPE_CU_MODULE_CREATE_INFO_NVX = 1000029000 - VK_STRUCTURE_TYPE_CU_FUNCTION_CREATE_INFO_NVX = 1000029001 - VK_STRUCTURE_TYPE_CU_LAUNCH_INFO_NVX = 1000029002 - VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000 - VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX = 1000030001 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT = 1000038000 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000038001 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000038002 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT = 1000038003 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT = 1000038004 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_INFO_EXT = 1000038005 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_INFO_EXT = 1000038006 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_EXT = 1000038007 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_INFO_EXT = 1000038008 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_EXT = 1000038009 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_REFERENCE_LISTS_INFO_EXT = 1000038010 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT = 1000039000 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000039001 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000039002 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT = 1000039003 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_EXT = 1000039004 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_EXT = 1000039005 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_INFO_EXT = 1000039006 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_EXT = 1000039007 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_INFO_EXT = 1000039008 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_EXT = 1000039009 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT = 1000039010 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR = 1000040000 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR = 1000040001 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR = 1000040003 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000040004 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006 - VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000 - VK_STRUCTURE_TYPE_RENDERING_INFO = 1000044000 - VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO = 1000044001 - VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO = 1000044002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES = 1000044003 - VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO = 1000044004 - VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006 - VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007 - VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD = 1000044008 - VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX = 1000044009 - VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000 - VK_STRUCTURE_TYPE_PRIVATE_VENDOR_INFO_RESERVED_OFFSET_0_NV = 1000051000 - VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO = 1000053000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES = 1000053001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES = 1000053002 - VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000 - VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV = 1000056001 - VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057000 - VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057001 - VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 = 1000059000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 = 1000059001 - VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2 = 1000059002 - VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2 = 1000059003 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2 = 1000059004 - VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2 = 1000059005 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2 = 1000059006 - VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2 = 1000059007 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2 = 1000059008 - VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO = 1000060000 - VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO = 1000060003 - VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO = 1000060004 - VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO = 1000060005 - VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO = 1000060006 - VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007 - VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR = 1000060008 - VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR = 1000060009 - VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR = 1000060010 - VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR = 1000060011 - VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR = 1000060012 - VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO = 1000060013 - VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO = 1000060014 - VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000 - VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES = 1000063000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES = 1000066000 - VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001 - VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO_EXT = 1000068000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT = 1000068001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT = 1000068002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES = 1000070000 - VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO = 1000070001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO = 1000071000 - VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES = 1000071001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO = 1000071002 - VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES = 1000071003 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES = 1000071004 - VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO = 1000072000 - VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO = 1000072001 - VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO = 1000072002 - VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000 - VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001 - VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002 - VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR = 1000073003 - VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR = 1000074000 - VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR = 1000074001 - VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR = 1000074002 - VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR = 1000075000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO = 1000076000 - VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES = 1000076001 - VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO = 1000077000 - VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078000 - VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078001 - VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR = 1000078002 - VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003 - VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR = 1000079000 - VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR = 1000079001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = 1000080000 - VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001 - VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES = 1000083000 - VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000 - VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO = 1000085000 - VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV = 1000087000 - VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT = 1000090000 - VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT = 1000091000 - VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT = 1000091001 - VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT = 1000091002 - VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT = 1000091003 - VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE = 1000092000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = 1000094000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX = 1000097000 - VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV = 1000098000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT = 1000099000 - VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT = 1000099001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT = 1000101000 - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT = 1000101001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT = 1000102000 - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT = 1000102001 - VK_STRUCTURE_TYPE_HDR_METADATA_EXT = 1000105000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000 - VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001 - VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002 - VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003 - VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2 = 1000109000 - VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2 = 1000109001 - VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2 = 1000109002 - VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2 = 1000109003 - VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2 = 1000109004 - VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO = 1000109005 - VK_STRUCTURE_TYPE_SUBPASS_END_INFO = 1000109006 - VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO = 1000112000 - VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES = 1000112001 - VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO = 1000113000 - VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000 - VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001 - VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002 - VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR = 1000115000 - VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR = 1000115001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR = 1000116000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR = 1000116001 - VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR = 1000116002 - VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR = 1000116003 - VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR = 1000116004 - VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR = 1000116005 - VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR = 1000116006 - VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_RESERVATION_INFO_KHR = 1000116007 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES = 1000117000 - VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO = 1000117001 - VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO = 1000117002 - VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO = 1000117003 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000 - VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR = 1000119001 - VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR = 1000119002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES = 1000120000 - VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR = 1000121000 - VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR = 1000121001 - VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR = 1000121002 - VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR = 1000121003 - VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR = 1000121004 - VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK = 1000122000 - VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000 - VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS = 1000127000 - VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO = 1000127001 - VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000128000 - VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT = 1000128001 - VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT = 1000128002 - VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000128003 - VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000128004 - VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID = 1000129000 - VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID = 1000129001 - VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID = 1000129002 - VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003 - VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004 - VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005 - VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID = 1000129006 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000 - VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES = 1000138000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES = 1000138001 - VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK = 1000138002 - VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO = 1000138003 - VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000 - VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001 - VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT = 1000143003 - VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT = 1000143004 - VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO = 1000145000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES = 1000145001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES = 1000145002 - VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2 = 1000145003 - VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2 = 1000146000 - VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2 = 1000146001 - VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2 = 1000146002 - VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2 = 1000146003 - VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2 = 1000146004 - VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO = 1000147000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001 - VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002 - VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR = 1000150000 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR = 1000150002 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR = 1000150003 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR = 1000150004 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR = 1000150005 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR = 1000150006 - VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR = 1000150007 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_INFO_KHR = 1000150009 - VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_INFO_KHR = 1000150010 - VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR = 1000150011 - VK_STRUCTURE_TYPE_COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR = 1000150012 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR = 1000150013 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR = 1000150014 - VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR = 1000150015 - VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR = 1000150016 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR = 1000150017 - VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR = 1000150018 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR = 1000150020 - VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV = 1000154000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV = 1000154001 - VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO = 1000156000 - VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO = 1000156001 - VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO = 1000156002 - VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO = 1000156003 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES = 1000156004 - VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES = 1000156005 - VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO = 1000157000 - VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO = 1000157001 - VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT = 1000158000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT = 1000158002 - VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT = 1000158003 - VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT = 1000158004 - VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158005 - VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT = 1000158006 - VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000 - VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001 - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002 - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003 - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR = 1000163000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR = 1000163001 - VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV = 1000164000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV = 1000164001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV = 1000164002 - VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV = 1000164005 - VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV = 1000165000 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV = 1000165001 - VK_STRUCTURE_TYPE_GEOMETRY_NV = 1000165003 - VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV = 1000165004 - VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV = 1000165005 - VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV = 1000165006 - VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV = 1000165007 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV = 1000165008 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV = 1000165009 - VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV = 1000165011 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV = 1000165012 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV = 1000166000 - VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV = 1000166001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000 - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT = 1000170000 - VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001 - VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = 1000174000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000 - VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000 - VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR = 1000181000 - VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000 - VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR = 1000187000 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000187001 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000187002 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004 - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005 - VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000 - VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002 - VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP = 1000191000 - VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO = 1000192000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000 - VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = 1000201000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV = 1000202001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR = 1000203000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV = 1000204000 - VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV = 1000205000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002 - VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000 - VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES = 1000207000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES = 1000207001 - VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO = 1000207002 - VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO = 1000207003 - VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO = 1000207004 - VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO = 1000207005 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL = 1000209000 - VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL = 1000210000 - VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL = 1000210001 - VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL = 1000210002 - VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL = 1000210003 - VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL = 1000210004 - VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL = 1000210005 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES = 1000211000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT = 1000212000 - VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD = 1000213000 - VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD = 1000213001 - VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA = 1000214000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES = 1000215000 - VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT = 1000218000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT = 1000218001 - VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES = 1000225000 - VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO = 1000225001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES = 1000225002 - VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000226000 - VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR = 1000226001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR = 1000226002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR = 1000226003 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR = 1000226004 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT = 1000234000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000 - VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001 - VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR = 1000239000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV = 1000240000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000 - VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001 - VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000 - VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO = 1000244001 - VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES = 1000245000 - VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000 - VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR = 1000248000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000 - VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV = 1000250000 - VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV = 1000250001 - VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV = 1000250002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT = 1000251000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT = 1000254000 - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT = 1000254001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT = 1000254002 - VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT = 1000255000 - VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT = 1000255001 - VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT = 1000255002 - VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES = 1000257000 - VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002 - VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003 - VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO = 1000257004 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = 1000259000 - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = 1000259001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = 1000259002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT = 1000260000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES = 1000261000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = 1000265000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT = 1000267000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR = 1000269000 - VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR = 1000269001 - VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR = 1000269002 - VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR = 1000269003 - VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004 - VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000 - VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT = 1000274000 - VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = 1000274001 - VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT = 1000274002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT = 1000275000 - VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT = 1000275001 - VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = 1000275002 - VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT = 1000275003 - VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = 1000275004 - VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = 1000275005 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES = 1000276000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000 - VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001 - VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV = 1000277002 - VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV = 1000277003 - VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV = 1000277004 - VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV = 1000277005 - VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV = 1000277006 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV = 1000277007 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV = 1000278000 - VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV = 1000278001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES = 1000280000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES = 1000280001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES = 1000281001 - VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000 - VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM = 1000282001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT = 1000284000 - VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT = 1000284001 - VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT = 1000284002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT = 1000286000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT = 1000286001 - VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT = 1000287000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT = 1000287001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT = 1000287002 - VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR = 1000290000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV = 1000292000 - VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_BARRIER_NV = 1000292001 - VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV = 1000292002 - VK_STRUCTURE_TYPE_PRESENT_ID_KHR = 1000294000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR = 1000294001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES = 1000295000 - VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO = 1000295001 - VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO = 1000295002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES = 1000297000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_SC_1_0_FEATURES = 1000298000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_SC_1_0_PROPERTIES = 1000298001 - VK_STRUCTURE_TYPE_DEVICE_OBJECT_RESERVATION_CREATE_INFO = 1000298002 - VK_STRUCTURE_TYPE_COMMAND_POOL_MEMORY_RESERVATION_CREATE_INFO = 1000298003 - VK_STRUCTURE_TYPE_COMMAND_POOL_MEMORY_CONSUMPTION = 1000298004 - VK_STRUCTURE_TYPE_PIPELINE_POOL_SIZE = 1000298005 - VK_STRUCTURE_TYPE_FAULT_DATA = 1000298007 - VK_STRUCTURE_TYPE_FAULT_CALLBACK_INFO = 1000298008 - VK_STRUCTURE_TYPE_PIPELINE_OFFLINE_CREATE_INFO = 1000298010 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR = 1000299000 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR = 1000299001 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_LAYER_INFO_KHR = 1000299002 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR = 1000299003 - VK_STRUCTURE_TYPE_VIDEO_ENCODE_USAGE_INFO_KHR = 1000299004 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV = 1000300000 - VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV = 1000300001 - VK_STRUCTURE_TYPE_REFRESH_OBJECT_LIST_KHR = 1000308000 - VK_STRUCTURE_TYPE_RESERVED_QCOM = 1000309000 - VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT = 1000311000 - VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT = 1000311001 - VK_STRUCTURE_TYPE_EXPORT_METAL_DEVICE_INFO_EXT = 1000311002 - VK_STRUCTURE_TYPE_EXPORT_METAL_COMMAND_QUEUE_INFO_EXT = 1000311003 - VK_STRUCTURE_TYPE_EXPORT_METAL_BUFFER_INFO_EXT = 1000311004 - VK_STRUCTURE_TYPE_IMPORT_METAL_BUFFER_INFO_EXT = 1000311005 - VK_STRUCTURE_TYPE_EXPORT_METAL_TEXTURE_INFO_EXT = 1000311006 - VK_STRUCTURE_TYPE_IMPORT_METAL_TEXTURE_INFO_EXT = 1000311007 - VK_STRUCTURE_TYPE_EXPORT_METAL_IO_SURFACE_INFO_EXT = 1000311008 - VK_STRUCTURE_TYPE_IMPORT_METAL_IO_SURFACE_INFO_EXT = 1000311009 - VK_STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311010 - VK_STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311011 - VK_STRUCTURE_TYPE_MEMORY_BARRIER_2 = 1000314000 - VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2 = 1000314001 - VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 = 1000314002 - VK_STRUCTURE_TYPE_DEPENDENCY_INFO = 1000314003 - VK_STRUCTURE_TYPE_SUBMIT_INFO_2 = 1000314004 - VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO = 1000314005 - VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO = 1000314006 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES = 1000314007 - VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV = 1000314008 - VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV = 1000314009 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT = 1000316000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT = 1000316001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT = 1000316002 - VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT = 1000316003 - VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT = 1000316004 - VK_STRUCTURE_TYPE_BUFFER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316005 - VK_STRUCTURE_TYPE_IMAGE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316006 - VK_STRUCTURE_TYPE_IMAGE_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316007 - VK_STRUCTURE_TYPE_SAMPLER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316008 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316009 - VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT = 1000316010 - VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT = 1000316011 - VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_PUSH_DESCRIPTOR_BUFFER_HANDLE_EXT = 1000316012 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT = 1000320000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT = 1000320001 - VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT = 1000320002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD = 1000321000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR = 1000322000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR = 1000323000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES = 1000325000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV = 1000326000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV = 1000326001 - VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV = 1000326002 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV = 1000327000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV = 1000327001 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV = 1000327002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT = 1000328000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT = 1000328001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT = 1000330000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT = 1000332000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT = 1000332001 - VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM = 1000333000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES = 1000335000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR = 1000336000 - VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2 = 1000337000 - VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2 = 1000337001 - VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 = 1000337002 - VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2 = 1000337003 - VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2 = 1000337004 - VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2 = 1000337005 - VK_STRUCTURE_TYPE_BUFFER_COPY_2 = 1000337006 - VK_STRUCTURE_TYPE_IMAGE_COPY_2 = 1000337007 - VK_STRUCTURE_TYPE_IMAGE_BLIT_2 = 1000337008 - VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 = 1000337009 - VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2 = 1000337010 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT = 1000338000 - VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT = 1000338001 - VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT = 1000338002 - VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT = 1000338003 - VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT = 1000338004 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT = 1000339000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT = 1000340000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT = 1000341000 - VK_STRUCTURE_TYPE_DEVICE_FAULT_COUNTS_EXT = 1000341001 - VK_STRUCTURE_TYPE_DEVICE_FAULT_INFO_EXT = 1000341002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT = 1000342000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT = 1000344000 - VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT = 1000346000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR = 1000347000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR = 1000347001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR = 1000348013 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT = 1000351000 - VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT = 1000351002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT = 1000352000 - VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT = 1000352001 - VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT = 1000352002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT = 1000353000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT = 1000354000 - VK_STRUCTURE_TYPE_DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT = 1000354001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT = 1000355000 - VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT = 1000355001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT = 1000356000 - VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3 = 1000360000 - VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364000 - VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA = 1000364001 - VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364002 - VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365000 - VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365001 - VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA = 1000366000 - VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA = 1000366001 - VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA = 1000366002 - VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIA = 1000366003 - VK_STRUCTURE_TYPE_BUFFER_CONSTRAINTS_INFO_FUCHSIA = 1000366004 - VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA = 1000366005 - VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA = 1000366006 - VK_STRUCTURE_TYPE_IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA = 1000366007 - VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA = 1000366008 - VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CONSTRAINTS_INFO_FUCHSIA = 1000366009 - VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI = 1000369000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI = 1000369001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI = 1000369002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI = 1000370000 - VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV = 1000371000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV = 1000371001 - VK_STRUCTURE_TYPE_PIPELINE_PROPERTIES_IDENTIFIER_EXT = 1000372000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT = 1000372001 - VK_STRUCTURE_TYPE_IMPORT_FENCE_SCI_SYNC_INFO_NV = 1000373000 - VK_STRUCTURE_TYPE_EXPORT_FENCE_SCI_SYNC_INFO_NV = 1000373001 - VK_STRUCTURE_TYPE_FENCE_GET_SCI_SYNC_INFO_NV = 1000373002 - VK_STRUCTURE_TYPE_SCI_SYNC_ATTRIBUTES_INFO_NV = 1000373003 - VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_SCI_SYNC_INFO_NV = 1000373004 - VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_SCI_SYNC_INFO_NV = 1000373005 - VK_STRUCTURE_TYPE_SEMAPHORE_GET_SCI_SYNC_INFO_NV = 1000373006 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SCI_SYNC_FEATURES_NV = 1000373007 - VK_STRUCTURE_TYPE_IMPORT_MEMORY_SCI_BUF_INFO_NV = 1000374000 - VK_STRUCTURE_TYPE_EXPORT_MEMORY_SCI_BUF_INFO_NV = 1000374001 - VK_STRUCTURE_TYPE_MEMORY_GET_SCI_BUF_INFO_NV = 1000374002 - VK_STRUCTURE_TYPE_MEMORY_SCI_BUF_PROPERTIES_NV = 1000374003 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCI_BUF_FEATURES_NV = 1000374004 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT = 1000376000 - VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT = 1000376001 - VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT = 1000376002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT = 1000377000 - VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX = 1000378000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT = 1000381000 - VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT = 1000381001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT = 1000382000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR = 1000386000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = 1000388000 - VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = 1000388001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT = 1000391000 - VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT = 1000391001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT = 1000392000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT = 1000392001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT = 1000393000 - VK_STRUCTURE_TYPE_MICROMAP_BUILD_INFO_EXT = 1000396000 - VK_STRUCTURE_TYPE_MICROMAP_VERSION_INFO_EXT = 1000396001 - VK_STRUCTURE_TYPE_COPY_MICROMAP_INFO_EXT = 1000396002 - VK_STRUCTURE_TYPE_COPY_MICROMAP_TO_MEMORY_INFO_EXT = 1000396003 - VK_STRUCTURE_TYPE_COPY_MEMORY_TO_MICROMAP_INFO_EXT = 1000396004 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT = 1000396005 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_EXT = 1000396006 - VK_STRUCTURE_TYPE_MICROMAP_CREATE_INFO_EXT = 1000396007 - VK_STRUCTURE_TYPE_MICROMAP_BUILD_SIZES_INFO_EXT = 1000396008 - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT = 1000396009 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI = 1000404000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI = 1000404001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT = 1000411000 - VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT = 1000411001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT = 1000412000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES = 1000413000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES = 1000413001 - VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS = 1000413002 - VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS = 1000413003 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM = 1000415000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT = 1000418000 - VK_STRUCTURE_TYPE_IMAGE_VIEW_SLICED_CREATE_INFO_EXT = 1000418001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE = 1000420000 - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_BINDING_REFERENCE_VALVE = 1000420001 - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_HOST_MAPPING_INFO_VALVE = 1000420002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT = 1000421000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT = 1000422000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM = 1000425000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM = 1000425001 - VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM = 1000425002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV = 1000426000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV = 1000426001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV = 1000427000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV = 1000427001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV = 1000430000 - VK_STRUCTURE_TYPE_APPLICATION_PARAMETERS_EXT = 1000435000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT = 1000437000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM = 1000440000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM = 1000440001 - VK_STRUCTURE_TYPE_IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM = 1000440002 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT = 1000455000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT = 1000455001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT = 1000458000 - VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT = 1000458001 - VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000458002 - VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT = 1000458003 - VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG = 1000459000 - VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG = 1000459001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT = 1000462000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT = 1000462001 - VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT = 1000462002 - VK_STRUCTURE_TYPE_SHADER_MODULE_IDENTIFIER_EXT = 1000462003 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV = 1000464000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV = 1000464001 - VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV = 1000464002 - VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_NV = 1000464003 - VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_INFO_NV = 1000464004 - VK_STRUCTURE_TYPE_OPTICAL_FLOW_EXECUTE_INFO_NV = 1000464005 - VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV = 1000464010 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT = 1000465000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT = 1000466000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM = 1000484000 - VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM = 1000484001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC = 1000485000 - VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC = 1000485001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM = 1000488000 - VK_STRUCTURE_TYPE_SEMAPHORE_SCI_SYNC_POOL_CREATE_INFO_NV = 1000489000 - VK_STRUCTURE_TYPE_SEMAPHORE_SCI_SYNC_CREATE_INFO_NV = 1000489001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SCI_SYNC_2_FEATURES_NV = 1000489002 - VK_STRUCTURE_TYPE_DEVICE_SEMAPHORE_SCI_SYNC_POOL_RESERVATION_CREATE_INFO_NV = 1000489003 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV = 1000490000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV = 1000490001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM = 1000497000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM = 1000497001 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT = 1000498000 - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM = 1000510000 - VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_RENDER_AREAS_RENDER_PASS_BEGIN_INFO_QCOM = 1000510001 - VkSubpassContents* {.size: sizeof(cint).} = enum - VK_SUBPASS_CONTENTS_INLINE = 0 - VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = 1 - VkResult* {.size: sizeof(cint).} = enum - VK_ERROR_COMPRESSION_EXHAUSTED_EXT = -1000338000 - VK_ERROR_NO_PIPELINE_MATCH = -1000298001 - VK_ERROR_INVALID_PIPELINE_CACHE_DATA = -1000298000 - VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000 - VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000 - VK_ERROR_NOT_PERMITTED_KHR = -1000174001 - VK_ERROR_FRAGMENTATION = -1000161000 - VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000 - VK_ERROR_INVALID_EXTERNAL_HANDLE = -1000072003 - VK_ERROR_OUT_OF_POOL_MEMORY = -1000069000 - VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR = -1000023005 - VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR = -1000023004 - VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR = -1000023003 - VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR = -1000023002 - VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR = -1000023001 - VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR = -1000023000 - VK_ERROR_INVALID_SHADER_NV = -1000012000 - VK_ERROR_VALIDATION_FAILED_EXT = -1000011001 - VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001 - VK_ERROR_OUT_OF_DATE_KHR = -1000001004 - VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001 - VK_ERROR_SURFACE_LOST_KHR = -1000000000 - VK_ERROR_UNKNOWN = -13 - VK_ERROR_FRAGMENTED_POOL = -12 - VK_ERROR_FORMAT_NOT_SUPPORTED = -11 - VK_ERROR_TOO_MANY_OBJECTS = -10 - VK_ERROR_INCOMPATIBLE_DRIVER = -9 - VK_ERROR_FEATURE_NOT_PRESENT = -8 - VK_ERROR_EXTENSION_NOT_PRESENT = -7 - VK_ERROR_LAYER_NOT_PRESENT = -6 - VK_ERROR_MEMORY_MAP_FAILED = -5 - VK_ERROR_DEVICE_LOST = -4 - VK_ERROR_INITIALIZATION_FAILED = -3 - VK_ERROR_OUT_OF_DEVICE_MEMORY = -2 - VK_ERROR_OUT_OF_HOST_MEMORY = -1 - VK_SUCCESS = 0 - VK_NOT_READY = 1 - VK_TIMEOUT = 2 - VK_EVENT_SET = 3 - VK_EVENT_RESET = 4 - VK_INCOMPLETE = 5 - VK_SUBOPTIMAL_KHR = 1000001003 - VK_THREAD_IDLE_KHR = 1000268000 - VK_THREAD_DONE_KHR = 1000268001 - VK_OPERATION_DEFERRED_KHR = 1000268002 - VK_OPERATION_NOT_DEFERRED_KHR = 1000268003 - VK_PIPELINE_COMPILE_REQUIRED = 1000297000 - VkDynamicState* {.size: sizeof(cint).} = enum - VK_DYNAMIC_STATE_VIEWPORT = 0 - VK_DYNAMIC_STATE_SCISSOR = 1 - VK_DYNAMIC_STATE_LINE_WIDTH = 2 - VK_DYNAMIC_STATE_DEPTH_BIAS = 3 - VK_DYNAMIC_STATE_BLEND_CONSTANTS = 4 - VK_DYNAMIC_STATE_DEPTH_BOUNDS = 5 - VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = 6 - VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = 7 - VK_DYNAMIC_STATE_STENCIL_REFERENCE = 8 - VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV = 1000087000 - VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT = 1000099000 - VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT = 1000099001 - VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT = 1000099002 - VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT = 1000143000 - VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV = 1000164004 - VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV = 1000164006 - VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV = 1000205000 - VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV = 1000205001 - VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR = 1000226000 - VK_DYNAMIC_STATE_LINE_STIPPLE_EXT = 1000259000 - VK_DYNAMIC_STATE_CULL_MODE = 1000267000 - VK_DYNAMIC_STATE_FRONT_FACE = 1000267001 - VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY = 1000267002 - VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT = 1000267003 - VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT = 1000267004 - VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE = 1000267005 - VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE = 1000267006 - VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE = 1000267007 - VK_DYNAMIC_STATE_DEPTH_COMPARE_OP = 1000267008 - VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE = 1000267009 - VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE = 1000267010 - VK_DYNAMIC_STATE_STENCIL_OP = 1000267011 - VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR = 1000347000 - VK_DYNAMIC_STATE_VERTEX_INPUT_EXT = 1000352000 - VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT = 1000377000 - VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE = 1000377001 - VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE = 1000377002 - VK_DYNAMIC_STATE_LOGIC_OP_EXT = 1000377003 - VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE = 1000377004 - VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT = 1000381000 - VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT = 1000455002 - VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT = 1000455003 - VK_DYNAMIC_STATE_POLYGON_MODE_EXT = 1000455004 - VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT = 1000455005 - VK_DYNAMIC_STATE_SAMPLE_MASK_EXT = 1000455006 - VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT = 1000455007 - VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT = 1000455008 - VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT = 1000455009 - VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT = 1000455010 - VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT = 1000455011 - VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT = 1000455012 - VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT = 1000455013 - VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT = 1000455014 - VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT = 1000455015 - VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT = 1000455016 - VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT = 1000455017 - VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT = 1000455018 - VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT = 1000455019 - VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT = 1000455020 - VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT = 1000455021 - VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT = 1000455022 - VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV = 1000455023 - VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV = 1000455024 - VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV = 1000455025 - VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV = 1000455026 - VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV = 1000455027 - VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV = 1000455028 - VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV = 1000455029 - VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV = 1000455030 - VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV = 1000455031 - VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV = 1000455032 - VkDescriptorUpdateTemplateType* {.size: sizeof(cint).} = enum - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET = 0 - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR = 1 - VkObjectType* {.size: sizeof(cint).} = enum - VK_OBJECT_TYPE_UNKNOWN = 0 - VK_OBJECT_TYPE_INSTANCE = 1 - VK_OBJECT_TYPE_PHYSICAL_DEVICE = 2 - VK_OBJECT_TYPE_DEVICE = 3 - VK_OBJECT_TYPE_QUEUE = 4 - VK_OBJECT_TYPE_SEMAPHORE = 5 - VK_OBJECT_TYPE_COMMAND_BUFFER = 6 - VK_OBJECT_TYPE_FENCE = 7 - VK_OBJECT_TYPE_DEVICE_MEMORY = 8 - VK_OBJECT_TYPE_BUFFER = 9 - VK_OBJECT_TYPE_IMAGE = 10 - VK_OBJECT_TYPE_EVENT = 11 - VK_OBJECT_TYPE_QUERY_POOL = 12 - VK_OBJECT_TYPE_BUFFER_VIEW = 13 - VK_OBJECT_TYPE_IMAGE_VIEW = 14 - VK_OBJECT_TYPE_SHADER_MODULE = 15 - VK_OBJECT_TYPE_PIPELINE_CACHE = 16 - VK_OBJECT_TYPE_PIPELINE_LAYOUT = 17 - VK_OBJECT_TYPE_RENDER_PASS = 18 - VK_OBJECT_TYPE_PIPELINE = 19 - VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT = 20 - VK_OBJECT_TYPE_SAMPLER = 21 - VK_OBJECT_TYPE_DESCRIPTOR_POOL = 22 - VK_OBJECT_TYPE_DESCRIPTOR_SET = 23 - VK_OBJECT_TYPE_FRAMEBUFFER = 24 - VK_OBJECT_TYPE_COMMAND_POOL = 25 - VK_OBJECT_TYPE_SURFACE_KHR = 1000000000 - VK_OBJECT_TYPE_SWAPCHAIN_KHR = 1000001000 - VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000 - VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001 - VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000 - VK_OBJECT_TYPE_VIDEO_SESSION_KHR = 1000023000 - VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR = 1000023001 - VK_OBJECT_TYPE_CU_MODULE_NVX = 1000029000 - VK_OBJECT_TYPE_CU_FUNCTION_NVX = 1000029001 - VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE = 1000085000 - VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000 - VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000 - VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION = 1000156000 - VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000 - VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000 - VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL = 1000210000 - VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR = 1000268000 - VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV = 1000277000 - VK_OBJECT_TYPE_PRIVATE_DATA_SLOT = 1000295000 - VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA = 1000366000 - VK_OBJECT_TYPE_MICROMAP_EXT = 1000396000 - VK_OBJECT_TYPE_OPTICAL_FLOW_SESSION_NV = 1000464000 - VK_OBJECT_TYPE_SEMAPHORE_SCI_SYNC_POOL_NV = 1000489000 - VkRayTracingInvocationReorderModeNV* {.size: sizeof(cint).} = enum - VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_NV = 0 - VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_NV = 1 - VkDirectDriverLoadingModeLUNARG* {.size: sizeof(cint).} = enum - VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG = 0 - VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG = 1 - VkQueueFlagBits* {.size: sizeof(cint).} = enum - VK_QUEUE_GRAPHICS_BIT = 0b00000000000000000000000000000001 - VK_QUEUE_COMPUTE_BIT = 0b00000000000000000000000000000010 - VK_QUEUE_TRANSFER_BIT = 0b00000000000000000000000000000100 - VK_QUEUE_SPARSE_BINDING_BIT = 0b00000000000000000000000000001000 - VK_QUEUE_PROTECTED_BIT = 0b00000000000000000000000000010000 - VK_QUEUE_VIDEO_DECODE_BIT_KHR = 0b00000000000000000000000000100000 - VK_QUEUE_VIDEO_ENCODE_BIT_KHR = 0b00000000000000000000000001000000 - VK_QUEUE_RESERVED_7_BIT_QCOM = 0b00000000000000000000000010000000 - VK_QUEUE_OPTICAL_FLOW_BIT_NV = 0b00000000000000000000000100000000 - VK_QUEUE_RESERVED_9_BIT_EXT = 0b00000000000000000000001000000000 -func toBits*(flags: openArray[VkQueueFlagBits]): VkQueueFlags = - for flag in flags: - result = VkQueueFlags(uint(result) or uint(flag)) -func toEnums*(number: VkQueueFlags): seq[VkQueueFlagBits] = - for value in VkQueueFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkQueueFlags): bool = cint(a) == cint(b) -type - VkCullModeFlagBits* {.size: sizeof(cint).} = enum - VK_CULL_MODE_FRONT_BIT = 0b00000000000000000000000000000001 - VK_CULL_MODE_BACK_BIT = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkCullModeFlagBits]): VkCullModeFlags = - for flag in flags: - result = VkCullModeFlags(uint(result) or uint(flag)) -func toEnums*(number: VkCullModeFlags): seq[VkCullModeFlagBits] = - for value in VkCullModeFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkCullModeFlags): bool = cint(a) == cint(b) -const - VK_CULL_MODE_NONE* = 0 - VK_CULL_MODE_FRONT_AND_BACK* = 0x00000003 -type - VkRenderPassCreateFlagBits* {.size: sizeof(cint).} = enum - VK_RENDER_PASS_CREATE_RESERVED_0_BIT_KHR = 0b00000000000000000000000000000001 - VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkRenderPassCreateFlagBits]): VkRenderPassCreateFlags = - for flag in flags: - result = VkRenderPassCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkRenderPassCreateFlags): seq[VkRenderPassCreateFlagBits] = - for value in VkRenderPassCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkRenderPassCreateFlags): bool = cint(a) == cint(b) -type - VkDeviceQueueCreateFlagBits* {.size: sizeof(cint).} = enum - VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT = 0b00000000000000000000000000000001 - VK_DEVICE_QUEUE_CREATE_RESERVED_1_BIT_QCOM = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkDeviceQueueCreateFlagBits]): VkDeviceQueueCreateFlags = - for flag in flags: - result = VkDeviceQueueCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkDeviceQueueCreateFlags): seq[VkDeviceQueueCreateFlagBits] = - for value in VkDeviceQueueCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDeviceQueueCreateFlags): bool = cint(a) == cint(b) -type - VkMemoryPropertyFlagBits* {.size: sizeof(cint).} = enum - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = 0b00000000000000000000000000000001 - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = 0b00000000000000000000000000000010 - VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = 0b00000000000000000000000000000100 - VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 0b00000000000000000000000000001000 - VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0b00000000000000000000000000010000 - VK_MEMORY_PROPERTY_PROTECTED_BIT = 0b00000000000000000000000000100000 - VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD = 0b00000000000000000000000001000000 - VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD = 0b00000000000000000000000010000000 - VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV = 0b00000000000000000000000100000000 -func toBits*(flags: openArray[VkMemoryPropertyFlagBits]): VkMemoryPropertyFlags = - for flag in flags: - result = VkMemoryPropertyFlags(uint(result) or uint(flag)) -func toEnums*(number: VkMemoryPropertyFlags): seq[VkMemoryPropertyFlagBits] = - for value in VkMemoryPropertyFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkMemoryPropertyFlags): bool = cint(a) == cint(b) -type - VkMemoryHeapFlagBits* {.size: sizeof(cint).} = enum - VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 0b00000000000000000000000000000001 - VK_MEMORY_HEAP_MULTI_INSTANCE_BIT = 0b00000000000000000000000000000010 - VK_MEMORY_HEAP_SEU_SAFE_BIT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkMemoryHeapFlagBits]): VkMemoryHeapFlags = - for flag in flags: - result = VkMemoryHeapFlags(uint(result) or uint(flag)) -func toEnums*(number: VkMemoryHeapFlags): seq[VkMemoryHeapFlagBits] = - for value in VkMemoryHeapFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkMemoryHeapFlags): bool = cint(a) == cint(b) -type - VkAccessFlagBits* {.size: sizeof(cint).} = enum - VK_ACCESS_INDIRECT_COMMAND_READ_BIT = 0b00000000000000000000000000000001 - VK_ACCESS_INDEX_READ_BIT = 0b00000000000000000000000000000010 - VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = 0b00000000000000000000000000000100 - VK_ACCESS_UNIFORM_READ_BIT = 0b00000000000000000000000000001000 - VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = 0b00000000000000000000000000010000 - VK_ACCESS_SHADER_READ_BIT = 0b00000000000000000000000000100000 - VK_ACCESS_SHADER_WRITE_BIT = 0b00000000000000000000000001000000 - VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 0b00000000000000000000000010000000 - VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 0b00000000000000000000000100000000 - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0b00000000000000000000001000000000 - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0b00000000000000000000010000000000 - VK_ACCESS_TRANSFER_READ_BIT = 0b00000000000000000000100000000000 - VK_ACCESS_TRANSFER_WRITE_BIT = 0b00000000000000000001000000000000 - VK_ACCESS_HOST_READ_BIT = 0b00000000000000000010000000000000 - VK_ACCESS_HOST_WRITE_BIT = 0b00000000000000000100000000000000 - VK_ACCESS_MEMORY_READ_BIT = 0b00000000000000001000000000000000 - VK_ACCESS_MEMORY_WRITE_BIT = 0b00000000000000010000000000000000 - VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV = 0b00000000000000100000000000000000 - VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV = 0b00000000000001000000000000000000 - VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0b00000000000010000000000000000000 - VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT = 0b00000000000100000000000000000000 - VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0b00000000001000000000000000000000 - VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0b00000000010000000000000000000000 - VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0b00000000100000000000000000000000 - VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0b00000001000000000000000000000000 - VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0b00000010000000000000000000000000 - VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0b00000100000000000000000000000000 - VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0b00001000000000000000000000000000 -func toBits*(flags: openArray[VkAccessFlagBits]): VkAccessFlags = - for flag in flags: - result = VkAccessFlags(uint(result) or uint(flag)) -func toEnums*(number: VkAccessFlags): seq[VkAccessFlagBits] = - for value in VkAccessFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkAccessFlags): bool = cint(a) == cint(b) -type - VkBufferUsageFlagBits* {.size: sizeof(cint).} = enum - VK_BUFFER_USAGE_TRANSFER_SRC_BIT = 0b00000000000000000000000000000001 - VK_BUFFER_USAGE_TRANSFER_DST_BIT = 0b00000000000000000000000000000010 - VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 0b00000000000000000000000000000100 - VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = 0b00000000000000000000000000001000 - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = 0b00000000000000000000000000010000 - VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = 0b00000000000000000000000000100000 - VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0b00000000000000000000000001000000 - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0b00000000000000000000000010000000 - VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0b00000000000000000000000100000000 - VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0b00000000000000000000001000000000 - VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR = 0b00000000000000000000010000000000 - VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0b00000000000000000000100000000000 - VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0b00000000000000000001000000000000 - VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0b00000000000000000010000000000000 - VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0b00000000000000000100000000000000 - VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0b00000000000000001000000000000000 - VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0b00000000000000010000000000000000 - VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT = 0b00000000000000100000000000000000 - VK_BUFFER_USAGE_RESERVED_18_BIT_QCOM = 0b00000000000001000000000000000000 - VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0b00000000000010000000000000000000 - VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0b00000000000100000000000000000000 - VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0b00000000001000000000000000000000 - VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0b00000000010000000000000000000000 - VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0b00000000100000000000000000000000 - VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT = 0b00000001000000000000000000000000 - VK_BUFFER_USAGE_RESERVED_25_BIT_AMD = 0b00000010000000000000000000000000 - VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0b00000100000000000000000000000000 -func toBits*(flags: openArray[VkBufferUsageFlagBits]): VkBufferUsageFlags = - for flag in flags: - result = VkBufferUsageFlags(uint(result) or uint(flag)) -func toEnums*(number: VkBufferUsageFlags): seq[VkBufferUsageFlagBits] = - for value in VkBufferUsageFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkBufferUsageFlags): bool = cint(a) == cint(b) -type - VkBufferCreateFlagBits* {.size: sizeof(cint).} = enum - VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 0b00000000000000000000000000000001 - VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0b00000000000000000000000000000010 - VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0b00000000000000000000000000000100 - VK_BUFFER_CREATE_PROTECTED_BIT = 0b00000000000000000000000000001000 - VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0b00000000000000000000000000010000 - VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0b00000000000000000000000000100000 -func toBits*(flags: openArray[VkBufferCreateFlagBits]): VkBufferCreateFlags = - for flag in flags: - result = VkBufferCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkBufferCreateFlags): seq[VkBufferCreateFlagBits] = - for value in VkBufferCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkBufferCreateFlags): bool = cint(a) == cint(b) -type - VkShaderStageFlagBits* {.size: sizeof(cint).} = enum - VK_SHADER_STAGE_VERTEX_BIT = 0b00000000000000000000000000000001 - VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 0b00000000000000000000000000000010 - VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 0b00000000000000000000000000000100 - VK_SHADER_STAGE_GEOMETRY_BIT = 0b00000000000000000000000000001000 - VK_SHADER_STAGE_FRAGMENT_BIT = 0b00000000000000000000000000010000 - VK_SHADER_STAGE_COMPUTE_BIT = 0b00000000000000000000000000100000 - VK_SHADER_STAGE_TASK_BIT_EXT = 0b00000000000000000000000001000000 - VK_SHADER_STAGE_MESH_BIT_EXT = 0b00000000000000000000000010000000 - VK_SHADER_STAGE_RAYGEN_BIT_KHR = 0b00000000000000000000000100000000 - VK_SHADER_STAGE_ANY_HIT_BIT_KHR = 0b00000000000000000000001000000000 - VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR = 0b00000000000000000000010000000000 - VK_SHADER_STAGE_MISS_BIT_KHR = 0b00000000000000000000100000000000 - VK_SHADER_STAGE_INTERSECTION_BIT_KHR = 0b00000000000000000001000000000000 - VK_SHADER_STAGE_CALLABLE_BIT_KHR = 0b00000000000000000010000000000000 - VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI = 0b00000000000000000100000000000000 - VK_SHADER_STAGE_EXT_483_RESERVE_15 = 0b00000000000000001000000000000000 - VK_SHADER_STAGE_EXT_483_RESERVE_16 = 0b00000000000000010000000000000000 - VK_SHADER_STAGE_EXT_483_RESERVE_17 = 0b00000000000000100000000000000000 - VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI = 0b00000000000010000000000000000000 -func toBits*(flags: openArray[VkShaderStageFlagBits]): VkShaderStageFlags = - for flag in flags: - result = VkShaderStageFlags(uint(result) or uint(flag)) -func toEnums*(number: VkShaderStageFlags): seq[VkShaderStageFlagBits] = - for value in VkShaderStageFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkShaderStageFlags): bool = cint(a) == cint(b) -const - VK_SHADER_STAGE_ALL_GRAPHICS* = 0x0000001F - VK_SHADER_STAGE_ALL* = 0x7FFFFFFF -type - VkImageUsageFlagBits* {.size: sizeof(cint).} = enum - VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 0b00000000000000000000000000000001 - VK_IMAGE_USAGE_TRANSFER_DST_BIT = 0b00000000000000000000000000000010 - VK_IMAGE_USAGE_SAMPLED_BIT = 0b00000000000000000000000000000100 - VK_IMAGE_USAGE_STORAGE_BIT = 0b00000000000000000000000000001000 - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0b00000000000000000000000000010000 - VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0b00000000000000000000000000100000 - VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0b00000000000000000000000001000000 - VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0b00000000000000000000000010000000 - VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0b00000000000000000000000100000000 - VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0b00000000000000000000001000000000 - VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0b00000000000000000000010000000000 - VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0b00000000000000000000100000000000 - VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0b00000000000000000001000000000000 - VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0b00000000000000000010000000000000 - VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0b00000000000000000100000000000000 - VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0b00000000000000001000000000000000 - VK_IMAGE_USAGE_RESERVED_16_BIT_QCOM = 0b00000000000000010000000000000000 - VK_IMAGE_USAGE_RESERVED_17_BIT_QCOM = 0b00000000000000100000000000000000 - VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI = 0b00000000000001000000000000000000 - VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0b00000000000010000000000000000000 - VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM = 0b00000000000100000000000000000000 - VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM = 0b00000000001000000000000000000000 - VK_IMAGE_USAGE_RESERVED_22_BIT_EXT = 0b00000000010000000000000000000000 -func toBits*(flags: openArray[VkImageUsageFlagBits]): VkImageUsageFlags = - for flag in flags: - result = VkImageUsageFlags(uint(result) or uint(flag)) -func toEnums*(number: VkImageUsageFlags): seq[VkImageUsageFlagBits] = - for value in VkImageUsageFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkImageUsageFlags): bool = cint(a) == cint(b) -type - VkImageCreateFlagBits* {.size: sizeof(cint).} = enum - VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 0b00000000000000000000000000000001 - VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0b00000000000000000000000000000010 - VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0b00000000000000000000000000000100 - VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0b00000000000000000000000000001000 - VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0b00000000000000000000000000010000 - VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT = 0b00000000000000000000000000100000 - VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT = 0b00000000000000000000000001000000 - VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT = 0b00000000000000000000000010000000 - VK_IMAGE_CREATE_EXTENDED_USAGE_BIT = 0b00000000000000000000000100000000 - VK_IMAGE_CREATE_DISJOINT_BIT = 0b00000000000000000000001000000000 - VK_IMAGE_CREATE_ALIAS_BIT = 0b00000000000000000000010000000000 - VK_IMAGE_CREATE_PROTECTED_BIT = 0b00000000000000000000100000000000 - VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT = 0b00000000000000000001000000000000 - VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV = 0b00000000000000000010000000000000 - VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT = 0b00000000000000000100000000000000 - VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM = 0b00000000000000001000000000000000 - VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0b00000000000000010000000000000000 - VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT = 0b00000000000000100000000000000000 - VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT = 0b00000000000001000000000000000000 - VK_IMAGE_CREATE_RESERVED_19_BIT_EXT = 0b00000000000010000000000000000000 -func toBits*(flags: openArray[VkImageCreateFlagBits]): VkImageCreateFlags = - for flag in flags: - result = VkImageCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkImageCreateFlags): seq[VkImageCreateFlagBits] = - for value in VkImageCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkImageCreateFlags): bool = cint(a) == cint(b) -type - VkImageViewCreateFlagBits* {.size: sizeof(cint).} = enum - VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT = 0b00000000000000000000000000000001 - VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT = 0b00000000000000000000000000000010 - VK_IMAGE_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkImageViewCreateFlagBits]): VkImageViewCreateFlags = - for flag in flags: - result = VkImageViewCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkImageViewCreateFlags): seq[VkImageViewCreateFlagBits] = - for value in VkImageViewCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkImageViewCreateFlags): bool = cint(a) == cint(b) -type - VkSamplerCreateFlagBits* {.size: sizeof(cint).} = enum - VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT = 0b00000000000000000000000000000001 - VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT = 0b00000000000000000000000000000010 - VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT = 0b00000000000000000000000000000100 - VK_SAMPLER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0b00000000000000000000000000001000 - VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM = 0b00000000000000000000000000010000 -func toBits*(flags: openArray[VkSamplerCreateFlagBits]): VkSamplerCreateFlags = - for flag in flags: - result = VkSamplerCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkSamplerCreateFlags): seq[VkSamplerCreateFlagBits] = - for value in VkSamplerCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSamplerCreateFlags): bool = cint(a) == cint(b) -type - VkPipelineCreateFlagBits* {.size: sizeof(cint).} = enum - VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0b00000000000000000000000000000001 - VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0b00000000000000000000000000000010 - VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0b00000000000000000000000000000100 - VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT = 0b00000000000000000000000000001000 - VK_PIPELINE_CREATE_DISPATCH_BASE_BIT = 0b00000000000000000000000000010000 - VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV = 0b00000000000000000000000000100000 - VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR = 0b00000000000000000000000001000000 - VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR = 0b00000000000000000000000010000000 - VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT = 0b00000000000000000000000100000000 - VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT = 0b00000000000000000000001000000000 - VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT = 0b00000000000000000000010000000000 - VK_PIPELINE_CREATE_LIBRARY_BIT_KHR = 0b00000000000000000000100000000000 - VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR = 0b00000000000000000001000000000000 - VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR = 0b00000000000000000010000000000000 - VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR = 0b00000000000000000100000000000000 - VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR = 0b00000000000000001000000000000000 - VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR = 0b00000000000000010000000000000000 - VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR = 0b00000000000000100000000000000000 - VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV = 0b00000000000001000000000000000000 - VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR = 0b00000000000010000000000000000000 - VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV = 0b00000000000100000000000000000000 - VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0b00000000001000000000000000000000 - VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0b00000000010000000000000000000000 - VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT = 0b00000000100000000000000000000000 - VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = 0b00000001000000000000000000000000 - VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0b00000010000000000000000000000000 - VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0b00000100000000000000000000000000 - VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT = 0b00001000000000000000000000000000 - VK_PIPELINE_CREATE_RESERVED_BIT_28_NV = 0b00010000000000000000000000000000 - VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT = 0b00100000000000000000000000000000 - VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT = 0b01000000000000000000000000000000 -func toBits*(flags: openArray[VkPipelineCreateFlagBits]): VkPipelineCreateFlags = - for flag in flags: - result = VkPipelineCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPipelineCreateFlags): seq[VkPipelineCreateFlagBits] = - for value in VkPipelineCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPipelineCreateFlags): bool = cint(a) == cint(b) -type - VkPipelineShaderStageCreateFlagBits* {.size: sizeof(cint).} = enum - VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT = 0b00000000000000000000000000000001 - VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT = 0b00000000000000000000000000000010 - VK_PIPELINE_SHADER_STAGE_CREATE_RESERVED_3_BIT_KHR = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkPipelineShaderStageCreateFlagBits]): VkPipelineShaderStageCreateFlags = - for flag in flags: - result = VkPipelineShaderStageCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPipelineShaderStageCreateFlags): seq[VkPipelineShaderStageCreateFlagBits] = - for value in VkPipelineShaderStageCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPipelineShaderStageCreateFlags): bool = cint(a) == cint(b) -type - VkColorComponentFlagBits* {.size: sizeof(cint).} = enum - VK_COLOR_COMPONENT_R_BIT = 0b00000000000000000000000000000001 - VK_COLOR_COMPONENT_G_BIT = 0b00000000000000000000000000000010 - VK_COLOR_COMPONENT_B_BIT = 0b00000000000000000000000000000100 - VK_COLOR_COMPONENT_A_BIT = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkColorComponentFlagBits]): VkColorComponentFlags = - for flag in flags: - result = VkColorComponentFlags(uint(result) or uint(flag)) -func toEnums*(number: VkColorComponentFlags): seq[VkColorComponentFlagBits] = - for value in VkColorComponentFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkColorComponentFlags): bool = cint(a) == cint(b) -type - VkFenceCreateFlagBits* {.size: sizeof(cint).} = enum - VK_FENCE_CREATE_SIGNALED_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkFenceCreateFlagBits]): VkFenceCreateFlags = - for flag in flags: - result = VkFenceCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkFenceCreateFlags): seq[VkFenceCreateFlagBits] = - for value in VkFenceCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkFenceCreateFlags): bool = cint(a) == cint(b) -type - VkFormatFeatureFlagBits* {.size: sizeof(cint).} = enum - VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = 0b00000000000000000000000000000001 - VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = 0b00000000000000000000000000000010 - VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT = 0b00000000000000000000000000000100 - VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT = 0b00000000000000000000000000001000 - VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT = 0b00000000000000000000000000010000 - VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 0b00000000000000000000000000100000 - VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT = 0b00000000000000000000000001000000 - VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = 0b00000000000000000000000010000000 - VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = 0b00000000000000000000000100000000 - VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = 0b00000000000000000000001000000000 - VK_FORMAT_FEATURE_BLIT_SRC_BIT = 0b00000000000000000000010000000000 - VK_FORMAT_FEATURE_BLIT_DST_BIT = 0b00000000000000000000100000000000 - VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0b00000000000000000001000000000000 - VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT = 0b00000000000000000010000000000000 - VK_FORMAT_FEATURE_TRANSFER_SRC_BIT = 0b00000000000000000100000000000000 - VK_FORMAT_FEATURE_TRANSFER_DST_BIT = 0b00000000000000001000000000000000 - VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0b00000000000000010000000000000000 - VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT = 0b00000000000000100000000000000000 - VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT = 0b00000000000001000000000000000000 - VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT = 0b00000000000010000000000000000000 - VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT = 0b00000000000100000000000000000000 - VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT = 0b00000000001000000000000000000000 - VK_FORMAT_FEATURE_DISJOINT_BIT = 0b00000000010000000000000000000000 - VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT = 0b00000000100000000000000000000000 - VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0b00000001000000000000000000000000 - VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR = 0b00000010000000000000000000000000 - VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR = 0b00000100000000000000000000000000 - VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR = 0b00001000000000000000000000000000 - VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR = 0b00010000000000000000000000000000 - VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0b00100000000000000000000000000000 - VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0b01000000000000000000000000000000 -func toBits*(flags: openArray[VkFormatFeatureFlagBits]): VkFormatFeatureFlags = - for flag in flags: - result = VkFormatFeatureFlags(uint(result) or uint(flag)) -func toEnums*(number: VkFormatFeatureFlags): seq[VkFormatFeatureFlagBits] = - for value in VkFormatFeatureFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkFormatFeatureFlags): bool = cint(a) == cint(b) -type - VkQueryControlFlagBits* {.size: sizeof(cint).} = enum - VK_QUERY_CONTROL_PRECISE_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkQueryControlFlagBits]): VkQueryControlFlags = - for flag in flags: - result = VkQueryControlFlags(uint(result) or uint(flag)) -func toEnums*(number: VkQueryControlFlags): seq[VkQueryControlFlagBits] = - for value in VkQueryControlFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkQueryControlFlags): bool = cint(a) == cint(b) -type - VkQueryResultFlagBits* {.size: sizeof(cint).} = enum - VK_QUERY_RESULT_64_BIT = 0b00000000000000000000000000000001 - VK_QUERY_RESULT_WAIT_BIT = 0b00000000000000000000000000000010 - VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0b00000000000000000000000000000100 - VK_QUERY_RESULT_PARTIAL_BIT = 0b00000000000000000000000000001000 - VK_QUERY_RESULT_WITH_STATUS_BIT_KHR = 0b00000000000000000000000000010000 -func toBits*(flags: openArray[VkQueryResultFlagBits]): VkQueryResultFlags = - for flag in flags: - result = VkQueryResultFlags(uint(result) or uint(flag)) -func toEnums*(number: VkQueryResultFlags): seq[VkQueryResultFlagBits] = - for value in VkQueryResultFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkQueryResultFlags): bool = cint(a) == cint(b) -type - VkCommandBufferUsageFlagBits* {.size: sizeof(cint).} = enum - VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = 0b00000000000000000000000000000001 - VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = 0b00000000000000000000000000000010 - VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkCommandBufferUsageFlagBits]): VkCommandBufferUsageFlags = - for flag in flags: - result = VkCommandBufferUsageFlags(uint(result) or uint(flag)) -func toEnums*(number: VkCommandBufferUsageFlags): seq[VkCommandBufferUsageFlagBits] = - for value in VkCommandBufferUsageFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkCommandBufferUsageFlags): bool = cint(a) == cint(b) -type - VkQueryPipelineStatisticFlagBits* {.size: sizeof(cint).} = enum - VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = 0b00000000000000000000000000000001 - VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT = 0b00000000000000000000000000000010 - VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT = 0b00000000000000000000000000000100 - VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT = 0b00000000000000000000000000001000 - VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT = 0b00000000000000000000000000010000 - VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT = 0b00000000000000000000000000100000 - VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT = 0b00000000000000000000000001000000 - VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT = 0b00000000000000000000000010000000 - VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = 0b00000000000000000000000100000000 - VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = 0b00000000000000000000001000000000 - VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 0b00000000000000000000010000000000 - VK_QUERY_PIPELINE_STATISTIC_TASK_SHADER_INVOCATIONS_BIT_EXT = 0b00000000000000000000100000000000 - VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT = 0b00000000000000000001000000000000 - VK_QUERY_PIPELINE_STATISTIC_CLUSTER_CULLING_SHADER_INVOCATIONS_BIT_HUAWEI = 0b00000000000000000010000000000000 -func toBits*(flags: openArray[VkQueryPipelineStatisticFlagBits]): VkQueryPipelineStatisticFlags = - for flag in flags: - result = VkQueryPipelineStatisticFlags(uint(result) or uint(flag)) -func toEnums*(number: VkQueryPipelineStatisticFlags): seq[VkQueryPipelineStatisticFlagBits] = - for value in VkQueryPipelineStatisticFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkQueryPipelineStatisticFlags): bool = cint(a) == cint(b) -type - VkImageAspectFlagBits* {.size: sizeof(cint).} = enum - VK_IMAGE_ASPECT_COLOR_BIT = 0b00000000000000000000000000000001 - VK_IMAGE_ASPECT_DEPTH_BIT = 0b00000000000000000000000000000010 - VK_IMAGE_ASPECT_STENCIL_BIT = 0b00000000000000000000000000000100 - VK_IMAGE_ASPECT_METADATA_BIT = 0b00000000000000000000000000001000 - VK_IMAGE_ASPECT_PLANE_0_BIT = 0b00000000000000000000000000010000 - VK_IMAGE_ASPECT_PLANE_1_BIT = 0b00000000000000000000000000100000 - VK_IMAGE_ASPECT_PLANE_2_BIT = 0b00000000000000000000000001000000 - VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT = 0b00000000000000000000000010000000 - VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT = 0b00000000000000000000000100000000 - VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT = 0b00000000000000000000001000000000 - VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT = 0b00000000000000000000010000000000 -func toBits*(flags: openArray[VkImageAspectFlagBits]): VkImageAspectFlags = - for flag in flags: - result = VkImageAspectFlags(uint(result) or uint(flag)) -func toEnums*(number: VkImageAspectFlags): seq[VkImageAspectFlagBits] = - for value in VkImageAspectFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkImageAspectFlags): bool = cint(a) == cint(b) -type - VkSparseImageFormatFlagBits* {.size: sizeof(cint).} = enum - VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = 0b00000000000000000000000000000001 - VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = 0b00000000000000000000000000000010 - VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkSparseImageFormatFlagBits]): VkSparseImageFormatFlags = - for flag in flags: - result = VkSparseImageFormatFlags(uint(result) or uint(flag)) -func toEnums*(number: VkSparseImageFormatFlags): seq[VkSparseImageFormatFlagBits] = - for value in VkSparseImageFormatFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSparseImageFormatFlags): bool = cint(a) == cint(b) -type - VkSparseMemoryBindFlagBits* {.size: sizeof(cint).} = enum - VK_SPARSE_MEMORY_BIND_METADATA_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkSparseMemoryBindFlagBits]): VkSparseMemoryBindFlags = - for flag in flags: - result = VkSparseMemoryBindFlags(uint(result) or uint(flag)) -func toEnums*(number: VkSparseMemoryBindFlags): seq[VkSparseMemoryBindFlagBits] = - for value in VkSparseMemoryBindFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSparseMemoryBindFlags): bool = cint(a) == cint(b) -type - VkPipelineStageFlagBits* {.size: sizeof(cint).} = enum - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = 0b00000000000000000000000000000001 - VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = 0b00000000000000000000000000000010 - VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = 0b00000000000000000000000000000100 - VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = 0b00000000000000000000000000001000 - VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT = 0b00000000000000000000000000010000 - VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT = 0b00000000000000000000000000100000 - VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = 0b00000000000000000000000001000000 - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = 0b00000000000000000000000010000000 - VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = 0b00000000000000000000000100000000 - VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = 0b00000000000000000000001000000000 - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = 0b00000000000000000000010000000000 - VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = 0b00000000000000000000100000000000 - VK_PIPELINE_STAGE_TRANSFER_BIT = 0b00000000000000000001000000000000 - VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = 0b00000000000000000010000000000000 - VK_PIPELINE_STAGE_HOST_BIT = 0b00000000000000000100000000000000 - VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = 0b00000000000000001000000000000000 - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = 0b00000000000000010000000000000000 - VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV = 0b00000000000000100000000000000000 - VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT = 0b00000000000001000000000000000000 - VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT = 0b00000000000010000000000000000000 - VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT = 0b00000000000100000000000000000000 - VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR = 0b00000000001000000000000000000000 - VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0b00000000010000000000000000000000 - VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0b00000000100000000000000000000000 - VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT = 0b00000001000000000000000000000000 - VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0b00000010000000000000000000000000 -func toBits*(flags: openArray[VkPipelineStageFlagBits]): VkPipelineStageFlags = - for flag in flags: - result = VkPipelineStageFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPipelineStageFlags): seq[VkPipelineStageFlagBits] = - for value in VkPipelineStageFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPipelineStageFlags): bool = cint(a) == cint(b) -type - VkCommandPoolCreateFlagBits* {.size: sizeof(cint).} = enum - VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = 0b00000000000000000000000000000001 - VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 0b00000000000000000000000000000010 - VK_COMMAND_POOL_CREATE_PROTECTED_BIT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkCommandPoolCreateFlagBits]): VkCommandPoolCreateFlags = - for flag in flags: - result = VkCommandPoolCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkCommandPoolCreateFlags): seq[VkCommandPoolCreateFlagBits] = - for value in VkCommandPoolCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkCommandPoolCreateFlags): bool = cint(a) == cint(b) -type - VkCommandPoolResetFlagBits* {.size: sizeof(cint).} = enum - VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = 0b00000000000000000000000000000001 - VK_COMMAND_POOL_RESET_RESERVED_1_BIT_COREAVI = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkCommandPoolResetFlagBits]): VkCommandPoolResetFlags = - for flag in flags: - result = VkCommandPoolResetFlags(uint(result) or uint(flag)) -func toEnums*(number: VkCommandPoolResetFlags): seq[VkCommandPoolResetFlagBits] = - for value in VkCommandPoolResetFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkCommandPoolResetFlags): bool = cint(a) == cint(b) -type - VkCommandBufferResetFlagBits* {.size: sizeof(cint).} = enum - VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkCommandBufferResetFlagBits]): VkCommandBufferResetFlags = - for flag in flags: - result = VkCommandBufferResetFlags(uint(result) or uint(flag)) -func toEnums*(number: VkCommandBufferResetFlags): seq[VkCommandBufferResetFlagBits] = - for value in VkCommandBufferResetFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkCommandBufferResetFlags): bool = cint(a) == cint(b) -type - VkSampleCountFlagBits* {.size: sizeof(cint).} = enum - VK_SAMPLE_COUNT_1_BIT = 0b00000000000000000000000000000001 - VK_SAMPLE_COUNT_2_BIT = 0b00000000000000000000000000000010 - VK_SAMPLE_COUNT_4_BIT = 0b00000000000000000000000000000100 - VK_SAMPLE_COUNT_8_BIT = 0b00000000000000000000000000001000 - VK_SAMPLE_COUNT_16_BIT = 0b00000000000000000000000000010000 - VK_SAMPLE_COUNT_32_BIT = 0b00000000000000000000000000100000 - VK_SAMPLE_COUNT_64_BIT = 0b00000000000000000000000001000000 -func toBits*(flags: openArray[VkSampleCountFlagBits]): VkSampleCountFlags = - for flag in flags: - result = VkSampleCountFlags(uint(result) or uint(flag)) -func toEnums*(number: VkSampleCountFlags): seq[VkSampleCountFlagBits] = - for value in VkSampleCountFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSampleCountFlags): bool = cint(a) == cint(b) -type - VkAttachmentDescriptionFlagBits* {.size: sizeof(cint).} = enum - VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkAttachmentDescriptionFlagBits]): VkAttachmentDescriptionFlags = - for flag in flags: - result = VkAttachmentDescriptionFlags(uint(result) or uint(flag)) -func toEnums*(number: VkAttachmentDescriptionFlags): seq[VkAttachmentDescriptionFlagBits] = - for value in VkAttachmentDescriptionFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkAttachmentDescriptionFlags): bool = cint(a) == cint(b) -type - VkStencilFaceFlagBits* {.size: sizeof(cint).} = enum - VK_STENCIL_FACE_FRONT_BIT = 0b00000000000000000000000000000001 - VK_STENCIL_FACE_BACK_BIT = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkStencilFaceFlagBits]): VkStencilFaceFlags = - for flag in flags: - result = VkStencilFaceFlags(uint(result) or uint(flag)) -func toEnums*(number: VkStencilFaceFlags): seq[VkStencilFaceFlagBits] = - for value in VkStencilFaceFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkStencilFaceFlags): bool = cint(a) == cint(b) -const - VK_STENCIL_FACE_FRONT_AND_BACK* = 0x00000003 -type - VkDescriptorPoolCreateFlagBits* {.size: sizeof(cint).} = enum - VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0b00000000000000000000000000000001 - VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT = 0b00000000000000000000000000000010 - VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkDescriptorPoolCreateFlagBits]): VkDescriptorPoolCreateFlags = - for flag in flags: - result = VkDescriptorPoolCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkDescriptorPoolCreateFlags): seq[VkDescriptorPoolCreateFlagBits] = - for value in VkDescriptorPoolCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDescriptorPoolCreateFlags): bool = cint(a) == cint(b) -type - VkDependencyFlagBits* {.size: sizeof(cint).} = enum - VK_DEPENDENCY_BY_REGION_BIT = 0b00000000000000000000000000000001 - VK_DEPENDENCY_VIEW_LOCAL_BIT = 0b00000000000000000000000000000010 - VK_DEPENDENCY_DEVICE_GROUP_BIT = 0b00000000000000000000000000000100 - VK_DEPENDENCY_FEEDBACK_LOOP_BIT_EXT = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkDependencyFlagBits]): VkDependencyFlags = - for flag in flags: - result = VkDependencyFlags(uint(result) or uint(flag)) -func toEnums*(number: VkDependencyFlags): seq[VkDependencyFlagBits] = - for value in VkDependencyFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDependencyFlags): bool = cint(a) == cint(b) -type - VkSemaphoreType* {.size: sizeof(cint).} = enum - VK_SEMAPHORE_TYPE_BINARY = 0 - VK_SEMAPHORE_TYPE_TIMELINE = 1 - VkSemaphoreWaitFlagBits* {.size: sizeof(cint).} = enum - VK_SEMAPHORE_WAIT_ANY_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkSemaphoreWaitFlagBits]): VkSemaphoreWaitFlags = - for flag in flags: - result = VkSemaphoreWaitFlags(uint(result) or uint(flag)) -func toEnums*(number: VkSemaphoreWaitFlags): seq[VkSemaphoreWaitFlagBits] = - for value in VkSemaphoreWaitFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSemaphoreWaitFlags): bool = cint(a) == cint(b) -type - VkPresentModeKHR* {.size: sizeof(cint).} = enum - VK_PRESENT_MODE_IMMEDIATE_KHR = 0 - VK_PRESENT_MODE_MAILBOX_KHR = 1 - VK_PRESENT_MODE_FIFO_KHR = 2 - VK_PRESENT_MODE_FIFO_RELAXED_KHR = 3 - VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR = 1000111000 - VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR = 1000111001 - VkColorSpaceKHR* {.size: sizeof(cint).} = enum - VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0 - VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT = 1000104001 - VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT = 1000104002 - VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT = 1000104003 - VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT = 1000104004 - VK_COLOR_SPACE_BT709_LINEAR_EXT = 1000104005 - VK_COLOR_SPACE_BT709_NONLINEAR_EXT = 1000104006 - VK_COLOR_SPACE_BT2020_LINEAR_EXT = 1000104007 - VK_COLOR_SPACE_HDR10_ST2084_EXT = 1000104008 - VK_COLOR_SPACE_DOLBYVISION_EXT = 1000104009 - VK_COLOR_SPACE_HDR10_HLG_EXT = 1000104010 - VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT = 1000104011 - VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT = 1000104012 - VK_COLOR_SPACE_PASS_THROUGH_EXT = 1000104013 - VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT = 1000104014 - VK_COLOR_SPACE_DISPLAY_NATIVE_AMD = 1000213000 - VkDisplayPlaneAlphaFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR = 0b00000000000000000000000000000001 - VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR = 0b00000000000000000000000000000010 - VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR = 0b00000000000000000000000000000100 - VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkDisplayPlaneAlphaFlagBitsKHR]): VkDisplayPlaneAlphaFlagsKHR = - for flag in flags: - result = VkDisplayPlaneAlphaFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkDisplayPlaneAlphaFlagsKHR): seq[VkDisplayPlaneAlphaFlagBitsKHR] = - for value in VkDisplayPlaneAlphaFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDisplayPlaneAlphaFlagsKHR): bool = cint(a) == cint(b) -type - VkCompositeAlphaFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = 0b00000000000000000000000000000001 - VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR = 0b00000000000000000000000000000010 - VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR = 0b00000000000000000000000000000100 - VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkCompositeAlphaFlagBitsKHR]): VkCompositeAlphaFlagsKHR = - for flag in flags: - result = VkCompositeAlphaFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkCompositeAlphaFlagsKHR): seq[VkCompositeAlphaFlagBitsKHR] = - for value in VkCompositeAlphaFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkCompositeAlphaFlagsKHR): bool = cint(a) == cint(b) -type - VkSurfaceTransformFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR = 0b00000000000000000000000000000001 - VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR = 0b00000000000000000000000000000010 - VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR = 0b00000000000000000000000000000100 - VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR = 0b00000000000000000000000000001000 - VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR = 0b00000000000000000000000000010000 - VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR = 0b00000000000000000000000000100000 - VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR = 0b00000000000000000000000001000000 - VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR = 0b00000000000000000000000010000000 - VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR = 0b00000000000000000000000100000000 -func toBits*(flags: openArray[VkSurfaceTransformFlagBitsKHR]): VkSurfaceTransformFlagsKHR = - for flag in flags: - result = VkSurfaceTransformFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkSurfaceTransformFlagsKHR): seq[VkSurfaceTransformFlagBitsKHR] = - for value in VkSurfaceTransformFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSurfaceTransformFlagsKHR): bool = cint(a) == cint(b) -type - VkSwapchainImageUsageFlagBitsANDROID* {.size: sizeof(cint).} = enum - VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkSwapchainImageUsageFlagBitsANDROID]): VkSwapchainImageUsageFlagsANDROID = - for flag in flags: - result = VkSwapchainImageUsageFlagsANDROID(uint(result) or uint(flag)) -func toEnums*(number: VkSwapchainImageUsageFlagsANDROID): seq[VkSwapchainImageUsageFlagBitsANDROID] = - for value in VkSwapchainImageUsageFlagBitsANDROID.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSwapchainImageUsageFlagsANDROID): bool = cint(a) == cint(b) -type - VkTimeDomainEXT* {.size: sizeof(cint).} = enum - VK_TIME_DOMAIN_DEVICE_EXT = 0 - VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT = 1 - VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT = 2 - VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT = 3 - VkDebugReportFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_DEBUG_REPORT_INFORMATION_BIT_EXT = 0b00000000000000000000000000000001 - VK_DEBUG_REPORT_WARNING_BIT_EXT = 0b00000000000000000000000000000010 - VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT = 0b00000000000000000000000000000100 - VK_DEBUG_REPORT_ERROR_BIT_EXT = 0b00000000000000000000000000001000 - VK_DEBUG_REPORT_DEBUG_BIT_EXT = 0b00000000000000000000000000010000 -func toBits*(flags: openArray[VkDebugReportFlagBitsEXT]): VkDebugReportFlagsEXT = - for flag in flags: - result = VkDebugReportFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkDebugReportFlagsEXT): seq[VkDebugReportFlagBitsEXT] = - for value in VkDebugReportFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDebugReportFlagsEXT): bool = cint(a) == cint(b) -type - VkDebugReportObjectTypeEXT* {.size: sizeof(cint).} = enum - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT = 0 - VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT = 1 - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT = 2 - VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT = 3 - VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT = 4 - VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT = 5 - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT = 6 - VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT = 7 - VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT = 8 - VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT = 9 - VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT = 10 - VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT = 11 - VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT = 12 - VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT = 13 - VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT = 14 - VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT = 15 - VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT = 16 - VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT = 17 - VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT = 18 - VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT = 19 - VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT = 20 - VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT = 21 - VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT = 22 - VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT = 23 - VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT = 24 - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT = 25 - VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT = 26 - VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT = 27 - VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT = 28 - VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT = 29 - VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT = 30 - VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT = 33 - VK_DEBUG_REPORT_OBJECT_TYPE_CU_MODULE_NVX_EXT = 1000029000 - VK_DEBUG_REPORT_OBJECT_TYPE_CU_FUNCTION_NVX_EXT = 1000029001 - VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT = 1000085000 - VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT = 1000150000 - VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT = 1000156000 - VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT = 1000165000 - VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA_EXT = 1000366000 - VkDeviceMemoryReportEventTypeEXT* {.size: sizeof(cint).} = enum - VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT = 0 - VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT = 1 - VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT = 2 - VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT = 3 - VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT = 4 - VkRasterizationOrderAMD* {.size: sizeof(cint).} = enum - VK_RASTERIZATION_ORDER_STRICT_AMD = 0 - VK_RASTERIZATION_ORDER_RELAXED_AMD = 1 - VkExternalMemoryHandleTypeFlagBitsNV* {.size: sizeof(cint).} = enum - VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV = 0b00000000000000000000000000000001 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV = 0b00000000000000000000000000000010 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV = 0b00000000000000000000000000000100 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkExternalMemoryHandleTypeFlagBitsNV]): VkExternalMemoryHandleTypeFlagsNV = - for flag in flags: - result = VkExternalMemoryHandleTypeFlagsNV(uint(result) or uint(flag)) -func toEnums*(number: VkExternalMemoryHandleTypeFlagsNV): seq[VkExternalMemoryHandleTypeFlagBitsNV] = - for value in VkExternalMemoryHandleTypeFlagBitsNV.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkExternalMemoryHandleTypeFlagsNV): bool = cint(a) == cint(b) -type - VkExternalMemoryFeatureFlagBitsNV* {.size: sizeof(cint).} = enum - VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV = 0b00000000000000000000000000000001 - VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV = 0b00000000000000000000000000000010 - VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkExternalMemoryFeatureFlagBitsNV]): VkExternalMemoryFeatureFlagsNV = - for flag in flags: - result = VkExternalMemoryFeatureFlagsNV(uint(result) or uint(flag)) -func toEnums*(number: VkExternalMemoryFeatureFlagsNV): seq[VkExternalMemoryFeatureFlagBitsNV] = - for value in VkExternalMemoryFeatureFlagBitsNV.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkExternalMemoryFeatureFlagsNV): bool = cint(a) == cint(b) -type - VkValidationCheckEXT* {.size: sizeof(cint).} = enum - VK_VALIDATION_CHECK_ALL_EXT = 0 - VK_VALIDATION_CHECK_SHADERS_EXT = 1 - VkValidationFeatureEnableEXT* {.size: sizeof(cint).} = enum - VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT = 0 - VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT = 1 - VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT = 2 - VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT = 3 - VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT = 4 - VkValidationFeatureDisableEXT* {.size: sizeof(cint).} = enum - VK_VALIDATION_FEATURE_DISABLE_ALL_EXT = 0 - VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT = 1 - VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT = 2 - VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT = 3 - VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT = 4 - VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT = 5 - VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT = 6 - VK_VALIDATION_FEATURE_DISABLE_SHADER_VALIDATION_CACHE_EXT = 7 - VkSubgroupFeatureFlagBits* {.size: sizeof(cint).} = enum - VK_SUBGROUP_FEATURE_BASIC_BIT = 0b00000000000000000000000000000001 - VK_SUBGROUP_FEATURE_VOTE_BIT = 0b00000000000000000000000000000010 - VK_SUBGROUP_FEATURE_ARITHMETIC_BIT = 0b00000000000000000000000000000100 - VK_SUBGROUP_FEATURE_BALLOT_BIT = 0b00000000000000000000000000001000 - VK_SUBGROUP_FEATURE_SHUFFLE_BIT = 0b00000000000000000000000000010000 - VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = 0b00000000000000000000000000100000 - VK_SUBGROUP_FEATURE_CLUSTERED_BIT = 0b00000000000000000000000001000000 - VK_SUBGROUP_FEATURE_QUAD_BIT = 0b00000000000000000000000010000000 - VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV = 0b00000000000000000000000100000000 -func toBits*(flags: openArray[VkSubgroupFeatureFlagBits]): VkSubgroupFeatureFlags = - for flag in flags: - result = VkSubgroupFeatureFlags(uint(result) or uint(flag)) -func toEnums*(number: VkSubgroupFeatureFlags): seq[VkSubgroupFeatureFlagBits] = - for value in VkSubgroupFeatureFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSubgroupFeatureFlags): bool = cint(a) == cint(b) -type - VkIndirectCommandsLayoutUsageFlagBitsNV* {.size: sizeof(cint).} = enum - VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV = 0b00000000000000000000000000000001 - VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV = 0b00000000000000000000000000000010 - VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkIndirectCommandsLayoutUsageFlagBitsNV]): VkIndirectCommandsLayoutUsageFlagsNV = - for flag in flags: - result = VkIndirectCommandsLayoutUsageFlagsNV(uint(result) or uint(flag)) -func toEnums*(number: VkIndirectCommandsLayoutUsageFlagsNV): seq[VkIndirectCommandsLayoutUsageFlagBitsNV] = - for value in VkIndirectCommandsLayoutUsageFlagBitsNV.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkIndirectCommandsLayoutUsageFlagsNV): bool = cint(a) == cint(b) -type - VkIndirectStateFlagBitsNV* {.size: sizeof(cint).} = enum - VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkIndirectStateFlagBitsNV]): VkIndirectStateFlagsNV = - for flag in flags: - result = VkIndirectStateFlagsNV(uint(result) or uint(flag)) -func toEnums*(number: VkIndirectStateFlagsNV): seq[VkIndirectStateFlagBitsNV] = - for value in VkIndirectStateFlagBitsNV.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkIndirectStateFlagsNV): bool = cint(a) == cint(b) -type - VkIndirectCommandsTokenTypeNV* {.size: sizeof(cint).} = enum - VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV = 0 - VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV = 1 - VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV = 2 - VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV = 3 - VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV = 4 - VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV = 5 - VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV = 6 - VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV = 7 - VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV = 1000328000 - VkPrivateDataSlotCreateFlagBits* {.size: sizeof(cint).} = enum - VK_PRIVATE_DATA_SLOT_CREATE_RESERVED_0_BIT_NV = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkPrivateDataSlotCreateFlagBits]): VkPrivateDataSlotCreateFlags = - for flag in flags: - result = VkPrivateDataSlotCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPrivateDataSlotCreateFlags): seq[VkPrivateDataSlotCreateFlagBits] = - for value in VkPrivateDataSlotCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPrivateDataSlotCreateFlags): bool = cint(a) == cint(b) -type - VkDescriptorSetLayoutCreateFlagBits* {.size: sizeof(cint).} = enum - VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = 0b00000000000000000000000000000001 - VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT = 0b00000000000000000000000000000010 - VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT = 0b00000000000000000000000000000100 - VK_DESCRIPTOR_SET_LAYOUT_CREATE_RESERVED_3_BIT_AMD = 0b00000000000000000000000000001000 - VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT = 0b00000000000000000000000000010000 - VK_DESCRIPTOR_SET_LAYOUT_CREATE_EMBEDDED_IMMUTABLE_SAMPLERS_BIT_EXT = 0b00000000000000000000000000100000 -func toBits*(flags: openArray[VkDescriptorSetLayoutCreateFlagBits]): VkDescriptorSetLayoutCreateFlags = - for flag in flags: - result = VkDescriptorSetLayoutCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkDescriptorSetLayoutCreateFlags): seq[VkDescriptorSetLayoutCreateFlagBits] = - for value in VkDescriptorSetLayoutCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDescriptorSetLayoutCreateFlags): bool = cint(a) == cint(b) -type - VkExternalMemoryHandleTypeFlagBits* {.size: sizeof(cint).} = enum - VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT = 0b00000000000000000000000000000001 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0b00000000000000000000000000000010 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0b00000000000000000000000000000100 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT = 0b00000000000000000000000000001000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT = 0b00000000000000000000000000010000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT = 0b00000000000000000000000000100000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT = 0b00000000000000000000000001000000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT = 0b00000000000000000000000010000000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0b00000000000000000000000100000000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT = 0b00000000000000000000001000000000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID = 0b00000000000000000000010000000000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA = 0b00000000000000000000100000000000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV = 0b00000000000000000001000000000000 - VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCI_BUF_BIT_NV = 0b00000000000000000010000000000000 -func toBits*(flags: openArray[VkExternalMemoryHandleTypeFlagBits]): VkExternalMemoryHandleTypeFlags = - for flag in flags: - result = VkExternalMemoryHandleTypeFlags(uint(result) or uint(flag)) -func toEnums*(number: VkExternalMemoryHandleTypeFlags): seq[VkExternalMemoryHandleTypeFlagBits] = - for value in VkExternalMemoryHandleTypeFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkExternalMemoryHandleTypeFlags): bool = cint(a) == cint(b) -type - VkExternalMemoryFeatureFlagBits* {.size: sizeof(cint).} = enum - VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT = 0b00000000000000000000000000000001 - VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT = 0b00000000000000000000000000000010 - VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkExternalMemoryFeatureFlagBits]): VkExternalMemoryFeatureFlags = - for flag in flags: - result = VkExternalMemoryFeatureFlags(uint(result) or uint(flag)) -func toEnums*(number: VkExternalMemoryFeatureFlags): seq[VkExternalMemoryFeatureFlagBits] = - for value in VkExternalMemoryFeatureFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkExternalMemoryFeatureFlags): bool = cint(a) == cint(b) -type - VkExternalSemaphoreHandleTypeFlagBits* {.size: sizeof(cint).} = enum - VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT = 0b00000000000000000000000000000001 - VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0b00000000000000000000000000000010 - VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0b00000000000000000000000000000100 - VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT = 0b00000000000000000000000000001000 - VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT = 0b00000000000000000000000000010000 - VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SCI_SYNC_OBJ_BIT_NV = 0b00000000000000000000000000100000 - VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA = 0b00000000000000000000000010000000 -func toBits*(flags: openArray[VkExternalSemaphoreHandleTypeFlagBits]): VkExternalSemaphoreHandleTypeFlags = - for flag in flags: - result = VkExternalSemaphoreHandleTypeFlags(uint(result) or uint(flag)) -func toEnums*(number: VkExternalSemaphoreHandleTypeFlags): seq[VkExternalSemaphoreHandleTypeFlagBits] = - for value in VkExternalSemaphoreHandleTypeFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkExternalSemaphoreHandleTypeFlags): bool = cint(a) == cint(b) -type - VkExternalSemaphoreFeatureFlagBits* {.size: sizeof(cint).} = enum - VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT = 0b00000000000000000000000000000001 - VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkExternalSemaphoreFeatureFlagBits]): VkExternalSemaphoreFeatureFlags = - for flag in flags: - result = VkExternalSemaphoreFeatureFlags(uint(result) or uint(flag)) -func toEnums*(number: VkExternalSemaphoreFeatureFlags): seq[VkExternalSemaphoreFeatureFlagBits] = - for value in VkExternalSemaphoreFeatureFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkExternalSemaphoreFeatureFlags): bool = cint(a) == cint(b) -type - VkSemaphoreImportFlagBits* {.size: sizeof(cint).} = enum - VK_SEMAPHORE_IMPORT_TEMPORARY_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkSemaphoreImportFlagBits]): VkSemaphoreImportFlags = - for flag in flags: - result = VkSemaphoreImportFlags(uint(result) or uint(flag)) -func toEnums*(number: VkSemaphoreImportFlags): seq[VkSemaphoreImportFlagBits] = - for value in VkSemaphoreImportFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSemaphoreImportFlags): bool = cint(a) == cint(b) -type - VkExternalFenceHandleTypeFlagBits* {.size: sizeof(cint).} = enum - VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT = 0b00000000000000000000000000000001 - VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0b00000000000000000000000000000010 - VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0b00000000000000000000000000000100 - VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT = 0b00000000000000000000000000001000 - VK_EXTERNAL_FENCE_HANDLE_TYPE_SCI_SYNC_OBJ_BIT_NV = 0b00000000000000000000000000010000 - VK_EXTERNAL_FENCE_HANDLE_TYPE_SCI_SYNC_FENCE_BIT_NV = 0b00000000000000000000000000100000 -func toBits*(flags: openArray[VkExternalFenceHandleTypeFlagBits]): VkExternalFenceHandleTypeFlags = - for flag in flags: - result = VkExternalFenceHandleTypeFlags(uint(result) or uint(flag)) -func toEnums*(number: VkExternalFenceHandleTypeFlags): seq[VkExternalFenceHandleTypeFlagBits] = - for value in VkExternalFenceHandleTypeFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkExternalFenceHandleTypeFlags): bool = cint(a) == cint(b) -type - VkExternalFenceFeatureFlagBits* {.size: sizeof(cint).} = enum - VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT = 0b00000000000000000000000000000001 - VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkExternalFenceFeatureFlagBits]): VkExternalFenceFeatureFlags = - for flag in flags: - result = VkExternalFenceFeatureFlags(uint(result) or uint(flag)) -func toEnums*(number: VkExternalFenceFeatureFlags): seq[VkExternalFenceFeatureFlagBits] = - for value in VkExternalFenceFeatureFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkExternalFenceFeatureFlags): bool = cint(a) == cint(b) -type - VkFenceImportFlagBits* {.size: sizeof(cint).} = enum - VK_FENCE_IMPORT_TEMPORARY_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkFenceImportFlagBits]): VkFenceImportFlags = - for flag in flags: - result = VkFenceImportFlags(uint(result) or uint(flag)) -func toEnums*(number: VkFenceImportFlags): seq[VkFenceImportFlagBits] = - for value in VkFenceImportFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkFenceImportFlags): bool = cint(a) == cint(b) -type - VkSurfaceCounterFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_SURFACE_COUNTER_VBLANK_BIT_EXT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkSurfaceCounterFlagBitsEXT]): VkSurfaceCounterFlagsEXT = - for flag in flags: - result = VkSurfaceCounterFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkSurfaceCounterFlagsEXT): seq[VkSurfaceCounterFlagBitsEXT] = - for value in VkSurfaceCounterFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSurfaceCounterFlagsEXT): bool = cint(a) == cint(b) -type - VkDisplayPowerStateEXT* {.size: sizeof(cint).} = enum - VK_DISPLAY_POWER_STATE_OFF_EXT = 0 - VK_DISPLAY_POWER_STATE_SUSPEND_EXT = 1 - VK_DISPLAY_POWER_STATE_ON_EXT = 2 - VkDeviceEventTypeEXT* {.size: sizeof(cint).} = enum - VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT = 0 - VkDisplayEventTypeEXT* {.size: sizeof(cint).} = enum - VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT = 0 - VkPeerMemoryFeatureFlagBits* {.size: sizeof(cint).} = enum - VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT = 0b00000000000000000000000000000001 - VK_PEER_MEMORY_FEATURE_COPY_DST_BIT = 0b00000000000000000000000000000010 - VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT = 0b00000000000000000000000000000100 - VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkPeerMemoryFeatureFlagBits]): VkPeerMemoryFeatureFlags = - for flag in flags: - result = VkPeerMemoryFeatureFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPeerMemoryFeatureFlags): seq[VkPeerMemoryFeatureFlagBits] = - for value in VkPeerMemoryFeatureFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPeerMemoryFeatureFlags): bool = cint(a) == cint(b) -type - VkMemoryAllocateFlagBits* {.size: sizeof(cint).} = enum - VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT = 0b00000000000000000000000000000001 - VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT = 0b00000000000000000000000000000010 - VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkMemoryAllocateFlagBits]): VkMemoryAllocateFlags = - for flag in flags: - result = VkMemoryAllocateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkMemoryAllocateFlags): seq[VkMemoryAllocateFlagBits] = - for value in VkMemoryAllocateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkMemoryAllocateFlags): bool = cint(a) == cint(b) -type - VkDeviceGroupPresentModeFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR = 0b00000000000000000000000000000001 - VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR = 0b00000000000000000000000000000010 - VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR = 0b00000000000000000000000000000100 - VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkDeviceGroupPresentModeFlagBitsKHR]): VkDeviceGroupPresentModeFlagsKHR = - for flag in flags: - result = VkDeviceGroupPresentModeFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkDeviceGroupPresentModeFlagsKHR): seq[VkDeviceGroupPresentModeFlagBitsKHR] = - for value in VkDeviceGroupPresentModeFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDeviceGroupPresentModeFlagsKHR): bool = cint(a) == cint(b) -type - VkSwapchainCreateFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 0b00000000000000000000000000000001 - VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR = 0b00000000000000000000000000000010 - VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR = 0b00000000000000000000000000000100 - VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT = 0b00000000000000000000000000001000 - VK_SWAPCHAIN_CREATE_RESERVED_4_BIT_EXT = 0b00000000000000000000000000010000 -func toBits*(flags: openArray[VkSwapchainCreateFlagBitsKHR]): VkSwapchainCreateFlagsKHR = - for flag in flags: - result = VkSwapchainCreateFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkSwapchainCreateFlagsKHR): seq[VkSwapchainCreateFlagBitsKHR] = - for value in VkSwapchainCreateFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSwapchainCreateFlagsKHR): bool = cint(a) == cint(b) -type - VkViewportCoordinateSwizzleNV* {.size: sizeof(cint).} = enum - VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV = 0 - VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_X_NV = 1 - VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Y_NV = 2 - VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Y_NV = 3 - VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Z_NV = 4 - VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Z_NV = 5 - VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_W_NV = 6 - VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV = 7 - VkDiscardRectangleModeEXT* {.size: sizeof(cint).} = enum - VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT = 0 - VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT = 1 - VkSubpassDescriptionFlagBits* {.size: sizeof(cint).} = enum - VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX = 0b00000000000000000000000000000001 - VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX = 0b00000000000000000000000000000010 - VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM = 0b00000000000000000000000000000100 - VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM = 0b00000000000000000000000000001000 - VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT = 0b00000000000000000000000000010000 - VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0b00000000000000000000000000100000 - VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0b00000000000000000000000001000000 - VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT = 0b00000000000000000000000010000000 -func toBits*(flags: openArray[VkSubpassDescriptionFlagBits]): VkSubpassDescriptionFlags = - for flag in flags: - result = VkSubpassDescriptionFlags(uint(result) or uint(flag)) -func toEnums*(number: VkSubpassDescriptionFlags): seq[VkSubpassDescriptionFlagBits] = - for value in VkSubpassDescriptionFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSubpassDescriptionFlags): bool = cint(a) == cint(b) -type - VkPointClippingBehavior* {.size: sizeof(cint).} = enum - VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES = 0 - VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY = 1 - VkSamplerReductionMode* {.size: sizeof(cint).} = enum - VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE = 0 - VK_SAMPLER_REDUCTION_MODE_MIN = 1 - VK_SAMPLER_REDUCTION_MODE_MAX = 2 - VkTessellationDomainOrigin* {.size: sizeof(cint).} = enum - VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT = 0 - VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT = 1 - VkSamplerYcbcrModelConversion* {.size: sizeof(cint).} = enum - VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY = 0 - VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY = 1 - VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709 = 2 - VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601 = 3 - VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020 = 4 - VkSamplerYcbcrRange* {.size: sizeof(cint).} = enum - VK_SAMPLER_YCBCR_RANGE_ITU_FULL = 0 - VK_SAMPLER_YCBCR_RANGE_ITU_NARROW = 1 - VkChromaLocation* {.size: sizeof(cint).} = enum - VK_CHROMA_LOCATION_COSITED_EVEN = 0 - VK_CHROMA_LOCATION_MIDPOINT = 1 - VkBlendOverlapEXT* {.size: sizeof(cint).} = enum - VK_BLEND_OVERLAP_UNCORRELATED_EXT = 0 - VK_BLEND_OVERLAP_DISJOINT_EXT = 1 - VK_BLEND_OVERLAP_CONJOINT_EXT = 2 - VkCoverageModulationModeNV* {.size: sizeof(cint).} = enum - VK_COVERAGE_MODULATION_MODE_NONE_NV = 0 - VK_COVERAGE_MODULATION_MODE_RGB_NV = 1 - VK_COVERAGE_MODULATION_MODE_ALPHA_NV = 2 - VK_COVERAGE_MODULATION_MODE_RGBA_NV = 3 - VkCoverageReductionModeNV* {.size: sizeof(cint).} = enum - VK_COVERAGE_REDUCTION_MODE_MERGE_NV = 0 - VK_COVERAGE_REDUCTION_MODE_TRUNCATE_NV = 1 - VkValidationCacheHeaderVersionEXT* {.size: sizeof(cint).} = enum - VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT = 1 - VkShaderInfoTypeAMD* {.size: sizeof(cint).} = enum - VK_SHADER_INFO_TYPE_STATISTICS_AMD = 0 - VK_SHADER_INFO_TYPE_BINARY_AMD = 1 - VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD = 2 - VkQueueGlobalPriorityKHR* {.size: sizeof(cint).} = enum - VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR = 128 - VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR = 256 - VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR = 512 - VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR = 1024 - VkDebugUtilsMessageSeverityFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT = 0b00000000000000000000000000000001 - VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT = 0b00000000000000000000000000010000 - VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT = 0b00000000000000000000000100000000 - VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT = 0b00000000000000000001000000000000 -func toBits*(flags: openArray[VkDebugUtilsMessageSeverityFlagBitsEXT]): VkDebugUtilsMessageSeverityFlagsEXT = - for flag in flags: - result = VkDebugUtilsMessageSeverityFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkDebugUtilsMessageSeverityFlagsEXT): seq[VkDebugUtilsMessageSeverityFlagBitsEXT] = - for value in VkDebugUtilsMessageSeverityFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDebugUtilsMessageSeverityFlagsEXT): bool = cint(a) == cint(b) -type - VkDebugUtilsMessageTypeFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT = 0b00000000000000000000000000000001 - VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT = 0b00000000000000000000000000000010 - VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT = 0b00000000000000000000000000000100 - VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkDebugUtilsMessageTypeFlagBitsEXT]): VkDebugUtilsMessageTypeFlagsEXT = - for flag in flags: - result = VkDebugUtilsMessageTypeFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkDebugUtilsMessageTypeFlagsEXT): seq[VkDebugUtilsMessageTypeFlagBitsEXT] = - for value in VkDebugUtilsMessageTypeFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDebugUtilsMessageTypeFlagsEXT): bool = cint(a) == cint(b) -type - VkConservativeRasterizationModeEXT* {.size: sizeof(cint).} = enum - VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT = 0 - VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT = 1 - VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT = 2 - VkDescriptorBindingFlagBits* {.size: sizeof(cint).} = enum - VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT = 0b00000000000000000000000000000001 - VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT = 0b00000000000000000000000000000010 - VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT = 0b00000000000000000000000000000100 - VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT = 0b00000000000000000000000000001000 - VK_DESCRIPTOR_BINDING_RESERVED_4_BIT_QCOM = 0b00000000000000000000000000010000 -func toBits*(flags: openArray[VkDescriptorBindingFlagBits]): VkDescriptorBindingFlags = - for flag in flags: - result = VkDescriptorBindingFlags(uint(result) or uint(flag)) -func toEnums*(number: VkDescriptorBindingFlags): seq[VkDescriptorBindingFlagBits] = - for value in VkDescriptorBindingFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDescriptorBindingFlags): bool = cint(a) == cint(b) -type - VkVendorId* {.size: sizeof(cint).} = enum - VK_VENDOR_ID_VIV = 65537 - VK_VENDOR_ID_VSI = 65538 - VK_VENDOR_ID_KAZAN = 65539 - VK_VENDOR_ID_CODEPLAY = 65540 - VK_VENDOR_ID_MESA = 65541 - VK_VENDOR_ID_POCL = 65542 - VkDriverId* {.size: sizeof(cint).} = enum - VK_DRIVER_ID_AMD_PROPRIETARY = 1 - VK_DRIVER_ID_AMD_OPEN_SOURCE = 2 - VK_DRIVER_ID_MESA_RADV = 3 - VK_DRIVER_ID_NVIDIA_PROPRIETARY = 4 - VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS = 5 - VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA = 6 - VK_DRIVER_ID_IMAGINATION_PROPRIETARY = 7 - VK_DRIVER_ID_QUALCOMM_PROPRIETARY = 8 - VK_DRIVER_ID_ARM_PROPRIETARY = 9 - VK_DRIVER_ID_GOOGLE_SWIFTSHADER = 10 - VK_DRIVER_ID_GGP_PROPRIETARY = 11 - VK_DRIVER_ID_BROADCOM_PROPRIETARY = 12 - VK_DRIVER_ID_MESA_LLVMPIPE = 13 - VK_DRIVER_ID_MOLTENVK = 14 - VK_DRIVER_ID_COREAVI_PROPRIETARY = 15 - VK_DRIVER_ID_JUICE_PROPRIETARY = 16 - VK_DRIVER_ID_VERISILICON_PROPRIETARY = 17 - VK_DRIVER_ID_MESA_TURNIP = 18 - VK_DRIVER_ID_MESA_V3DV = 19 - VK_DRIVER_ID_MESA_PANVK = 20 - VK_DRIVER_ID_SAMSUNG_PROPRIETARY = 21 - VK_DRIVER_ID_MESA_VENUS = 22 - VK_DRIVER_ID_MESA_DOZEN = 23 - VK_DRIVER_ID_MESA_NVK = 24 - VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA = 25 - VkConditionalRenderingFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkConditionalRenderingFlagBitsEXT]): VkConditionalRenderingFlagsEXT = - for flag in flags: - result = VkConditionalRenderingFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkConditionalRenderingFlagsEXT): seq[VkConditionalRenderingFlagBitsEXT] = - for value in VkConditionalRenderingFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkConditionalRenderingFlagsEXT): bool = cint(a) == cint(b) -type - VkResolveModeFlagBits* {.size: sizeof(cint).} = enum - VK_RESOLVE_MODE_SAMPLE_ZERO_BIT = 0b00000000000000000000000000000001 - VK_RESOLVE_MODE_AVERAGE_BIT = 0b00000000000000000000000000000010 - VK_RESOLVE_MODE_MIN_BIT = 0b00000000000000000000000000000100 - VK_RESOLVE_MODE_MAX_BIT = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkResolveModeFlagBits]): VkResolveModeFlags = - for flag in flags: - result = VkResolveModeFlags(uint(result) or uint(flag)) -func toEnums*(number: VkResolveModeFlags): seq[VkResolveModeFlagBits] = - for value in VkResolveModeFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkResolveModeFlags): bool = cint(a) == cint(b) -const - VK_RESOLVE_MODE_NONE* = 0 -type - VkShadingRatePaletteEntryNV* {.size: sizeof(cint).} = enum - VK_SHADING_RATE_PALETTE_ENTRY_NO_INVOCATIONS_NV = 0 - VK_SHADING_RATE_PALETTE_ENTRY_16_INVOCATIONS_PER_PIXEL_NV = 1 - VK_SHADING_RATE_PALETTE_ENTRY_8_INVOCATIONS_PER_PIXEL_NV = 2 - VK_SHADING_RATE_PALETTE_ENTRY_4_INVOCATIONS_PER_PIXEL_NV = 3 - VK_SHADING_RATE_PALETTE_ENTRY_2_INVOCATIONS_PER_PIXEL_NV = 4 - VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV = 5 - VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X1_PIXELS_NV = 6 - VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV = 7 - VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X2_PIXELS_NV = 8 - VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X2_PIXELS_NV = 9 - VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X4_PIXELS_NV = 10 - VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV = 11 - VkCoarseSampleOrderTypeNV* {.size: sizeof(cint).} = enum - VK_COARSE_SAMPLE_ORDER_TYPE_DEFAULT_NV = 0 - VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV = 1 - VK_COARSE_SAMPLE_ORDER_TYPE_PIXEL_MAJOR_NV = 2 - VK_COARSE_SAMPLE_ORDER_TYPE_SAMPLE_MAJOR_NV = 3 - VkGeometryInstanceFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR = 0b00000000000000000000000000000001 - VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR = 0b00000000000000000000000000000010 - VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR = 0b00000000000000000000000000000100 - VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR = 0b00000000000000000000000000001000 - VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_EXT = 0b00000000000000000000000000010000 - VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT = 0b00000000000000000000000000100000 -func toBits*(flags: openArray[VkGeometryInstanceFlagBitsKHR]): VkGeometryInstanceFlagsKHR = - for flag in flags: - result = VkGeometryInstanceFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkGeometryInstanceFlagsKHR): seq[VkGeometryInstanceFlagBitsKHR] = - for value in VkGeometryInstanceFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkGeometryInstanceFlagsKHR): bool = cint(a) == cint(b) -type - VkGeometryFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_GEOMETRY_OPAQUE_BIT_KHR = 0b00000000000000000000000000000001 - VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkGeometryFlagBitsKHR]): VkGeometryFlagsKHR = - for flag in flags: - result = VkGeometryFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkGeometryFlagsKHR): seq[VkGeometryFlagBitsKHR] = - for value in VkGeometryFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkGeometryFlagsKHR): bool = cint(a) == cint(b) -type - VkBuildAccelerationStructureFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR = 0b00000000000000000000000000000001 - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR = 0b00000000000000000000000000000010 - VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR = 0b00000000000000000000000000000100 - VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR = 0b00000000000000000000000000001000 - VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR = 0b00000000000000000000000000010000 - VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV = 0b00000000000000000000000000100000 - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT = 0b00000000000000000000000001000000 - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT = 0b00000000000000000000000010000000 - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT = 0b00000000000000000000000100000000 - VK_BUILD_ACCELERATION_STRUCTURE_RESERVED_BIT_9_NV = 0b00000000000000000000001000000000 - VK_BUILD_ACCELERATION_STRUCTURE_RESERVED_BIT_10_NV = 0b00000000000000000000010000000000 -func toBits*(flags: openArray[VkBuildAccelerationStructureFlagBitsKHR]): VkBuildAccelerationStructureFlagsKHR = - for flag in flags: - result = VkBuildAccelerationStructureFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkBuildAccelerationStructureFlagsKHR): seq[VkBuildAccelerationStructureFlagBitsKHR] = - for value in VkBuildAccelerationStructureFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkBuildAccelerationStructureFlagsKHR): bool = cint(a) == cint(b) -type - VkAccelerationStructureCreateFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = 0b00000000000000000000000000000001 - VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV = 0b00000000000000000000000000000100 - VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkAccelerationStructureCreateFlagBitsKHR]): VkAccelerationStructureCreateFlagsKHR = - for flag in flags: - result = VkAccelerationStructureCreateFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkAccelerationStructureCreateFlagsKHR): seq[VkAccelerationStructureCreateFlagBitsKHR] = - for value in VkAccelerationStructureCreateFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkAccelerationStructureCreateFlagsKHR): bool = cint(a) == cint(b) -type - VkCopyAccelerationStructureModeKHR* {.size: sizeof(cint).} = enum - VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR = 0 - VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR = 1 - VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR = 2 - VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR = 3 - VkBuildAccelerationStructureModeKHR* {.size: sizeof(cint).} = enum - VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR = 0 - VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR = 1 - VkAccelerationStructureTypeKHR* {.size: sizeof(cint).} = enum - VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR = 0 - VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR = 1 - VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR = 2 - VkGeometryTypeKHR* {.size: sizeof(cint).} = enum - VK_GEOMETRY_TYPE_TRIANGLES_KHR = 0 - VK_GEOMETRY_TYPE_AABBS_KHR = 1 - VK_GEOMETRY_TYPE_INSTANCES_KHR = 2 - VkAccelerationStructureMemoryRequirementsTypeNV* {.size: sizeof(cint).} = enum - VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV = 0 - VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV = 1 - VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV = 2 - VkAccelerationStructureBuildTypeKHR* {.size: sizeof(cint).} = enum - VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR = 0 - VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR = 1 - VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR = 2 - VkRayTracingShaderGroupTypeKHR* {.size: sizeof(cint).} = enum - VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR = 0 - VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR = 1 - VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR = 2 - VkAccelerationStructureCompatibilityKHR* {.size: sizeof(cint).} = enum - VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR = 0 - VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR = 1 - VkShaderGroupShaderKHR* {.size: sizeof(cint).} = enum - VK_SHADER_GROUP_SHADER_GENERAL_KHR = 0 - VK_SHADER_GROUP_SHADER_CLOSEST_HIT_KHR = 1 - VK_SHADER_GROUP_SHADER_ANY_HIT_KHR = 2 - VK_SHADER_GROUP_SHADER_INTERSECTION_KHR = 3 - VkMemoryOverallocationBehaviorAMD* {.size: sizeof(cint).} = enum - VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD = 0 - VK_MEMORY_OVERALLOCATION_BEHAVIOR_ALLOWED_AMD = 1 - VK_MEMORY_OVERALLOCATION_BEHAVIOR_DISALLOWED_AMD = 2 - VkFramebufferCreateFlagBits* {.size: sizeof(cint).} = enum - VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkFramebufferCreateFlagBits]): VkFramebufferCreateFlags = - for flag in flags: - result = VkFramebufferCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkFramebufferCreateFlags): seq[VkFramebufferCreateFlagBits] = - for value in VkFramebufferCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkFramebufferCreateFlags): bool = cint(a) == cint(b) -type - VkScopeNV* {.size: sizeof(cint).} = enum - VK_SCOPE_DEVICE_NV = 1 - VK_SCOPE_WORKGROUP_NV = 2 - VK_SCOPE_SUBGROUP_NV = 3 - VK_SCOPE_QUEUE_FAMILY_NV = 5 - VkComponentTypeNV* {.size: sizeof(cint).} = enum - VK_COMPONENT_TYPE_FLOAT16_NV = 0 - VK_COMPONENT_TYPE_FLOAT32_NV = 1 - VK_COMPONENT_TYPE_FLOAT64_NV = 2 - VK_COMPONENT_TYPE_SINT8_NV = 3 - VK_COMPONENT_TYPE_SINT16_NV = 4 - VK_COMPONENT_TYPE_SINT32_NV = 5 - VK_COMPONENT_TYPE_SINT64_NV = 6 - VK_COMPONENT_TYPE_UINT8_NV = 7 - VK_COMPONENT_TYPE_UINT16_NV = 8 - VK_COMPONENT_TYPE_UINT32_NV = 9 - VK_COMPONENT_TYPE_UINT64_NV = 10 - VkDeviceDiagnosticsConfigFlagBitsNV* {.size: sizeof(cint).} = enum - VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_DEBUG_INFO_BIT_NV = 0b00000000000000000000000000000001 - VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_RESOURCE_TRACKING_BIT_NV = 0b00000000000000000000000000000010 - VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_AUTOMATIC_CHECKPOINTS_BIT_NV = 0b00000000000000000000000000000100 - VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_ERROR_REPORTING_BIT_NV = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkDeviceDiagnosticsConfigFlagBitsNV]): VkDeviceDiagnosticsConfigFlagsNV = - for flag in flags: - result = VkDeviceDiagnosticsConfigFlagsNV(uint(result) or uint(flag)) -func toEnums*(number: VkDeviceDiagnosticsConfigFlagsNV): seq[VkDeviceDiagnosticsConfigFlagBitsNV] = - for value in VkDeviceDiagnosticsConfigFlagBitsNV.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDeviceDiagnosticsConfigFlagsNV): bool = cint(a) == cint(b) -type - VkPipelineCreationFeedbackFlagBits* {.size: sizeof(cint).} = enum - VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT = 0b00000000000000000000000000000001 - VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT = 0b00000000000000000000000000000010 - VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkPipelineCreationFeedbackFlagBits]): VkPipelineCreationFeedbackFlags = - for flag in flags: - result = VkPipelineCreationFeedbackFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPipelineCreationFeedbackFlags): seq[VkPipelineCreationFeedbackFlagBits] = - for value in VkPipelineCreationFeedbackFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPipelineCreationFeedbackFlags): bool = cint(a) == cint(b) -type - VkFullScreenExclusiveEXT* {.size: sizeof(cint).} = enum - VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT = 0 - VK_FULL_SCREEN_EXCLUSIVE_ALLOWED_EXT = 1 - VK_FULL_SCREEN_EXCLUSIVE_DISALLOWED_EXT = 2 - VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT = 3 - VkPerformanceCounterScopeKHR* {.size: sizeof(cint).} = enum - VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR = 0 - VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR = 1 - VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR = 2 - VkMemoryDecompressionMethodFlagBitsNV* {.size: 8.} = enum - VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV = 0b0000000000000000000000000000000000000000000000000000000000000001 -func toBits*(flags: openArray[VkMemoryDecompressionMethodFlagBitsNV]): VkMemoryDecompressionMethodFlagsNV = - for flag in flags: - result = VkMemoryDecompressionMethodFlagsNV(uint64(result) or uint64(flag)) -func toEnums*(number: VkMemoryDecompressionMethodFlagsNV): seq[VkMemoryDecompressionMethodFlagBitsNV] = - for value in VkMemoryDecompressionMethodFlagBitsNV.items: - if (cast[uint64](value) and uint64(number)) > 0: - result.add value -proc `==`*(a, b: VkMemoryDecompressionMethodFlagsNV): bool = uint64(a) == uint64(b) -type - VkPerformanceCounterUnitKHR* {.size: sizeof(cint).} = enum - VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR = 0 - VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR = 1 - VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR = 2 - VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR = 3 - VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR = 4 - VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR = 5 - VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR = 6 - VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR = 7 - VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR = 8 - VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR = 9 - VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR = 10 - VkPerformanceCounterStorageKHR* {.size: sizeof(cint).} = enum - VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR = 0 - VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR = 1 - VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR = 2 - VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR = 3 - VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR = 4 - VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR = 5 - VkPerformanceCounterDescriptionFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR = 0b00000000000000000000000000000001 - VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkPerformanceCounterDescriptionFlagBitsKHR]): VkPerformanceCounterDescriptionFlagsKHR = - for flag in flags: - result = VkPerformanceCounterDescriptionFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkPerformanceCounterDescriptionFlagsKHR): seq[VkPerformanceCounterDescriptionFlagBitsKHR] = - for value in VkPerformanceCounterDescriptionFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPerformanceCounterDescriptionFlagsKHR): bool = cint(a) == cint(b) -type - VkPerformanceConfigurationTypeINTEL* {.size: sizeof(cint).} = enum - VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL = 0 - VkQueryPoolSamplingModeINTEL* {.size: sizeof(cint).} = enum - VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL = 0 - VkPerformanceOverrideTypeINTEL* {.size: sizeof(cint).} = enum - VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL = 0 - VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL = 1 - VkPerformanceParameterTypeINTEL* {.size: sizeof(cint).} = enum - VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL = 0 - VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL = 1 - VkPerformanceValueTypeINTEL* {.size: sizeof(cint).} = enum - VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL = 0 - VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL = 1 - VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL = 2 - VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL = 3 - VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL = 4 - VkShaderFloatControlsIndependence* {.size: sizeof(cint).} = enum - VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY = 0 - VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL = 1 - VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE = 2 - VkPipelineExecutableStatisticFormatKHR* {.size: sizeof(cint).} = enum - VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR = 0 - VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR = 1 - VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR = 2 - VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR = 3 - VkLineRasterizationModeEXT* {.size: sizeof(cint).} = enum - VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT = 0 - VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT = 1 - VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT = 2 - VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT = 3 - VkFaultLevel* {.size: sizeof(cint).} = enum - VK_FAULT_LEVEL_UNASSIGNED = 0 - VK_FAULT_LEVEL_CRITICAL = 1 - VK_FAULT_LEVEL_RECOVERABLE = 2 - VK_FAULT_LEVEL_WARNING = 3 - VkFaultType* {.size: sizeof(cint).} = enum - VK_FAULT_TYPE_INVALID = 0 - VK_FAULT_TYPE_UNASSIGNED = 1 - VK_FAULT_TYPE_IMPLEMENTATION = 2 - VK_FAULT_TYPE_SYSTEM = 3 - VK_FAULT_TYPE_PHYSICAL_DEVICE = 4 - VK_FAULT_TYPE_COMMAND_BUFFER_FULL = 5 - VK_FAULT_TYPE_INVALID_API_USAGE = 6 - VkFaultQueryBehavior* {.size: sizeof(cint).} = enum - VK_FAULT_QUERY_BEHAVIOR_GET_AND_CLEAR_ALL_FAULTS = 0 - VkToolPurposeFlagBits* {.size: sizeof(cint).} = enum - VK_TOOL_PURPOSE_VALIDATION_BIT = 0b00000000000000000000000000000001 - VK_TOOL_PURPOSE_PROFILING_BIT = 0b00000000000000000000000000000010 - VK_TOOL_PURPOSE_TRACING_BIT = 0b00000000000000000000000000000100 - VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT = 0b00000000000000000000000000001000 - VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT = 0b00000000000000000000000000010000 - VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT = 0b00000000000000000000000000100000 - VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT = 0b00000000000000000000000001000000 -func toBits*(flags: openArray[VkToolPurposeFlagBits]): VkToolPurposeFlags = - for flag in flags: - result = VkToolPurposeFlags(uint(result) or uint(flag)) -func toEnums*(number: VkToolPurposeFlags): seq[VkToolPurposeFlagBits] = - for value in VkToolPurposeFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkToolPurposeFlags): bool = cint(a) == cint(b) -type - VkPipelineMatchControl* {.size: sizeof(cint).} = enum - VK_PIPELINE_MATCH_CONTROL_APPLICATION_UUID_EXACT_MATCH = 0 - VkFragmentShadingRateCombinerOpKHR* {.size: sizeof(cint).} = enum - VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR = 0 - VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR = 1 - VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_KHR = 2 - VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_KHR = 3 - VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR = 4 - VkFragmentShadingRateNV* {.size: sizeof(cint).} = enum - VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV = 0 - VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV = 1 - VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV = 4 - VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV = 5 - VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV = 6 - VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV = 9 - VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV = 10 - VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV = 11 - VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV = 12 - VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV = 13 - VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV = 14 - VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV = 15 - VkFragmentShadingRateTypeNV* {.size: sizeof(cint).} = enum - VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV = 0 - VK_FRAGMENT_SHADING_RATE_TYPE_ENUMS_NV = 1 - VkSubpassMergeStatusEXT* {.size: sizeof(cint).} = enum - VK_SUBPASS_MERGE_STATUS_MERGED_EXT = 0 - VK_SUBPASS_MERGE_STATUS_DISALLOWED_EXT = 1 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT = 2 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT = 3 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT = 4 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT = 5 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT = 6 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT = 7 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT = 8 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT = 9 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT = 10 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT = 11 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT = 12 - VK_SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT = 13 - VkAccessFlagBits2* {.size: 8.} = enum - VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT = 0b0000000000000000000000000000000000000000000000000000000000000001 - VK_ACCESS_2_INDEX_READ_BIT = 0b0000000000000000000000000000000000000000000000000000000000000010 - VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT = 0b0000000000000000000000000000000000000000000000000000000000000100 - VK_ACCESS_2_UNIFORM_READ_BIT = 0b0000000000000000000000000000000000000000000000000000000000001000 - VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT = 0b0000000000000000000000000000000000000000000000000000000000010000 - VK_ACCESS_2_SHADER_READ_BIT = 0b0000000000000000000000000000000000000000000000000000000000100000 - VK_ACCESS_2_SHADER_WRITE_BIT = 0b0000000000000000000000000000000000000000000000000000000001000000 - VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT = 0b0000000000000000000000000000000000000000000000000000000010000000 - VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT = 0b0000000000000000000000000000000000000000000000000000000100000000 - VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0b0000000000000000000000000000000000000000000000000000001000000000 - VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0b0000000000000000000000000000000000000000000000000000010000000000 - VK_ACCESS_2_TRANSFER_READ_BIT = 0b0000000000000000000000000000000000000000000000000000100000000000 - VK_ACCESS_2_TRANSFER_WRITE_BIT = 0b0000000000000000000000000000000000000000000000000001000000000000 - VK_ACCESS_2_HOST_READ_BIT = 0b0000000000000000000000000000000000000000000000000010000000000000 - VK_ACCESS_2_HOST_WRITE_BIT = 0b0000000000000000000000000000000000000000000000000100000000000000 - VK_ACCESS_2_MEMORY_READ_BIT = 0b0000000000000000000000000000000000000000000000001000000000000000 - VK_ACCESS_2_MEMORY_WRITE_BIT = 0b0000000000000000000000000000000000000000000000010000000000000000 - VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0b0000000000000000000000000000000000000000000000100000000000000000 - VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0b0000000000000000000000000000000000000000000001000000000000000000 - VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0b0000000000000000000000000000000000000000000010000000000000000000 - VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT = 0b0000000000000000000000000000000000000000000100000000000000000000 - VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0b0000000000000000000000000000000000000000001000000000000000000000 - VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0b0000000000000000000000000000000000000000010000000000000000000000 - VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0b0000000000000000000000000000000000000000100000000000000000000000 - VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0b0000000000000000000000000000000000000001000000000000000000000000 - VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0b0000000000000000000000000000000000000010000000000000000000000000 - VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0b0000000000000000000000000000000000000100000000000000000000000000 - VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0b0000000000000000000000000000000000001000000000000000000000000000 - VK_ACCESS_2_SHADER_SAMPLED_READ_BIT = 0b0000000000000000000000000000000100000000000000000000000000000000 - VK_ACCESS_2_SHADER_STORAGE_READ_BIT = 0b0000000000000000000000000000001000000000000000000000000000000000 - VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT = 0b0000000000000000000000000000010000000000000000000000000000000000 - VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR = 0b0000000000000000000000000000100000000000000000000000000000000000 - VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR = 0b0000000000000000000000000001000000000000000000000000000000000000 - VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR = 0b0000000000000000000000000010000000000000000000000000000000000000 - VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR = 0b0000000000000000000000000100000000000000000000000000000000000000 - VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI = 0b0000000000000000000000001000000000000000000000000000000000000000 - VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR = 0b0000000000000000000000010000000000000000000000000000000000000000 - VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT = 0b0000000000000000000000100000000000000000000000000000000000000000 - VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV = 0b0000000000000000000001000000000000000000000000000000000000000000 - VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV = 0b0000000000000000000010000000000000000000000000000000000000000000 - VK_ACCESS_2_MICROMAP_READ_BIT_EXT = 0b0000000000000000000100000000000000000000000000000000000000000000 - VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT = 0b0000000000000000001000000000000000000000000000000000000000000000 - VK_ACCESS_2_RESERVED_46_BIT_EXT = 0b0000000000000000010000000000000000000000000000000000000000000000 -func toBits*(flags: openArray[VkAccessFlagBits2]): VkAccessFlags2 = - for flag in flags: - result = VkAccessFlags2(uint64(result) or uint64(flag)) -func toEnums*(number: VkAccessFlags2): seq[VkAccessFlagBits2] = - for value in VkAccessFlagBits2.items: - if (cast[uint64](value) and uint64(number)) > 0: - result.add value -proc `==`*(a, b: VkAccessFlags2): bool = uint64(a) == uint64(b) -const - VK_ACCESS_2_NONE* = 0 -type - VkPipelineStageFlagBits2* {.size: 8.} = enum - VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT = 0b0000000000000000000000000000000000000000000000000000000000000001 - VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT = 0b0000000000000000000000000000000000000000000000000000000000000010 - VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT = 0b0000000000000000000000000000000000000000000000000000000000000100 - VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT = 0b0000000000000000000000000000000000000000000000000000000000001000 - VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT = 0b0000000000000000000000000000000000000000000000000000000000010000 - VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT = 0b0000000000000000000000000000000000000000000000000000000000100000 - VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT = 0b0000000000000000000000000000000000000000000000000000000001000000 - VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT = 0b0000000000000000000000000000000000000000000000000000000010000000 - VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT = 0b0000000000000000000000000000000000000000000000000000000100000000 - VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT = 0b0000000000000000000000000000000000000000000000000000001000000000 - VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT = 0b0000000000000000000000000000000000000000000000000000010000000000 - VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT = 0b0000000000000000000000000000000000000000000000000000100000000000 - VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT = 0b0000000000000000000000000000000000000000000000000001000000000000 - VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT = 0b0000000000000000000000000000000000000000000000000010000000000000 - VK_PIPELINE_STAGE_2_HOST_BIT = 0b0000000000000000000000000000000000000000000000000100000000000000 - VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT = 0b0000000000000000000000000000000000000000000000001000000000000000 - VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT = 0b0000000000000000000000000000000000000000000000010000000000000000 - VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0b0000000000000000000000000000000000000000000000100000000000000000 - VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0b0000000000000000000000000000000000000000000001000000000000000000 - VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT = 0b0000000000000000000000000000000000000000000010000000000000000000 - VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT = 0b0000000000000000000000000000000000000000000100000000000000000000 - VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0b0000000000000000000000000000000000000000001000000000000000000000 - VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0b0000000000000000000000000000000000000000010000000000000000000000 - VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0b0000000000000000000000000000000000000000100000000000000000000000 - VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0b0000000000000000000000000000000000000001000000000000000000000000 - VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0b0000000000000000000000000000000000000010000000000000000000000000 - VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR = 0b0000000000000000000000000000000000000100000000000000000000000000 - VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR = 0b0000000000000000000000000000000000001000000000000000000000000000 - VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR = 0b0000000000000000000000000000000000010000000000000000000000000000 - VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV = 0b0000000000000000000000000000000000100000000000000000000000000000 - VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT = 0b0000000000000000000000000000000001000000000000000000000000000000 - VK_PIPELINE_STAGE_2_COPY_BIT = 0b0000000000000000000000000000000100000000000000000000000000000000 - VK_PIPELINE_STAGE_2_RESOLVE_BIT = 0b0000000000000000000000000000001000000000000000000000000000000000 - VK_PIPELINE_STAGE_2_BLIT_BIT = 0b0000000000000000000000000000010000000000000000000000000000000000 - VK_PIPELINE_STAGE_2_CLEAR_BIT = 0b0000000000000000000000000000100000000000000000000000000000000000 - VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT = 0b0000000000000000000000000001000000000000000000000000000000000000 - VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT = 0b0000000000000000000000000010000000000000000000000000000000000000 - VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT = 0b0000000000000000000000000100000000000000000000000000000000000000 - VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI = 0b0000000000000000000000001000000000000000000000000000000000000000 - VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI = 0b0000000000000000000000010000000000000000000000000000000000000000 - VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI = 0b0000000000000000000000100000000000000000000000000000000000000000 -func toBits*(flags: openArray[VkPipelineStageFlagBits2]): VkPipelineStageFlags2 = - for flag in flags: - result = VkPipelineStageFlags2(uint64(result) or uint64(flag)) -func toEnums*(number: VkPipelineStageFlags2): seq[VkPipelineStageFlagBits2] = - for value in VkPipelineStageFlagBits2.items: - if (cast[uint64](value) and uint64(number)) > 0: - result.add value -proc `==`*(a, b: VkPipelineStageFlags2): bool = uint64(a) == uint64(b) -const - VK_PIPELINE_STAGE_2_NONE* = 0 -type - VkSubmitFlagBits* {.size: sizeof(cint).} = enum - VK_SUBMIT_PROTECTED_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkSubmitFlagBits]): VkSubmitFlags = - for flag in flags: - result = VkSubmitFlags(uint(result) or uint(flag)) -func toEnums*(number: VkSubmitFlags): seq[VkSubmitFlagBits] = - for value in VkSubmitFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkSubmitFlags): bool = cint(a) == cint(b) -type - VkEventCreateFlagBits* {.size: sizeof(cint).} = enum - VK_EVENT_CREATE_DEVICE_ONLY_BIT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkEventCreateFlagBits]): VkEventCreateFlags = - for flag in flags: - result = VkEventCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkEventCreateFlags): seq[VkEventCreateFlagBits] = - for value in VkEventCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkEventCreateFlags): bool = cint(a) == cint(b) -type - VkPipelineLayoutCreateFlagBits* {.size: sizeof(cint).} = enum - VK_PIPELINE_LAYOUT_CREATE_RESERVED_0_BIT_AMD = 0b00000000000000000000000000000001 - VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkPipelineLayoutCreateFlagBits]): VkPipelineLayoutCreateFlags = - for flag in flags: - result = VkPipelineLayoutCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPipelineLayoutCreateFlags): seq[VkPipelineLayoutCreateFlagBits] = - for value in VkPipelineLayoutCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPipelineLayoutCreateFlags): bool = cint(a) == cint(b) -type - VkSciSyncClientTypeNV* {.size: sizeof(cint).} = enum - VK_SCI_SYNC_CLIENT_TYPE_SIGNALER_NV = 0 - VK_SCI_SYNC_CLIENT_TYPE_WAITER_NV = 1 - VK_SCI_SYNC_CLIENT_TYPE_SIGNALER_WAITER_NV = 2 - VkSciSyncPrimitiveTypeNV* {.size: sizeof(cint).} = enum - VK_SCI_SYNC_PRIMITIVE_TYPE_FENCE_NV = 0 - VK_SCI_SYNC_PRIMITIVE_TYPE_SEMAPHORE_NV = 1 - VkProvokingVertexModeEXT* {.size: sizeof(cint).} = enum - VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT = 0 - VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT = 1 - VkPipelineCacheValidationVersion* {.size: sizeof(cint).} = enum - VK_PIPELINE_CACHE_VALIDATION_VERSION_SAFETY_CRITICAL_ONE = 1 - VkAccelerationStructureMotionInstanceTypeNV* {.size: sizeof(cint).} = enum - VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_STATIC_NV = 0 - VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MATRIX_MOTION_NV = 1 - VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_SRT_MOTION_NV = 2 - VkPipelineColorBlendStateCreateFlagBits* {.size: sizeof(cint).} = enum - VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkPipelineColorBlendStateCreateFlagBits]): VkPipelineColorBlendStateCreateFlags = - for flag in flags: - result = VkPipelineColorBlendStateCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPipelineColorBlendStateCreateFlags): seq[VkPipelineColorBlendStateCreateFlagBits] = - for value in VkPipelineColorBlendStateCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPipelineColorBlendStateCreateFlags): bool = cint(a) == cint(b) -type - VkPipelineDepthStencilStateCreateFlagBits* {.size: sizeof(cint).} = enum - VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0b00000000000000000000000000000001 - VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkPipelineDepthStencilStateCreateFlagBits]): VkPipelineDepthStencilStateCreateFlags = - for flag in flags: - result = VkPipelineDepthStencilStateCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkPipelineDepthStencilStateCreateFlags): seq[VkPipelineDepthStencilStateCreateFlagBits] = - for value in VkPipelineDepthStencilStateCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPipelineDepthStencilStateCreateFlags): bool = cint(a) == cint(b) -type - VkGraphicsPipelineLibraryFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT = 0b00000000000000000000000000000001 - VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT = 0b00000000000000000000000000000010 - VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT = 0b00000000000000000000000000000100 - VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkGraphicsPipelineLibraryFlagBitsEXT]): VkGraphicsPipelineLibraryFlagsEXT = - for flag in flags: - result = VkGraphicsPipelineLibraryFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkGraphicsPipelineLibraryFlagsEXT): seq[VkGraphicsPipelineLibraryFlagBitsEXT] = - for value in VkGraphicsPipelineLibraryFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkGraphicsPipelineLibraryFlagsEXT): bool = cint(a) == cint(b) -type - VkDeviceAddressBindingFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_DEVICE_ADDRESS_BINDING_INTERNAL_OBJECT_BIT_EXT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkDeviceAddressBindingFlagBitsEXT]): VkDeviceAddressBindingFlagsEXT = - for flag in flags: - result = VkDeviceAddressBindingFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkDeviceAddressBindingFlagsEXT): seq[VkDeviceAddressBindingFlagBitsEXT] = - for value in VkDeviceAddressBindingFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkDeviceAddressBindingFlagsEXT): bool = cint(a) == cint(b) -type - VkDeviceAddressBindingTypeEXT* {.size: sizeof(cint).} = enum - VK_DEVICE_ADDRESS_BINDING_TYPE_BIND_EXT = 0 - VK_DEVICE_ADDRESS_BINDING_TYPE_UNBIND_EXT = 1 - VkPresentScalingFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT = 0b00000000000000000000000000000001 - VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT = 0b00000000000000000000000000000010 - VK_PRESENT_SCALING_STRETCH_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkPresentScalingFlagBitsEXT]): VkPresentScalingFlagsEXT = - for flag in flags: - result = VkPresentScalingFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkPresentScalingFlagsEXT): seq[VkPresentScalingFlagBitsEXT] = - for value in VkPresentScalingFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPresentScalingFlagsEXT): bool = cint(a) == cint(b) -type - VkPresentGravityFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_PRESENT_GRAVITY_MIN_BIT_EXT = 0b00000000000000000000000000000001 - VK_PRESENT_GRAVITY_MAX_BIT_EXT = 0b00000000000000000000000000000010 - VK_PRESENT_GRAVITY_CENTERED_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkPresentGravityFlagBitsEXT]): VkPresentGravityFlagsEXT = - for flag in flags: - result = VkPresentGravityFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkPresentGravityFlagsEXT): seq[VkPresentGravityFlagBitsEXT] = - for value in VkPresentGravityFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkPresentGravityFlagsEXT): bool = cint(a) == cint(b) -type - VkVideoCodecOperationFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR = 0b00000000000000000000000000000010 - VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT = 0b00000000000000010000000000000000 - VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT = 0b00000000000000100000000000000000 -func toBits*(flags: openArray[VkVideoCodecOperationFlagBitsKHR]): VkVideoCodecOperationFlagsKHR = - for flag in flags: - result = VkVideoCodecOperationFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoCodecOperationFlagsKHR): seq[VkVideoCodecOperationFlagBitsKHR] = - for value in VkVideoCodecOperationFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoCodecOperationFlagsKHR): bool = cint(a) == cint(b) -const - VK_VIDEO_CODEC_OPERATION_NONE_KHR* = 0 -type - VkVideoChromaSubsamplingFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR = 0b00000000000000000000000000000010 - VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR = 0b00000000000000000000000000000100 - VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkVideoChromaSubsamplingFlagBitsKHR]): VkVideoChromaSubsamplingFlagsKHR = - for flag in flags: - result = VkVideoChromaSubsamplingFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoChromaSubsamplingFlagsKHR): seq[VkVideoChromaSubsamplingFlagBitsKHR] = - for value in VkVideoChromaSubsamplingFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoChromaSubsamplingFlagsKHR): bool = cint(a) == cint(b) -const - VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR* = 0 -type - VkVideoComponentBitDepthFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR = 0b00000000000000000000000000000100 - VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR = 0b00000000000000000000000000010000 -func toBits*(flags: openArray[VkVideoComponentBitDepthFlagBitsKHR]): VkVideoComponentBitDepthFlagsKHR = - for flag in flags: - result = VkVideoComponentBitDepthFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoComponentBitDepthFlagsKHR): seq[VkVideoComponentBitDepthFlagBitsKHR] = - for value in VkVideoComponentBitDepthFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoComponentBitDepthFlagsKHR): bool = cint(a) == cint(b) -const - VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR* = 0 -type - VkVideoCapabilityFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkVideoCapabilityFlagBitsKHR]): VkVideoCapabilityFlagsKHR = - for flag in flags: - result = VkVideoCapabilityFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoCapabilityFlagsKHR): seq[VkVideoCapabilityFlagBitsKHR] = - for value in VkVideoCapabilityFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoCapabilityFlagsKHR): bool = cint(a) == cint(b) -type - VkVideoSessionCreateFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkVideoSessionCreateFlagBitsKHR]): VkVideoSessionCreateFlagsKHR = - for flag in flags: - result = VkVideoSessionCreateFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoSessionCreateFlagsKHR): seq[VkVideoSessionCreateFlagBitsKHR] = - for value in VkVideoSessionCreateFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoSessionCreateFlagsKHR): bool = cint(a) == cint(b) -type - VkVideoDecodeH264PictureLayoutFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkVideoDecodeH264PictureLayoutFlagBitsKHR]): VkVideoDecodeH264PictureLayoutFlagsKHR = - for flag in flags: - result = VkVideoDecodeH264PictureLayoutFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoDecodeH264PictureLayoutFlagsKHR): seq[VkVideoDecodeH264PictureLayoutFlagBitsKHR] = - for value in VkVideoDecodeH264PictureLayoutFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoDecodeH264PictureLayoutFlagsKHR): bool = cint(a) == cint(b) -const - VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR* = 0 -type - VkVideoCodingControlFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR = 0b00000000000000000000000000000010 - VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_LAYER_BIT_KHR = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkVideoCodingControlFlagBitsKHR]): VkVideoCodingControlFlagsKHR = - for flag in flags: - result = VkVideoCodingControlFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoCodingControlFlagsKHR): seq[VkVideoCodingControlFlagBitsKHR] = - for value in VkVideoCodingControlFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoCodingControlFlagsKHR): bool = cint(a) == cint(b) -type - VkQueryResultStatusKHR* {.size: sizeof(cint).} = enum - VK_QUERY_RESULT_STATUS_ERROR_KHR = -1 - VK_QUERY_RESULT_STATUS_NOT_READY_KHR = 0 - VK_QUERY_RESULT_STATUS_COMPLETE_KHR = 1 - VkVideoDecodeUsageFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_DECODE_USAGE_TRANSCODING_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_DECODE_USAGE_OFFLINE_BIT_KHR = 0b00000000000000000000000000000010 - VK_VIDEO_DECODE_USAGE_STREAMING_BIT_KHR = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkVideoDecodeUsageFlagBitsKHR]): VkVideoDecodeUsageFlagsKHR = - for flag in flags: - result = VkVideoDecodeUsageFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoDecodeUsageFlagsKHR): seq[VkVideoDecodeUsageFlagBitsKHR] = - for value in VkVideoDecodeUsageFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoDecodeUsageFlagsKHR): bool = cint(a) == cint(b) -const - VK_VIDEO_DECODE_USAGE_DEFAULT_KHR* = 0 -type - VkVideoDecodeCapabilityFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR = 0b00000000000000000000000000000010 -func toBits*(flags: openArray[VkVideoDecodeCapabilityFlagBitsKHR]): VkVideoDecodeCapabilityFlagsKHR = - for flag in flags: - result = VkVideoDecodeCapabilityFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoDecodeCapabilityFlagsKHR): seq[VkVideoDecodeCapabilityFlagBitsKHR] = - for value in VkVideoDecodeCapabilityFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoDecodeCapabilityFlagsKHR): bool = cint(a) == cint(b) -type - VkVideoEncodeUsageFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_USAGE_TRANSCODING_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_USAGE_STREAMING_BIT_KHR = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_USAGE_RECORDING_BIT_KHR = 0b00000000000000000000000000000100 - VK_VIDEO_ENCODE_USAGE_CONFERENCING_BIT_KHR = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkVideoEncodeUsageFlagBitsKHR]): VkVideoEncodeUsageFlagsKHR = - for flag in flags: - result = VkVideoEncodeUsageFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeUsageFlagsKHR): seq[VkVideoEncodeUsageFlagBitsKHR] = - for value in VkVideoEncodeUsageFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeUsageFlagsKHR): bool = cint(a) == cint(b) -const - VK_VIDEO_ENCODE_USAGE_DEFAULT_KHR* = 0 -type - VkVideoEncodeContentFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_CONTENT_CAMERA_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_CONTENT_DESKTOP_BIT_KHR = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_CONTENT_RENDERED_BIT_KHR = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkVideoEncodeContentFlagBitsKHR]): VkVideoEncodeContentFlagsKHR = - for flag in flags: - result = VkVideoEncodeContentFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeContentFlagsKHR): seq[VkVideoEncodeContentFlagBitsKHR] = - for value in VkVideoEncodeContentFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeContentFlagsKHR): bool = cint(a) == cint(b) -const - VK_VIDEO_ENCODE_CONTENT_DEFAULT_KHR* = 0 -type - VkVideoEncodeTuningModeKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_TUNING_MODE_DEFAULT_KHR = 0 - VK_VIDEO_ENCODE_TUNING_MODE_HIGH_QUALITY_KHR = 1 - VK_VIDEO_ENCODE_TUNING_MODE_LOW_LATENCY_KHR = 2 - VK_VIDEO_ENCODE_TUNING_MODE_ULTRA_LOW_LATENCY_KHR = 3 - VK_VIDEO_ENCODE_TUNING_MODE_LOSSLESS_KHR = 4 - VkVideoEncodeCapabilityFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkVideoEncodeCapabilityFlagBitsKHR]): VkVideoEncodeCapabilityFlagsKHR = - for flag in flags: - result = VkVideoEncodeCapabilityFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeCapabilityFlagsKHR): seq[VkVideoEncodeCapabilityFlagBitsKHR] = - for value in VkVideoEncodeCapabilityFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeCapabilityFlagsKHR): bool = cint(a) == cint(b) -type - VkVideoEncodeRateControlModeFlagBitsKHR* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkVideoEncodeRateControlModeFlagBitsKHR]): VkVideoEncodeRateControlModeFlagsKHR = - for flag in flags: - result = VkVideoEncodeRateControlModeFlagsKHR(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeRateControlModeFlagsKHR): seq[VkVideoEncodeRateControlModeFlagBitsKHR] = - for value in VkVideoEncodeRateControlModeFlagBitsKHR.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeRateControlModeFlagsKHR): bool = cint(a) == cint(b) -type - VkVideoEncodeH264CapabilityFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H264_CAPABILITY_DIRECT_8X8_INFERENCE_ENABLED_BIT_EXT = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_H264_CAPABILITY_DIRECT_8X8_INFERENCE_DISABLED_BIT_EXT = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_H264_CAPABILITY_SEPARATE_COLOUR_PLANE_BIT_EXT = 0b00000000000000000000000000000100 - VK_VIDEO_ENCODE_H264_CAPABILITY_QPPRIME_Y_ZERO_TRANSFORM_BYPASS_BIT_EXT = 0b00000000000000000000000000001000 - VK_VIDEO_ENCODE_H264_CAPABILITY_SCALING_LISTS_BIT_EXT = 0b00000000000000000000000000010000 - VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_EXT = 0b00000000000000000000000000100000 - VK_VIDEO_ENCODE_H264_CAPABILITY_CHROMA_QP_OFFSET_BIT_EXT = 0b00000000000000000000000001000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_SECOND_CHROMA_QP_OFFSET_BIT_EXT = 0b00000000000000000000000010000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_PIC_INIT_QP_MINUS26_BIT_EXT = 0b00000000000000000000000100000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_PRED_BIT_EXT = 0b00000000000000000000001000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BIPRED_EXPLICIT_BIT_EXT = 0b00000000000000000000010000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BIPRED_IMPLICIT_BIT_EXT = 0b00000000000000000000100000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_PRED_NO_TABLE_BIT_EXT = 0b00000000000000000001000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_TRANSFORM_8X8_BIT_EXT = 0b00000000000000000010000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT = 0b00000000000000000100000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT = 0b00000000000000001000000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT = 0b00000000000000010000000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT = 0b00000000000000100000000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT = 0b00000000000001000000000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_DISABLE_DIRECT_SPATIAL_MV_PRED_BIT_EXT = 0b00000000000010000000000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT = 0b00000000000100000000000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_SLICE_MB_COUNT_BIT_EXT = 0b00000000001000000000000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_EXT = 0b00000000010000000000000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_EXT = 0b00000000100000000000000000000000 - VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_EXT = 0b00000001000000000000000000000000 -func toBits*(flags: openArray[VkVideoEncodeH264CapabilityFlagBitsEXT]): VkVideoEncodeH264CapabilityFlagsEXT = - for flag in flags: - result = VkVideoEncodeH264CapabilityFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeH264CapabilityFlagsEXT): seq[VkVideoEncodeH264CapabilityFlagBitsEXT] = - for value in VkVideoEncodeH264CapabilityFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeH264CapabilityFlagsEXT): bool = cint(a) == cint(b) -type - VkVideoEncodeH264InputModeFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkVideoEncodeH264InputModeFlagBitsEXT]): VkVideoEncodeH264InputModeFlagsEXT = - for flag in flags: - result = VkVideoEncodeH264InputModeFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeH264InputModeFlagsEXT): seq[VkVideoEncodeH264InputModeFlagBitsEXT] = - for value in VkVideoEncodeH264InputModeFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeH264InputModeFlagsEXT): bool = cint(a) == cint(b) -type - VkVideoEncodeH264OutputModeFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkVideoEncodeH264OutputModeFlagBitsEXT]): VkVideoEncodeH264OutputModeFlagsEXT = - for flag in flags: - result = VkVideoEncodeH264OutputModeFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeH264OutputModeFlagsEXT): seq[VkVideoEncodeH264OutputModeFlagBitsEXT] = - for value in VkVideoEncodeH264OutputModeFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeH264OutputModeFlagsEXT): bool = cint(a) == cint(b) -type - VkVideoEncodeH264RateControlStructureEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H264_RATE_CONTROL_STRUCTURE_UNKNOWN_EXT = 0 - VK_VIDEO_ENCODE_H264_RATE_CONTROL_STRUCTURE_FLAT_EXT = 1 - VK_VIDEO_ENCODE_H264_RATE_CONTROL_STRUCTURE_DYADIC_EXT = 2 - VkImageConstraintsInfoFlagBitsFUCHSIA* {.size: sizeof(cint).} = enum - VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA = 0b00000000000000000000000000000001 - VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA = 0b00000000000000000000000000000010 - VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA = 0b00000000000000000000000000000100 - VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA = 0b00000000000000000000000000001000 - VK_IMAGE_CONSTRAINTS_INFO_PROTECTED_OPTIONAL_FUCHSIA = 0b00000000000000000000000000010000 -func toBits*(flags: openArray[VkImageConstraintsInfoFlagBitsFUCHSIA]): VkImageConstraintsInfoFlagsFUCHSIA = - for flag in flags: - result = VkImageConstraintsInfoFlagsFUCHSIA(uint(result) or uint(flag)) -func toEnums*(number: VkImageConstraintsInfoFlagsFUCHSIA): seq[VkImageConstraintsInfoFlagBitsFUCHSIA] = - for value in VkImageConstraintsInfoFlagBitsFUCHSIA.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkImageConstraintsInfoFlagsFUCHSIA): bool = cint(a) == cint(b) -type - VkFormatFeatureFlagBits2* {.size: 8.} = enum - VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT = 0b0000000000000000000000000000000000000000000000000000000000000001 - VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT = 0b0000000000000000000000000000000000000000000000000000000000000010 - VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT = 0b0000000000000000000000000000000000000000000000000000000000000100 - VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT = 0b0000000000000000000000000000000000000000000000000000000000001000 - VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT = 0b0000000000000000000000000000000000000000000000000000000000010000 - VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 0b0000000000000000000000000000000000000000000000000000000000100000 - VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT = 0b0000000000000000000000000000000000000000000000000000000001000000 - VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT = 0b0000000000000000000000000000000000000000000000000000000010000000 - VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT = 0b0000000000000000000000000000000000000000000000000000000100000000 - VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT = 0b0000000000000000000000000000000000000000000000000000001000000000 - VK_FORMAT_FEATURE_2_BLIT_SRC_BIT = 0b0000000000000000000000000000000000000000000000000000010000000000 - VK_FORMAT_FEATURE_2_BLIT_DST_BIT = 0b0000000000000000000000000000000000000000000000000000100000000000 - VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0b0000000000000000000000000000000000000000000000000001000000000000 - VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT = 0b0000000000000000000000000000000000000000000000000010000000000000 - VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT = 0b0000000000000000000000000000000000000000000000000100000000000000 - VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT = 0b0000000000000000000000000000000000000000000000001000000000000000 - VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0b0000000000000000000000000000000000000000000000010000000000000000 - VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT = 0b0000000000000000000000000000000000000000000000100000000000000000 - VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT = 0b0000000000000000000000000000000000000000000001000000000000000000 - VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT = 0b0000000000000000000000000000000000000000000010000000000000000000 - VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT = 0b0000000000000000000000000000000000000000000100000000000000000000 - VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT = 0b0000000000000000000000000000000000000000001000000000000000000000 - VK_FORMAT_FEATURE_2_DISJOINT_BIT = 0b0000000000000000000000000000000000000000010000000000000000000000 - VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT = 0b0000000000000000000000000000000000000000100000000000000000000000 - VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT = 0b0000000000000000000000000000000000000001000000000000000000000000 - VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR = 0b0000000000000000000000000000000000000010000000000000000000000000 - VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR = 0b0000000000000000000000000000000000000100000000000000000000000000 - VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR = 0b0000000000000000000000000000000000001000000000000000000000000000 - VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR = 0b0000000000000000000000000000000000010000000000000000000000000000 - VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0b0000000000000000000000000000000000100000000000000000000000000000 - VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0b0000000000000000000000000000000001000000000000000000000000000000 - VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT = 0b0000000000000000000000000000000010000000000000000000000000000000 - VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT = 0b0000000000000000000000000000000100000000000000000000000000000000 - VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT = 0b0000000000000000000000000000001000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM = 0b0000000000000000000000000000010000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM = 0b0000000000000000000000000000100000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM = 0b0000000000000000000000000001000000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM = 0b0000000000000000000000000010000000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV = 0b0000000000000000000000000100000000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_RESERVED_39_BIT_EXT = 0b0000000000000000000000001000000000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV = 0b0000000000000000000000010000000000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_OPTICAL_FLOW_VECTOR_BIT_NV = 0b0000000000000000000000100000000000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV = 0b0000000000000000000001000000000000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_RESERVED_44_BIT_EXT = 0b0000000000000000000100000000000000000000000000000000000000000000 - VK_FORMAT_FEATURE_2_RESERVED_45_BIT_EXT = 0b0000000000000000001000000000000000000000000000000000000000000000 -func toBits*(flags: openArray[VkFormatFeatureFlagBits2]): VkFormatFeatureFlags2 = - for flag in flags: - result = VkFormatFeatureFlags2(uint64(result) or uint64(flag)) -func toEnums*(number: VkFormatFeatureFlags2): seq[VkFormatFeatureFlagBits2] = - for value in VkFormatFeatureFlagBits2.items: - if (cast[uint64](value) and uint64(number)) > 0: - result.add value -proc `==`*(a, b: VkFormatFeatureFlags2): bool = uint64(a) == uint64(b) -type - VkRenderingFlagBits* {.size: sizeof(cint).} = enum - VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT = 0b00000000000000000000000000000001 - VK_RENDERING_SUSPENDING_BIT = 0b00000000000000000000000000000010 - VK_RENDERING_RESUMING_BIT = 0b00000000000000000000000000000100 - VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkRenderingFlagBits]): VkRenderingFlags = - for flag in flags: - result = VkRenderingFlags(uint(result) or uint(flag)) -func toEnums*(number: VkRenderingFlags): seq[VkRenderingFlagBits] = - for value in VkRenderingFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkRenderingFlags): bool = cint(a) == cint(b) -type - VkVideoEncodeH265CapabilityFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H265_CAPABILITY_SEPARATE_COLOUR_PLANE_BIT_EXT = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_H265_CAPABILITY_SCALING_LISTS_BIT_EXT = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_H265_CAPABILITY_SAMPLE_ADAPTIVE_OFFSET_ENABLED_BIT_EXT = 0b00000000000000000000000000000100 - VK_VIDEO_ENCODE_H265_CAPABILITY_PCM_ENABLE_BIT_EXT = 0b00000000000000000000000000001000 - VK_VIDEO_ENCODE_H265_CAPABILITY_SPS_TEMPORAL_MVP_ENABLED_BIT_EXT = 0b00000000000000000000000000010000 - VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_EXT = 0b00000000000000000000000000100000 - VK_VIDEO_ENCODE_H265_CAPABILITY_INIT_QP_MINUS26_BIT_EXT = 0b00000000000000000000000001000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_LOG2_PARALLEL_MERGE_LEVEL_MINUS2_BIT_EXT = 0b00000000000000000000000010000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_SIGN_DATA_HIDING_ENABLED_BIT_EXT = 0b00000000000000000000000100000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_TRANSFORM_SKIP_ENABLED_BIT_EXT = 0b00000000000000000000001000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_TRANSFORM_SKIP_DISABLED_BIT_EXT = 0b00000000000000000000010000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_BIT_EXT = 0b00000000000000000000100000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_WEIGHTED_PRED_BIT_EXT = 0b00000000000000000001000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_WEIGHTED_BIPRED_BIT_EXT = 0b00000000000000000010000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_WEIGHTED_PRED_NO_TABLE_BIT_EXT = 0b00000000000000000100000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_TRANSQUANT_BYPASS_ENABLED_BIT_EXT = 0b00000000000000001000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_ENTROPY_CODING_SYNC_ENABLED_BIT_EXT = 0b00000000000000010000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_DEBLOCKING_FILTER_OVERRIDE_ENABLED_BIT_EXT = 0b00000000000000100000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILE_PER_FRAME_BIT_EXT = 0b00000000000001000000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_PER_TILE_BIT_EXT = 0b00000000000010000000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILE_PER_SLICE_BIT_EXT = 0b00000000000100000000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_SLICE_SEGMENT_CTB_COUNT_BIT_EXT = 0b00000000001000000000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_EXT = 0b00000000010000000000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_DEPENDENT_SLICE_SEGMENT_BIT_EXT = 0b00000000100000000000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_EXT = 0b00000001000000000000000000000000 - VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_EXT = 0b00000010000000000000000000000000 -func toBits*(flags: openArray[VkVideoEncodeH265CapabilityFlagBitsEXT]): VkVideoEncodeH265CapabilityFlagsEXT = - for flag in flags: - result = VkVideoEncodeH265CapabilityFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeH265CapabilityFlagsEXT): seq[VkVideoEncodeH265CapabilityFlagBitsEXT] = - for value in VkVideoEncodeH265CapabilityFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeH265CapabilityFlagsEXT): bool = cint(a) == cint(b) -type - VkVideoEncodeH265InputModeFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H265_INPUT_MODE_FRAME_BIT_EXT = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_H265_INPUT_MODE_SLICE_SEGMENT_BIT_EXT = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_H265_INPUT_MODE_NON_VCL_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkVideoEncodeH265InputModeFlagBitsEXT]): VkVideoEncodeH265InputModeFlagsEXT = - for flag in flags: - result = VkVideoEncodeH265InputModeFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeH265InputModeFlagsEXT): seq[VkVideoEncodeH265InputModeFlagBitsEXT] = - for value in VkVideoEncodeH265InputModeFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeH265InputModeFlagsEXT): bool = cint(a) == cint(b) -type - VkVideoEncodeH265OutputModeFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H265_OUTPUT_MODE_FRAME_BIT_EXT = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_H265_OUTPUT_MODE_SLICE_SEGMENT_BIT_EXT = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_H265_OUTPUT_MODE_NON_VCL_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkVideoEncodeH265OutputModeFlagBitsEXT]): VkVideoEncodeH265OutputModeFlagsEXT = - for flag in flags: - result = VkVideoEncodeH265OutputModeFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeH265OutputModeFlagsEXT): seq[VkVideoEncodeH265OutputModeFlagBitsEXT] = - for value in VkVideoEncodeH265OutputModeFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeH265OutputModeFlagsEXT): bool = cint(a) == cint(b) -type - VkVideoEncodeH265RateControlStructureEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H265_RATE_CONTROL_STRUCTURE_UNKNOWN_EXT = 0 - VK_VIDEO_ENCODE_H265_RATE_CONTROL_STRUCTURE_FLAT_EXT = 1 - VK_VIDEO_ENCODE_H265_RATE_CONTROL_STRUCTURE_DYADIC_EXT = 2 - VkVideoEncodeH265CtbSizeFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_EXT = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_EXT = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkVideoEncodeH265CtbSizeFlagBitsEXT]): VkVideoEncodeH265CtbSizeFlagsEXT = - for flag in flags: - result = VkVideoEncodeH265CtbSizeFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeH265CtbSizeFlagsEXT): seq[VkVideoEncodeH265CtbSizeFlagBitsEXT] = - for value in VkVideoEncodeH265CtbSizeFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeH265CtbSizeFlagsEXT): bool = cint(a) == cint(b) -type - VkVideoEncodeH265TransformBlockSizeFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_EXT = 0b00000000000000000000000000000001 - VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_EXT = 0b00000000000000000000000000000010 - VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_EXT = 0b00000000000000000000000000000100 - VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_EXT = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkVideoEncodeH265TransformBlockSizeFlagBitsEXT]): VkVideoEncodeH265TransformBlockSizeFlagsEXT = - for flag in flags: - result = VkVideoEncodeH265TransformBlockSizeFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkVideoEncodeH265TransformBlockSizeFlagsEXT): seq[VkVideoEncodeH265TransformBlockSizeFlagBitsEXT] = - for value in VkVideoEncodeH265TransformBlockSizeFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkVideoEncodeH265TransformBlockSizeFlagsEXT): bool = cint(a) == cint(b) -type - VkExportMetalObjectTypeFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_EXPORT_METAL_OBJECT_TYPE_METAL_DEVICE_BIT_EXT = 0b00000000000000000000000000000001 - VK_EXPORT_METAL_OBJECT_TYPE_METAL_COMMAND_QUEUE_BIT_EXT = 0b00000000000000000000000000000010 - VK_EXPORT_METAL_OBJECT_TYPE_METAL_BUFFER_BIT_EXT = 0b00000000000000000000000000000100 - VK_EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT = 0b00000000000000000000000000001000 - VK_EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT = 0b00000000000000000000000000010000 - VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT = 0b00000000000000000000000000100000 -func toBits*(flags: openArray[VkExportMetalObjectTypeFlagBitsEXT]): VkExportMetalObjectTypeFlagsEXT = - for flag in flags: - result = VkExportMetalObjectTypeFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkExportMetalObjectTypeFlagsEXT): seq[VkExportMetalObjectTypeFlagBitsEXT] = - for value in VkExportMetalObjectTypeFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkExportMetalObjectTypeFlagsEXT): bool = cint(a) == cint(b) -type - VkInstanceCreateFlagBits* {.size: sizeof(cint).} = enum - VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkInstanceCreateFlagBits]): VkInstanceCreateFlags = - for flag in flags: - result = VkInstanceCreateFlags(uint(result) or uint(flag)) -func toEnums*(number: VkInstanceCreateFlags): seq[VkInstanceCreateFlagBits] = - for value in VkInstanceCreateFlagBits.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkInstanceCreateFlags): bool = cint(a) == cint(b) -type - VkImageCompressionFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT = 0b00000000000000000000000000000001 - VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT = 0b00000000000000000000000000000010 - VK_IMAGE_COMPRESSION_DISABLED_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkImageCompressionFlagBitsEXT]): VkImageCompressionFlagsEXT = - for flag in flags: - result = VkImageCompressionFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkImageCompressionFlagsEXT): seq[VkImageCompressionFlagBitsEXT] = - for value in VkImageCompressionFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkImageCompressionFlagsEXT): bool = cint(a) == cint(b) -const - VK_IMAGE_COMPRESSION_DEFAULT_EXT* = 0 -type - VkImageCompressionFixedRateFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_IMAGE_COMPRESSION_FIXED_RATE_1BPC_BIT_EXT = 0b00000000000000000000000000000001 - VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT = 0b00000000000000000000000000000010 - VK_IMAGE_COMPRESSION_FIXED_RATE_3BPC_BIT_EXT = 0b00000000000000000000000000000100 - VK_IMAGE_COMPRESSION_FIXED_RATE_4BPC_BIT_EXT = 0b00000000000000000000000000001000 - VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT = 0b00000000000000000000000000010000 - VK_IMAGE_COMPRESSION_FIXED_RATE_6BPC_BIT_EXT = 0b00000000000000000000000000100000 - VK_IMAGE_COMPRESSION_FIXED_RATE_7BPC_BIT_EXT = 0b00000000000000000000000001000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_8BPC_BIT_EXT = 0b00000000000000000000000010000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_9BPC_BIT_EXT = 0b00000000000000000000000100000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_10BPC_BIT_EXT = 0b00000000000000000000001000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_11BPC_BIT_EXT = 0b00000000000000000000010000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_12BPC_BIT_EXT = 0b00000000000000000000100000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_13BPC_BIT_EXT = 0b00000000000000000001000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_14BPC_BIT_EXT = 0b00000000000000000010000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_15BPC_BIT_EXT = 0b00000000000000000100000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_16BPC_BIT_EXT = 0b00000000000000001000000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_17BPC_BIT_EXT = 0b00000000000000010000000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_18BPC_BIT_EXT = 0b00000000000000100000000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_19BPC_BIT_EXT = 0b00000000000001000000000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_20BPC_BIT_EXT = 0b00000000000010000000000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_21BPC_BIT_EXT = 0b00000000000100000000000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_22BPC_BIT_EXT = 0b00000000001000000000000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_23BPC_BIT_EXT = 0b00000000010000000000000000000000 - VK_IMAGE_COMPRESSION_FIXED_RATE_24BPC_BIT_EXT = 0b00000000100000000000000000000000 -func toBits*(flags: openArray[VkImageCompressionFixedRateFlagBitsEXT]): VkImageCompressionFixedRateFlagsEXT = - for flag in flags: - result = VkImageCompressionFixedRateFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkImageCompressionFixedRateFlagsEXT): seq[VkImageCompressionFixedRateFlagBitsEXT] = - for value in VkImageCompressionFixedRateFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkImageCompressionFixedRateFlagsEXT): bool = cint(a) == cint(b) -const - VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT* = 0 -type - VkPipelineRobustnessBufferBehaviorEXT* {.size: sizeof(cint).} = enum - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT = 0 - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT = 1 - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT = 2 - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT = 3 - VkPipelineRobustnessImageBehaviorEXT* {.size: sizeof(cint).} = enum - VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT = 0 - VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT = 1 - VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT = 2 - VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT = 3 - VkOpticalFlowGridSizeFlagBitsNV* {.size: sizeof(cint).} = enum - VK_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_NV = 0b00000000000000000000000000000001 - VK_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_NV = 0b00000000000000000000000000000010 - VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV = 0b00000000000000000000000000000100 - VK_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_NV = 0b00000000000000000000000000001000 -func toBits*(flags: openArray[VkOpticalFlowGridSizeFlagBitsNV]): VkOpticalFlowGridSizeFlagsNV = - for flag in flags: - result = VkOpticalFlowGridSizeFlagsNV(uint(result) or uint(flag)) -func toEnums*(number: VkOpticalFlowGridSizeFlagsNV): seq[VkOpticalFlowGridSizeFlagBitsNV] = - for value in VkOpticalFlowGridSizeFlagBitsNV.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkOpticalFlowGridSizeFlagsNV): bool = cint(a) == cint(b) -const - VK_OPTICAL_FLOW_GRID_SIZE_UNKNOWN_NV* = 0 -type - VkOpticalFlowUsageFlagBitsNV* {.size: sizeof(cint).} = enum - VK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV = 0b00000000000000000000000000000001 - VK_OPTICAL_FLOW_USAGE_OUTPUT_BIT_NV = 0b00000000000000000000000000000010 - VK_OPTICAL_FLOW_USAGE_HINT_BIT_NV = 0b00000000000000000000000000000100 - VK_OPTICAL_FLOW_USAGE_COST_BIT_NV = 0b00000000000000000000000000001000 - VK_OPTICAL_FLOW_USAGE_GLOBAL_FLOW_BIT_NV = 0b00000000000000000000000000010000 -func toBits*(flags: openArray[VkOpticalFlowUsageFlagBitsNV]): VkOpticalFlowUsageFlagsNV = - for flag in flags: - result = VkOpticalFlowUsageFlagsNV(uint(result) or uint(flag)) -func toEnums*(number: VkOpticalFlowUsageFlagsNV): seq[VkOpticalFlowUsageFlagBitsNV] = - for value in VkOpticalFlowUsageFlagBitsNV.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkOpticalFlowUsageFlagsNV): bool = cint(a) == cint(b) -const - VK_OPTICAL_FLOW_USAGE_UNKNOWN_NV* = 0 -type - VkOpticalFlowPerformanceLevelNV* {.size: sizeof(cint).} = enum - VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_UNKNOWN_NV = 0 - VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_SLOW_NV = 1 - VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_MEDIUM_NV = 2 - VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_FAST_NV = 3 - VkOpticalFlowSessionBindingPointNV* {.size: sizeof(cint).} = enum - VK_OPTICAL_FLOW_SESSION_BINDING_POINT_UNKNOWN_NV = 0 - VK_OPTICAL_FLOW_SESSION_BINDING_POINT_INPUT_NV = 1 - VK_OPTICAL_FLOW_SESSION_BINDING_POINT_REFERENCE_NV = 2 - VK_OPTICAL_FLOW_SESSION_BINDING_POINT_HINT_NV = 3 - VK_OPTICAL_FLOW_SESSION_BINDING_POINT_FLOW_VECTOR_NV = 4 - VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_FLOW_VECTOR_NV = 5 - VK_OPTICAL_FLOW_SESSION_BINDING_POINT_COST_NV = 6 - VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_COST_NV = 7 - VK_OPTICAL_FLOW_SESSION_BINDING_POINT_GLOBAL_FLOW_NV = 8 - VkOpticalFlowSessionCreateFlagBitsNV* {.size: sizeof(cint).} = enum - VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_HINT_BIT_NV = 0b00000000000000000000000000000001 - VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_COST_BIT_NV = 0b00000000000000000000000000000010 - VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_GLOBAL_FLOW_BIT_NV = 0b00000000000000000000000000000100 - VK_OPTICAL_FLOW_SESSION_CREATE_ALLOW_REGIONS_BIT_NV = 0b00000000000000000000000000001000 - VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV = 0b00000000000000000000000000010000 -func toBits*(flags: openArray[VkOpticalFlowSessionCreateFlagBitsNV]): VkOpticalFlowSessionCreateFlagsNV = - for flag in flags: - result = VkOpticalFlowSessionCreateFlagsNV(uint(result) or uint(flag)) -func toEnums*(number: VkOpticalFlowSessionCreateFlagsNV): seq[VkOpticalFlowSessionCreateFlagBitsNV] = - for value in VkOpticalFlowSessionCreateFlagBitsNV.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkOpticalFlowSessionCreateFlagsNV): bool = cint(a) == cint(b) -type - VkOpticalFlowExecuteFlagBitsNV* {.size: sizeof(cint).} = enum - VK_OPTICAL_FLOW_EXECUTE_DISABLE_TEMPORAL_HINTS_BIT_NV = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkOpticalFlowExecuteFlagBitsNV]): VkOpticalFlowExecuteFlagsNV = - for flag in flags: - result = VkOpticalFlowExecuteFlagsNV(uint(result) or uint(flag)) -func toEnums*(number: VkOpticalFlowExecuteFlagsNV): seq[VkOpticalFlowExecuteFlagBitsNV] = - for value in VkOpticalFlowExecuteFlagBitsNV.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkOpticalFlowExecuteFlagsNV): bool = cint(a) == cint(b) -type - VkMicromapTypeEXT* {.size: sizeof(cint).} = enum - VK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT = 0 - VkBuildMicromapFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_BUILD_MICROMAP_PREFER_FAST_TRACE_BIT_EXT = 0b00000000000000000000000000000001 - VK_BUILD_MICROMAP_PREFER_FAST_BUILD_BIT_EXT = 0b00000000000000000000000000000010 - VK_BUILD_MICROMAP_ALLOW_COMPACTION_BIT_EXT = 0b00000000000000000000000000000100 -func toBits*(flags: openArray[VkBuildMicromapFlagBitsEXT]): VkBuildMicromapFlagsEXT = - for flag in flags: - result = VkBuildMicromapFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkBuildMicromapFlagsEXT): seq[VkBuildMicromapFlagBitsEXT] = - for value in VkBuildMicromapFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkBuildMicromapFlagsEXT): bool = cint(a) == cint(b) -type - VkMicromapCreateFlagBitsEXT* {.size: sizeof(cint).} = enum - VK_MICROMAP_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = 0b00000000000000000000000000000001 -func toBits*(flags: openArray[VkMicromapCreateFlagBitsEXT]): VkMicromapCreateFlagsEXT = - for flag in flags: - result = VkMicromapCreateFlagsEXT(uint(result) or uint(flag)) -func toEnums*(number: VkMicromapCreateFlagsEXT): seq[VkMicromapCreateFlagBitsEXT] = - for value in VkMicromapCreateFlagBitsEXT.items: - if (value.ord and cint(number)) > 0: - result.add value -proc `==`*(a, b: VkMicromapCreateFlagsEXT): bool = cint(a) == cint(b) -type - VkCopyMicromapModeEXT* {.size: sizeof(cint).} = enum - VK_COPY_MICROMAP_MODE_CLONE_EXT = 0 - VK_COPY_MICROMAP_MODE_SERIALIZE_EXT = 1 - VK_COPY_MICROMAP_MODE_DESERIALIZE_EXT = 2 - VK_COPY_MICROMAP_MODE_COMPACT_EXT = 3 - VkBuildMicromapModeEXT* {.size: sizeof(cint).} = enum - VK_BUILD_MICROMAP_MODE_BUILD_EXT = 0 - VkOpacityMicromapFormatEXT* {.size: sizeof(cint).} = enum - VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT = 1 - VK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT = 2 - VkOpacityMicromapSpecialIndexEXT* {.size: sizeof(cint).} = enum - VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_EXT = -4 - VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_EXT = -3 - VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_EXT = -2 - VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_EXT = -1 - VkDeviceFaultAddressTypeEXT* {.size: sizeof(cint).} = enum - VK_DEVICE_FAULT_ADDRESS_TYPE_NONE_EXT = 0 - VK_DEVICE_FAULT_ADDRESS_TYPE_READ_INVALID_EXT = 1 - VK_DEVICE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT = 2 - VK_DEVICE_FAULT_ADDRESS_TYPE_EXECUTE_INVALID_EXT = 3 - VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_UNKNOWN_EXT = 4 - VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_INVALID_EXT = 5 - VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_FAULT_EXT = 6 - VkDeviceFaultVendorBinaryHeaderVersionEXT* {.size: sizeof(cint).} = enum - VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT_ENUM = 1 -proc `$`*(bitset: VkFramebufferCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkRenderPassCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkSamplerCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkPipelineCacheCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkPipelineShaderStageCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkDescriptorSetLayoutCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkInstanceCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkDeviceQueueCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkBufferCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkBufferUsageFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkColorComponentFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkCommandPoolCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkCommandPoolResetFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkCommandBufferResetFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkCommandBufferUsageFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkCullModeFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkFenceCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkFormatFeatureFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkImageAspectFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkImageCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkImageUsageFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkImageViewCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkMemoryHeapFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkAccessFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkMemoryPropertyFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkPipelineCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkQueryControlFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkQueryPipelineStatisticFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkQueryResultFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkQueueFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkShaderStageFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkSparseMemoryBindFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkStencilFaceFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkPipelineStageFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkSparseImageFormatFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkSampleCountFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkAttachmentDescriptionFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkDescriptorPoolCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkDependencyFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkEventCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkPipelineLayoutCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkIndirectCommandsLayoutUsageFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkIndirectStateFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkPrivateDataSlotCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkSubpassDescriptionFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkResolveModeFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkDescriptorBindingFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkConditionalRenderingFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkGeometryFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkGeometryInstanceFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkBuildAccelerationStructureFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkAccelerationStructureCreateFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkDeviceDiagnosticsConfigFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkPipelineCreationFeedbackFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkPerformanceCounterDescriptionFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkSemaphoreWaitFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkToolPurposeFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkAccessFlags2): string = $toEnums(bitset) -proc `$`*(bitset: VkPipelineStageFlags2): string = $toEnums(bitset) -proc `$`*(bitset: VkImageConstraintsInfoFlagsFUCHSIA): string = $toEnums(bitset) -proc `$`*(bitset: VkFormatFeatureFlags2): string = $toEnums(bitset) -proc `$`*(bitset: VkRenderingFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkPipelineDepthStencilStateCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkPipelineColorBlendStateCreateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkImageCompressionFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkImageCompressionFixedRateFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkExportMetalObjectTypeFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkDeviceAddressBindingFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkBuildMicromapFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkMicromapCreateFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkMemoryDecompressionMethodFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkCompositeAlphaFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkDisplayPlaneAlphaFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkSurfaceTransformFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkDebugReportFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkExternalMemoryHandleTypeFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkExternalMemoryFeatureFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkExternalMemoryHandleTypeFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkExternalMemoryFeatureFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkExternalSemaphoreHandleTypeFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkExternalSemaphoreFeatureFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkSemaphoreImportFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkExternalFenceHandleTypeFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkExternalFenceFeatureFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkFenceImportFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkSurfaceCounterFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkPeerMemoryFeatureFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkMemoryAllocateFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkDeviceGroupPresentModeFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkSwapchainCreateFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkSubgroupFeatureFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkDebugUtilsMessageSeverityFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkDebugUtilsMessageTypeFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkSwapchainImageUsageFlagsANDROID): string = $toEnums(bitset) -proc `$`*(bitset: VkSubmitFlags): string = $toEnums(bitset) -proc `$`*(bitset: VkGraphicsPipelineLibraryFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkOpticalFlowGridSizeFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkOpticalFlowUsageFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkOpticalFlowSessionCreateFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkOpticalFlowExecuteFlagsNV): string = $toEnums(bitset) -proc `$`*(bitset: VkPresentScalingFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkPresentGravityFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoCodecOperationFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoChromaSubsamplingFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoComponentBitDepthFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoCapabilityFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoSessionCreateFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoCodingControlFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoDecodeUsageFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoDecodeCapabilityFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoDecodeH264PictureLayoutFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeUsageFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeContentFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeCapabilityFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeRateControlModeFlagsKHR): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeH264CapabilityFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeH264InputModeFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeH264OutputModeFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeH265CapabilityFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeH265InputModeFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeH265OutputModeFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeH265CtbSizeFlagsEXT): string = $toEnums(bitset) -proc `$`*(bitset: VkVideoEncodeH265TransformBlockSizeFlagsEXT): string = $toEnums(bitset) -type - VkGeometryFlagsNV* = VkGeometryFlagsKHR - VkGeometryInstanceFlagsNV* = VkGeometryInstanceFlagsKHR - VkBuildAccelerationStructureFlagsNV* = VkBuildAccelerationStructureFlagsKHR - VkPrivateDataSlotCreateFlagsEXT* = VkPrivateDataSlotCreateFlags - VkDescriptorUpdateTemplateCreateFlagsKHR* = VkDescriptorUpdateTemplateCreateFlags - VkPipelineCreationFeedbackFlagsEXT* = VkPipelineCreationFeedbackFlags - VkSemaphoreWaitFlagsKHR* = VkSemaphoreWaitFlags - VkAccessFlags2KHR* = VkAccessFlags2 - VkPipelineStageFlags2KHR* = VkPipelineStageFlags2 - VkFormatFeatureFlags2KHR* = VkFormatFeatureFlags2 - VkRenderingFlagsKHR* = VkRenderingFlags - VkPeerMemoryFeatureFlagsKHR* = VkPeerMemoryFeatureFlags - VkMemoryAllocateFlagsKHR* = VkMemoryAllocateFlags - VkCommandPoolTrimFlagsKHR* = VkCommandPoolTrimFlags - VkExternalMemoryHandleTypeFlagsKHR* = VkExternalMemoryHandleTypeFlags - VkExternalMemoryFeatureFlagsKHR* = VkExternalMemoryFeatureFlags - VkExternalSemaphoreHandleTypeFlagsKHR* = VkExternalSemaphoreHandleTypeFlags - VkExternalSemaphoreFeatureFlagsKHR* = VkExternalSemaphoreFeatureFlags - VkSemaphoreImportFlagsKHR* = VkSemaphoreImportFlags - VkExternalFenceHandleTypeFlagsKHR* = VkExternalFenceHandleTypeFlags - VkExternalFenceFeatureFlagsKHR* = VkExternalFenceFeatureFlags - VkFenceImportFlagsKHR* = VkFenceImportFlags - VkDescriptorBindingFlagsEXT* = VkDescriptorBindingFlags - VkResolveModeFlagsKHR* = VkResolveModeFlags - VkToolPurposeFlagsEXT* = VkToolPurposeFlags - VkSubmitFlagsKHR* = VkSubmitFlags - VkPrivateDataSlotCreateFlagBitsEXT* = VkPrivateDataSlotCreateFlagBits - VkDescriptorUpdateTemplateTypeKHR* = VkDescriptorUpdateTemplateType - VkPointClippingBehaviorKHR* = VkPointClippingBehavior - VkQueueGlobalPriorityEXT* = VkQueueGlobalPriorityKHR - VkResolveModeFlagBitsKHR* = VkResolveModeFlagBits - VkDescriptorBindingFlagBitsEXT* = VkDescriptorBindingFlagBits - VkSemaphoreTypeKHR* = VkSemaphoreType - VkGeometryFlagBitsNV* = VkGeometryFlagBitsKHR - VkGeometryInstanceFlagBitsNV* = VkGeometryInstanceFlagBitsKHR - VkBuildAccelerationStructureFlagBitsNV* = VkBuildAccelerationStructureFlagBitsKHR - VkCopyAccelerationStructureModeNV* = VkCopyAccelerationStructureModeKHR - VkAccelerationStructureTypeNV* = VkAccelerationStructureTypeKHR - VkGeometryTypeNV* = VkGeometryTypeKHR - VkRayTracingShaderGroupTypeNV* = VkRayTracingShaderGroupTypeKHR - VkPipelineCreationFeedbackFlagBitsEXT* = VkPipelineCreationFeedbackFlagBits - VkSemaphoreWaitFlagBitsKHR* = VkSemaphoreWaitFlagBits - VkToolPurposeFlagBitsEXT* = VkToolPurposeFlagBits - VkAccessFlagBits2KHR* = VkAccessFlagBits2 - VkPipelineStageFlagBits2KHR* = VkPipelineStageFlagBits2 - VkFormatFeatureFlagBits2KHR* = VkFormatFeatureFlagBits2 - VkRenderingFlagBitsKHR* = VkRenderingFlagBits - VkExternalMemoryHandleTypeFlagBitsKHR* = VkExternalMemoryHandleTypeFlagBits - VkExternalMemoryFeatureFlagBitsKHR* = VkExternalMemoryFeatureFlagBits - VkExternalSemaphoreHandleTypeFlagBitsKHR* = VkExternalSemaphoreHandleTypeFlagBits - VkExternalSemaphoreFeatureFlagBitsKHR* = VkExternalSemaphoreFeatureFlagBits - VkSemaphoreImportFlagBitsKHR* = VkSemaphoreImportFlagBits - VkExternalFenceHandleTypeFlagBitsKHR* = VkExternalFenceHandleTypeFlagBits - VkExternalFenceFeatureFlagBitsKHR* = VkExternalFenceFeatureFlagBits - VkFenceImportFlagBitsKHR* = VkFenceImportFlagBits - VkPeerMemoryFeatureFlagBitsKHR* = VkPeerMemoryFeatureFlagBits - VkMemoryAllocateFlagBitsKHR* = VkMemoryAllocateFlagBits - VkTessellationDomainOriginKHR* = VkTessellationDomainOrigin - VkSamplerYcbcrModelConversionKHR* = VkSamplerYcbcrModelConversion - VkSamplerYcbcrRangeKHR* = VkSamplerYcbcrRange - VkChromaLocationKHR* = VkChromaLocation - VkSamplerReductionModeEXT* = VkSamplerReductionMode - VkShaderFloatControlsIndependenceKHR* = VkShaderFloatControlsIndependence - VkSubmitFlagBitsKHR* = VkSubmitFlagBits - VkDriverIdKHR* = VkDriverId -type - PFN_vkInternalAllocationNotification* = proc(pUserData: pointer, size: csize_t, allocationType: VkInternalAllocationType, allocationScope: VkSystemAllocationScope): void {.cdecl.} - PFN_vkInternalFreeNotification* = proc(pUserData: pointer, size: csize_t, allocationType: VkInternalAllocationType, allocationScope: VkSystemAllocationScope): void {.cdecl.} - PFN_vkReallocationFunction* = proc(pUserData: pointer, pOriginal: pointer, size: csize_t, alignment: csize_t, allocationScope: VkSystemAllocationScope): pointer {.cdecl.} - PFN_vkAllocationFunction* = proc(pUserData: pointer, size: csize_t, alignment: csize_t, allocationScope: VkSystemAllocationScope): pointer {.cdecl.} - PFN_vkFreeFunction* = proc(pUserData: pointer, pMemory: pointer): void {.cdecl.} - PFN_vkVoidFunction* = proc(): void {.cdecl.} - PFN_vkDebugReportCallbackEXT* = proc(flags: VkDebugReportFlagsEXT, objectType: VkDebugReportObjectTypeEXT, theobject: uint64, location: csize_t, messageCode: int32, pLayerPrefix: cstring, pMessage: cstring, pUserData: pointer): VkBool32 {.cdecl.} - PFN_vkDebugUtilsMessengerCallbackEXT* = proc(messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT, messageTypes: VkDebugUtilsMessageTypeFlagsEXT, pCallbackData: ptr VkDebugUtilsMessengerCallbackDataEXT, pUserData: pointer): VkBool32 {.cdecl.} - PFN_vkFaultCallbackFunction* = proc(unrecordedFaults: VkBool32, faultCount: uint32, pFaults: ptr VkFaultData): void {.cdecl.} - PFN_vkDeviceMemoryReportCallbackEXT* = proc(pCallbackData: ptr VkDeviceMemoryReportCallbackDataEXT, pUserData: pointer): void {.cdecl.} - PFN_vkGetInstanceProcAddrLUNARG* = proc(instance: VkInstance, pName: cstring): PFN_vkVoidFunction {.cdecl.} - VkBaseOutStructure* = object - sType*: VkStructureType - pNext*: ptr VkBaseOutStructure - VkBaseInStructure* = object - sType*: VkStructureType - pNext*: ptr VkBaseInStructure - VkOffset2D* = object - x*: int32 - y*: int32 - VkOffset3D* = object - x*: int32 - y*: int32 - z*: int32 - VkExtent2D* = object - width*: uint32 - height*: uint32 - VkExtent3D* = object - width*: uint32 - height*: uint32 - depth*: uint32 - VkViewport* = object - x*: float32 - y*: float32 - width*: float32 - height*: float32 - minDepth*: float32 - maxDepth*: float32 - VkRect2D* = object - offset*: VkOffset2D - extent*: VkExtent2D - VkClearRect* = object - rect*: VkRect2D - baseArrayLayer*: uint32 - layerCount*: uint32 - VkComponentMapping* = object - r*: VkComponentSwizzle - g*: VkComponentSwizzle - b*: VkComponentSwizzle - a*: VkComponentSwizzle - VkPhysicalDeviceProperties* = object - apiVersion*: uint32 - driverVersion*: uint32 - vendorID*: uint32 - deviceID*: uint32 - deviceType*: VkPhysicalDeviceType - deviceName*: array[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE, char] - pipelineCacheUUID*: array[VK_UUID_SIZE, uint8] - limits*: VkPhysicalDeviceLimits - sparseProperties*: VkPhysicalDeviceSparseProperties - VkExtensionProperties* = object - extensionName*: array[VK_MAX_EXTENSION_NAME_SIZE, char] - specVersion*: uint32 - VkLayerProperties* = object - layerName*: array[VK_MAX_EXTENSION_NAME_SIZE, char] - specVersion*: uint32 - implementationVersion*: uint32 - description*: array[VK_MAX_DESCRIPTION_SIZE, char] - VkApplicationInfo* = object - sType*: VkStructureType - pNext*: pointer - pApplicationName*: cstring - applicationVersion*: uint32 - pEngineName*: cstring - engineVersion*: uint32 - apiVersion*: uint32 - VkAllocationCallbacks* = object - pUserData*: pointer - pfnAllocation*: PFN_vkAllocationFunction - pfnReallocation*: PFN_vkReallocationFunction - pfnFree*: PFN_vkFreeFunction - pfnInternalAllocation*: PFN_vkInternalAllocationNotification - pfnInternalFree*: PFN_vkInternalFreeNotification - VkDeviceQueueCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDeviceQueueCreateFlags - queueFamilyIndex*: uint32 - queueCount*: uint32 - pQueuePriorities*: ptr float32 - VkDeviceCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDeviceCreateFlags - queueCreateInfoCount*: uint32 - pQueueCreateInfos*: ptr VkDeviceQueueCreateInfo - enabledLayerCount*: uint32 - ppEnabledLayerNames*: cstringArray - enabledExtensionCount*: uint32 - ppEnabledExtensionNames*: cstringArray - pEnabledFeatures*: ptr VkPhysicalDeviceFeatures - VkInstanceCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkInstanceCreateFlags - pApplicationInfo*: ptr VkApplicationInfo - enabledLayerCount*: uint32 - ppEnabledLayerNames*: cstringArray - enabledExtensionCount*: uint32 - ppEnabledExtensionNames*: cstringArray - VkQueueFamilyProperties* = object - queueFlags*: VkQueueFlags - queueCount*: uint32 - timestampValidBits*: uint32 - minImageTransferGranularity*: VkExtent3D - VkPhysicalDeviceMemoryProperties* = object - memoryTypeCount*: uint32 - memoryTypes*: array[VK_MAX_MEMORY_TYPES, VkMemoryType] - memoryHeapCount*: uint32 - memoryHeaps*: array[VK_MAX_MEMORY_HEAPS, VkMemoryHeap] - VkMemoryAllocateInfo* = object - sType*: VkStructureType - pNext*: pointer - allocationSize*: VkDeviceSize - memoryTypeIndex*: uint32 - VkMemoryRequirements* = object - size*: VkDeviceSize - alignment*: VkDeviceSize - memoryTypeBits*: uint32 - VkSparseImageFormatProperties* = object - aspectMask*: VkImageAspectFlags - imageGranularity*: VkExtent3D - flags*: VkSparseImageFormatFlags - VkSparseImageMemoryRequirements* = object - formatProperties*: VkSparseImageFormatProperties - imageMipTailFirstLod*: uint32 - imageMipTailSize*: VkDeviceSize - imageMipTailOffset*: VkDeviceSize - imageMipTailStride*: VkDeviceSize - VkMemoryType* = object - propertyFlags*: VkMemoryPropertyFlags - heapIndex*: uint32 - VkMemoryHeap* = object - size*: VkDeviceSize - flags*: VkMemoryHeapFlags - VkMappedMemoryRange* = object - sType*: VkStructureType - pNext*: pointer - memory*: VkDeviceMemory - offset*: VkDeviceSize - size*: VkDeviceSize - VkFormatProperties* = object - linearTilingFeatures*: VkFormatFeatureFlags - optimalTilingFeatures*: VkFormatFeatureFlags - bufferFeatures*: VkFormatFeatureFlags - VkImageFormatProperties* = object - maxExtent*: VkExtent3D - maxMipLevels*: uint32 - maxArrayLayers*: uint32 - sampleCounts*: VkSampleCountFlags - maxResourceSize*: VkDeviceSize - VkDescriptorBufferInfo* = object - buffer*: VkBuffer - offset*: VkDeviceSize - range*: VkDeviceSize - VkDescriptorImageInfo* = object - sampler*: VkSampler - imageView*: VkImageView - imageLayout*: VkImageLayout - VkWriteDescriptorSet* = object - sType*: VkStructureType - pNext*: pointer - dstSet*: VkDescriptorSet - dstBinding*: uint32 - dstArrayElement*: uint32 - descriptorCount*: uint32 - descriptorType*: VkDescriptorType - pImageInfo*: ptr VkDescriptorImageInfo - pBufferInfo*: ptr VkDescriptorBufferInfo - pTexelBufferView*: ptr VkBufferView - VkCopyDescriptorSet* = object - sType*: VkStructureType - pNext*: pointer - srcSet*: VkDescriptorSet - srcBinding*: uint32 - srcArrayElement*: uint32 - dstSet*: VkDescriptorSet - dstBinding*: uint32 - dstArrayElement*: uint32 - descriptorCount*: uint32 - VkBufferCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkBufferCreateFlags - size*: VkDeviceSize - usage*: VkBufferUsageFlags - sharingMode*: VkSharingMode - queueFamilyIndexCount*: uint32 - pQueueFamilyIndices*: ptr uint32 - VkBufferViewCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkBufferViewCreateFlags - buffer*: VkBuffer - format*: VkFormat - offset*: VkDeviceSize - range*: VkDeviceSize - VkImageSubresource* = object - aspectMask*: VkImageAspectFlags - mipLevel*: uint32 - arrayLayer*: uint32 - VkImageSubresourceLayers* = object - aspectMask*: VkImageAspectFlags - mipLevel*: uint32 - baseArrayLayer*: uint32 - layerCount*: uint32 - VkImageSubresourceRange* = object - aspectMask*: VkImageAspectFlags - baseMipLevel*: uint32 - levelCount*: uint32 - baseArrayLayer*: uint32 - layerCount*: uint32 - VkMemoryBarrier* = object - sType*: VkStructureType - pNext*: pointer - srcAccessMask*: VkAccessFlags - dstAccessMask*: VkAccessFlags - VkBufferMemoryBarrier* = object - sType*: VkStructureType - pNext*: pointer - srcAccessMask*: VkAccessFlags - dstAccessMask*: VkAccessFlags - srcQueueFamilyIndex*: uint32 - dstQueueFamilyIndex*: uint32 - buffer*: VkBuffer - offset*: VkDeviceSize - size*: VkDeviceSize - VkImageMemoryBarrier* = object - sType*: VkStructureType - pNext*: pointer - srcAccessMask*: VkAccessFlags - dstAccessMask*: VkAccessFlags - oldLayout*: VkImageLayout - newLayout*: VkImageLayout - srcQueueFamilyIndex*: uint32 - dstQueueFamilyIndex*: uint32 - image*: VkImage - subresourceRange*: VkImageSubresourceRange - VkImageCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkImageCreateFlags - imageType*: VkImageType - format*: VkFormat - extent*: VkExtent3D - mipLevels*: uint32 - arrayLayers*: uint32 - samples*: VkSampleCountFlagBits - tiling*: VkImageTiling - usage*: VkImageUsageFlags - sharingMode*: VkSharingMode - queueFamilyIndexCount*: uint32 - pQueueFamilyIndices*: ptr uint32 - initialLayout*: VkImageLayout - VkSubresourceLayout* = object - offset*: VkDeviceSize - size*: VkDeviceSize - rowPitch*: VkDeviceSize - arrayPitch*: VkDeviceSize - depthPitch*: VkDeviceSize - VkImageViewCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkImageViewCreateFlags - image*: VkImage - viewType*: VkImageViewType - format*: VkFormat - components*: VkComponentMapping - subresourceRange*: VkImageSubresourceRange - VkBufferCopy* = object - srcOffset*: VkDeviceSize - dstOffset*: VkDeviceSize - size*: VkDeviceSize - VkSparseMemoryBind* = object - resourceOffset*: VkDeviceSize - size*: VkDeviceSize - memory*: VkDeviceMemory - memoryOffset*: VkDeviceSize - flags*: VkSparseMemoryBindFlags - VkSparseImageMemoryBind* = object - subresource*: VkImageSubresource - offset*: VkOffset3D - extent*: VkExtent3D - memory*: VkDeviceMemory - memoryOffset*: VkDeviceSize - flags*: VkSparseMemoryBindFlags - VkSparseBufferMemoryBindInfo* = object - buffer*: VkBuffer - bindCount*: uint32 - pBinds*: ptr VkSparseMemoryBind - VkSparseImageOpaqueMemoryBindInfo* = object - image*: VkImage - bindCount*: uint32 - pBinds*: ptr VkSparseMemoryBind - VkSparseImageMemoryBindInfo* = object - image*: VkImage - bindCount*: uint32 - pBinds*: ptr VkSparseImageMemoryBind - VkBindSparseInfo* = object - sType*: VkStructureType - pNext*: pointer - waitSemaphoreCount*: uint32 - pWaitSemaphores*: ptr VkSemaphore - bufferBindCount*: uint32 - pBufferBinds*: ptr VkSparseBufferMemoryBindInfo - imageOpaqueBindCount*: uint32 - pImageOpaqueBinds*: ptr VkSparseImageOpaqueMemoryBindInfo - imageBindCount*: uint32 - pImageBinds*: ptr VkSparseImageMemoryBindInfo - signalSemaphoreCount*: uint32 - pSignalSemaphores*: ptr VkSemaphore - VkImageCopy* = object - srcSubresource*: VkImageSubresourceLayers - srcOffset*: VkOffset3D - dstSubresource*: VkImageSubresourceLayers - dstOffset*: VkOffset3D - extent*: VkExtent3D - VkImageBlit* = object - srcSubresource*: VkImageSubresourceLayers - srcOffsets*: array[2, VkOffset3D] - dstSubresource*: VkImageSubresourceLayers - dstOffsets*: array[2, VkOffset3D] - VkBufferImageCopy* = object - bufferOffset*: VkDeviceSize - bufferRowLength*: uint32 - bufferImageHeight*: uint32 - imageSubresource*: VkImageSubresourceLayers - imageOffset*: VkOffset3D - imageExtent*: VkExtent3D - VkCopyMemoryIndirectCommandNV* = object - srcAddress*: VkDeviceAddress - dstAddress*: VkDeviceAddress - size*: VkDeviceSize - VkCopyMemoryToImageIndirectCommandNV* = object - srcAddress*: VkDeviceAddress - bufferRowLength*: uint32 - bufferImageHeight*: uint32 - imageSubresource*: VkImageSubresourceLayers - imageOffset*: VkOffset3D - imageExtent*: VkExtent3D - VkImageResolve* = object - srcSubresource*: VkImageSubresourceLayers - srcOffset*: VkOffset3D - dstSubresource*: VkImageSubresourceLayers - dstOffset*: VkOffset3D - extent*: VkExtent3D - VkShaderModuleCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkShaderModuleCreateFlags - codeSize*: csize_t - pCode*: ptr uint32 - VkDescriptorSetLayoutBinding* = object - binding*: uint32 - descriptorType*: VkDescriptorType - descriptorCount*: uint32 - stageFlags*: VkShaderStageFlags - pImmutableSamplers*: ptr VkSampler - VkDescriptorSetLayoutCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDescriptorSetLayoutCreateFlags - bindingCount*: uint32 - pBindings*: ptr VkDescriptorSetLayoutBinding - VkDescriptorPoolSize* = object - thetype*: VkDescriptorType - descriptorCount*: uint32 - VkDescriptorPoolCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDescriptorPoolCreateFlags - maxSets*: uint32 - poolSizeCount*: uint32 - pPoolSizes*: ptr VkDescriptorPoolSize - VkDescriptorSetAllocateInfo* = object - sType*: VkStructureType - pNext*: pointer - descriptorPool*: VkDescriptorPool - descriptorSetCount*: uint32 - pSetLayouts*: ptr VkDescriptorSetLayout - VkSpecializationMapEntry* = object - constantID*: uint32 - offset*: uint32 - size*: csize_t - VkSpecializationInfo* = object - mapEntryCount*: uint32 - pMapEntries*: ptr VkSpecializationMapEntry - dataSize*: csize_t - pData*: pointer - VkPipelineShaderStageCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineShaderStageCreateFlags - stage*: VkShaderStageFlagBits - module*: VkShaderModule - pName*: cstring - pSpecializationInfo*: ptr VkSpecializationInfo - VkComputePipelineCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineCreateFlags - stage*: VkPipelineShaderStageCreateInfo - layout*: VkPipelineLayout - basePipelineHandle*: VkPipeline - basePipelineIndex*: int32 - VkVertexInputBindingDescription* = object - binding*: uint32 - stride*: uint32 - inputRate*: VkVertexInputRate - VkVertexInputAttributeDescription* = object - location*: uint32 - binding*: uint32 - format*: VkFormat - offset*: uint32 - VkPipelineVertexInputStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineVertexInputStateCreateFlags - vertexBindingDescriptionCount*: uint32 - pVertexBindingDescriptions*: ptr VkVertexInputBindingDescription - vertexAttributeDescriptionCount*: uint32 - pVertexAttributeDescriptions*: ptr VkVertexInputAttributeDescription - VkPipelineInputAssemblyStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineInputAssemblyStateCreateFlags - topology*: VkPrimitiveTopology - primitiveRestartEnable*: VkBool32 - VkPipelineTessellationStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineTessellationStateCreateFlags - patchControlPoints*: uint32 - VkPipelineViewportStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineViewportStateCreateFlags - viewportCount*: uint32 - pViewports*: ptr VkViewport - scissorCount*: uint32 - pScissors*: ptr VkRect2D - VkPipelineRasterizationStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineRasterizationStateCreateFlags - depthClampEnable*: VkBool32 - rasterizerDiscardEnable*: VkBool32 - polygonMode*: VkPolygonMode - cullMode*: VkCullModeFlags - frontFace*: VkFrontFace - depthBiasEnable*: VkBool32 - depthBiasConstantFactor*: float32 - depthBiasClamp*: float32 - depthBiasSlopeFactor*: float32 - lineWidth*: float32 - VkPipelineMultisampleStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineMultisampleStateCreateFlags - rasterizationSamples*: VkSampleCountFlagBits - sampleShadingEnable*: VkBool32 - minSampleShading*: float32 - pSampleMask*: ptr VkSampleMask - alphaToCoverageEnable*: VkBool32 - alphaToOneEnable*: VkBool32 - VkPipelineColorBlendAttachmentState* = object - blendEnable*: VkBool32 - srcColorBlendFactor*: VkBlendFactor - dstColorBlendFactor*: VkBlendFactor - colorBlendOp*: VkBlendOp - srcAlphaBlendFactor*: VkBlendFactor - dstAlphaBlendFactor*: VkBlendFactor - alphaBlendOp*: VkBlendOp - colorWriteMask*: VkColorComponentFlags - VkPipelineColorBlendStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineColorBlendStateCreateFlags - logicOpEnable*: VkBool32 - logicOp*: VkLogicOp - attachmentCount*: uint32 - pAttachments*: ptr VkPipelineColorBlendAttachmentState - blendConstants*: array[4, float32] - VkPipelineDynamicStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineDynamicStateCreateFlags - dynamicStateCount*: uint32 - pDynamicStates*: ptr VkDynamicState - VkStencilOpState* = object - failOp*: VkStencilOp - passOp*: VkStencilOp - depthFailOp*: VkStencilOp - compareOp*: VkCompareOp - compareMask*: uint32 - writeMask*: uint32 - reference*: uint32 - VkPipelineDepthStencilStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineDepthStencilStateCreateFlags - depthTestEnable*: VkBool32 - depthWriteEnable*: VkBool32 - depthCompareOp*: VkCompareOp - depthBoundsTestEnable*: VkBool32 - stencilTestEnable*: VkBool32 - front*: VkStencilOpState - back*: VkStencilOpState - minDepthBounds*: float32 - maxDepthBounds*: float32 - VkGraphicsPipelineCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineCreateFlags - stageCount*: uint32 - pStages*: ptr VkPipelineShaderStageCreateInfo - pVertexInputState*: ptr VkPipelineVertexInputStateCreateInfo - pInputAssemblyState*: ptr VkPipelineInputAssemblyStateCreateInfo - pTessellationState*: ptr VkPipelineTessellationStateCreateInfo - pViewportState*: ptr VkPipelineViewportStateCreateInfo - pRasterizationState*: ptr VkPipelineRasterizationStateCreateInfo - pMultisampleState*: ptr VkPipelineMultisampleStateCreateInfo - pDepthStencilState*: ptr VkPipelineDepthStencilStateCreateInfo - pColorBlendState*: ptr VkPipelineColorBlendStateCreateInfo - pDynamicState*: ptr VkPipelineDynamicStateCreateInfo - layout*: VkPipelineLayout - renderPass*: VkRenderPass - subpass*: uint32 - basePipelineHandle*: VkPipeline - basePipelineIndex*: int32 - VkPipelineCacheCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineCacheCreateFlags - initialDataSize*: csize_t - pInitialData*: pointer - VkPipelineCacheHeaderVersionOne* = object - headerSize*: uint32 - headerVersion*: VkPipelineCacheHeaderVersion - vendorID*: uint32 - deviceID*: uint32 - pipelineCacheUUID*: array[VK_UUID_SIZE, uint8] - VkPipelineCacheStageValidationIndexEntry* = object - codeSize*: uint64 - codeOffset*: uint64 - VkPipelineCacheSafetyCriticalIndexEntry* = object - pipelineIdentifier*: array[VK_UUID_SIZE, uint8] - pipelineMemorySize*: uint64 - jsonSize*: uint64 - jsonOffset*: uint64 - stageIndexCount*: uint32 - stageIndexStride*: uint32 - stageIndexOffset*: uint64 - VkPipelineCacheHeaderVersionSafetyCriticalOne* = object - headerVersionOne*: VkPipelineCacheHeaderVersionOne - validationVersion*: VkPipelineCacheValidationVersion - implementationData*: uint32 - pipelineIndexCount*: uint32 - pipelineIndexStride*: uint32 - pipelineIndexOffset*: uint64 - VkPushConstantRange* = object - stageFlags*: VkShaderStageFlags - offset*: uint32 - size*: uint32 - VkPipelineLayoutCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineLayoutCreateFlags - setLayoutCount*: uint32 - pSetLayouts*: ptr VkDescriptorSetLayout - pushConstantRangeCount*: uint32 - pPushConstantRanges*: ptr VkPushConstantRange - VkSamplerCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkSamplerCreateFlags - magFilter*: VkFilter - minFilter*: VkFilter - mipmapMode*: VkSamplerMipmapMode - addressModeU*: VkSamplerAddressMode - addressModeV*: VkSamplerAddressMode - addressModeW*: VkSamplerAddressMode - mipLodBias*: float32 - anisotropyEnable*: VkBool32 - maxAnisotropy*: float32 - compareEnable*: VkBool32 - compareOp*: VkCompareOp - minLod*: float32 - maxLod*: float32 - borderColor*: VkBorderColor - unnormalizedCoordinates*: VkBool32 - VkCommandPoolCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkCommandPoolCreateFlags - queueFamilyIndex*: uint32 - VkCommandBufferAllocateInfo* = object - sType*: VkStructureType - pNext*: pointer - commandPool*: VkCommandPool - level*: VkCommandBufferLevel - commandBufferCount*: uint32 - VkCommandBufferInheritanceInfo* = object - sType*: VkStructureType - pNext*: pointer - renderPass*: VkRenderPass - subpass*: uint32 - framebuffer*: VkFramebuffer - occlusionQueryEnable*: VkBool32 - queryFlags*: VkQueryControlFlags - pipelineStatistics*: VkQueryPipelineStatisticFlags - VkCommandBufferBeginInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkCommandBufferUsageFlags - pInheritanceInfo*: ptr VkCommandBufferInheritanceInfo - VkRenderPassBeginInfo* = object - sType*: VkStructureType - pNext*: pointer - renderPass*: VkRenderPass - framebuffer*: VkFramebuffer - renderArea*: VkRect2D - clearValueCount*: uint32 - pClearValues*: ptr VkClearValue - VkClearColorValue* {.union.} = object - float32*: array[4, float32] - int32*: array[4, int32] - uint32*: array[4, uint32] - VkClearDepthStencilValue* = object - depth*: float32 - stencil*: uint32 - VkClearValue* {.union.} = object - color*: VkClearColorValue - depthStencil*: VkClearDepthStencilValue - VkClearAttachment* = object - aspectMask*: VkImageAspectFlags - colorAttachment*: uint32 - clearValue*: VkClearValue - VkAttachmentDescription* = object - flags*: VkAttachmentDescriptionFlags - format*: VkFormat - samples*: VkSampleCountFlagBits - loadOp*: VkAttachmentLoadOp - storeOp*: VkAttachmentStoreOp - stencilLoadOp*: VkAttachmentLoadOp - stencilStoreOp*: VkAttachmentStoreOp - initialLayout*: VkImageLayout - finalLayout*: VkImageLayout - VkAttachmentReference* = object - attachment*: uint32 - layout*: VkImageLayout - VkSubpassDescription* = object - flags*: VkSubpassDescriptionFlags - pipelineBindPoint*: VkPipelineBindPoint - inputAttachmentCount*: uint32 - pInputAttachments*: ptr VkAttachmentReference - colorAttachmentCount*: uint32 - pColorAttachments*: ptr VkAttachmentReference - pResolveAttachments*: ptr VkAttachmentReference - pDepthStencilAttachment*: ptr VkAttachmentReference - preserveAttachmentCount*: uint32 - pPreserveAttachments*: ptr uint32 - VkSubpassDependency* = object - srcSubpass*: uint32 - dstSubpass*: uint32 - srcStageMask*: VkPipelineStageFlags - dstStageMask*: VkPipelineStageFlags - srcAccessMask*: VkAccessFlags - dstAccessMask*: VkAccessFlags - dependencyFlags*: VkDependencyFlags - VkRenderPassCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkRenderPassCreateFlags - attachmentCount*: uint32 - pAttachments*: ptr VkAttachmentDescription - subpassCount*: uint32 - pSubpasses*: ptr VkSubpassDescription - dependencyCount*: uint32 - pDependencies*: ptr VkSubpassDependency - VkEventCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkEventCreateFlags - VkFenceCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkFenceCreateFlags - VkPhysicalDeviceFeatures* = object - robustBufferAccess*: VkBool32 - fullDrawIndexUint32*: VkBool32 - imageCubeArray*: VkBool32 - independentBlend*: VkBool32 - geometryShader*: VkBool32 - tessellationShader*: VkBool32 - sampleRateShading*: VkBool32 - dualSrcBlend*: VkBool32 - logicOp*: VkBool32 - multiDrawIndirect*: VkBool32 - drawIndirectFirstInstance*: VkBool32 - depthClamp*: VkBool32 - depthBiasClamp*: VkBool32 - fillModeNonSolid*: VkBool32 - depthBounds*: VkBool32 - wideLines*: VkBool32 - largePoints*: VkBool32 - alphaToOne*: VkBool32 - multiViewport*: VkBool32 - samplerAnisotropy*: VkBool32 - textureCompressionETC2*: VkBool32 - textureCompressionASTC_LDR*: VkBool32 - textureCompressionBC*: VkBool32 - occlusionQueryPrecise*: VkBool32 - pipelineStatisticsQuery*: VkBool32 - vertexPipelineStoresAndAtomics*: VkBool32 - fragmentStoresAndAtomics*: VkBool32 - shaderTessellationAndGeometryPointSize*: VkBool32 - shaderImageGatherExtended*: VkBool32 - shaderStorageImageExtendedFormats*: VkBool32 - shaderStorageImageMultisample*: VkBool32 - shaderStorageImageReadWithoutFormat*: VkBool32 - shaderStorageImageWriteWithoutFormat*: VkBool32 - shaderUniformBufferArrayDynamicIndexing*: VkBool32 - shaderSampledImageArrayDynamicIndexing*: VkBool32 - shaderStorageBufferArrayDynamicIndexing*: VkBool32 - shaderStorageImageArrayDynamicIndexing*: VkBool32 - shaderClipDistance*: VkBool32 - shaderCullDistance*: VkBool32 - shaderFloat64*: VkBool32 - shaderInt64*: VkBool32 - shaderInt16*: VkBool32 - shaderResourceResidency*: VkBool32 - shaderResourceMinLod*: VkBool32 - sparseBinding*: VkBool32 - sparseResidencyBuffer*: VkBool32 - sparseResidencyImage2D*: VkBool32 - sparseResidencyImage3D*: VkBool32 - sparseResidency2Samples*: VkBool32 - sparseResidency4Samples*: VkBool32 - sparseResidency8Samples*: VkBool32 - sparseResidency16Samples*: VkBool32 - sparseResidencyAliased*: VkBool32 - variableMultisampleRate*: VkBool32 - inheritedQueries*: VkBool32 - VkPhysicalDeviceSparseProperties* = object - residencyStandard2DBlockShape*: VkBool32 - residencyStandard2DMultisampleBlockShape*: VkBool32 - residencyStandard3DBlockShape*: VkBool32 - residencyAlignedMipSize*: VkBool32 - residencyNonResidentStrict*: VkBool32 - VkPhysicalDeviceLimits* = object - maxImageDimension1D*: uint32 - maxImageDimension2D*: uint32 - maxImageDimension3D*: uint32 - maxImageDimensionCube*: uint32 - maxImageArrayLayers*: uint32 - maxTexelBufferElements*: uint32 - maxUniformBufferRange*: uint32 - maxStorageBufferRange*: uint32 - maxPushConstantsSize*: uint32 - maxMemoryAllocationCount*: uint32 - maxSamplerAllocationCount*: uint32 - bufferImageGranularity*: VkDeviceSize - sparseAddressSpaceSize*: VkDeviceSize - maxBoundDescriptorSets*: uint32 - maxPerStageDescriptorSamplers*: uint32 - maxPerStageDescriptorUniformBuffers*: uint32 - maxPerStageDescriptorStorageBuffers*: uint32 - maxPerStageDescriptorSampledImages*: uint32 - maxPerStageDescriptorStorageImages*: uint32 - maxPerStageDescriptorInputAttachments*: uint32 - maxPerStageResources*: uint32 - maxDescriptorSetSamplers*: uint32 - maxDescriptorSetUniformBuffers*: uint32 - maxDescriptorSetUniformBuffersDynamic*: uint32 - maxDescriptorSetStorageBuffers*: uint32 - maxDescriptorSetStorageBuffersDynamic*: uint32 - maxDescriptorSetSampledImages*: uint32 - maxDescriptorSetStorageImages*: uint32 - maxDescriptorSetInputAttachments*: uint32 - maxVertexInputAttributes*: uint32 - maxVertexInputBindings*: uint32 - maxVertexInputAttributeOffset*: uint32 - maxVertexInputBindingStride*: uint32 - maxVertexOutputComponents*: uint32 - maxTessellationGenerationLevel*: uint32 - maxTessellationPatchSize*: uint32 - maxTessellationControlPerVertexInputComponents*: uint32 - maxTessellationControlPerVertexOutputComponents*: uint32 - maxTessellationControlPerPatchOutputComponents*: uint32 - maxTessellationControlTotalOutputComponents*: uint32 - maxTessellationEvaluationInputComponents*: uint32 - maxTessellationEvaluationOutputComponents*: uint32 - maxGeometryShaderInvocations*: uint32 - maxGeometryInputComponents*: uint32 - maxGeometryOutputComponents*: uint32 - maxGeometryOutputVertices*: uint32 - maxGeometryTotalOutputComponents*: uint32 - maxFragmentInputComponents*: uint32 - maxFragmentOutputAttachments*: uint32 - maxFragmentDualSrcAttachments*: uint32 - maxFragmentCombinedOutputResources*: uint32 - maxComputeSharedMemorySize*: uint32 - maxComputeWorkGroupCount*: array[3, uint32] - maxComputeWorkGroupInvocations*: uint32 - maxComputeWorkGroupSize*: array[3, uint32] - subPixelPrecisionBits*: uint32 - subTexelPrecisionBits*: uint32 - mipmapPrecisionBits*: uint32 - maxDrawIndexedIndexValue*: uint32 - maxDrawIndirectCount*: uint32 - maxSamplerLodBias*: float32 - maxSamplerAnisotropy*: float32 - maxViewports*: uint32 - maxViewportDimensions*: array[2, uint32] - viewportBoundsRange*: array[2, float32] - viewportSubPixelBits*: uint32 - minMemoryMapAlignment*: csize_t - minTexelBufferOffsetAlignment*: VkDeviceSize - minUniformBufferOffsetAlignment*: VkDeviceSize - minStorageBufferOffsetAlignment*: VkDeviceSize - minTexelOffset*: int32 - maxTexelOffset*: uint32 - minTexelGatherOffset*: int32 - maxTexelGatherOffset*: uint32 - minInterpolationOffset*: float32 - maxInterpolationOffset*: float32 - subPixelInterpolationOffsetBits*: uint32 - maxFramebufferWidth*: uint32 - maxFramebufferHeight*: uint32 - maxFramebufferLayers*: uint32 - framebufferColorSampleCounts*: VkSampleCountFlags - framebufferDepthSampleCounts*: VkSampleCountFlags - framebufferStencilSampleCounts*: VkSampleCountFlags - framebufferNoAttachmentsSampleCounts*: VkSampleCountFlags - maxColorAttachments*: uint32 - sampledImageColorSampleCounts*: VkSampleCountFlags - sampledImageIntegerSampleCounts*: VkSampleCountFlags - sampledImageDepthSampleCounts*: VkSampleCountFlags - sampledImageStencilSampleCounts*: VkSampleCountFlags - storageImageSampleCounts*: VkSampleCountFlags - maxSampleMaskWords*: uint32 - timestampComputeAndGraphics*: VkBool32 - timestampPeriod*: float32 - maxClipDistances*: uint32 - maxCullDistances*: uint32 - maxCombinedClipAndCullDistances*: uint32 - discreteQueuePriorities*: uint32 - pointSizeRange*: array[2, float32] - lineWidthRange*: array[2, float32] - pointSizeGranularity*: float32 - lineWidthGranularity*: float32 - strictLines*: VkBool32 - standardSampleLocations*: VkBool32 - optimalBufferCopyOffsetAlignment*: VkDeviceSize - optimalBufferCopyRowPitchAlignment*: VkDeviceSize - nonCoherentAtomSize*: VkDeviceSize - VkSemaphoreCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkSemaphoreCreateFlags - VkQueryPoolCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkQueryPoolCreateFlags - queryType*: VkQueryType - queryCount*: uint32 - pipelineStatistics*: VkQueryPipelineStatisticFlags - VkFramebufferCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkFramebufferCreateFlags - renderPass*: VkRenderPass - attachmentCount*: uint32 - pAttachments*: ptr VkImageView - width*: uint32 - height*: uint32 - layers*: uint32 - VkDrawIndirectCommand* = object - vertexCount*: uint32 - instanceCount*: uint32 - firstVertex*: uint32 - firstInstance*: uint32 - VkDrawIndexedIndirectCommand* = object - indexCount*: uint32 - instanceCount*: uint32 - firstIndex*: uint32 - vertexOffset*: int32 - firstInstance*: uint32 - VkDispatchIndirectCommand* = object - x*: uint32 - y*: uint32 - z*: uint32 - VkMultiDrawInfoEXT* = object - firstVertex*: uint32 - vertexCount*: uint32 - VkMultiDrawIndexedInfoEXT* = object - firstIndex*: uint32 - indexCount*: uint32 - vertexOffset*: int32 - VkSubmitInfo* = object - sType*: VkStructureType - pNext*: pointer - waitSemaphoreCount*: uint32 - pWaitSemaphores*: ptr VkSemaphore - pWaitDstStageMask*: ptr VkPipelineStageFlags - commandBufferCount*: uint32 - pCommandBuffers*: ptr VkCommandBuffer - signalSemaphoreCount*: uint32 - pSignalSemaphores*: ptr VkSemaphore - VkDisplayPropertiesKHR* = object - display*: VkDisplayKHR - displayName*: cstring - physicalDimensions*: VkExtent2D - physicalResolution*: VkExtent2D - supportedTransforms*: VkSurfaceTransformFlagsKHR - planeReorderPossible*: VkBool32 - persistentContent*: VkBool32 - VkDisplayPlanePropertiesKHR* = object - currentDisplay*: VkDisplayKHR - currentStackIndex*: uint32 - VkDisplayModeParametersKHR* = object - visibleRegion*: VkExtent2D - refreshRate*: uint32 - VkDisplayModePropertiesKHR* = object - displayMode*: VkDisplayModeKHR - parameters*: VkDisplayModeParametersKHR - VkDisplayModeCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDisplayModeCreateFlagsKHR - parameters*: VkDisplayModeParametersKHR - VkDisplayPlaneCapabilitiesKHR* = object - supportedAlpha*: VkDisplayPlaneAlphaFlagsKHR - minSrcPosition*: VkOffset2D - maxSrcPosition*: VkOffset2D - minSrcExtent*: VkExtent2D - maxSrcExtent*: VkExtent2D - minDstPosition*: VkOffset2D - maxDstPosition*: VkOffset2D - minDstExtent*: VkExtent2D - maxDstExtent*: VkExtent2D - VkDisplaySurfaceCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDisplaySurfaceCreateFlagsKHR - displayMode*: VkDisplayModeKHR - planeIndex*: uint32 - planeStackIndex*: uint32 - transform*: VkSurfaceTransformFlagBitsKHR - globalAlpha*: float32 - alphaMode*: VkDisplayPlaneAlphaFlagBitsKHR - imageExtent*: VkExtent2D - VkDisplayPresentInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - srcRect*: VkRect2D - dstRect*: VkRect2D - persistent*: VkBool32 - VkSurfaceCapabilitiesKHR* = object - minImageCount*: uint32 - maxImageCount*: uint32 - currentExtent*: VkExtent2D - minImageExtent*: VkExtent2D - maxImageExtent*: VkExtent2D - maxImageArrayLayers*: uint32 - supportedTransforms*: VkSurfaceTransformFlagsKHR - currentTransform*: VkSurfaceTransformFlagBitsKHR - supportedCompositeAlpha*: VkCompositeAlphaFlagsKHR - supportedUsageFlags*: VkImageUsageFlags - VkSurfaceFormatKHR* = object - format*: VkFormat - colorSpace*: VkColorSpaceKHR - VkSwapchainCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkSwapchainCreateFlagsKHR - surface*: VkSurfaceKHR - minImageCount*: uint32 - imageFormat*: VkFormat - imageColorSpace*: VkColorSpaceKHR - imageExtent*: VkExtent2D - imageArrayLayers*: uint32 - imageUsage*: VkImageUsageFlags - imageSharingMode*: VkSharingMode - queueFamilyIndexCount*: uint32 - pQueueFamilyIndices*: ptr uint32 - preTransform*: VkSurfaceTransformFlagBitsKHR - compositeAlpha*: VkCompositeAlphaFlagBitsKHR - presentMode*: VkPresentModeKHR - clipped*: VkBool32 - oldSwapchain*: VkSwapchainKHR - VkPresentInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - waitSemaphoreCount*: uint32 - pWaitSemaphores*: ptr VkSemaphore - swapchainCount*: uint32 - pSwapchains*: ptr VkSwapchainKHR - pImageIndices*: ptr uint32 - pResults*: ptr VkResult - VkDebugReportCallbackCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDebugReportFlagsEXT - pfnCallback*: PFN_vkDebugReportCallbackEXT - pUserData*: pointer - VkValidationFlagsEXT* = object - sType*: VkStructureType - pNext*: pointer - disabledValidationCheckCount*: uint32 - pDisabledValidationChecks*: ptr VkValidationCheckEXT - VkValidationFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - enabledValidationFeatureCount*: uint32 - pEnabledValidationFeatures*: ptr VkValidationFeatureEnableEXT - disabledValidationFeatureCount*: uint32 - pDisabledValidationFeatures*: ptr VkValidationFeatureDisableEXT - VkApplicationParametersEXT* = object - sType*: VkStructureType - pNext*: pointer - vendorID*: uint32 - deviceID*: uint32 - key*: uint32 - value*: uint64 - VkPipelineRasterizationStateRasterizationOrderAMD* = object - sType*: VkStructureType - pNext*: pointer - rasterizationOrder*: VkRasterizationOrderAMD - VkDebugMarkerObjectNameInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - objectType*: VkDebugReportObjectTypeEXT - theobject*: uint64 - pObjectName*: cstring - VkDebugMarkerObjectTagInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - objectType*: VkDebugReportObjectTypeEXT - theobject*: uint64 - tagName*: uint64 - tagSize*: csize_t - pTag*: pointer - VkDebugMarkerMarkerInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - pMarkerName*: cstring - color*: array[4, float32] - VkDedicatedAllocationImageCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - dedicatedAllocation*: VkBool32 - VkDedicatedAllocationBufferCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - dedicatedAllocation*: VkBool32 - VkDedicatedAllocationMemoryAllocateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - image*: VkImage - buffer*: VkBuffer - VkExternalImageFormatPropertiesNV* = object - imageFormatProperties*: VkImageFormatProperties - externalMemoryFeatures*: VkExternalMemoryFeatureFlagsNV - exportFromImportedHandleTypes*: VkExternalMemoryHandleTypeFlagsNV - compatibleHandleTypes*: VkExternalMemoryHandleTypeFlagsNV - VkExternalMemoryImageCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - handleTypes*: VkExternalMemoryHandleTypeFlagsNV - VkExportMemoryAllocateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - handleTypes*: VkExternalMemoryHandleTypeFlagsNV - VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - deviceGeneratedCommands*: VkBool32 - VkDevicePrivateDataCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - privateDataSlotRequestCount*: uint32 - VkDevicePrivateDataCreateInfoEXT* = object - VkPrivateDataSlotCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPrivateDataSlotCreateFlags - VkPrivateDataSlotCreateInfoEXT* = object - VkPhysicalDevicePrivateDataFeatures* = object - sType*: VkStructureType - pNext*: pointer - privateData*: VkBool32 - VkPhysicalDevicePrivateDataFeaturesEXT* = object - VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - maxGraphicsShaderGroupCount*: uint32 - maxIndirectSequenceCount*: uint32 - maxIndirectCommandsTokenCount*: uint32 - maxIndirectCommandsStreamCount*: uint32 - maxIndirectCommandsTokenOffset*: uint32 - maxIndirectCommandsStreamStride*: uint32 - minSequencesCountBufferOffsetAlignment*: uint32 - minSequencesIndexBufferOffsetAlignment*: uint32 - minIndirectCommandsBufferOffsetAlignment*: uint32 - VkPhysicalDeviceMultiDrawPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - maxMultiDrawCount*: uint32 - VkGraphicsShaderGroupCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - stageCount*: uint32 - pStages*: ptr VkPipelineShaderStageCreateInfo - pVertexInputState*: ptr VkPipelineVertexInputStateCreateInfo - pTessellationState*: ptr VkPipelineTessellationStateCreateInfo - VkGraphicsPipelineShaderGroupsCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - groupCount*: uint32 - pGroups*: ptr VkGraphicsShaderGroupCreateInfoNV - pipelineCount*: uint32 - pPipelines*: ptr VkPipeline - VkBindShaderGroupIndirectCommandNV* = object - groupIndex*: uint32 - VkBindIndexBufferIndirectCommandNV* = object - bufferAddress*: VkDeviceAddress - size*: uint32 - indexType*: VkIndexType - VkBindVertexBufferIndirectCommandNV* = object - bufferAddress*: VkDeviceAddress - size*: uint32 - stride*: uint32 - VkSetStateFlagsIndirectCommandNV* = object - data*: uint32 - VkIndirectCommandsStreamNV* = object - buffer*: VkBuffer - offset*: VkDeviceSize - VkIndirectCommandsLayoutTokenNV* = object - sType*: VkStructureType - pNext*: pointer - tokenType*: VkIndirectCommandsTokenTypeNV - stream*: uint32 - offset*: uint32 - vertexBindingUnit*: uint32 - vertexDynamicStride*: VkBool32 - pushconstantPipelineLayout*: VkPipelineLayout - pushconstantShaderStageFlags*: VkShaderStageFlags - pushconstantOffset*: uint32 - pushconstantSize*: uint32 - indirectStateFlags*: VkIndirectStateFlagsNV - indexTypeCount*: uint32 - pIndexTypes*: ptr VkIndexType - pIndexTypeValues*: ptr uint32 - VkIndirectCommandsLayoutCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkIndirectCommandsLayoutUsageFlagsNV - pipelineBindPoint*: VkPipelineBindPoint - tokenCount*: uint32 - pTokens*: ptr VkIndirectCommandsLayoutTokenNV - streamCount*: uint32 - pStreamStrides*: ptr uint32 - VkGeneratedCommandsInfoNV* = object - sType*: VkStructureType - pNext*: pointer - pipelineBindPoint*: VkPipelineBindPoint - pipeline*: VkPipeline - indirectCommandsLayout*: VkIndirectCommandsLayoutNV - streamCount*: uint32 - pStreams*: ptr VkIndirectCommandsStreamNV - sequencesCount*: uint32 - preprocessBuffer*: VkBuffer - preprocessOffset*: VkDeviceSize - preprocessSize*: VkDeviceSize - sequencesCountBuffer*: VkBuffer - sequencesCountOffset*: VkDeviceSize - sequencesIndexBuffer*: VkBuffer - sequencesIndexOffset*: VkDeviceSize - VkGeneratedCommandsMemoryRequirementsInfoNV* = object - sType*: VkStructureType - pNext*: pointer - pipelineBindPoint*: VkPipelineBindPoint - pipeline*: VkPipeline - indirectCommandsLayout*: VkIndirectCommandsLayoutNV - maxSequencesCount*: uint32 - VkPhysicalDeviceFeatures2* = object - sType*: VkStructureType - pNext*: pointer - features*: VkPhysicalDeviceFeatures - VkPhysicalDeviceFeatures2KHR* = object - VkPhysicalDeviceProperties2* = object - sType*: VkStructureType - pNext*: pointer - properties*: VkPhysicalDeviceProperties - VkPhysicalDeviceProperties2KHR* = object - VkFormatProperties2* = object - sType*: VkStructureType - pNext*: pointer - formatProperties*: VkFormatProperties - VkFormatProperties2KHR* = object - VkImageFormatProperties2* = object - sType*: VkStructureType - pNext*: pointer - imageFormatProperties*: VkImageFormatProperties - VkImageFormatProperties2KHR* = object - VkPhysicalDeviceImageFormatInfo2* = object - sType*: VkStructureType - pNext*: pointer - format*: VkFormat - thetype*: VkImageType - tiling*: VkImageTiling - usage*: VkImageUsageFlags - flags*: VkImageCreateFlags - VkPhysicalDeviceImageFormatInfo2KHR* = object - VkQueueFamilyProperties2* = object - sType*: VkStructureType - pNext*: pointer - queueFamilyProperties*: VkQueueFamilyProperties - VkQueueFamilyProperties2KHR* = object - VkPhysicalDeviceMemoryProperties2* = object - sType*: VkStructureType - pNext*: pointer - memoryProperties*: VkPhysicalDeviceMemoryProperties - VkPhysicalDeviceMemoryProperties2KHR* = object - VkSparseImageFormatProperties2* = object - sType*: VkStructureType - pNext*: pointer - properties*: VkSparseImageFormatProperties - VkSparseImageFormatProperties2KHR* = object - VkPhysicalDeviceSparseImageFormatInfo2* = object - sType*: VkStructureType - pNext*: pointer - format*: VkFormat - thetype*: VkImageType - samples*: VkSampleCountFlagBits - usage*: VkImageUsageFlags - tiling*: VkImageTiling - VkPhysicalDeviceSparseImageFormatInfo2KHR* = object - VkPhysicalDevicePushDescriptorPropertiesKHR* = object - sType*: VkStructureType - pNext*: pointer - maxPushDescriptors*: uint32 - VkConformanceVersion* = object - major*: uint8 - minor*: uint8 - subminor*: uint8 - patch*: uint8 - VkConformanceVersionKHR* = object - VkPhysicalDeviceDriverProperties* = object - sType*: VkStructureType - pNext*: pointer - driverID*: VkDriverId - driverName*: array[VK_MAX_DRIVER_NAME_SIZE, char] - driverInfo*: array[VK_MAX_DRIVER_INFO_SIZE, char] - conformanceVersion*: VkConformanceVersion - VkPhysicalDeviceDriverPropertiesKHR* = object - VkPresentRegionsKHR* = object - sType*: VkStructureType - pNext*: pointer - swapchainCount*: uint32 - pRegions*: ptr VkPresentRegionKHR - VkPresentRegionKHR* = object - rectangleCount*: uint32 - pRectangles*: ptr VkRectLayerKHR - VkRectLayerKHR* = object - offset*: VkOffset2D - extent*: VkExtent2D - layer*: uint32 - VkPhysicalDeviceVariablePointersFeatures* = object - sType*: VkStructureType - pNext*: pointer - variablePointersStorageBuffer*: VkBool32 - variablePointers*: VkBool32 - VkPhysicalDeviceVariablePointersFeaturesKHR* = object - VkPhysicalDeviceVariablePointerFeaturesKHR* = object - VkPhysicalDeviceVariablePointerFeatures* = object - VkExternalMemoryProperties* = object - externalMemoryFeatures*: VkExternalMemoryFeatureFlags - exportFromImportedHandleTypes*: VkExternalMemoryHandleTypeFlags - compatibleHandleTypes*: VkExternalMemoryHandleTypeFlags - VkExternalMemoryPropertiesKHR* = object - VkPhysicalDeviceExternalImageFormatInfo* = object - sType*: VkStructureType - pNext*: pointer - handleType*: VkExternalMemoryHandleTypeFlagBits - VkPhysicalDeviceExternalImageFormatInfoKHR* = object - VkExternalImageFormatProperties* = object - sType*: VkStructureType - pNext*: pointer - externalMemoryProperties*: VkExternalMemoryProperties - VkExternalImageFormatPropertiesKHR* = object - VkPhysicalDeviceExternalBufferInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkBufferCreateFlags - usage*: VkBufferUsageFlags - handleType*: VkExternalMemoryHandleTypeFlagBits - VkPhysicalDeviceExternalBufferInfoKHR* = object - VkExternalBufferProperties* = object - sType*: VkStructureType - pNext*: pointer - externalMemoryProperties*: VkExternalMemoryProperties - VkExternalBufferPropertiesKHR* = object - VkPhysicalDeviceIDProperties* = object - sType*: VkStructureType - pNext*: pointer - deviceUUID*: array[VK_UUID_SIZE, uint8] - driverUUID*: array[VK_UUID_SIZE, uint8] - deviceLUID*: array[VK_LUID_SIZE, uint8] - deviceNodeMask*: uint32 - deviceLUIDValid*: VkBool32 - VkPhysicalDeviceIDPropertiesKHR* = object - VkExternalMemoryImageCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - handleTypes*: VkExternalMemoryHandleTypeFlags - VkExternalMemoryImageCreateInfoKHR* = object - VkExternalMemoryBufferCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - handleTypes*: VkExternalMemoryHandleTypeFlags - VkExternalMemoryBufferCreateInfoKHR* = object - VkExportMemoryAllocateInfo* = object - sType*: VkStructureType - pNext*: pointer - handleTypes*: VkExternalMemoryHandleTypeFlags - VkExportMemoryAllocateInfoKHR* = object - VkImportMemoryFdInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - handleType*: VkExternalMemoryHandleTypeFlagBits - fd*: cint - VkMemoryFdPropertiesKHR* = object - sType*: VkStructureType - pNext*: pointer - memoryTypeBits*: uint32 - VkMemoryGetFdInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - memory*: VkDeviceMemory - handleType*: VkExternalMemoryHandleTypeFlagBits - VkPhysicalDeviceExternalSemaphoreInfo* = object - sType*: VkStructureType - pNext*: pointer - handleType*: VkExternalSemaphoreHandleTypeFlagBits - VkPhysicalDeviceExternalSemaphoreInfoKHR* = object - VkExternalSemaphoreProperties* = object - sType*: VkStructureType - pNext*: pointer - exportFromImportedHandleTypes*: VkExternalSemaphoreHandleTypeFlags - compatibleHandleTypes*: VkExternalSemaphoreHandleTypeFlags - externalSemaphoreFeatures*: VkExternalSemaphoreFeatureFlags - VkExternalSemaphorePropertiesKHR* = object - VkExportSemaphoreCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - handleTypes*: VkExternalSemaphoreHandleTypeFlags - VkExportSemaphoreCreateInfoKHR* = object - VkImportSemaphoreFdInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - semaphore*: VkSemaphore - flags*: VkSemaphoreImportFlags - handleType*: VkExternalSemaphoreHandleTypeFlagBits - fd*: cint - VkSemaphoreGetFdInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - semaphore*: VkSemaphore - handleType*: VkExternalSemaphoreHandleTypeFlagBits - VkPhysicalDeviceExternalFenceInfo* = object - sType*: VkStructureType - pNext*: pointer - handleType*: VkExternalFenceHandleTypeFlagBits - VkPhysicalDeviceExternalFenceInfoKHR* = object - VkExternalFenceProperties* = object - sType*: VkStructureType - pNext*: pointer - exportFromImportedHandleTypes*: VkExternalFenceHandleTypeFlags - compatibleHandleTypes*: VkExternalFenceHandleTypeFlags - externalFenceFeatures*: VkExternalFenceFeatureFlags - VkExternalFencePropertiesKHR* = object - VkExportFenceCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - handleTypes*: VkExternalFenceHandleTypeFlags - VkExportFenceCreateInfoKHR* = object - VkImportFenceFdInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - fence*: VkFence - flags*: VkFenceImportFlags - handleType*: VkExternalFenceHandleTypeFlagBits - fd*: cint - VkFenceGetFdInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - fence*: VkFence - handleType*: VkExternalFenceHandleTypeFlagBits - VkPhysicalDeviceMultiviewFeatures* = object - sType*: VkStructureType - pNext*: pointer - multiview*: VkBool32 - multiviewGeometryShader*: VkBool32 - multiviewTessellationShader*: VkBool32 - VkPhysicalDeviceMultiviewFeaturesKHR* = object - VkPhysicalDeviceMultiviewProperties* = object - sType*: VkStructureType - pNext*: pointer - maxMultiviewViewCount*: uint32 - maxMultiviewInstanceIndex*: uint32 - VkPhysicalDeviceMultiviewPropertiesKHR* = object - VkRenderPassMultiviewCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - subpassCount*: uint32 - pViewMasks*: ptr uint32 - dependencyCount*: uint32 - pViewOffsets*: ptr int32 - correlationMaskCount*: uint32 - pCorrelationMasks*: ptr uint32 - VkRenderPassMultiviewCreateInfoKHR* = object - VkSurfaceCapabilities2EXT* = object - sType*: VkStructureType - pNext*: pointer - minImageCount*: uint32 - maxImageCount*: uint32 - currentExtent*: VkExtent2D - minImageExtent*: VkExtent2D - maxImageExtent*: VkExtent2D - maxImageArrayLayers*: uint32 - supportedTransforms*: VkSurfaceTransformFlagsKHR - currentTransform*: VkSurfaceTransformFlagBitsKHR - supportedCompositeAlpha*: VkCompositeAlphaFlagsKHR - supportedUsageFlags*: VkImageUsageFlags - supportedSurfaceCounters*: VkSurfaceCounterFlagsEXT - VkDisplayPowerInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - powerState*: VkDisplayPowerStateEXT - VkDeviceEventInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - deviceEvent*: VkDeviceEventTypeEXT - VkDisplayEventInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - displayEvent*: VkDisplayEventTypeEXT - VkSwapchainCounterCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - surfaceCounters*: VkSurfaceCounterFlagsEXT - VkPhysicalDeviceGroupProperties* = object - sType*: VkStructureType - pNext*: pointer - physicalDeviceCount*: uint32 - physicalDevices*: array[VK_MAX_DEVICE_GROUP_SIZE, VkPhysicalDevice] - subsetAllocation*: VkBool32 - VkPhysicalDeviceGroupPropertiesKHR* = object - VkMemoryAllocateFlagsInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkMemoryAllocateFlags - deviceMask*: uint32 - VkMemoryAllocateFlagsInfoKHR* = object - VkBindBufferMemoryInfo* = object - sType*: VkStructureType - pNext*: pointer - buffer*: VkBuffer - memory*: VkDeviceMemory - memoryOffset*: VkDeviceSize - VkBindBufferMemoryInfoKHR* = object - VkBindBufferMemoryDeviceGroupInfo* = object - sType*: VkStructureType - pNext*: pointer - deviceIndexCount*: uint32 - pDeviceIndices*: ptr uint32 - VkBindBufferMemoryDeviceGroupInfoKHR* = object - VkBindImageMemoryInfo* = object - sType*: VkStructureType - pNext*: pointer - image*: VkImage - memory*: VkDeviceMemory - memoryOffset*: VkDeviceSize - VkBindImageMemoryInfoKHR* = object - VkBindImageMemoryDeviceGroupInfo* = object - sType*: VkStructureType - pNext*: pointer - deviceIndexCount*: uint32 - pDeviceIndices*: ptr uint32 - splitInstanceBindRegionCount*: uint32 - pSplitInstanceBindRegions*: ptr VkRect2D - VkBindImageMemoryDeviceGroupInfoKHR* = object - VkDeviceGroupRenderPassBeginInfo* = object - sType*: VkStructureType - pNext*: pointer - deviceMask*: uint32 - deviceRenderAreaCount*: uint32 - pDeviceRenderAreas*: ptr VkRect2D - VkDeviceGroupRenderPassBeginInfoKHR* = object - VkDeviceGroupCommandBufferBeginInfo* = object - sType*: VkStructureType - pNext*: pointer - deviceMask*: uint32 - VkDeviceGroupCommandBufferBeginInfoKHR* = object - VkDeviceGroupSubmitInfo* = object - sType*: VkStructureType - pNext*: pointer - waitSemaphoreCount*: uint32 - pWaitSemaphoreDeviceIndices*: ptr uint32 - commandBufferCount*: uint32 - pCommandBufferDeviceMasks*: ptr uint32 - signalSemaphoreCount*: uint32 - pSignalSemaphoreDeviceIndices*: ptr uint32 - VkDeviceGroupSubmitInfoKHR* = object - VkDeviceGroupBindSparseInfo* = object - sType*: VkStructureType - pNext*: pointer - resourceDeviceIndex*: uint32 - memoryDeviceIndex*: uint32 - VkDeviceGroupBindSparseInfoKHR* = object - VkDeviceGroupPresentCapabilitiesKHR* = object - sType*: VkStructureType - pNext*: pointer - presentMask*: array[VK_MAX_DEVICE_GROUP_SIZE, uint32] - modes*: VkDeviceGroupPresentModeFlagsKHR - VkImageSwapchainCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - swapchain*: VkSwapchainKHR - VkBindImageMemorySwapchainInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - swapchain*: VkSwapchainKHR - imageIndex*: uint32 - VkAcquireNextImageInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - swapchain*: VkSwapchainKHR - timeout*: uint64 - semaphore*: VkSemaphore - fence*: VkFence - deviceMask*: uint32 - VkDeviceGroupPresentInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - swapchainCount*: uint32 - pDeviceMasks*: ptr uint32 - mode*: VkDeviceGroupPresentModeFlagBitsKHR - VkDeviceGroupDeviceCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - physicalDeviceCount*: uint32 - pPhysicalDevices*: ptr VkPhysicalDevice - VkDeviceGroupDeviceCreateInfoKHR* = object - VkDeviceGroupSwapchainCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - modes*: VkDeviceGroupPresentModeFlagsKHR - VkDescriptorUpdateTemplateEntry* = object - dstBinding*: uint32 - dstArrayElement*: uint32 - descriptorCount*: uint32 - descriptorType*: VkDescriptorType - offset*: csize_t - stride*: csize_t - VkDescriptorUpdateTemplateEntryKHR* = object - VkDescriptorUpdateTemplateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDescriptorUpdateTemplateCreateFlags - descriptorUpdateEntryCount*: uint32 - pDescriptorUpdateEntries*: ptr VkDescriptorUpdateTemplateEntry - templateType*: VkDescriptorUpdateTemplateType - descriptorSetLayout*: VkDescriptorSetLayout - pipelineBindPoint*: VkPipelineBindPoint - pipelineLayout*: VkPipelineLayout - set*: uint32 - VkDescriptorUpdateTemplateCreateInfoKHR* = object - VkXYColorEXT* = object - x*: float32 - y*: float32 - VkPhysicalDevicePresentIdFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - presentId*: VkBool32 - VkPresentIdKHR* = object - sType*: VkStructureType - pNext*: pointer - swapchainCount*: uint32 - pPresentIds*: ptr uint64 - VkPhysicalDevicePresentWaitFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - presentWait*: VkBool32 - VkHdrMetadataEXT* = object - sType*: VkStructureType - pNext*: pointer - displayPrimaryRed*: VkXYColorEXT - displayPrimaryGreen*: VkXYColorEXT - displayPrimaryBlue*: VkXYColorEXT - whitePoint*: VkXYColorEXT - maxLuminance*: float32 - minLuminance*: float32 - maxContentLightLevel*: float32 - maxFrameAverageLightLevel*: float32 - VkDisplayNativeHdrSurfaceCapabilitiesAMD* = object - sType*: VkStructureType - pNext*: pointer - localDimmingSupport*: VkBool32 - VkSwapchainDisplayNativeHdrCreateInfoAMD* = object - sType*: VkStructureType - pNext*: pointer - localDimmingEnable*: VkBool32 - VkRefreshCycleDurationGOOGLE* = object - refreshDuration*: uint64 - VkPastPresentationTimingGOOGLE* = object - presentID*: uint32 - desiredPresentTime*: uint64 - actualPresentTime*: uint64 - earliestPresentTime*: uint64 - presentMargin*: uint64 - VkPresentTimesInfoGOOGLE* = object - sType*: VkStructureType - pNext*: pointer - swapchainCount*: uint32 - pTimes*: ptr VkPresentTimeGOOGLE - VkPresentTimeGOOGLE* = object - presentID*: uint32 - desiredPresentTime*: uint64 - VkViewportWScalingNV* = object - xcoeff*: float32 - ycoeff*: float32 - VkPipelineViewportWScalingStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - viewportWScalingEnable*: VkBool32 - viewportCount*: uint32 - pViewportWScalings*: ptr VkViewportWScalingNV - VkViewportSwizzleNV* = object - x*: VkViewportCoordinateSwizzleNV - y*: VkViewportCoordinateSwizzleNV - z*: VkViewportCoordinateSwizzleNV - w*: VkViewportCoordinateSwizzleNV - VkPipelineViewportSwizzleStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineViewportSwizzleStateCreateFlagsNV - viewportCount*: uint32 - pViewportSwizzles*: ptr VkViewportSwizzleNV - VkPhysicalDeviceDiscardRectanglePropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - maxDiscardRectangles*: uint32 - VkPipelineDiscardRectangleStateCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineDiscardRectangleStateCreateFlagsEXT - discardRectangleMode*: VkDiscardRectangleModeEXT - discardRectangleCount*: uint32 - pDiscardRectangles*: ptr VkRect2D - VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* = object - sType*: VkStructureType - pNext*: pointer - perViewPositionAllComponents*: VkBool32 - VkInputAttachmentAspectReference* = object - subpass*: uint32 - inputAttachmentIndex*: uint32 - aspectMask*: VkImageAspectFlags - VkInputAttachmentAspectReferenceKHR* = object - VkRenderPassInputAttachmentAspectCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - aspectReferenceCount*: uint32 - pAspectReferences*: ptr VkInputAttachmentAspectReference - VkRenderPassInputAttachmentAspectCreateInfoKHR* = object - VkPhysicalDeviceSurfaceInfo2KHR* = object - sType*: VkStructureType - pNext*: pointer - surface*: VkSurfaceKHR - VkSurfaceCapabilities2KHR* = object - sType*: VkStructureType - pNext*: pointer - surfaceCapabilities*: VkSurfaceCapabilitiesKHR - VkSurfaceFormat2KHR* = object - sType*: VkStructureType - pNext*: pointer - surfaceFormat*: VkSurfaceFormatKHR - VkDisplayProperties2KHR* = object - sType*: VkStructureType - pNext*: pointer - displayProperties*: VkDisplayPropertiesKHR - VkDisplayPlaneProperties2KHR* = object - sType*: VkStructureType - pNext*: pointer - displayPlaneProperties*: VkDisplayPlanePropertiesKHR - VkDisplayModeProperties2KHR* = object - sType*: VkStructureType - pNext*: pointer - displayModeProperties*: VkDisplayModePropertiesKHR - VkDisplayPlaneInfo2KHR* = object - sType*: VkStructureType - pNext*: pointer - mode*: VkDisplayModeKHR - planeIndex*: uint32 - VkDisplayPlaneCapabilities2KHR* = object - sType*: VkStructureType - pNext*: pointer - capabilities*: VkDisplayPlaneCapabilitiesKHR - VkSharedPresentSurfaceCapabilitiesKHR* = object - sType*: VkStructureType - pNext*: pointer - sharedPresentSupportedUsageFlags*: VkImageUsageFlags - VkPhysicalDevice16BitStorageFeatures* = object - sType*: VkStructureType - pNext*: pointer - storageBuffer16BitAccess*: VkBool32 - uniformAndStorageBuffer16BitAccess*: VkBool32 - storagePushConstant16*: VkBool32 - storageInputOutput16*: VkBool32 - VkPhysicalDevice16BitStorageFeaturesKHR* = object - VkPhysicalDeviceSubgroupProperties* = object - sType*: VkStructureType - pNext*: pointer - subgroupSize*: uint32 - supportedStages*: VkShaderStageFlags - supportedOperations*: VkSubgroupFeatureFlags - quadOperationsInAllStages*: VkBool32 - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* = object - sType*: VkStructureType - pNext*: pointer - shaderSubgroupExtendedTypes*: VkBool32 - VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR* = object - VkBufferMemoryRequirementsInfo2* = object - sType*: VkStructureType - pNext*: pointer - buffer*: VkBuffer - VkBufferMemoryRequirementsInfo2KHR* = object - VkDeviceBufferMemoryRequirements* = object - sType*: VkStructureType - pNext*: pointer - pCreateInfo*: ptr VkBufferCreateInfo - VkDeviceBufferMemoryRequirementsKHR* = object - VkImageMemoryRequirementsInfo2* = object - sType*: VkStructureType - pNext*: pointer - image*: VkImage - VkImageMemoryRequirementsInfo2KHR* = object - VkImageSparseMemoryRequirementsInfo2* = object - sType*: VkStructureType - pNext*: pointer - image*: VkImage - VkImageSparseMemoryRequirementsInfo2KHR* = object - VkDeviceImageMemoryRequirements* = object - sType*: VkStructureType - pNext*: pointer - pCreateInfo*: ptr VkImageCreateInfo - planeAspect*: VkImageAspectFlagBits - VkDeviceImageMemoryRequirementsKHR* = object - VkMemoryRequirements2* = object - sType*: VkStructureType - pNext*: pointer - memoryRequirements*: VkMemoryRequirements - VkMemoryRequirements2KHR* = object - VkSparseImageMemoryRequirements2* = object - sType*: VkStructureType - pNext*: pointer - memoryRequirements*: VkSparseImageMemoryRequirements - VkSparseImageMemoryRequirements2KHR* = object - VkPhysicalDevicePointClippingProperties* = object - sType*: VkStructureType - pNext*: pointer - pointClippingBehavior*: VkPointClippingBehavior - VkPhysicalDevicePointClippingPropertiesKHR* = object - VkMemoryDedicatedRequirements* = object - sType*: VkStructureType - pNext*: pointer - prefersDedicatedAllocation*: VkBool32 - requiresDedicatedAllocation*: VkBool32 - VkMemoryDedicatedRequirementsKHR* = object - VkMemoryDedicatedAllocateInfo* = object - sType*: VkStructureType - pNext*: pointer - image*: VkImage - buffer*: VkBuffer - VkMemoryDedicatedAllocateInfoKHR* = object - VkImageViewUsageCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - usage*: VkImageUsageFlags - VkImageViewSlicedCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - sliceOffset*: uint32 - sliceCount*: uint32 - VkImageViewUsageCreateInfoKHR* = object - VkPipelineTessellationDomainOriginStateCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - domainOrigin*: VkTessellationDomainOrigin - VkPipelineTessellationDomainOriginStateCreateInfoKHR* = object - VkSamplerYcbcrConversionInfo* = object - sType*: VkStructureType - pNext*: pointer - conversion*: VkSamplerYcbcrConversion - VkSamplerYcbcrConversionInfoKHR* = object - VkSamplerYcbcrConversionCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - format*: VkFormat - ycbcrModel*: VkSamplerYcbcrModelConversion - ycbcrRange*: VkSamplerYcbcrRange - components*: VkComponentMapping - xChromaOffset*: VkChromaLocation - yChromaOffset*: VkChromaLocation - chromaFilter*: VkFilter - forceExplicitReconstruction*: VkBool32 - VkSamplerYcbcrConversionCreateInfoKHR* = object - VkBindImagePlaneMemoryInfo* = object - sType*: VkStructureType - pNext*: pointer - planeAspect*: VkImageAspectFlagBits - VkBindImagePlaneMemoryInfoKHR* = object - VkImagePlaneMemoryRequirementsInfo* = object - sType*: VkStructureType - pNext*: pointer - planeAspect*: VkImageAspectFlagBits - VkImagePlaneMemoryRequirementsInfoKHR* = object - VkPhysicalDeviceSamplerYcbcrConversionFeatures* = object - sType*: VkStructureType - pNext*: pointer - samplerYcbcrConversion*: VkBool32 - VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR* = object - VkSamplerYcbcrConversionImageFormatProperties* = object - sType*: VkStructureType - pNext*: pointer - combinedImageSamplerDescriptorCount*: uint32 - VkSamplerYcbcrConversionImageFormatPropertiesKHR* = object - VkTextureLODGatherFormatPropertiesAMD* = object - sType*: VkStructureType - pNext*: pointer - supportsTextureGatherLODBiasAMD*: VkBool32 - VkConditionalRenderingBeginInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - buffer*: VkBuffer - offset*: VkDeviceSize - flags*: VkConditionalRenderingFlagsEXT - VkProtectedSubmitInfo* = object - sType*: VkStructureType - pNext*: pointer - protectedSubmit*: VkBool32 - VkPhysicalDeviceProtectedMemoryFeatures* = object - sType*: VkStructureType - pNext*: pointer - protectedMemory*: VkBool32 - VkPhysicalDeviceProtectedMemoryProperties* = object - sType*: VkStructureType - pNext*: pointer - protectedNoFault*: VkBool32 - VkDeviceQueueInfo2* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDeviceQueueCreateFlags - queueFamilyIndex*: uint32 - queueIndex*: uint32 - VkPipelineCoverageToColorStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineCoverageToColorStateCreateFlagsNV - coverageToColorEnable*: VkBool32 - coverageToColorLocation*: uint32 - VkPhysicalDeviceSamplerFilterMinmaxProperties* = object - sType*: VkStructureType - pNext*: pointer - filterMinmaxSingleComponentFormats*: VkBool32 - filterMinmaxImageComponentMapping*: VkBool32 - VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT* = object - VkSampleLocationEXT* = object - x*: float32 - y*: float32 - VkSampleLocationsInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - sampleLocationsPerPixel*: VkSampleCountFlagBits - sampleLocationGridSize*: VkExtent2D - sampleLocationsCount*: uint32 - pSampleLocations*: ptr VkSampleLocationEXT - VkAttachmentSampleLocationsEXT* = object - attachmentIndex*: uint32 - sampleLocationsInfo*: VkSampleLocationsInfoEXT - VkSubpassSampleLocationsEXT* = object - subpassIndex*: uint32 - sampleLocationsInfo*: VkSampleLocationsInfoEXT - VkRenderPassSampleLocationsBeginInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - attachmentInitialSampleLocationsCount*: uint32 - pAttachmentInitialSampleLocations*: ptr VkAttachmentSampleLocationsEXT - postSubpassSampleLocationsCount*: uint32 - pPostSubpassSampleLocations*: ptr VkSubpassSampleLocationsEXT - VkPipelineSampleLocationsStateCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - sampleLocationsEnable*: VkBool32 - sampleLocationsInfo*: VkSampleLocationsInfoEXT - VkPhysicalDeviceSampleLocationsPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - sampleLocationSampleCounts*: VkSampleCountFlags - maxSampleLocationGridSize*: VkExtent2D - sampleLocationCoordinateRange*: array[2, float32] - sampleLocationSubPixelBits*: uint32 - variableSampleLocations*: VkBool32 - VkMultisamplePropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - maxSampleLocationGridSize*: VkExtent2D - VkSamplerReductionModeCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - reductionMode*: VkSamplerReductionMode - VkSamplerReductionModeCreateInfoEXT* = object - VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - advancedBlendCoherentOperations*: VkBool32 - VkPhysicalDeviceMultiDrawFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - multiDraw*: VkBool32 - VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - advancedBlendMaxColorAttachments*: uint32 - advancedBlendIndependentBlend*: VkBool32 - advancedBlendNonPremultipliedSrcColor*: VkBool32 - advancedBlendNonPremultipliedDstColor*: VkBool32 - advancedBlendCorrelatedOverlap*: VkBool32 - advancedBlendAllOperations*: VkBool32 - VkPipelineColorBlendAdvancedStateCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - srcPremultiplied*: VkBool32 - dstPremultiplied*: VkBool32 - blendOverlap*: VkBlendOverlapEXT - VkPhysicalDeviceInlineUniformBlockFeatures* = object - sType*: VkStructureType - pNext*: pointer - inlineUniformBlock*: VkBool32 - descriptorBindingInlineUniformBlockUpdateAfterBind*: VkBool32 - VkPhysicalDeviceInlineUniformBlockFeaturesEXT* = object - VkPhysicalDeviceInlineUniformBlockProperties* = object - sType*: VkStructureType - pNext*: pointer - maxInlineUniformBlockSize*: uint32 - maxPerStageDescriptorInlineUniformBlocks*: uint32 - maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks*: uint32 - maxDescriptorSetInlineUniformBlocks*: uint32 - maxDescriptorSetUpdateAfterBindInlineUniformBlocks*: uint32 - VkPhysicalDeviceInlineUniformBlockPropertiesEXT* = object - VkWriteDescriptorSetInlineUniformBlock* = object - sType*: VkStructureType - pNext*: pointer - dataSize*: uint32 - pData*: pointer - VkWriteDescriptorSetInlineUniformBlockEXT* = object - VkDescriptorPoolInlineUniformBlockCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - maxInlineUniformBlockBindings*: uint32 - VkDescriptorPoolInlineUniformBlockCreateInfoEXT* = object - VkPipelineCoverageModulationStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineCoverageModulationStateCreateFlagsNV - coverageModulationMode*: VkCoverageModulationModeNV - coverageModulationTableEnable*: VkBool32 - coverageModulationTableCount*: uint32 - pCoverageModulationTable*: ptr float32 - VkImageFormatListCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - viewFormatCount*: uint32 - pViewFormats*: ptr VkFormat - VkImageFormatListCreateInfoKHR* = object - VkValidationCacheCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkValidationCacheCreateFlagsEXT - initialDataSize*: csize_t - pInitialData*: pointer - VkShaderModuleValidationCacheCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - validationCache*: VkValidationCacheEXT - VkPhysicalDeviceMaintenance3Properties* = object - sType*: VkStructureType - pNext*: pointer - maxPerSetDescriptors*: uint32 - maxMemoryAllocationSize*: VkDeviceSize - VkPhysicalDeviceMaintenance3PropertiesKHR* = object - VkPhysicalDeviceMaintenance4Features* = object - sType*: VkStructureType - pNext*: pointer - maintenance4*: VkBool32 - VkPhysicalDeviceMaintenance4FeaturesKHR* = object - VkPhysicalDeviceMaintenance4Properties* = object - sType*: VkStructureType - pNext*: pointer - maxBufferSize*: VkDeviceSize - VkPhysicalDeviceMaintenance4PropertiesKHR* = object - VkDescriptorSetLayoutSupport* = object - sType*: VkStructureType - pNext*: pointer - supported*: VkBool32 - VkDescriptorSetLayoutSupportKHR* = object - VkPhysicalDeviceShaderDrawParametersFeatures* = object - sType*: VkStructureType - pNext*: pointer - shaderDrawParameters*: VkBool32 - VkPhysicalDeviceShaderDrawParameterFeatures* = object - VkPhysicalDeviceShaderFloat16Int8Features* = object - sType*: VkStructureType - pNext*: pointer - shaderFloat16*: VkBool32 - shaderInt8*: VkBool32 - VkPhysicalDeviceShaderFloat16Int8FeaturesKHR* = object - VkPhysicalDeviceFloat16Int8FeaturesKHR* = object - VkPhysicalDeviceFloatControlsProperties* = object - sType*: VkStructureType - pNext*: pointer - denormBehaviorIndependence*: VkShaderFloatControlsIndependence - roundingModeIndependence*: VkShaderFloatControlsIndependence - shaderSignedZeroInfNanPreserveFloat16*: VkBool32 - shaderSignedZeroInfNanPreserveFloat32*: VkBool32 - shaderSignedZeroInfNanPreserveFloat64*: VkBool32 - shaderDenormPreserveFloat16*: VkBool32 - shaderDenormPreserveFloat32*: VkBool32 - shaderDenormPreserveFloat64*: VkBool32 - shaderDenormFlushToZeroFloat16*: VkBool32 - shaderDenormFlushToZeroFloat32*: VkBool32 - shaderDenormFlushToZeroFloat64*: VkBool32 - shaderRoundingModeRTEFloat16*: VkBool32 - shaderRoundingModeRTEFloat32*: VkBool32 - shaderRoundingModeRTEFloat64*: VkBool32 - shaderRoundingModeRTZFloat16*: VkBool32 - shaderRoundingModeRTZFloat32*: VkBool32 - shaderRoundingModeRTZFloat64*: VkBool32 - VkPhysicalDeviceFloatControlsPropertiesKHR* = object - VkPhysicalDeviceHostQueryResetFeatures* = object - sType*: VkStructureType - pNext*: pointer - hostQueryReset*: VkBool32 - VkPhysicalDeviceHostQueryResetFeaturesEXT* = object - VkShaderResourceUsageAMD* = object - numUsedVgprs*: uint32 - numUsedSgprs*: uint32 - ldsSizePerLocalWorkGroup*: uint32 - ldsUsageSizeInBytes*: csize_t - scratchMemUsageInBytes*: csize_t - VkShaderStatisticsInfoAMD* = object - shaderStageMask*: VkShaderStageFlags - resourceUsage*: VkShaderResourceUsageAMD - numPhysicalVgprs*: uint32 - numPhysicalSgprs*: uint32 - numAvailableVgprs*: uint32 - numAvailableSgprs*: uint32 - computeWorkGroupSize*: array[3, uint32] - VkDeviceQueueGlobalPriorityCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - globalPriority*: VkQueueGlobalPriorityKHR - VkDeviceQueueGlobalPriorityCreateInfoEXT* = object - VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - globalPriorityQuery*: VkBool32 - VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* = object - VkQueueFamilyGlobalPriorityPropertiesKHR* = object - sType*: VkStructureType - pNext*: pointer - priorityCount*: uint32 - priorities*: array[VK_MAX_GLOBAL_PRIORITY_SIZE_KHR, VkQueueGlobalPriorityKHR] - VkQueueFamilyGlobalPriorityPropertiesEXT* = object - VkDebugUtilsObjectNameInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - objectType*: VkObjectType - objectHandle*: uint64 - pObjectName*: cstring - VkDebugUtilsObjectTagInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - objectType*: VkObjectType - objectHandle*: uint64 - tagName*: uint64 - tagSize*: csize_t - pTag*: pointer - VkDebugUtilsLabelEXT* = object - sType*: VkStructureType - pNext*: pointer - pLabelName*: cstring - color*: array[4, float32] - VkDebugUtilsMessengerCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDebugUtilsMessengerCreateFlagsEXT - messageSeverity*: VkDebugUtilsMessageSeverityFlagsEXT - messageType*: VkDebugUtilsMessageTypeFlagsEXT - pfnUserCallback*: PFN_vkDebugUtilsMessengerCallbackEXT - pUserData*: pointer - VkDebugUtilsMessengerCallbackDataEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDebugUtilsMessengerCallbackDataFlagsEXT - pMessageIdName*: cstring - messageIdNumber*: int32 - pMessage*: cstring - queueLabelCount*: uint32 - pQueueLabels*: ptr VkDebugUtilsLabelEXT - cmdBufLabelCount*: uint32 - pCmdBufLabels*: ptr VkDebugUtilsLabelEXT - objectCount*: uint32 - pObjects*: ptr VkDebugUtilsObjectNameInfoEXT - VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - deviceMemoryReport*: VkBool32 - VkDeviceDeviceMemoryReportCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDeviceMemoryReportFlagsEXT - pfnUserCallback*: PFN_vkDeviceMemoryReportCallbackEXT - pUserData*: pointer - VkDeviceMemoryReportCallbackDataEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDeviceMemoryReportFlagsEXT - thetype*: VkDeviceMemoryReportEventTypeEXT - memoryObjectId*: uint64 - size*: VkDeviceSize - objectType*: VkObjectType - objectHandle*: uint64 - heapIndex*: uint32 - VkImportMemoryHostPointerInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - handleType*: VkExternalMemoryHandleTypeFlagBits - pHostPointer*: pointer - VkMemoryHostPointerPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - memoryTypeBits*: uint32 - VkPhysicalDeviceExternalMemoryHostPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - minImportedHostPointerAlignment*: VkDeviceSize - VkPhysicalDeviceConservativeRasterizationPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - primitiveOverestimationSize*: float32 - maxExtraPrimitiveOverestimationSize*: float32 - extraPrimitiveOverestimationSizeGranularity*: float32 - primitiveUnderestimation*: VkBool32 - conservativePointAndLineRasterization*: VkBool32 - degenerateTrianglesRasterized*: VkBool32 - degenerateLinesRasterized*: VkBool32 - fullyCoveredFragmentShaderInputVariable*: VkBool32 - conservativeRasterizationPostDepthCoverage*: VkBool32 - VkCalibratedTimestampInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - timeDomain*: VkTimeDomainEXT - VkPhysicalDeviceShaderCorePropertiesAMD* = object - sType*: VkStructureType - pNext*: pointer - shaderEngineCount*: uint32 - shaderArraysPerEngineCount*: uint32 - computeUnitsPerShaderArray*: uint32 - simdPerComputeUnit*: uint32 - wavefrontsPerSimd*: uint32 - wavefrontSize*: uint32 - sgprsPerSimd*: uint32 - minSgprAllocation*: uint32 - maxSgprAllocation*: uint32 - sgprAllocationGranularity*: uint32 - vgprsPerSimd*: uint32 - minVgprAllocation*: uint32 - maxVgprAllocation*: uint32 - vgprAllocationGranularity*: uint32 - VkPhysicalDeviceShaderCoreProperties2AMD* = object - sType*: VkStructureType - pNext*: pointer - shaderCoreFeatures*: VkShaderCorePropertiesFlagsAMD - activeComputeUnitCount*: uint32 - VkPipelineRasterizationConservativeStateCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineRasterizationConservativeStateCreateFlagsEXT - conservativeRasterizationMode*: VkConservativeRasterizationModeEXT - extraPrimitiveOverestimationSize*: float32 - VkPhysicalDeviceDescriptorIndexingFeatures* = object - sType*: VkStructureType - pNext*: pointer - shaderInputAttachmentArrayDynamicIndexing*: VkBool32 - shaderUniformTexelBufferArrayDynamicIndexing*: VkBool32 - shaderStorageTexelBufferArrayDynamicIndexing*: VkBool32 - shaderUniformBufferArrayNonUniformIndexing*: VkBool32 - shaderSampledImageArrayNonUniformIndexing*: VkBool32 - shaderStorageBufferArrayNonUniformIndexing*: VkBool32 - shaderStorageImageArrayNonUniformIndexing*: VkBool32 - shaderInputAttachmentArrayNonUniformIndexing*: VkBool32 - shaderUniformTexelBufferArrayNonUniformIndexing*: VkBool32 - shaderStorageTexelBufferArrayNonUniformIndexing*: VkBool32 - descriptorBindingUniformBufferUpdateAfterBind*: VkBool32 - descriptorBindingSampledImageUpdateAfterBind*: VkBool32 - descriptorBindingStorageImageUpdateAfterBind*: VkBool32 - descriptorBindingStorageBufferUpdateAfterBind*: VkBool32 - descriptorBindingUniformTexelBufferUpdateAfterBind*: VkBool32 - descriptorBindingStorageTexelBufferUpdateAfterBind*: VkBool32 - descriptorBindingUpdateUnusedWhilePending*: VkBool32 - descriptorBindingPartiallyBound*: VkBool32 - descriptorBindingVariableDescriptorCount*: VkBool32 - runtimeDescriptorArray*: VkBool32 - VkPhysicalDeviceDescriptorIndexingFeaturesEXT* = object - VkPhysicalDeviceDescriptorIndexingProperties* = object - sType*: VkStructureType - pNext*: pointer - maxUpdateAfterBindDescriptorsInAllPools*: uint32 - shaderUniformBufferArrayNonUniformIndexingNative*: VkBool32 - shaderSampledImageArrayNonUniformIndexingNative*: VkBool32 - shaderStorageBufferArrayNonUniformIndexingNative*: VkBool32 - shaderStorageImageArrayNonUniformIndexingNative*: VkBool32 - shaderInputAttachmentArrayNonUniformIndexingNative*: VkBool32 - robustBufferAccessUpdateAfterBind*: VkBool32 - quadDivergentImplicitLod*: VkBool32 - maxPerStageDescriptorUpdateAfterBindSamplers*: uint32 - maxPerStageDescriptorUpdateAfterBindUniformBuffers*: uint32 - maxPerStageDescriptorUpdateAfterBindStorageBuffers*: uint32 - maxPerStageDescriptorUpdateAfterBindSampledImages*: uint32 - maxPerStageDescriptorUpdateAfterBindStorageImages*: uint32 - maxPerStageDescriptorUpdateAfterBindInputAttachments*: uint32 - maxPerStageUpdateAfterBindResources*: uint32 - maxDescriptorSetUpdateAfterBindSamplers*: uint32 - maxDescriptorSetUpdateAfterBindUniformBuffers*: uint32 - maxDescriptorSetUpdateAfterBindUniformBuffersDynamic*: uint32 - maxDescriptorSetUpdateAfterBindStorageBuffers*: uint32 - maxDescriptorSetUpdateAfterBindStorageBuffersDynamic*: uint32 - maxDescriptorSetUpdateAfterBindSampledImages*: uint32 - maxDescriptorSetUpdateAfterBindStorageImages*: uint32 - maxDescriptorSetUpdateAfterBindInputAttachments*: uint32 - VkPhysicalDeviceDescriptorIndexingPropertiesEXT* = object - VkDescriptorSetLayoutBindingFlagsCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - bindingCount*: uint32 - pBindingFlags*: ptr VkDescriptorBindingFlags - VkDescriptorSetLayoutBindingFlagsCreateInfoEXT* = object - VkDescriptorSetVariableDescriptorCountAllocateInfo* = object - sType*: VkStructureType - pNext*: pointer - descriptorSetCount*: uint32 - pDescriptorCounts*: ptr uint32 - VkDescriptorSetVariableDescriptorCountAllocateInfoEXT* = object - VkDescriptorSetVariableDescriptorCountLayoutSupport* = object - sType*: VkStructureType - pNext*: pointer - maxVariableDescriptorCount*: uint32 - VkDescriptorSetVariableDescriptorCountLayoutSupportEXT* = object - VkAttachmentDescription2* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkAttachmentDescriptionFlags - format*: VkFormat - samples*: VkSampleCountFlagBits - loadOp*: VkAttachmentLoadOp - storeOp*: VkAttachmentStoreOp - stencilLoadOp*: VkAttachmentLoadOp - stencilStoreOp*: VkAttachmentStoreOp - initialLayout*: VkImageLayout - finalLayout*: VkImageLayout - VkAttachmentDescription2KHR* = object - VkAttachmentReference2* = object - sType*: VkStructureType - pNext*: pointer - attachment*: uint32 - layout*: VkImageLayout - aspectMask*: VkImageAspectFlags - VkAttachmentReference2KHR* = object - VkSubpassDescription2* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkSubpassDescriptionFlags - pipelineBindPoint*: VkPipelineBindPoint - viewMask*: uint32 - inputAttachmentCount*: uint32 - pInputAttachments*: ptr VkAttachmentReference2 - colorAttachmentCount*: uint32 - pColorAttachments*: ptr VkAttachmentReference2 - pResolveAttachments*: ptr VkAttachmentReference2 - pDepthStencilAttachment*: ptr VkAttachmentReference2 - preserveAttachmentCount*: uint32 - pPreserveAttachments*: ptr uint32 - VkSubpassDescription2KHR* = object - VkSubpassDependency2* = object - sType*: VkStructureType - pNext*: pointer - srcSubpass*: uint32 - dstSubpass*: uint32 - srcStageMask*: VkPipelineStageFlags - dstStageMask*: VkPipelineStageFlags - srcAccessMask*: VkAccessFlags - dstAccessMask*: VkAccessFlags - dependencyFlags*: VkDependencyFlags - viewOffset*: int32 - VkSubpassDependency2KHR* = object - VkRenderPassCreateInfo2* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkRenderPassCreateFlags - attachmentCount*: uint32 - pAttachments*: ptr VkAttachmentDescription2 - subpassCount*: uint32 - pSubpasses*: ptr VkSubpassDescription2 - dependencyCount*: uint32 - pDependencies*: ptr VkSubpassDependency2 - correlatedViewMaskCount*: uint32 - pCorrelatedViewMasks*: ptr uint32 - VkRenderPassCreateInfo2KHR* = object - VkSubpassBeginInfo* = object - sType*: VkStructureType - pNext*: pointer - contents*: VkSubpassContents - VkSubpassBeginInfoKHR* = object - VkSubpassEndInfo* = object - sType*: VkStructureType - pNext*: pointer - VkSubpassEndInfoKHR* = object - VkPhysicalDeviceTimelineSemaphoreFeatures* = object - sType*: VkStructureType - pNext*: pointer - timelineSemaphore*: VkBool32 - VkPhysicalDeviceTimelineSemaphoreFeaturesKHR* = object - VkPhysicalDeviceTimelineSemaphoreProperties* = object - sType*: VkStructureType - pNext*: pointer - maxTimelineSemaphoreValueDifference*: uint64 - VkPhysicalDeviceTimelineSemaphorePropertiesKHR* = object - VkSemaphoreTypeCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - semaphoreType*: VkSemaphoreType - initialValue*: uint64 - VkSemaphoreTypeCreateInfoKHR* = object - VkTimelineSemaphoreSubmitInfo* = object - sType*: VkStructureType - pNext*: pointer - waitSemaphoreValueCount*: uint32 - pWaitSemaphoreValues*: ptr uint64 - signalSemaphoreValueCount*: uint32 - pSignalSemaphoreValues*: ptr uint64 - VkTimelineSemaphoreSubmitInfoKHR* = object - VkSemaphoreWaitInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkSemaphoreWaitFlags - semaphoreCount*: uint32 - pSemaphores*: ptr VkSemaphore - pValues*: ptr uint64 - VkSemaphoreWaitInfoKHR* = object - VkSemaphoreSignalInfo* = object - sType*: VkStructureType - pNext*: pointer - semaphore*: VkSemaphore - value*: uint64 - VkSemaphoreSignalInfoKHR* = object - VkVertexInputBindingDivisorDescriptionEXT* = object - binding*: uint32 - divisor*: uint32 - VkPipelineVertexInputDivisorStateCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - vertexBindingDivisorCount*: uint32 - pVertexBindingDivisors*: ptr VkVertexInputBindingDivisorDescriptionEXT - VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - maxVertexAttribDivisor*: uint32 - VkPhysicalDevicePCIBusInfoPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - pciDomain*: uint32 - pciBus*: uint32 - pciDevice*: uint32 - pciFunction*: uint32 - VkCommandBufferInheritanceConditionalRenderingInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - conditionalRenderingEnable*: VkBool32 - VkPhysicalDevice8BitStorageFeatures* = object - sType*: VkStructureType - pNext*: pointer - storageBuffer8BitAccess*: VkBool32 - uniformAndStorageBuffer8BitAccess*: VkBool32 - storagePushConstant8*: VkBool32 - VkPhysicalDevice8BitStorageFeaturesKHR* = object - VkPhysicalDeviceConditionalRenderingFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - conditionalRendering*: VkBool32 - inheritedConditionalRendering*: VkBool32 - VkPhysicalDeviceVulkanMemoryModelFeatures* = object - sType*: VkStructureType - pNext*: pointer - vulkanMemoryModel*: VkBool32 - vulkanMemoryModelDeviceScope*: VkBool32 - vulkanMemoryModelAvailabilityVisibilityChains*: VkBool32 - VkPhysicalDeviceVulkanMemoryModelFeaturesKHR* = object - VkPhysicalDeviceShaderAtomicInt64Features* = object - sType*: VkStructureType - pNext*: pointer - shaderBufferInt64Atomics*: VkBool32 - shaderSharedInt64Atomics*: VkBool32 - VkPhysicalDeviceShaderAtomicInt64FeaturesKHR* = object - VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - shaderBufferFloat32Atomics*: VkBool32 - shaderBufferFloat32AtomicAdd*: VkBool32 - shaderBufferFloat64Atomics*: VkBool32 - shaderBufferFloat64AtomicAdd*: VkBool32 - shaderSharedFloat32Atomics*: VkBool32 - shaderSharedFloat32AtomicAdd*: VkBool32 - shaderSharedFloat64Atomics*: VkBool32 - shaderSharedFloat64AtomicAdd*: VkBool32 - shaderImageFloat32Atomics*: VkBool32 - shaderImageFloat32AtomicAdd*: VkBool32 - sparseImageFloat32Atomics*: VkBool32 - sparseImageFloat32AtomicAdd*: VkBool32 - VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - shaderBufferFloat16Atomics*: VkBool32 - shaderBufferFloat16AtomicAdd*: VkBool32 - shaderBufferFloat16AtomicMinMax*: VkBool32 - shaderBufferFloat32AtomicMinMax*: VkBool32 - shaderBufferFloat64AtomicMinMax*: VkBool32 - shaderSharedFloat16Atomics*: VkBool32 - shaderSharedFloat16AtomicAdd*: VkBool32 - shaderSharedFloat16AtomicMinMax*: VkBool32 - shaderSharedFloat32AtomicMinMax*: VkBool32 - shaderSharedFloat64AtomicMinMax*: VkBool32 - shaderImageFloat32AtomicMinMax*: VkBool32 - sparseImageFloat32AtomicMinMax*: VkBool32 - VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - vertexAttributeInstanceRateDivisor*: VkBool32 - vertexAttributeInstanceRateZeroDivisor*: VkBool32 - VkQueueFamilyCheckpointPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - checkpointExecutionStageMask*: VkPipelineStageFlags - VkCheckpointDataNV* = object - sType*: VkStructureType - pNext*: pointer - stage*: VkPipelineStageFlagBits - pCheckpointMarker*: pointer - VkPhysicalDeviceDepthStencilResolveProperties* = object - sType*: VkStructureType - pNext*: pointer - supportedDepthResolveModes*: VkResolveModeFlags - supportedStencilResolveModes*: VkResolveModeFlags - independentResolveNone*: VkBool32 - independentResolve*: VkBool32 - VkPhysicalDeviceDepthStencilResolvePropertiesKHR* = object - VkSubpassDescriptionDepthStencilResolve* = object - sType*: VkStructureType - pNext*: pointer - depthResolveMode*: VkResolveModeFlagBits - stencilResolveMode*: VkResolveModeFlagBits - pDepthStencilResolveAttachment*: ptr VkAttachmentReference2 - VkSubpassDescriptionDepthStencilResolveKHR* = object - VkImageViewASTCDecodeModeEXT* = object - sType*: VkStructureType - pNext*: pointer - decodeMode*: VkFormat - VkPhysicalDeviceASTCDecodeFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - decodeModeSharedExponent*: VkBool32 - VkPhysicalDeviceTransformFeedbackFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - transformFeedback*: VkBool32 - geometryStreams*: VkBool32 - VkPhysicalDeviceTransformFeedbackPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - maxTransformFeedbackStreams*: uint32 - maxTransformFeedbackBuffers*: uint32 - maxTransformFeedbackBufferSize*: VkDeviceSize - maxTransformFeedbackStreamDataSize*: uint32 - maxTransformFeedbackBufferDataSize*: uint32 - maxTransformFeedbackBufferDataStride*: uint32 - transformFeedbackQueries*: VkBool32 - transformFeedbackStreamsLinesTriangles*: VkBool32 - transformFeedbackRasterizationStreamSelect*: VkBool32 - transformFeedbackDraw*: VkBool32 - VkPipelineRasterizationStateStreamCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineRasterizationStateStreamCreateFlagsEXT - rasterizationStream*: uint32 - VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - representativeFragmentTest*: VkBool32 - VkPipelineRepresentativeFragmentTestStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - representativeFragmentTestEnable*: VkBool32 - VkPhysicalDeviceExclusiveScissorFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - exclusiveScissor*: VkBool32 - VkPipelineViewportExclusiveScissorStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - exclusiveScissorCount*: uint32 - pExclusiveScissors*: ptr VkRect2D - VkPhysicalDeviceCornerSampledImageFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - cornerSampledImage*: VkBool32 - VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - computeDerivativeGroupQuads*: VkBool32 - computeDerivativeGroupLinear*: VkBool32 - VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* = object - VkPhysicalDeviceShaderImageFootprintFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - imageFootprint*: VkBool32 - VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - dedicatedAllocationImageAliasing*: VkBool32 - VkPhysicalDeviceCopyMemoryIndirectFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - indirectCopy*: VkBool32 - VkPhysicalDeviceCopyMemoryIndirectPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - supportedQueues*: VkQueueFlags - VkPhysicalDeviceMemoryDecompressionFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - memoryDecompression*: VkBool32 - VkPhysicalDeviceMemoryDecompressionPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - decompressionMethods*: VkMemoryDecompressionMethodFlagsNV - maxDecompressionIndirectCount*: uint64 - VkShadingRatePaletteNV* = object - shadingRatePaletteEntryCount*: uint32 - pShadingRatePaletteEntries*: ptr VkShadingRatePaletteEntryNV - VkPipelineViewportShadingRateImageStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - shadingRateImageEnable*: VkBool32 - viewportCount*: uint32 - pShadingRatePalettes*: ptr VkShadingRatePaletteNV - VkPhysicalDeviceShadingRateImageFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - shadingRateImage*: VkBool32 - shadingRateCoarseSampleOrder*: VkBool32 - VkPhysicalDeviceShadingRateImagePropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - shadingRateTexelSize*: VkExtent2D - shadingRatePaletteSize*: uint32 - shadingRateMaxCoarseSamples*: uint32 - VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* = object - sType*: VkStructureType - pNext*: pointer - invocationMask*: VkBool32 - VkCoarseSampleLocationNV* = object - pixelX*: uint32 - pixelY*: uint32 - sample*: uint32 - VkCoarseSampleOrderCustomNV* = object - shadingRate*: VkShadingRatePaletteEntryNV - sampleCount*: uint32 - sampleLocationCount*: uint32 - pSampleLocations*: ptr VkCoarseSampleLocationNV - VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - sampleOrderType*: VkCoarseSampleOrderTypeNV - customSampleOrderCount*: uint32 - pCustomSampleOrders*: ptr VkCoarseSampleOrderCustomNV - VkPhysicalDeviceMeshShaderFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - taskShader*: VkBool32 - meshShader*: VkBool32 - VkPhysicalDeviceMeshShaderPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - maxDrawMeshTasksCount*: uint32 - maxTaskWorkGroupInvocations*: uint32 - maxTaskWorkGroupSize*: array[3, uint32] - maxTaskTotalMemorySize*: uint32 - maxTaskOutputCount*: uint32 - maxMeshWorkGroupInvocations*: uint32 - maxMeshWorkGroupSize*: array[3, uint32] - maxMeshTotalMemorySize*: uint32 - maxMeshOutputVertices*: uint32 - maxMeshOutputPrimitives*: uint32 - maxMeshMultiviewViewCount*: uint32 - meshOutputPerVertexGranularity*: uint32 - meshOutputPerPrimitiveGranularity*: uint32 - VkDrawMeshTasksIndirectCommandNV* = object - taskCount*: uint32 - firstTask*: uint32 - VkPhysicalDeviceMeshShaderFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - taskShader*: VkBool32 - meshShader*: VkBool32 - multiviewMeshShader*: VkBool32 - primitiveFragmentShadingRateMeshShader*: VkBool32 - meshShaderQueries*: VkBool32 - VkPhysicalDeviceMeshShaderPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - maxTaskWorkGroupTotalCount*: uint32 - maxTaskWorkGroupCount*: array[3, uint32] - maxTaskWorkGroupInvocations*: uint32 - maxTaskWorkGroupSize*: array[3, uint32] - maxTaskPayloadSize*: uint32 - maxTaskSharedMemorySize*: uint32 - maxTaskPayloadAndSharedMemorySize*: uint32 - maxMeshWorkGroupTotalCount*: uint32 - maxMeshWorkGroupCount*: array[3, uint32] - maxMeshWorkGroupInvocations*: uint32 - maxMeshWorkGroupSize*: array[3, uint32] - maxMeshSharedMemorySize*: uint32 - maxMeshPayloadAndSharedMemorySize*: uint32 - maxMeshOutputMemorySize*: uint32 - maxMeshPayloadAndOutputMemorySize*: uint32 - maxMeshOutputComponents*: uint32 - maxMeshOutputVertices*: uint32 - maxMeshOutputPrimitives*: uint32 - maxMeshOutputLayers*: uint32 - maxMeshMultiviewViewCount*: uint32 - meshOutputPerVertexGranularity*: uint32 - meshOutputPerPrimitiveGranularity*: uint32 - maxPreferredTaskWorkGroupInvocations*: uint32 - maxPreferredMeshWorkGroupInvocations*: uint32 - prefersLocalInvocationVertexOutput*: VkBool32 - prefersLocalInvocationPrimitiveOutput*: VkBool32 - prefersCompactVertexOutput*: VkBool32 - prefersCompactPrimitiveOutput*: VkBool32 - VkDrawMeshTasksIndirectCommandEXT* = object - groupCountX*: uint32 - groupCountY*: uint32 - groupCountZ*: uint32 - VkRayTracingShaderGroupCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - thetype*: VkRayTracingShaderGroupTypeKHR - generalShader*: uint32 - closestHitShader*: uint32 - anyHitShader*: uint32 - intersectionShader*: uint32 - VkRayTracingShaderGroupCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - thetype*: VkRayTracingShaderGroupTypeKHR - generalShader*: uint32 - closestHitShader*: uint32 - anyHitShader*: uint32 - intersectionShader*: uint32 - pShaderGroupCaptureReplayHandle*: pointer - VkRayTracingPipelineCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineCreateFlags - stageCount*: uint32 - pStages*: ptr VkPipelineShaderStageCreateInfo - groupCount*: uint32 - pGroups*: ptr VkRayTracingShaderGroupCreateInfoNV - maxRecursionDepth*: uint32 - layout*: VkPipelineLayout - basePipelineHandle*: VkPipeline - basePipelineIndex*: int32 - VkRayTracingPipelineCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineCreateFlags - stageCount*: uint32 - pStages*: ptr VkPipelineShaderStageCreateInfo - groupCount*: uint32 - pGroups*: ptr VkRayTracingShaderGroupCreateInfoKHR - maxPipelineRayRecursionDepth*: uint32 - pLibraryInfo*: ptr VkPipelineLibraryCreateInfoKHR - pLibraryInterface*: ptr VkRayTracingPipelineInterfaceCreateInfoKHR - pDynamicState*: ptr VkPipelineDynamicStateCreateInfo - layout*: VkPipelineLayout - basePipelineHandle*: VkPipeline - basePipelineIndex*: int32 - VkGeometryTrianglesNV* = object - sType*: VkStructureType - pNext*: pointer - vertexData*: VkBuffer - vertexOffset*: VkDeviceSize - vertexCount*: uint32 - vertexStride*: VkDeviceSize - vertexFormat*: VkFormat - indexData*: VkBuffer - indexOffset*: VkDeviceSize - indexCount*: uint32 - indexType*: VkIndexType - transformData*: VkBuffer - transformOffset*: VkDeviceSize - VkGeometryAABBNV* = object - sType*: VkStructureType - pNext*: pointer - aabbData*: VkBuffer - numAABBs*: uint32 - stride*: uint32 - offset*: VkDeviceSize - VkGeometryDataNV* = object - triangles*: VkGeometryTrianglesNV - aabbs*: VkGeometryAABBNV - VkGeometryNV* = object - sType*: VkStructureType - pNext*: pointer - geometryType*: VkGeometryTypeKHR - geometry*: VkGeometryDataNV - flags*: VkGeometryFlagsKHR - VkAccelerationStructureInfoNV* = object - sType*: VkStructureType - pNext*: pointer - thetype*: VkAccelerationStructureTypeNV - flags*: VkBuildAccelerationStructureFlagsNV - instanceCount*: uint32 - geometryCount*: uint32 - pGeometries*: ptr VkGeometryNV - VkAccelerationStructureCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - compactedSize*: VkDeviceSize - info*: VkAccelerationStructureInfoNV - VkBindAccelerationStructureMemoryInfoNV* = object - sType*: VkStructureType - pNext*: pointer - accelerationStructure*: VkAccelerationStructureNV - memory*: VkDeviceMemory - memoryOffset*: VkDeviceSize - deviceIndexCount*: uint32 - pDeviceIndices*: ptr uint32 - VkWriteDescriptorSetAccelerationStructureKHR* = object - sType*: VkStructureType - pNext*: pointer - accelerationStructureCount*: uint32 - pAccelerationStructures*: ptr VkAccelerationStructureKHR - VkWriteDescriptorSetAccelerationStructureNV* = object - sType*: VkStructureType - pNext*: pointer - accelerationStructureCount*: uint32 - pAccelerationStructures*: ptr VkAccelerationStructureNV - VkAccelerationStructureMemoryRequirementsInfoNV* = object - sType*: VkStructureType - pNext*: pointer - thetype*: VkAccelerationStructureMemoryRequirementsTypeNV - accelerationStructure*: VkAccelerationStructureNV - VkPhysicalDeviceAccelerationStructureFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - accelerationStructure*: VkBool32 - accelerationStructureCaptureReplay*: VkBool32 - accelerationStructureIndirectBuild*: VkBool32 - accelerationStructureHostCommands*: VkBool32 - descriptorBindingAccelerationStructureUpdateAfterBind*: VkBool32 - VkPhysicalDeviceRayTracingPipelineFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - rayTracingPipeline*: VkBool32 - rayTracingPipelineShaderGroupHandleCaptureReplay*: VkBool32 - rayTracingPipelineShaderGroupHandleCaptureReplayMixed*: VkBool32 - rayTracingPipelineTraceRaysIndirect*: VkBool32 - rayTraversalPrimitiveCulling*: VkBool32 - VkPhysicalDeviceRayQueryFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - rayQuery*: VkBool32 - VkPhysicalDeviceAccelerationStructurePropertiesKHR* = object - sType*: VkStructureType - pNext*: pointer - maxGeometryCount*: uint64 - maxInstanceCount*: uint64 - maxPrimitiveCount*: uint64 - maxPerStageDescriptorAccelerationStructures*: uint32 - maxPerStageDescriptorUpdateAfterBindAccelerationStructures*: uint32 - maxDescriptorSetAccelerationStructures*: uint32 - maxDescriptorSetUpdateAfterBindAccelerationStructures*: uint32 - minAccelerationStructureScratchOffsetAlignment*: uint32 - VkPhysicalDeviceRayTracingPipelinePropertiesKHR* = object - sType*: VkStructureType - pNext*: pointer - shaderGroupHandleSize*: uint32 - maxRayRecursionDepth*: uint32 - maxShaderGroupStride*: uint32 - shaderGroupBaseAlignment*: uint32 - shaderGroupHandleCaptureReplaySize*: uint32 - maxRayDispatchInvocationCount*: uint32 - shaderGroupHandleAlignment*: uint32 - maxRayHitAttributeSize*: uint32 - VkPhysicalDeviceRayTracingPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - shaderGroupHandleSize*: uint32 - maxRecursionDepth*: uint32 - maxShaderGroupStride*: uint32 - shaderGroupBaseAlignment*: uint32 - maxGeometryCount*: uint64 - maxInstanceCount*: uint64 - maxTriangleCount*: uint64 - maxDescriptorSetAccelerationStructures*: uint32 - VkStridedDeviceAddressRegionKHR* = object - deviceAddress*: VkDeviceAddress - stride*: VkDeviceSize - size*: VkDeviceSize - VkTraceRaysIndirectCommandKHR* = object - width*: uint32 - height*: uint32 - depth*: uint32 - VkTraceRaysIndirectCommand2KHR* = object - raygenShaderRecordAddress*: VkDeviceAddress - raygenShaderRecordSize*: VkDeviceSize - missShaderBindingTableAddress*: VkDeviceAddress - missShaderBindingTableSize*: VkDeviceSize - missShaderBindingTableStride*: VkDeviceSize - hitShaderBindingTableAddress*: VkDeviceAddress - hitShaderBindingTableSize*: VkDeviceSize - hitShaderBindingTableStride*: VkDeviceSize - callableShaderBindingTableAddress*: VkDeviceAddress - callableShaderBindingTableSize*: VkDeviceSize - callableShaderBindingTableStride*: VkDeviceSize - width*: uint32 - height*: uint32 - depth*: uint32 - VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - rayTracingMaintenance1*: VkBool32 - rayTracingPipelineTraceRaysIndirect2*: VkBool32 - VkDrmFormatModifierPropertiesListEXT* = object - sType*: VkStructureType - pNext*: pointer - drmFormatModifierCount*: uint32 - pDrmFormatModifierProperties*: ptr VkDrmFormatModifierPropertiesEXT - VkDrmFormatModifierPropertiesEXT* = object - drmFormatModifier*: uint64 - drmFormatModifierPlaneCount*: uint32 - drmFormatModifierTilingFeatures*: VkFormatFeatureFlags - VkPhysicalDeviceImageDrmFormatModifierInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - drmFormatModifier*: uint64 - sharingMode*: VkSharingMode - queueFamilyIndexCount*: uint32 - pQueueFamilyIndices*: ptr uint32 - VkImageDrmFormatModifierListCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - drmFormatModifierCount*: uint32 - pDrmFormatModifiers*: ptr uint64 - VkImageDrmFormatModifierExplicitCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - drmFormatModifier*: uint64 - drmFormatModifierPlaneCount*: uint32 - pPlaneLayouts*: ptr VkSubresourceLayout - VkImageDrmFormatModifierPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - drmFormatModifier*: uint64 - VkImageStencilUsageCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - stencilUsage*: VkImageUsageFlags - VkImageStencilUsageCreateInfoEXT* = object - VkDeviceMemoryOverallocationCreateInfoAMD* = object - sType*: VkStructureType - pNext*: pointer - overallocationBehavior*: VkMemoryOverallocationBehaviorAMD - VkPhysicalDeviceFragmentDensityMapFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - fragmentDensityMap*: VkBool32 - fragmentDensityMapDynamic*: VkBool32 - fragmentDensityMapNonSubsampledImages*: VkBool32 - VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - fragmentDensityMapDeferred*: VkBool32 - VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM* = object - sType*: VkStructureType - pNext*: pointer - fragmentDensityMapOffset*: VkBool32 - VkPhysicalDeviceFragmentDensityMapPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - minFragmentDensityTexelSize*: VkExtent2D - maxFragmentDensityTexelSize*: VkExtent2D - fragmentDensityInvocations*: VkBool32 - VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - subsampledLoads*: VkBool32 - subsampledCoarseReconstructionEarlyAccess*: VkBool32 - maxSubsampledArrayLayers*: uint32 - maxDescriptorSetSubsampledSamplers*: uint32 - VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM* = object - sType*: VkStructureType - pNext*: pointer - fragmentDensityOffsetGranularity*: VkExtent2D - VkRenderPassFragmentDensityMapCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - fragmentDensityMapAttachment*: VkAttachmentReference - VkSubpassFragmentDensityMapOffsetEndInfoQCOM* = object - sType*: VkStructureType - pNext*: pointer - fragmentDensityOffsetCount*: uint32 - pFragmentDensityOffsets*: ptr VkOffset2D - VkPhysicalDeviceScalarBlockLayoutFeatures* = object - sType*: VkStructureType - pNext*: pointer - scalarBlockLayout*: VkBool32 - VkPhysicalDeviceScalarBlockLayoutFeaturesEXT* = object - VkSurfaceProtectedCapabilitiesKHR* = object - sType*: VkStructureType - pNext*: pointer - supportsProtected*: VkBool32 - VkPhysicalDeviceUniformBufferStandardLayoutFeatures* = object - sType*: VkStructureType - pNext*: pointer - uniformBufferStandardLayout*: VkBool32 - VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR* = object - VkPhysicalDeviceDepthClipEnableFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - depthClipEnable*: VkBool32 - VkPipelineRasterizationDepthClipStateCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineRasterizationDepthClipStateCreateFlagsEXT - depthClipEnable*: VkBool32 - VkPhysicalDeviceMemoryBudgetPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - heapBudget*: array[VK_MAX_MEMORY_HEAPS, VkDeviceSize] - heapUsage*: array[VK_MAX_MEMORY_HEAPS, VkDeviceSize] - VkPhysicalDeviceMemoryPriorityFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - memoryPriority*: VkBool32 - VkMemoryPriorityAllocateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - priority*: float32 - VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - pageableDeviceLocalMemory*: VkBool32 - VkPhysicalDeviceBufferDeviceAddressFeatures* = object - sType*: VkStructureType - pNext*: pointer - bufferDeviceAddress*: VkBool32 - bufferDeviceAddressCaptureReplay*: VkBool32 - bufferDeviceAddressMultiDevice*: VkBool32 - VkPhysicalDeviceBufferDeviceAddressFeaturesKHR* = object - VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - bufferDeviceAddress*: VkBool32 - bufferDeviceAddressCaptureReplay*: VkBool32 - bufferDeviceAddressMultiDevice*: VkBool32 - VkPhysicalDeviceBufferAddressFeaturesEXT* = object - VkBufferDeviceAddressInfo* = object - sType*: VkStructureType - pNext*: pointer - buffer*: VkBuffer - VkBufferDeviceAddressInfoKHR* = object - VkBufferDeviceAddressInfoEXT* = object - VkBufferOpaqueCaptureAddressCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - opaqueCaptureAddress*: uint64 - VkBufferOpaqueCaptureAddressCreateInfoKHR* = object - VkBufferDeviceAddressCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - deviceAddress*: VkDeviceAddress - VkPhysicalDeviceImageViewImageFormatInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - imageViewType*: VkImageViewType - VkFilterCubicImageViewImageFormatPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - filterCubic*: VkBool32 - filterCubicMinmax*: VkBool32 - VkPhysicalDeviceImagelessFramebufferFeatures* = object - sType*: VkStructureType - pNext*: pointer - imagelessFramebuffer*: VkBool32 - VkPhysicalDeviceImagelessFramebufferFeaturesKHR* = object - VkFramebufferAttachmentsCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - attachmentImageInfoCount*: uint32 - pAttachmentImageInfos*: ptr VkFramebufferAttachmentImageInfo - VkFramebufferAttachmentsCreateInfoKHR* = object - VkFramebufferAttachmentImageInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkImageCreateFlags - usage*: VkImageUsageFlags - width*: uint32 - height*: uint32 - layerCount*: uint32 - viewFormatCount*: uint32 - pViewFormats*: ptr VkFormat - VkFramebufferAttachmentImageInfoKHR* = object - VkRenderPassAttachmentBeginInfo* = object - sType*: VkStructureType - pNext*: pointer - attachmentCount*: uint32 - pAttachments*: ptr VkImageView - VkRenderPassAttachmentBeginInfoKHR* = object - VkPhysicalDeviceTextureCompressionASTCHDRFeatures* = object - sType*: VkStructureType - pNext*: pointer - textureCompressionASTC_HDR*: VkBool32 - VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* = object - VkPhysicalDeviceCooperativeMatrixFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - cooperativeMatrix*: VkBool32 - cooperativeMatrixRobustBufferAccess*: VkBool32 - VkPhysicalDeviceCooperativeMatrixPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - cooperativeMatrixSupportedStages*: VkShaderStageFlags - VkCooperativeMatrixPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - MSize*: uint32 - NSize*: uint32 - KSize*: uint32 - AType*: VkComponentTypeNV - BType*: VkComponentTypeNV - CType*: VkComponentTypeNV - DType*: VkComponentTypeNV - scope*: VkScopeNV - VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - ycbcrImageArrays*: VkBool32 - VkImageViewHandleInfoNVX* = object - sType*: VkStructureType - pNext*: pointer - imageView*: VkImageView - descriptorType*: VkDescriptorType - sampler*: VkSampler - VkImageViewAddressPropertiesNVX* = object - sType*: VkStructureType - pNext*: pointer - deviceAddress*: VkDeviceAddress - size*: VkDeviceSize - VkPipelineCreationFeedback* = object - flags*: VkPipelineCreationFeedbackFlags - duration*: uint64 - VkPipelineCreationFeedbackEXT* = object - VkPipelineCreationFeedbackCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - pPipelineCreationFeedback*: ptr VkPipelineCreationFeedback - pipelineStageCreationFeedbackCount*: uint32 - pPipelineStageCreationFeedbacks*: ptr VkPipelineCreationFeedback - VkPipelineCreationFeedbackCreateInfoEXT* = object - VkPhysicalDevicePresentBarrierFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - presentBarrier*: VkBool32 - VkSurfaceCapabilitiesPresentBarrierNV* = object - sType*: VkStructureType - pNext*: pointer - presentBarrierSupported*: VkBool32 - VkSwapchainPresentBarrierCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - presentBarrierEnable*: VkBool32 - VkPhysicalDevicePerformanceQueryFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - performanceCounterQueryPools*: VkBool32 - performanceCounterMultipleQueryPools*: VkBool32 - VkPhysicalDevicePerformanceQueryPropertiesKHR* = object - sType*: VkStructureType - pNext*: pointer - allowCommandBufferQueryCopies*: VkBool32 - VkPerformanceCounterKHR* = object - sType*: VkStructureType - pNext*: pointer - unit*: VkPerformanceCounterUnitKHR - scope*: VkPerformanceCounterScopeKHR - storage*: VkPerformanceCounterStorageKHR - uuid*: array[VK_UUID_SIZE, uint8] - VkPerformanceCounterDescriptionKHR* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPerformanceCounterDescriptionFlagsKHR - name*: array[VK_MAX_DESCRIPTION_SIZE, char] - category*: array[VK_MAX_DESCRIPTION_SIZE, char] - description*: array[VK_MAX_DESCRIPTION_SIZE, char] - VkQueryPoolPerformanceCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - queueFamilyIndex*: uint32 - counterIndexCount*: uint32 - pCounterIndices*: ptr uint32 - VkPerformanceCounterResultKHR* {.union.} = object - int32*: int32 - int64*: int64 - uint32*: uint32 - uint64*: uint64 - float32*: float32 - float64*: float64 - VkAcquireProfilingLockInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkAcquireProfilingLockFlagsKHR - timeout*: uint64 - VkPerformanceQuerySubmitInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - counterPassIndex*: uint32 - VkPerformanceQueryReservationInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - maxPerformanceQueriesPerPool*: uint32 - VkHeadlessSurfaceCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkHeadlessSurfaceCreateFlagsEXT - VkPhysicalDeviceCoverageReductionModeFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - coverageReductionMode*: VkBool32 - VkPipelineCoverageReductionStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkPipelineCoverageReductionStateCreateFlagsNV - coverageReductionMode*: VkCoverageReductionModeNV - VkFramebufferMixedSamplesCombinationNV* = object - sType*: VkStructureType - pNext*: pointer - coverageReductionMode*: VkCoverageReductionModeNV - rasterizationSamples*: VkSampleCountFlagBits - depthStencilSamples*: VkSampleCountFlags - colorSamples*: VkSampleCountFlags - VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* = object - sType*: VkStructureType - pNext*: pointer - shaderIntegerFunctions2*: VkBool32 - VkPerformanceValueDataINTEL* {.union.} = object - value32*: uint32 - value64*: uint64 - valueFloat*: float32 - valueBool*: VkBool32 - valueString*: cstring - VkPerformanceValueINTEL* = object - thetype*: VkPerformanceValueTypeINTEL - data*: VkPerformanceValueDataINTEL - VkInitializePerformanceApiInfoINTEL* = object - sType*: VkStructureType - pNext*: pointer - pUserData*: pointer - VkQueryPoolPerformanceQueryCreateInfoINTEL* = object - sType*: VkStructureType - pNext*: pointer - performanceCountersSampling*: VkQueryPoolSamplingModeINTEL - VkQueryPoolCreateInfoINTEL* = object - VkPerformanceMarkerInfoINTEL* = object - sType*: VkStructureType - pNext*: pointer - marker*: uint64 - VkPerformanceStreamMarkerInfoINTEL* = object - sType*: VkStructureType - pNext*: pointer - marker*: uint32 - VkPerformanceOverrideInfoINTEL* = object - sType*: VkStructureType - pNext*: pointer - thetype*: VkPerformanceOverrideTypeINTEL - enable*: VkBool32 - parameter*: uint64 - VkPerformanceConfigurationAcquireInfoINTEL* = object - sType*: VkStructureType - pNext*: pointer - thetype*: VkPerformanceConfigurationTypeINTEL - VkPhysicalDeviceShaderClockFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - shaderSubgroupClock*: VkBool32 - shaderDeviceClock*: VkBool32 - VkPhysicalDeviceIndexTypeUint8FeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - indexTypeUint8*: VkBool32 - VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - shaderSMCount*: uint32 - shaderWarpsPerSM*: uint32 - VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - shaderSMBuiltins*: VkBool32 - VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - fragmentShaderSampleInterlock*: VkBool32 - fragmentShaderPixelInterlock*: VkBool32 - fragmentShaderShadingRateInterlock*: VkBool32 - VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* = object - sType*: VkStructureType - pNext*: pointer - separateDepthStencilLayouts*: VkBool32 - VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR* = object - VkAttachmentReferenceStencilLayout* = object - sType*: VkStructureType - pNext*: pointer - stencilLayout*: VkImageLayout - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - primitiveTopologyListRestart*: VkBool32 - primitiveTopologyPatchListRestart*: VkBool32 - VkAttachmentReferenceStencilLayoutKHR* = object - VkAttachmentDescriptionStencilLayout* = object - sType*: VkStructureType - pNext*: pointer - stencilInitialLayout*: VkImageLayout - stencilFinalLayout*: VkImageLayout - VkAttachmentDescriptionStencilLayoutKHR* = object - VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - pipelineExecutableInfo*: VkBool32 - VkPipelineInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - pipeline*: VkPipeline - VkPipelineInfoEXT* = object - VkPipelineExecutablePropertiesKHR* = object - sType*: VkStructureType - pNext*: pointer - stages*: VkShaderStageFlags - name*: array[VK_MAX_DESCRIPTION_SIZE, char] - description*: array[VK_MAX_DESCRIPTION_SIZE, char] - subgroupSize*: uint32 - VkPipelineExecutableInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - pipeline*: VkPipeline - executableIndex*: uint32 - VkPipelineExecutableStatisticValueKHR* {.union.} = object - b32*: VkBool32 - i64*: int64 - u64*: uint64 - f64*: float64 - VkPipelineExecutableStatisticKHR* = object - sType*: VkStructureType - pNext*: pointer - name*: array[VK_MAX_DESCRIPTION_SIZE, char] - description*: array[VK_MAX_DESCRIPTION_SIZE, char] - format*: VkPipelineExecutableStatisticFormatKHR - value*: VkPipelineExecutableStatisticValueKHR - VkPipelineExecutableInternalRepresentationKHR* = object - sType*: VkStructureType - pNext*: pointer - name*: array[VK_MAX_DESCRIPTION_SIZE, char] - description*: array[VK_MAX_DESCRIPTION_SIZE, char] - isText*: VkBool32 - dataSize*: csize_t - pData*: pointer - VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures* = object - sType*: VkStructureType - pNext*: pointer - shaderDemoteToHelperInvocation*: VkBool32 - VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* = object - VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - texelBufferAlignment*: VkBool32 - VkPhysicalDeviceTexelBufferAlignmentProperties* = object - sType*: VkStructureType - pNext*: pointer - storageTexelBufferOffsetAlignmentBytes*: VkDeviceSize - storageTexelBufferOffsetSingleTexelAlignment*: VkBool32 - uniformTexelBufferOffsetAlignmentBytes*: VkDeviceSize - uniformTexelBufferOffsetSingleTexelAlignment*: VkBool32 - VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* = object - VkPhysicalDeviceSubgroupSizeControlFeatures* = object - sType*: VkStructureType - pNext*: pointer - subgroupSizeControl*: VkBool32 - computeFullSubgroups*: VkBool32 - VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* = object - VkPhysicalDeviceSubgroupSizeControlProperties* = object - sType*: VkStructureType - pNext*: pointer - minSubgroupSize*: uint32 - maxSubgroupSize*: uint32 - maxComputeWorkgroupSubgroups*: uint32 - requiredSubgroupSizeStages*: VkShaderStageFlags - VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* = object - VkPipelineShaderStageRequiredSubgroupSizeCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - requiredSubgroupSize*: uint32 - VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* = object - VkSubpassShadingPipelineCreateInfoHUAWEI* = object - sType*: VkStructureType - pNext*: pointer - renderPass*: VkRenderPass - subpass*: uint32 - VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* = object - sType*: VkStructureType - pNext*: pointer - maxSubpassShadingWorkgroupSizeAspectRatio*: uint32 - VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI* = object - sType*: VkStructureType - pNext*: pointer - maxWorkGroupCount*: array[3, uint32] - maxWorkGroupSize*: array[3, uint32] - maxOutputClusterCount*: uint32 - VkMemoryOpaqueCaptureAddressAllocateInfo* = object - sType*: VkStructureType - pNext*: pointer - opaqueCaptureAddress*: uint64 - VkMemoryOpaqueCaptureAddressAllocateInfoKHR* = object - VkDeviceMemoryOpaqueCaptureAddressInfo* = object - sType*: VkStructureType - pNext*: pointer - memory*: VkDeviceMemory - VkDeviceMemoryOpaqueCaptureAddressInfoKHR* = object - VkPhysicalDeviceLineRasterizationFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - rectangularLines*: VkBool32 - bresenhamLines*: VkBool32 - smoothLines*: VkBool32 - stippledRectangularLines*: VkBool32 - stippledBresenhamLines*: VkBool32 - stippledSmoothLines*: VkBool32 - VkPhysicalDeviceLineRasterizationPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - lineSubPixelPrecisionBits*: uint32 - VkPipelineRasterizationLineStateCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - lineRasterizationMode*: VkLineRasterizationModeEXT - stippledLineEnable*: VkBool32 - lineStippleFactor*: uint32 - lineStipplePattern*: uint16 - VkPhysicalDevicePipelineCreationCacheControlFeatures* = object - sType*: VkStructureType - pNext*: pointer - pipelineCreationCacheControl*: VkBool32 - VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* = object - VkPhysicalDeviceVulkan11Features* = object - sType*: VkStructureType - pNext*: pointer - storageBuffer16BitAccess*: VkBool32 - uniformAndStorageBuffer16BitAccess*: VkBool32 - storagePushConstant16*: VkBool32 - storageInputOutput16*: VkBool32 - multiview*: VkBool32 - multiviewGeometryShader*: VkBool32 - multiviewTessellationShader*: VkBool32 - variablePointersStorageBuffer*: VkBool32 - variablePointers*: VkBool32 - protectedMemory*: VkBool32 - samplerYcbcrConversion*: VkBool32 - shaderDrawParameters*: VkBool32 - VkPhysicalDeviceVulkan11Properties* = object - sType*: VkStructureType - pNext*: pointer - deviceUUID*: array[VK_UUID_SIZE, uint8] - driverUUID*: array[VK_UUID_SIZE, uint8] - deviceLUID*: array[VK_LUID_SIZE, uint8] - deviceNodeMask*: uint32 - deviceLUIDValid*: VkBool32 - subgroupSize*: uint32 - subgroupSupportedStages*: VkShaderStageFlags - subgroupSupportedOperations*: VkSubgroupFeatureFlags - subgroupQuadOperationsInAllStages*: VkBool32 - pointClippingBehavior*: VkPointClippingBehavior - maxMultiviewViewCount*: uint32 - maxMultiviewInstanceIndex*: uint32 - protectedNoFault*: VkBool32 - maxPerSetDescriptors*: uint32 - maxMemoryAllocationSize*: VkDeviceSize - VkPhysicalDeviceVulkan12Features* = object - sType*: VkStructureType - pNext*: pointer - samplerMirrorClampToEdge*: VkBool32 - drawIndirectCount*: VkBool32 - storageBuffer8BitAccess*: VkBool32 - uniformAndStorageBuffer8BitAccess*: VkBool32 - storagePushConstant8*: VkBool32 - shaderBufferInt64Atomics*: VkBool32 - shaderSharedInt64Atomics*: VkBool32 - shaderFloat16*: VkBool32 - shaderInt8*: VkBool32 - descriptorIndexing*: VkBool32 - shaderInputAttachmentArrayDynamicIndexing*: VkBool32 - shaderUniformTexelBufferArrayDynamicIndexing*: VkBool32 - shaderStorageTexelBufferArrayDynamicIndexing*: VkBool32 - shaderUniformBufferArrayNonUniformIndexing*: VkBool32 - shaderSampledImageArrayNonUniformIndexing*: VkBool32 - shaderStorageBufferArrayNonUniformIndexing*: VkBool32 - shaderStorageImageArrayNonUniformIndexing*: VkBool32 - shaderInputAttachmentArrayNonUniformIndexing*: VkBool32 - shaderUniformTexelBufferArrayNonUniformIndexing*: VkBool32 - shaderStorageTexelBufferArrayNonUniformIndexing*: VkBool32 - descriptorBindingUniformBufferUpdateAfterBind*: VkBool32 - descriptorBindingSampledImageUpdateAfterBind*: VkBool32 - descriptorBindingStorageImageUpdateAfterBind*: VkBool32 - descriptorBindingStorageBufferUpdateAfterBind*: VkBool32 - descriptorBindingUniformTexelBufferUpdateAfterBind*: VkBool32 - descriptorBindingStorageTexelBufferUpdateAfterBind*: VkBool32 - descriptorBindingUpdateUnusedWhilePending*: VkBool32 - descriptorBindingPartiallyBound*: VkBool32 - descriptorBindingVariableDescriptorCount*: VkBool32 - runtimeDescriptorArray*: VkBool32 - samplerFilterMinmax*: VkBool32 - scalarBlockLayout*: VkBool32 - imagelessFramebuffer*: VkBool32 - uniformBufferStandardLayout*: VkBool32 - shaderSubgroupExtendedTypes*: VkBool32 - separateDepthStencilLayouts*: VkBool32 - hostQueryReset*: VkBool32 - timelineSemaphore*: VkBool32 - bufferDeviceAddress*: VkBool32 - bufferDeviceAddressCaptureReplay*: VkBool32 - bufferDeviceAddressMultiDevice*: VkBool32 - vulkanMemoryModel*: VkBool32 - vulkanMemoryModelDeviceScope*: VkBool32 - vulkanMemoryModelAvailabilityVisibilityChains*: VkBool32 - shaderOutputViewportIndex*: VkBool32 - shaderOutputLayer*: VkBool32 - subgroupBroadcastDynamicId*: VkBool32 - VkPhysicalDeviceVulkan12Properties* = object - sType*: VkStructureType - pNext*: pointer - driverID*: VkDriverId - driverName*: array[VK_MAX_DRIVER_NAME_SIZE, char] - driverInfo*: array[VK_MAX_DRIVER_INFO_SIZE, char] - conformanceVersion*: VkConformanceVersion - denormBehaviorIndependence*: VkShaderFloatControlsIndependence - roundingModeIndependence*: VkShaderFloatControlsIndependence - shaderSignedZeroInfNanPreserveFloat16*: VkBool32 - shaderSignedZeroInfNanPreserveFloat32*: VkBool32 - shaderSignedZeroInfNanPreserveFloat64*: VkBool32 - shaderDenormPreserveFloat16*: VkBool32 - shaderDenormPreserveFloat32*: VkBool32 - shaderDenormPreserveFloat64*: VkBool32 - shaderDenormFlushToZeroFloat16*: VkBool32 - shaderDenormFlushToZeroFloat32*: VkBool32 - shaderDenormFlushToZeroFloat64*: VkBool32 - shaderRoundingModeRTEFloat16*: VkBool32 - shaderRoundingModeRTEFloat32*: VkBool32 - shaderRoundingModeRTEFloat64*: VkBool32 - shaderRoundingModeRTZFloat16*: VkBool32 - shaderRoundingModeRTZFloat32*: VkBool32 - shaderRoundingModeRTZFloat64*: VkBool32 - maxUpdateAfterBindDescriptorsInAllPools*: uint32 - shaderUniformBufferArrayNonUniformIndexingNative*: VkBool32 - shaderSampledImageArrayNonUniformIndexingNative*: VkBool32 - shaderStorageBufferArrayNonUniformIndexingNative*: VkBool32 - shaderStorageImageArrayNonUniformIndexingNative*: VkBool32 - shaderInputAttachmentArrayNonUniformIndexingNative*: VkBool32 - robustBufferAccessUpdateAfterBind*: VkBool32 - quadDivergentImplicitLod*: VkBool32 - maxPerStageDescriptorUpdateAfterBindSamplers*: uint32 - maxPerStageDescriptorUpdateAfterBindUniformBuffers*: uint32 - maxPerStageDescriptorUpdateAfterBindStorageBuffers*: uint32 - maxPerStageDescriptorUpdateAfterBindSampledImages*: uint32 - maxPerStageDescriptorUpdateAfterBindStorageImages*: uint32 - maxPerStageDescriptorUpdateAfterBindInputAttachments*: uint32 - maxPerStageUpdateAfterBindResources*: uint32 - maxDescriptorSetUpdateAfterBindSamplers*: uint32 - maxDescriptorSetUpdateAfterBindUniformBuffers*: uint32 - maxDescriptorSetUpdateAfterBindUniformBuffersDynamic*: uint32 - maxDescriptorSetUpdateAfterBindStorageBuffers*: uint32 - maxDescriptorSetUpdateAfterBindStorageBuffersDynamic*: uint32 - maxDescriptorSetUpdateAfterBindSampledImages*: uint32 - maxDescriptorSetUpdateAfterBindStorageImages*: uint32 - maxDescriptorSetUpdateAfterBindInputAttachments*: uint32 - supportedDepthResolveModes*: VkResolveModeFlags - supportedStencilResolveModes*: VkResolveModeFlags - independentResolveNone*: VkBool32 - independentResolve*: VkBool32 - filterMinmaxSingleComponentFormats*: VkBool32 - filterMinmaxImageComponentMapping*: VkBool32 - maxTimelineSemaphoreValueDifference*: uint64 - framebufferIntegerColorSampleCounts*: VkSampleCountFlags - VkPhysicalDeviceVulkan13Features* = object - sType*: VkStructureType - pNext*: pointer - robustImageAccess*: VkBool32 - inlineUniformBlock*: VkBool32 - descriptorBindingInlineUniformBlockUpdateAfterBind*: VkBool32 - pipelineCreationCacheControl*: VkBool32 - privateData*: VkBool32 - shaderDemoteToHelperInvocation*: VkBool32 - shaderTerminateInvocation*: VkBool32 - subgroupSizeControl*: VkBool32 - computeFullSubgroups*: VkBool32 - synchronization2*: VkBool32 - textureCompressionASTC_HDR*: VkBool32 - shaderZeroInitializeWorkgroupMemory*: VkBool32 - dynamicRendering*: VkBool32 - shaderIntegerDotProduct*: VkBool32 - maintenance4*: VkBool32 - VkPhysicalDeviceVulkan13Properties* = object - sType*: VkStructureType - pNext*: pointer - minSubgroupSize*: uint32 - maxSubgroupSize*: uint32 - maxComputeWorkgroupSubgroups*: uint32 - requiredSubgroupSizeStages*: VkShaderStageFlags - maxInlineUniformBlockSize*: uint32 - maxPerStageDescriptorInlineUniformBlocks*: uint32 - maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks*: uint32 - maxDescriptorSetInlineUniformBlocks*: uint32 - maxDescriptorSetUpdateAfterBindInlineUniformBlocks*: uint32 - maxInlineUniformTotalSize*: uint32 - integerDotProduct8BitUnsignedAccelerated*: VkBool32 - integerDotProduct8BitSignedAccelerated*: VkBool32 - integerDotProduct8BitMixedSignednessAccelerated*: VkBool32 - integerDotProduct4x8BitPackedUnsignedAccelerated*: VkBool32 - integerDotProduct4x8BitPackedSignedAccelerated*: VkBool32 - integerDotProduct4x8BitPackedMixedSignednessAccelerated*: VkBool32 - integerDotProduct16BitUnsignedAccelerated*: VkBool32 - integerDotProduct16BitSignedAccelerated*: VkBool32 - integerDotProduct16BitMixedSignednessAccelerated*: VkBool32 - integerDotProduct32BitUnsignedAccelerated*: VkBool32 - integerDotProduct32BitSignedAccelerated*: VkBool32 - integerDotProduct32BitMixedSignednessAccelerated*: VkBool32 - integerDotProduct64BitUnsignedAccelerated*: VkBool32 - integerDotProduct64BitSignedAccelerated*: VkBool32 - integerDotProduct64BitMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating8BitUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating8BitSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating16BitUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating16BitSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating32BitUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating32BitSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating64BitUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating64BitSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated*: VkBool32 - storageTexelBufferOffsetAlignmentBytes*: VkDeviceSize - storageTexelBufferOffsetSingleTexelAlignment*: VkBool32 - uniformTexelBufferOffsetAlignmentBytes*: VkDeviceSize - uniformTexelBufferOffsetSingleTexelAlignment*: VkBool32 - maxBufferSize*: VkDeviceSize - VkPipelineCompilerControlCreateInfoAMD* = object - sType*: VkStructureType - pNext*: pointer - compilerControlFlags*: VkPipelineCompilerControlFlagsAMD - VkPhysicalDeviceCoherentMemoryFeaturesAMD* = object - sType*: VkStructureType - pNext*: pointer - deviceCoherentMemory*: VkBool32 - VkFaultData* = object - sType*: VkStructureType - pNext*: pointer - faultLevel*: VkFaultLevel - faultType*: VkFaultType - VkFaultCallbackInfo* = object - sType*: VkStructureType - pNext*: pointer - faultCount*: uint32 - pFaults*: ptr VkFaultData - pfnFaultCallback*: PFN_vkFaultCallbackFunction - VkPhysicalDeviceToolProperties* = object - sType*: VkStructureType - pNext*: pointer - name*: array[VK_MAX_EXTENSION_NAME_SIZE, char] - version*: array[VK_MAX_EXTENSION_NAME_SIZE, char] - purposes*: VkToolPurposeFlags - description*: array[VK_MAX_DESCRIPTION_SIZE, char] - layer*: array[VK_MAX_EXTENSION_NAME_SIZE, char] - VkPhysicalDeviceToolPropertiesEXT* = object - VkSamplerCustomBorderColorCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - customBorderColor*: VkClearColorValue - format*: VkFormat - VkPhysicalDeviceCustomBorderColorPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - maxCustomBorderColorSamplers*: uint32 - VkPhysicalDeviceCustomBorderColorFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - customBorderColors*: VkBool32 - customBorderColorWithoutFormat*: VkBool32 - VkSamplerBorderColorComponentMappingCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - components*: VkComponentMapping - srgb*: VkBool32 - VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - borderColorSwizzle*: VkBool32 - borderColorSwizzleFromImage*: VkBool32 - VkDeviceOrHostAddressKHR* {.union.} = object - deviceAddress*: VkDeviceAddress - hostAddress*: pointer - VkDeviceOrHostAddressConstKHR* {.union.} = object - deviceAddress*: VkDeviceAddress - hostAddress*: pointer - VkAccelerationStructureGeometryTrianglesDataKHR* = object - sType*: VkStructureType - pNext*: pointer - vertexFormat*: VkFormat - vertexData*: VkDeviceOrHostAddressConstKHR - vertexStride*: VkDeviceSize - maxVertex*: uint32 - indexType*: VkIndexType - indexData*: VkDeviceOrHostAddressConstKHR - transformData*: VkDeviceOrHostAddressConstKHR - VkAccelerationStructureGeometryAabbsDataKHR* = object - sType*: VkStructureType - pNext*: pointer - data*: VkDeviceOrHostAddressConstKHR - stride*: VkDeviceSize - VkAccelerationStructureGeometryInstancesDataKHR* = object - sType*: VkStructureType - pNext*: pointer - arrayOfPointers*: VkBool32 - data*: VkDeviceOrHostAddressConstKHR - VkAccelerationStructureGeometryDataKHR* {.union.} = object - triangles*: VkAccelerationStructureGeometryTrianglesDataKHR - aabbs*: VkAccelerationStructureGeometryAabbsDataKHR - instances*: VkAccelerationStructureGeometryInstancesDataKHR - VkAccelerationStructureGeometryKHR* = object - sType*: VkStructureType - pNext*: pointer - geometryType*: VkGeometryTypeKHR - geometry*: VkAccelerationStructureGeometryDataKHR - flags*: VkGeometryFlagsKHR - VkAccelerationStructureBuildGeometryInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - thetype*: VkAccelerationStructureTypeKHR - flags*: VkBuildAccelerationStructureFlagsKHR - mode*: VkBuildAccelerationStructureModeKHR - srcAccelerationStructure*: VkAccelerationStructureKHR - dstAccelerationStructure*: VkAccelerationStructureKHR - geometryCount*: uint32 - pGeometries*: ptr VkAccelerationStructureGeometryKHR - ppGeometries*: ptr ptr VkAccelerationStructureGeometryKHR - scratchData*: VkDeviceOrHostAddressKHR - VkAccelerationStructureBuildRangeInfoKHR* = object - primitiveCount*: uint32 - primitiveOffset*: uint32 - firstVertex*: uint32 - transformOffset*: uint32 - VkAccelerationStructureCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - createFlags*: VkAccelerationStructureCreateFlagsKHR - buffer*: VkBuffer - offset*: VkDeviceSize - size*: VkDeviceSize - thetype*: VkAccelerationStructureTypeKHR - deviceAddress*: VkDeviceAddress - VkAabbPositionsKHR* = object - minX*: float32 - minY*: float32 - minZ*: float32 - maxX*: float32 - maxY*: float32 - maxZ*: float32 - VkAabbPositionsNV* = object - VkTransformMatrixKHR* = object - matrix*: array[3*4, float32] - VkTransformMatrixNV* = object - VkAccelerationStructureInstanceKHR* = object - transform*: VkTransformMatrixKHR - instanceCustomIndex*: uint32 - mask*: uint32 - instanceShaderBindingTableRecordOffset*: uint32 - flags*: VkGeometryInstanceFlagsKHR - accelerationStructureReference*: uint64 - VkAccelerationStructureInstanceNV* = object - VkAccelerationStructureDeviceAddressInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - accelerationStructure*: VkAccelerationStructureKHR - VkAccelerationStructureVersionInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - pVersionData*: ptr uint8 - VkCopyAccelerationStructureInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - src*: VkAccelerationStructureKHR - dst*: VkAccelerationStructureKHR - mode*: VkCopyAccelerationStructureModeKHR - VkCopyAccelerationStructureToMemoryInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - src*: VkAccelerationStructureKHR - dst*: VkDeviceOrHostAddressKHR - mode*: VkCopyAccelerationStructureModeKHR - VkCopyMemoryToAccelerationStructureInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - src*: VkDeviceOrHostAddressConstKHR - dst*: VkAccelerationStructureKHR - mode*: VkCopyAccelerationStructureModeKHR - VkRayTracingPipelineInterfaceCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - maxPipelineRayPayloadSize*: uint32 - maxPipelineRayHitAttributeSize*: uint32 - VkPipelineLibraryCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - libraryCount*: uint32 - pLibraries*: ptr VkPipeline - VkRefreshObjectKHR* = object - objectType*: VkObjectType - objectHandle*: uint64 - flags*: VkRefreshObjectFlagsKHR - VkRefreshObjectListKHR* = object - sType*: VkStructureType - pNext*: pointer - objectCount*: uint32 - pObjects*: ptr VkRefreshObjectKHR - VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - extendedDynamicState*: VkBool32 - VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - extendedDynamicState2*: VkBool32 - extendedDynamicState2LogicOp*: VkBool32 - extendedDynamicState2PatchControlPoints*: VkBool32 - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - extendedDynamicState3TessellationDomainOrigin*: VkBool32 - extendedDynamicState3DepthClampEnable*: VkBool32 - extendedDynamicState3PolygonMode*: VkBool32 - extendedDynamicState3RasterizationSamples*: VkBool32 - extendedDynamicState3SampleMask*: VkBool32 - extendedDynamicState3AlphaToCoverageEnable*: VkBool32 - extendedDynamicState3AlphaToOneEnable*: VkBool32 - extendedDynamicState3LogicOpEnable*: VkBool32 - extendedDynamicState3ColorBlendEnable*: VkBool32 - extendedDynamicState3ColorBlendEquation*: VkBool32 - extendedDynamicState3ColorWriteMask*: VkBool32 - extendedDynamicState3RasterizationStream*: VkBool32 - extendedDynamicState3ConservativeRasterizationMode*: VkBool32 - extendedDynamicState3ExtraPrimitiveOverestimationSize*: VkBool32 - extendedDynamicState3DepthClipEnable*: VkBool32 - extendedDynamicState3SampleLocationsEnable*: VkBool32 - extendedDynamicState3ColorBlendAdvanced*: VkBool32 - extendedDynamicState3ProvokingVertexMode*: VkBool32 - extendedDynamicState3LineRasterizationMode*: VkBool32 - extendedDynamicState3LineStippleEnable*: VkBool32 - extendedDynamicState3DepthClipNegativeOneToOne*: VkBool32 - extendedDynamicState3ViewportWScalingEnable*: VkBool32 - extendedDynamicState3ViewportSwizzle*: VkBool32 - extendedDynamicState3CoverageToColorEnable*: VkBool32 - extendedDynamicState3CoverageToColorLocation*: VkBool32 - extendedDynamicState3CoverageModulationMode*: VkBool32 - extendedDynamicState3CoverageModulationTableEnable*: VkBool32 - extendedDynamicState3CoverageModulationTable*: VkBool32 - extendedDynamicState3CoverageReductionMode*: VkBool32 - extendedDynamicState3RepresentativeFragmentTestEnable*: VkBool32 - extendedDynamicState3ShadingRateImageEnable*: VkBool32 - VkPhysicalDeviceExtendedDynamicState3PropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - dynamicPrimitiveTopologyUnrestricted*: VkBool32 - VkColorBlendEquationEXT* = object - srcColorBlendFactor*: VkBlendFactor - dstColorBlendFactor*: VkBlendFactor - colorBlendOp*: VkBlendOp - srcAlphaBlendFactor*: VkBlendFactor - dstAlphaBlendFactor*: VkBlendFactor - alphaBlendOp*: VkBlendOp - VkColorBlendAdvancedEXT* = object - advancedBlendOp*: VkBlendOp - srcPremultiplied*: VkBool32 - dstPremultiplied*: VkBool32 - blendOverlap*: VkBlendOverlapEXT - clampResults*: VkBool32 - VkRenderPassTransformBeginInfoQCOM* = object - sType*: VkStructureType - pNext*: pointer - transform*: VkSurfaceTransformFlagBitsKHR - VkCopyCommandTransformInfoQCOM* = object - sType*: VkStructureType - pNext*: pointer - transform*: VkSurfaceTransformFlagBitsKHR - VkCommandBufferInheritanceRenderPassTransformInfoQCOM* = object - sType*: VkStructureType - pNext*: pointer - transform*: VkSurfaceTransformFlagBitsKHR - renderArea*: VkRect2D - VkPhysicalDeviceDiagnosticsConfigFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - diagnosticsConfig*: VkBool32 - VkDeviceDiagnosticsConfigCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDeviceDiagnosticsConfigFlagsNV - VkPipelineOfflineCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - pipelineIdentifier*: array[VK_UUID_SIZE, uint8] - matchControl*: VkPipelineMatchControl - poolEntrySize*: VkDeviceSize - VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures* = object - sType*: VkStructureType - pNext*: pointer - shaderZeroInitializeWorkgroupMemory*: VkBool32 - VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* = object - VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - shaderSubgroupUniformControlFlow*: VkBool32 - VkPhysicalDeviceRobustness2FeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - robustBufferAccess2*: VkBool32 - robustImageAccess2*: VkBool32 - nullDescriptor*: VkBool32 - VkPhysicalDeviceRobustness2PropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - robustStorageBufferAccessSizeAlignment*: VkDeviceSize - robustUniformBufferAccessSizeAlignment*: VkDeviceSize - VkPhysicalDeviceImageRobustnessFeatures* = object - sType*: VkStructureType - pNext*: pointer - robustImageAccess*: VkBool32 - VkPhysicalDeviceImageRobustnessFeaturesEXT* = object - VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - workgroupMemoryExplicitLayout*: VkBool32 - workgroupMemoryExplicitLayoutScalarBlockLayout*: VkBool32 - workgroupMemoryExplicitLayout8BitAccess*: VkBool32 - workgroupMemoryExplicitLayout16BitAccess*: VkBool32 - VkPhysicalDevice4444FormatsFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - formatA4R4G4B4*: VkBool32 - formatA4B4G4R4*: VkBool32 - VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* = object - sType*: VkStructureType - pNext*: pointer - subpassShading*: VkBool32 - VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI* = object - sType*: VkStructureType - pNext*: pointer - clustercullingShader*: VkBool32 - multiviewClusterCullingShader*: VkBool32 - VkBufferCopy2* = object - sType*: VkStructureType - pNext*: pointer - srcOffset*: VkDeviceSize - dstOffset*: VkDeviceSize - size*: VkDeviceSize - VkBufferCopy2KHR* = object - VkImageCopy2* = object - sType*: VkStructureType - pNext*: pointer - srcSubresource*: VkImageSubresourceLayers - srcOffset*: VkOffset3D - dstSubresource*: VkImageSubresourceLayers - dstOffset*: VkOffset3D - extent*: VkExtent3D - VkImageCopy2KHR* = object - VkImageBlit2* = object - sType*: VkStructureType - pNext*: pointer - srcSubresource*: VkImageSubresourceLayers - srcOffsets*: array[2, VkOffset3D] - dstSubresource*: VkImageSubresourceLayers - dstOffsets*: array[2, VkOffset3D] - VkImageBlit2KHR* = object - VkBufferImageCopy2* = object - sType*: VkStructureType - pNext*: pointer - bufferOffset*: VkDeviceSize - bufferRowLength*: uint32 - bufferImageHeight*: uint32 - imageSubresource*: VkImageSubresourceLayers - imageOffset*: VkOffset3D - imageExtent*: VkExtent3D - VkBufferImageCopy2KHR* = object - VkImageResolve2* = object - sType*: VkStructureType - pNext*: pointer - srcSubresource*: VkImageSubresourceLayers - srcOffset*: VkOffset3D - dstSubresource*: VkImageSubresourceLayers - dstOffset*: VkOffset3D - extent*: VkExtent3D - VkImageResolve2KHR* = object - VkCopyBufferInfo2* = object - sType*: VkStructureType - pNext*: pointer - srcBuffer*: VkBuffer - dstBuffer*: VkBuffer - regionCount*: uint32 - pRegions*: ptr VkBufferCopy2 - VkCopyBufferInfo2KHR* = object - VkCopyImageInfo2* = object - sType*: VkStructureType - pNext*: pointer - srcImage*: VkImage - srcImageLayout*: VkImageLayout - dstImage*: VkImage - dstImageLayout*: VkImageLayout - regionCount*: uint32 - pRegions*: ptr VkImageCopy2 - VkCopyImageInfo2KHR* = object - VkBlitImageInfo2* = object - sType*: VkStructureType - pNext*: pointer - srcImage*: VkImage - srcImageLayout*: VkImageLayout - dstImage*: VkImage - dstImageLayout*: VkImageLayout - regionCount*: uint32 - pRegions*: ptr VkImageBlit2 - filter*: VkFilter - VkBlitImageInfo2KHR* = object - VkCopyBufferToImageInfo2* = object - sType*: VkStructureType - pNext*: pointer - srcBuffer*: VkBuffer - dstImage*: VkImage - dstImageLayout*: VkImageLayout - regionCount*: uint32 - pRegions*: ptr VkBufferImageCopy2 - VkCopyBufferToImageInfo2KHR* = object - VkCopyImageToBufferInfo2* = object - sType*: VkStructureType - pNext*: pointer - srcImage*: VkImage - srcImageLayout*: VkImageLayout - dstBuffer*: VkBuffer - regionCount*: uint32 - pRegions*: ptr VkBufferImageCopy2 - VkCopyImageToBufferInfo2KHR* = object - VkResolveImageInfo2* = object - sType*: VkStructureType - pNext*: pointer - srcImage*: VkImage - srcImageLayout*: VkImageLayout - dstImage*: VkImage - dstImageLayout*: VkImageLayout - regionCount*: uint32 - pRegions*: ptr VkImageResolve2 - VkResolveImageInfo2KHR* = object - VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - shaderImageInt64Atomics*: VkBool32 - sparseImageInt64Atomics*: VkBool32 - VkFragmentShadingRateAttachmentInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - pFragmentShadingRateAttachment*: ptr VkAttachmentReference2 - shadingRateAttachmentTexelSize*: VkExtent2D - VkPipelineFragmentShadingRateStateCreateInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - fragmentSize*: VkExtent2D - combinerOps*: array[2, VkFragmentShadingRateCombinerOpKHR] - VkPhysicalDeviceFragmentShadingRateFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - pipelineFragmentShadingRate*: VkBool32 - primitiveFragmentShadingRate*: VkBool32 - attachmentFragmentShadingRate*: VkBool32 - VkPhysicalDeviceFragmentShadingRatePropertiesKHR* = object - sType*: VkStructureType - pNext*: pointer - minFragmentShadingRateAttachmentTexelSize*: VkExtent2D - maxFragmentShadingRateAttachmentTexelSize*: VkExtent2D - maxFragmentShadingRateAttachmentTexelSizeAspectRatio*: uint32 - primitiveFragmentShadingRateWithMultipleViewports*: VkBool32 - layeredShadingRateAttachments*: VkBool32 - fragmentShadingRateNonTrivialCombinerOps*: VkBool32 - maxFragmentSize*: VkExtent2D - maxFragmentSizeAspectRatio*: uint32 - maxFragmentShadingRateCoverageSamples*: uint32 - maxFragmentShadingRateRasterizationSamples*: VkSampleCountFlagBits - fragmentShadingRateWithShaderDepthStencilWrites*: VkBool32 - fragmentShadingRateWithSampleMask*: VkBool32 - fragmentShadingRateWithShaderSampleMask*: VkBool32 - fragmentShadingRateWithConservativeRasterization*: VkBool32 - fragmentShadingRateWithFragmentShaderInterlock*: VkBool32 - fragmentShadingRateWithCustomSampleLocations*: VkBool32 - fragmentShadingRateStrictMultiplyCombiner*: VkBool32 - VkPhysicalDeviceFragmentShadingRateKHR* = object - sType*: VkStructureType - pNext*: pointer - sampleCounts*: VkSampleCountFlags - fragmentSize*: VkExtent2D - VkPhysicalDeviceShaderTerminateInvocationFeatures* = object - sType*: VkStructureType - pNext*: pointer - shaderTerminateInvocation*: VkBool32 - VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* = object - VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - fragmentShadingRateEnums*: VkBool32 - supersampleFragmentShadingRates*: VkBool32 - noInvocationFragmentShadingRates*: VkBool32 - VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - maxFragmentShadingRateInvocationCount*: VkSampleCountFlagBits - VkPipelineFragmentShadingRateEnumStateCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - shadingRateType*: VkFragmentShadingRateTypeNV - shadingRate*: VkFragmentShadingRateNV - combinerOps*: array[2, VkFragmentShadingRateCombinerOpKHR] - VkAccelerationStructureBuildSizesInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - accelerationStructureSize*: VkDeviceSize - updateScratchSize*: VkDeviceSize - buildScratchSize*: VkDeviceSize - VkPhysicalDeviceImage2DViewOf3DFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - image2DViewOf3D*: VkBool32 - sampler2DViewOf3D*: VkBool32 - VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - imageSlicedViewOf3D*: VkBool32 - VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - mutableDescriptorType*: VkBool32 - VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* = object - VkMutableDescriptorTypeListEXT* = object - descriptorTypeCount*: uint32 - pDescriptorTypes*: ptr VkDescriptorType - VkMutableDescriptorTypeListVALVE* = object - VkMutableDescriptorTypeCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - mutableDescriptorTypeListCount*: uint32 - pMutableDescriptorTypeLists*: ptr VkMutableDescriptorTypeListEXT - VkMutableDescriptorTypeCreateInfoVALVE* = object - VkPhysicalDeviceDepthClipControlFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - depthClipControl*: VkBool32 - VkPipelineViewportDepthClipControlCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - negativeOneToOne*: VkBool32 - VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - vertexInputDynamicState*: VkBool32 - VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - externalMemoryRDMA*: VkBool32 - VkVertexInputBindingDescription2EXT* = object - sType*: VkStructureType - pNext*: pointer - binding*: uint32 - stride*: uint32 - inputRate*: VkVertexInputRate - divisor*: uint32 - VkVertexInputAttributeDescription2EXT* = object - sType*: VkStructureType - pNext*: pointer - location*: uint32 - binding*: uint32 - format*: VkFormat - offset*: uint32 - VkPhysicalDeviceColorWriteEnableFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - colorWriteEnable*: VkBool32 - VkPipelineColorWriteCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - attachmentCount*: uint32 - pColorWriteEnables*: ptr VkBool32 - VkMemoryBarrier2* = object - sType*: VkStructureType - pNext*: pointer - srcStageMask*: VkPipelineStageFlags2 - srcAccessMask*: VkAccessFlags2 - dstStageMask*: VkPipelineStageFlags2 - dstAccessMask*: VkAccessFlags2 - VkMemoryBarrier2KHR* = object - VkImageMemoryBarrier2* = object - sType*: VkStructureType - pNext*: pointer - srcStageMask*: VkPipelineStageFlags2 - srcAccessMask*: VkAccessFlags2 - dstStageMask*: VkPipelineStageFlags2 - dstAccessMask*: VkAccessFlags2 - oldLayout*: VkImageLayout - newLayout*: VkImageLayout - srcQueueFamilyIndex*: uint32 - dstQueueFamilyIndex*: uint32 - image*: VkImage - subresourceRange*: VkImageSubresourceRange - VkImageMemoryBarrier2KHR* = object - VkBufferMemoryBarrier2* = object - sType*: VkStructureType - pNext*: pointer - srcStageMask*: VkPipelineStageFlags2 - srcAccessMask*: VkAccessFlags2 - dstStageMask*: VkPipelineStageFlags2 - dstAccessMask*: VkAccessFlags2 - srcQueueFamilyIndex*: uint32 - dstQueueFamilyIndex*: uint32 - buffer*: VkBuffer - offset*: VkDeviceSize - size*: VkDeviceSize - VkBufferMemoryBarrier2KHR* = object - VkDependencyInfo* = object - sType*: VkStructureType - pNext*: pointer - dependencyFlags*: VkDependencyFlags - memoryBarrierCount*: uint32 - pMemoryBarriers*: ptr VkMemoryBarrier2 - bufferMemoryBarrierCount*: uint32 - pBufferMemoryBarriers*: ptr VkBufferMemoryBarrier2 - imageMemoryBarrierCount*: uint32 - pImageMemoryBarriers*: ptr VkImageMemoryBarrier2 - VkDependencyInfoKHR* = object - VkSemaphoreSubmitInfo* = object - sType*: VkStructureType - pNext*: pointer - semaphore*: VkSemaphore - value*: uint64 - stageMask*: VkPipelineStageFlags2 - deviceIndex*: uint32 - VkSemaphoreSubmitInfoKHR* = object - VkCommandBufferSubmitInfo* = object - sType*: VkStructureType - pNext*: pointer - commandBuffer*: VkCommandBuffer - deviceMask*: uint32 - VkCommandBufferSubmitInfoKHR* = object - VkSubmitInfo2* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkSubmitFlags - waitSemaphoreInfoCount*: uint32 - pWaitSemaphoreInfos*: ptr VkSemaphoreSubmitInfo - commandBufferInfoCount*: uint32 - pCommandBufferInfos*: ptr VkCommandBufferSubmitInfo - signalSemaphoreInfoCount*: uint32 - pSignalSemaphoreInfos*: ptr VkSemaphoreSubmitInfo - VkSubmitInfo2KHR* = object - VkQueueFamilyCheckpointProperties2NV* = object - sType*: VkStructureType - pNext*: pointer - checkpointExecutionStageMask*: VkPipelineStageFlags2 - VkCheckpointData2NV* = object - sType*: VkStructureType - pNext*: pointer - stage*: VkPipelineStageFlags2 - pCheckpointMarker*: pointer - VkPhysicalDeviceSynchronization2Features* = object - sType*: VkStructureType - pNext*: pointer - synchronization2*: VkBool32 - VkPhysicalDeviceSynchronization2FeaturesKHR* = object - VkPhysicalDeviceVulkanSC10Properties* = object - sType*: VkStructureType - pNext*: pointer - deviceNoDynamicHostAllocations*: VkBool32 - deviceDestroyFreesMemory*: VkBool32 - commandPoolMultipleCommandBuffersRecording*: VkBool32 - commandPoolResetCommandBuffer*: VkBool32 - commandBufferSimultaneousUse*: VkBool32 - secondaryCommandBufferNullOrImagelessFramebuffer*: VkBool32 - recycleDescriptorSetMemory*: VkBool32 - recyclePipelineMemory*: VkBool32 - maxRenderPassSubpasses*: uint32 - maxRenderPassDependencies*: uint32 - maxSubpassInputAttachments*: uint32 - maxSubpassPreserveAttachments*: uint32 - maxFramebufferAttachments*: uint32 - maxDescriptorSetLayoutBindings*: uint32 - maxQueryFaultCount*: uint32 - maxCallbackFaultCount*: uint32 - maxCommandPoolCommandBuffers*: uint32 - maxCommandBufferSize*: VkDeviceSize - VkPipelinePoolSize* = object - sType*: VkStructureType - pNext*: pointer - poolEntrySize*: VkDeviceSize - poolEntryCount*: uint32 - VkDeviceObjectReservationCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - pipelineCacheCreateInfoCount*: uint32 - pPipelineCacheCreateInfos*: ptr VkPipelineCacheCreateInfo - pipelinePoolSizeCount*: uint32 - pPipelinePoolSizes*: ptr VkPipelinePoolSize - semaphoreRequestCount*: uint32 - commandBufferRequestCount*: uint32 - fenceRequestCount*: uint32 - deviceMemoryRequestCount*: uint32 - bufferRequestCount*: uint32 - imageRequestCount*: uint32 - eventRequestCount*: uint32 - queryPoolRequestCount*: uint32 - bufferViewRequestCount*: uint32 - imageViewRequestCount*: uint32 - layeredImageViewRequestCount*: uint32 - pipelineCacheRequestCount*: uint32 - pipelineLayoutRequestCount*: uint32 - renderPassRequestCount*: uint32 - graphicsPipelineRequestCount*: uint32 - computePipelineRequestCount*: uint32 - descriptorSetLayoutRequestCount*: uint32 - samplerRequestCount*: uint32 - descriptorPoolRequestCount*: uint32 - descriptorSetRequestCount*: uint32 - framebufferRequestCount*: uint32 - commandPoolRequestCount*: uint32 - samplerYcbcrConversionRequestCount*: uint32 - surfaceRequestCount*: uint32 - swapchainRequestCount*: uint32 - displayModeRequestCount*: uint32 - subpassDescriptionRequestCount*: uint32 - attachmentDescriptionRequestCount*: uint32 - descriptorSetLayoutBindingRequestCount*: uint32 - descriptorSetLayoutBindingLimit*: uint32 - maxImageViewMipLevels*: uint32 - maxImageViewArrayLayers*: uint32 - maxLayeredImageViewMipLevels*: uint32 - maxOcclusionQueriesPerPool*: uint32 - maxPipelineStatisticsQueriesPerPool*: uint32 - maxTimestampQueriesPerPool*: uint32 - maxImmutableSamplersPerDescriptorSetLayout*: uint32 - VkCommandPoolMemoryReservationCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - commandPoolReservedSize*: VkDeviceSize - commandPoolMaxCommandBuffers*: uint32 - VkCommandPoolMemoryConsumption* = object - sType*: VkStructureType - pNext*: pointer - commandPoolAllocated*: VkDeviceSize - commandPoolReservedSize*: VkDeviceSize - commandBufferAllocated*: VkDeviceSize - VkPhysicalDeviceVulkanSC10Features* = object - sType*: VkStructureType - pNext*: pointer - shaderAtomicInstructions*: VkBool32 - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - primitivesGeneratedQuery*: VkBool32 - primitivesGeneratedQueryWithRasterizerDiscard*: VkBool32 - primitivesGeneratedQueryWithNonZeroStreams*: VkBool32 - VkPhysicalDeviceLegacyDitheringFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - legacyDithering*: VkBool32 - VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - multisampledRenderToSingleSampled*: VkBool32 - VkSubpassResolvePerformanceQueryEXT* = object - sType*: VkStructureType - pNext*: pointer - optimal*: VkBool32 - VkMultisampledRenderToSingleSampledInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - multisampledRenderToSingleSampledEnable*: VkBool32 - rasterizationSamples*: VkSampleCountFlagBits - VkPhysicalDevicePipelineProtectedAccessFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - pipelineProtectedAccess*: VkBool32 - VkPhysicalDeviceInheritedViewportScissorFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - inheritedViewportScissor2D*: VkBool32 - VkCommandBufferInheritanceViewportScissorInfoNV* = object - sType*: VkStructureType - pNext*: pointer - viewportScissor2D*: VkBool32 - viewportDepthCount*: uint32 - pViewportDepths*: ptr VkViewport - VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - ycbcr2plane444Formats*: VkBool32 - VkPhysicalDeviceProvokingVertexFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - provokingVertexLast*: VkBool32 - transformFeedbackPreservesProvokingVertex*: VkBool32 - VkPhysicalDeviceProvokingVertexPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - provokingVertexModePerPipeline*: VkBool32 - transformFeedbackPreservesTriangleFanProvokingVertex*: VkBool32 - VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - provokingVertexMode*: VkProvokingVertexModeEXT - VkCuModuleCreateInfoNVX* = object - sType*: VkStructureType - pNext*: pointer - dataSize*: csize_t - pData*: pointer - VkCuFunctionCreateInfoNVX* = object - sType*: VkStructureType - pNext*: pointer - module*: VkCuModuleNVX - pName*: cstring - VkCuLaunchInfoNVX* = object - sType*: VkStructureType - pNext*: pointer - function*: VkCuFunctionNVX - gridDimX*: uint32 - gridDimY*: uint32 - gridDimZ*: uint32 - blockDimX*: uint32 - blockDimY*: uint32 - blockDimZ*: uint32 - sharedMemBytes*: uint32 - paramCount*: csize_t - pParams*: ptr pointer - extraCount*: csize_t - pExtras*: ptr pointer - VkPhysicalDeviceDescriptorBufferFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - descriptorBuffer*: VkBool32 - descriptorBufferCaptureReplay*: VkBool32 - descriptorBufferImageLayoutIgnored*: VkBool32 - descriptorBufferPushDescriptors*: VkBool32 - VkPhysicalDeviceDescriptorBufferPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - combinedImageSamplerDescriptorSingleArray*: VkBool32 - bufferlessPushDescriptors*: VkBool32 - allowSamplerImageViewPostSubmitCreation*: VkBool32 - descriptorBufferOffsetAlignment*: VkDeviceSize - maxDescriptorBufferBindings*: uint32 - maxResourceDescriptorBufferBindings*: uint32 - maxSamplerDescriptorBufferBindings*: uint32 - maxEmbeddedImmutableSamplerBindings*: uint32 - maxEmbeddedImmutableSamplers*: uint32 - bufferCaptureReplayDescriptorDataSize*: csize_t - imageCaptureReplayDescriptorDataSize*: csize_t - imageViewCaptureReplayDescriptorDataSize*: csize_t - samplerCaptureReplayDescriptorDataSize*: csize_t - accelerationStructureCaptureReplayDescriptorDataSize*: csize_t - samplerDescriptorSize*: csize_t - combinedImageSamplerDescriptorSize*: csize_t - sampledImageDescriptorSize*: csize_t - storageImageDescriptorSize*: csize_t - uniformTexelBufferDescriptorSize*: csize_t - robustUniformTexelBufferDescriptorSize*: csize_t - storageTexelBufferDescriptorSize*: csize_t - robustStorageTexelBufferDescriptorSize*: csize_t - uniformBufferDescriptorSize*: csize_t - robustUniformBufferDescriptorSize*: csize_t - storageBufferDescriptorSize*: csize_t - robustStorageBufferDescriptorSize*: csize_t - inputAttachmentDescriptorSize*: csize_t - accelerationStructureDescriptorSize*: csize_t - maxSamplerDescriptorBufferRange*: VkDeviceSize - maxResourceDescriptorBufferRange*: VkDeviceSize - samplerDescriptorBufferAddressSpaceSize*: VkDeviceSize - resourceDescriptorBufferAddressSpaceSize*: VkDeviceSize - descriptorBufferAddressSpaceSize*: VkDeviceSize - VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - combinedImageSamplerDensityMapDescriptorSize*: csize_t - VkDescriptorAddressInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - address*: VkDeviceAddress - range*: VkDeviceSize - format*: VkFormat - VkDescriptorBufferBindingInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - address*: VkDeviceAddress - usage*: VkBufferUsageFlags - VkDescriptorBufferBindingPushDescriptorBufferHandleEXT* = object - sType*: VkStructureType - pNext*: pointer - buffer*: VkBuffer - VkDescriptorDataEXT* {.union.} = object - pSampler*: ptr VkSampler - pCombinedImageSampler*: ptr VkDescriptorImageInfo - pInputAttachmentImage*: ptr VkDescriptorImageInfo - pSampledImage*: ptr VkDescriptorImageInfo - pStorageImage*: ptr VkDescriptorImageInfo - pUniformTexelBuffer*: ptr VkDescriptorAddressInfoEXT - pStorageTexelBuffer*: ptr VkDescriptorAddressInfoEXT - pUniformBuffer*: ptr VkDescriptorAddressInfoEXT - pStorageBuffer*: ptr VkDescriptorAddressInfoEXT - accelerationStructure*: VkDeviceAddress - VkDescriptorGetInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - thetype*: VkDescriptorType - data*: VkDescriptorDataEXT - VkBufferCaptureDescriptorDataInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - buffer*: VkBuffer - VkImageCaptureDescriptorDataInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - image*: VkImage - VkImageViewCaptureDescriptorDataInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - imageView*: VkImageView - VkSamplerCaptureDescriptorDataInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - sampler*: VkSampler - VkAccelerationStructureCaptureDescriptorDataInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - accelerationStructure*: VkAccelerationStructureKHR - accelerationStructureNV*: VkAccelerationStructureNV - VkOpaqueCaptureDescriptorDataCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - opaqueCaptureDescriptorData*: pointer - VkPhysicalDeviceShaderIntegerDotProductFeatures* = object - sType*: VkStructureType - pNext*: pointer - shaderIntegerDotProduct*: VkBool32 - VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* = object - VkPhysicalDeviceShaderIntegerDotProductProperties* = object - sType*: VkStructureType - pNext*: pointer - integerDotProduct8BitUnsignedAccelerated*: VkBool32 - integerDotProduct8BitSignedAccelerated*: VkBool32 - integerDotProduct8BitMixedSignednessAccelerated*: VkBool32 - integerDotProduct4x8BitPackedUnsignedAccelerated*: VkBool32 - integerDotProduct4x8BitPackedSignedAccelerated*: VkBool32 - integerDotProduct4x8BitPackedMixedSignednessAccelerated*: VkBool32 - integerDotProduct16BitUnsignedAccelerated*: VkBool32 - integerDotProduct16BitSignedAccelerated*: VkBool32 - integerDotProduct16BitMixedSignednessAccelerated*: VkBool32 - integerDotProduct32BitUnsignedAccelerated*: VkBool32 - integerDotProduct32BitSignedAccelerated*: VkBool32 - integerDotProduct32BitMixedSignednessAccelerated*: VkBool32 - integerDotProduct64BitUnsignedAccelerated*: VkBool32 - integerDotProduct64BitSignedAccelerated*: VkBool32 - integerDotProduct64BitMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating8BitUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating8BitSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating16BitUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating16BitSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating32BitUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating32BitSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating64BitUnsignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating64BitSignedAccelerated*: VkBool32 - integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated*: VkBool32 - VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* = object - VkPhysicalDeviceDrmPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - hasPrimary*: VkBool32 - hasRender*: VkBool32 - primaryMajor*: int64 - primaryMinor*: int64 - renderMajor*: int64 - renderMinor*: int64 - VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR* = object - sType*: VkStructureType - pNext*: pointer - fragmentShaderBarycentric*: VkBool32 - VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR* = object - sType*: VkStructureType - pNext*: pointer - triStripVertexOrderIndependentOfProvokingVertex*: VkBool32 - VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - rayTracingMotionBlur*: VkBool32 - rayTracingMotionBlurPipelineTraceRaysIndirect*: VkBool32 - VkAccelerationStructureGeometryMotionTrianglesDataNV* = object - sType*: VkStructureType - pNext*: pointer - vertexData*: VkDeviceOrHostAddressConstKHR - VkAccelerationStructureMotionInfoNV* = object - sType*: VkStructureType - pNext*: pointer - maxInstances*: uint32 - flags*: VkAccelerationStructureMotionInfoFlagsNV - VkSRTDataNV* = object - sx*: float32 - a*: float32 - b*: float32 - pvx*: float32 - sy*: float32 - c*: float32 - pvy*: float32 - sz*: float32 - pvz*: float32 - qx*: float32 - qy*: float32 - qz*: float32 - qw*: float32 - tx*: float32 - ty*: float32 - tz*: float32 - VkAccelerationStructureSRTMotionInstanceNV* = object - transformT0*: VkSRTDataNV - transformT1*: VkSRTDataNV - instanceCustomIndex*: uint32 - mask*: uint32 - instanceShaderBindingTableRecordOffset*: uint32 - flags*: VkGeometryInstanceFlagsKHR - accelerationStructureReference*: uint64 - VkAccelerationStructureMatrixMotionInstanceNV* = object - transformT0*: VkTransformMatrixKHR - transformT1*: VkTransformMatrixKHR - instanceCustomIndex*: uint32 - mask*: uint32 - instanceShaderBindingTableRecordOffset*: uint32 - flags*: VkGeometryInstanceFlagsKHR - accelerationStructureReference*: uint64 - VkAccelerationStructureMotionInstanceDataNV* {.union.} = object - staticInstance*: VkAccelerationStructureInstanceKHR - matrixMotionInstance*: VkAccelerationStructureMatrixMotionInstanceNV - srtMotionInstance*: VkAccelerationStructureSRTMotionInstanceNV - VkAccelerationStructureMotionInstanceNV* = object - thetype*: VkAccelerationStructureMotionInstanceTypeNV - flags*: VkAccelerationStructureMotionInstanceFlagsNV - data*: VkAccelerationStructureMotionInstanceDataNV - VkMemoryGetRemoteAddressInfoNV* = object - sType*: VkStructureType - pNext*: pointer - memory*: VkDeviceMemory - handleType*: VkExternalMemoryHandleTypeFlagBits - VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - formatRgba10x6WithoutYCbCrSampler*: VkBool32 - VkFormatProperties3* = object - sType*: VkStructureType - pNext*: pointer - linearTilingFeatures*: VkFormatFeatureFlags2 - optimalTilingFeatures*: VkFormatFeatureFlags2 - bufferFeatures*: VkFormatFeatureFlags2 - VkFormatProperties3KHR* = object - VkDrmFormatModifierPropertiesList2EXT* = object - sType*: VkStructureType - pNext*: pointer - drmFormatModifierCount*: uint32 - pDrmFormatModifierProperties*: ptr VkDrmFormatModifierProperties2EXT - VkDrmFormatModifierProperties2EXT* = object - drmFormatModifier*: uint64 - drmFormatModifierPlaneCount*: uint32 - drmFormatModifierTilingFeatures*: VkFormatFeatureFlags2 - VkPipelineRenderingCreateInfo* = object - sType*: VkStructureType - pNext*: pointer - viewMask*: uint32 - colorAttachmentCount*: uint32 - pColorAttachmentFormats*: ptr VkFormat - depthAttachmentFormat*: VkFormat - stencilAttachmentFormat*: VkFormat - VkPipelineRenderingCreateInfoKHR* = object - VkRenderingInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkRenderingFlags - renderArea*: VkRect2D - layerCount*: uint32 - viewMask*: uint32 - colorAttachmentCount*: uint32 - pColorAttachments*: ptr VkRenderingAttachmentInfo - pDepthAttachment*: ptr VkRenderingAttachmentInfo - pStencilAttachment*: ptr VkRenderingAttachmentInfo - VkRenderingInfoKHR* = object - VkRenderingAttachmentInfo* = object - sType*: VkStructureType - pNext*: pointer - imageView*: VkImageView - imageLayout*: VkImageLayout - resolveMode*: VkResolveModeFlagBits - resolveImageView*: VkImageView - resolveImageLayout*: VkImageLayout - loadOp*: VkAttachmentLoadOp - storeOp*: VkAttachmentStoreOp - clearValue*: VkClearValue - VkRenderingAttachmentInfoKHR* = object - VkRenderingFragmentShadingRateAttachmentInfoKHR* = object - sType*: VkStructureType - pNext*: pointer - imageView*: VkImageView - imageLayout*: VkImageLayout - shadingRateAttachmentTexelSize*: VkExtent2D - VkRenderingFragmentDensityMapAttachmentInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - imageView*: VkImageView - imageLayout*: VkImageLayout - VkPhysicalDeviceDynamicRenderingFeatures* = object - sType*: VkStructureType - pNext*: pointer - dynamicRendering*: VkBool32 - VkPhysicalDeviceDynamicRenderingFeaturesKHR* = object - VkCommandBufferInheritanceRenderingInfo* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkRenderingFlags - viewMask*: uint32 - colorAttachmentCount*: uint32 - pColorAttachmentFormats*: ptr VkFormat - depthAttachmentFormat*: VkFormat - stencilAttachmentFormat*: VkFormat - rasterizationSamples*: VkSampleCountFlagBits - VkCommandBufferInheritanceRenderingInfoKHR* = object - VkAttachmentSampleCountInfoAMD* = object - sType*: VkStructureType - pNext*: pointer - colorAttachmentCount*: uint32 - pColorAttachmentSamples*: ptr VkSampleCountFlagBits - depthStencilAttachmentSamples*: VkSampleCountFlagBits - VkAttachmentSampleCountInfoNV* = object - VkMultiviewPerViewAttributesInfoNVX* = object - sType*: VkStructureType - pNext*: pointer - perViewAttributes*: VkBool32 - perViewAttributesPositionXOnly*: VkBool32 - VkPhysicalDeviceImageViewMinLodFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - minLod*: VkBool32 - VkImageViewMinLodCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - minLod*: float32 - VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - rasterizationOrderColorAttachmentAccess*: VkBool32 - rasterizationOrderDepthAttachmentAccess*: VkBool32 - rasterizationOrderStencilAttachmentAccess*: VkBool32 - VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM* = object - VkPhysicalDeviceLinearColorAttachmentFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - linearColorAttachment*: VkBool32 - VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - graphicsPipelineLibrary*: VkBool32 - VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - graphicsPipelineLibraryFastLinking*: VkBool32 - graphicsPipelineLibraryIndependentInterpolationDecoration*: VkBool32 - VkGraphicsPipelineLibraryCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkGraphicsPipelineLibraryFlagsEXT - VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE* = object - sType*: VkStructureType - pNext*: pointer - descriptorSetHostMapping*: VkBool32 - VkDescriptorSetBindingReferenceVALVE* = object - sType*: VkStructureType - pNext*: pointer - descriptorSetLayout*: VkDescriptorSetLayout - binding*: uint32 - VkDescriptorSetLayoutHostMappingInfoVALVE* = object - sType*: VkStructureType - pNext*: pointer - descriptorOffset*: csize_t - descriptorSize*: uint32 - VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - shaderModuleIdentifier*: VkBool32 - VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - shaderModuleIdentifierAlgorithmUUID*: array[VK_UUID_SIZE, uint8] - VkPipelineShaderStageModuleIdentifierCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - identifierSize*: uint32 - pIdentifier*: ptr uint8 - VkShaderModuleIdentifierEXT* = object - sType*: VkStructureType - pNext*: pointer - identifierSize*: uint32 - identifier*: array[VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT, uint8] - VkImageCompressionControlEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkImageCompressionFlagsEXT - compressionControlPlaneCount*: uint32 - pFixedRateFlags*: ptr VkImageCompressionFixedRateFlagsEXT - VkPhysicalDeviceImageCompressionControlFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - imageCompressionControl*: VkBool32 - VkImageCompressionPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - imageCompressionFlags*: VkImageCompressionFlagsEXT - imageCompressionFixedRateFlags*: VkImageCompressionFixedRateFlagsEXT - VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - imageCompressionControlSwapchain*: VkBool32 - VkImageSubresource2EXT* = object - sType*: VkStructureType - pNext*: pointer - imageSubresource*: VkImageSubresource - VkSubresourceLayout2EXT* = object - sType*: VkStructureType - pNext*: pointer - subresourceLayout*: VkSubresourceLayout - VkRenderPassCreationControlEXT* = object - sType*: VkStructureType - pNext*: pointer - disallowMerging*: VkBool32 - VkRenderPassCreationFeedbackInfoEXT* = object - postMergeSubpassCount*: uint32 - VkRenderPassCreationFeedbackCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - pRenderPassFeedback*: ptr VkRenderPassCreationFeedbackInfoEXT - VkRenderPassSubpassFeedbackInfoEXT* = object - subpassMergeStatus*: VkSubpassMergeStatusEXT - description*: array[VK_MAX_DESCRIPTION_SIZE, char] - postMergeIndex*: uint32 - VkRenderPassSubpassFeedbackCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - pSubpassFeedback*: ptr VkRenderPassSubpassFeedbackInfoEXT - VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - subpassMergeFeedback*: VkBool32 - VkMicromapBuildInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - thetype*: VkMicromapTypeEXT - flags*: VkBuildMicromapFlagsEXT - mode*: VkBuildMicromapModeEXT - dstMicromap*: VkMicromapEXT - usageCountsCount*: uint32 - pUsageCounts*: ptr VkMicromapUsageEXT - ppUsageCounts*: ptr ptr VkMicromapUsageEXT - data*: VkDeviceOrHostAddressConstKHR - scratchData*: VkDeviceOrHostAddressKHR - triangleArray*: VkDeviceOrHostAddressConstKHR - triangleArrayStride*: VkDeviceSize - VkMicromapCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - createFlags*: VkMicromapCreateFlagsEXT - buffer*: VkBuffer - offset*: VkDeviceSize - size*: VkDeviceSize - thetype*: VkMicromapTypeEXT - deviceAddress*: VkDeviceAddress - VkMicromapVersionInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - pVersionData*: ptr uint8 - VkCopyMicromapInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - src*: VkMicromapEXT - dst*: VkMicromapEXT - mode*: VkCopyMicromapModeEXT - VkCopyMicromapToMemoryInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - src*: VkMicromapEXT - dst*: VkDeviceOrHostAddressKHR - mode*: VkCopyMicromapModeEXT - VkCopyMemoryToMicromapInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - src*: VkDeviceOrHostAddressConstKHR - dst*: VkMicromapEXT - mode*: VkCopyMicromapModeEXT - VkMicromapBuildSizesInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - micromapSize*: VkDeviceSize - buildScratchSize*: VkDeviceSize - discardable*: VkBool32 - VkMicromapUsageEXT* = object - count*: uint32 - subdivisionLevel*: uint32 - format*: uint32 - VkMicromapTriangleEXT* = object - dataOffset*: uint32 - subdivisionLevel*: uint16 - format*: uint16 - VkPhysicalDeviceOpacityMicromapFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - micromap*: VkBool32 - micromapCaptureReplay*: VkBool32 - micromapHostCommands*: VkBool32 - VkPhysicalDeviceOpacityMicromapPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - maxOpacity2StateSubdivisionLevel*: uint32 - maxOpacity4StateSubdivisionLevel*: uint32 - VkAccelerationStructureTrianglesOpacityMicromapEXT* = object - sType*: VkStructureType - pNext*: pointer - indexType*: VkIndexType - indexBuffer*: VkDeviceOrHostAddressConstKHR - indexStride*: VkDeviceSize - baseTriangle*: uint32 - usageCountsCount*: uint32 - pUsageCounts*: ptr VkMicromapUsageEXT - ppUsageCounts*: ptr ptr VkMicromapUsageEXT - micromap*: VkMicromapEXT - VkPipelinePropertiesIdentifierEXT* = object - sType*: VkStructureType - pNext*: pointer - pipelineIdentifier*: array[VK_UUID_SIZE, uint8] - VkPhysicalDevicePipelinePropertiesFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - pipelinePropertiesIdentifier*: VkBool32 - VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD* = object - sType*: VkStructureType - pNext*: pointer - shaderEarlyAndLateFragmentTests*: VkBool32 - VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - nonSeamlessCubeMap*: VkBool32 - VkPhysicalDevicePipelineRobustnessFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - pipelineRobustness*: VkBool32 - VkPipelineRobustnessCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - storageBuffers*: VkPipelineRobustnessBufferBehaviorEXT - uniformBuffers*: VkPipelineRobustnessBufferBehaviorEXT - vertexInputs*: VkPipelineRobustnessBufferBehaviorEXT - images*: VkPipelineRobustnessImageBehaviorEXT - VkPhysicalDevicePipelineRobustnessPropertiesEXT* = object - sType*: VkStructureType - pNext*: pointer - defaultRobustnessStorageBuffers*: VkPipelineRobustnessBufferBehaviorEXT - defaultRobustnessUniformBuffers*: VkPipelineRobustnessBufferBehaviorEXT - defaultRobustnessVertexInputs*: VkPipelineRobustnessBufferBehaviorEXT - defaultRobustnessImages*: VkPipelineRobustnessImageBehaviorEXT - VkImageViewSampleWeightCreateInfoQCOM* = object - sType*: VkStructureType - pNext*: pointer - filterCenter*: VkOffset2D - filterSize*: VkExtent2D - numPhases*: uint32 - VkPhysicalDeviceImageProcessingFeaturesQCOM* = object - sType*: VkStructureType - pNext*: pointer - textureSampleWeighted*: VkBool32 - textureBoxFilter*: VkBool32 - textureBlockMatch*: VkBool32 - VkPhysicalDeviceImageProcessingPropertiesQCOM* = object - sType*: VkStructureType - pNext*: pointer - maxWeightFilterPhases*: uint32 - maxWeightFilterDimension*: VkExtent2D - maxBlockMatchRegion*: VkExtent2D - maxBoxFilterBlockSize*: VkExtent2D - VkPhysicalDeviceTilePropertiesFeaturesQCOM* = object - sType*: VkStructureType - pNext*: pointer - tileProperties*: VkBool32 - VkTilePropertiesQCOM* = object - sType*: VkStructureType - pNext*: pointer - tileSize*: VkExtent3D - apronSize*: VkExtent2D - origin*: VkOffset2D - VkPhysicalDeviceAmigoProfilingFeaturesSEC* = object - sType*: VkStructureType - pNext*: pointer - amigoProfiling*: VkBool32 - VkAmigoProfilingSubmitInfoSEC* = object - sType*: VkStructureType - pNext*: pointer - firstDrawTimestamp*: uint64 - swapBufferTimestamp*: uint64 - VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - attachmentFeedbackLoopLayout*: VkBool32 - VkPhysicalDeviceDepthClampZeroOneFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - depthClampZeroOne*: VkBool32 - VkPhysicalDeviceAddressBindingReportFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - reportAddressBinding*: VkBool32 - VkDeviceAddressBindingCallbackDataEXT* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDeviceAddressBindingFlagsEXT - baseAddress*: VkDeviceAddress - size*: VkDeviceSize - bindingType*: VkDeviceAddressBindingTypeEXT - VkPhysicalDeviceOpticalFlowFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - opticalFlow*: VkBool32 - VkPhysicalDeviceOpticalFlowPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - supportedOutputGridSizes*: VkOpticalFlowGridSizeFlagsNV - supportedHintGridSizes*: VkOpticalFlowGridSizeFlagsNV - hintSupported*: VkBool32 - costSupported*: VkBool32 - bidirectionalFlowSupported*: VkBool32 - globalFlowSupported*: VkBool32 - minWidth*: uint32 - minHeight*: uint32 - maxWidth*: uint32 - maxHeight*: uint32 - maxNumRegionsOfInterest*: uint32 - VkOpticalFlowImageFormatInfoNV* = object - sType*: VkStructureType - pNext*: pointer - usage*: VkOpticalFlowUsageFlagsNV - VkOpticalFlowImageFormatPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - format*: VkFormat - VkOpticalFlowSessionCreateInfoNV* = object - sType*: VkStructureType - pNext*: pointer - width*: uint32 - height*: uint32 - imageFormat*: VkFormat - flowVectorFormat*: VkFormat - costFormat*: VkFormat - outputGridSize*: VkOpticalFlowGridSizeFlagsNV - hintGridSize*: VkOpticalFlowGridSizeFlagsNV - performanceLevel*: VkOpticalFlowPerformanceLevelNV - flags*: VkOpticalFlowSessionCreateFlagsNV - VkOpticalFlowSessionCreatePrivateDataInfoNV* = object - sType*: VkStructureType - pNext*: pointer - id*: uint32 - size*: uint32 - pPrivateData*: pointer - VkOpticalFlowExecuteInfoNV* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkOpticalFlowExecuteFlagsNV - regionCount*: uint32 - pRegions*: ptr VkRect2D - VkPhysicalDeviceFaultFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - deviceFault*: VkBool32 - deviceFaultVendorBinary*: VkBool32 - VkDeviceFaultAddressInfoEXT* = object - addressType*: VkDeviceFaultAddressTypeEXT - reportedAddress*: VkDeviceAddress - addressPrecision*: VkDeviceSize - VkDeviceFaultVendorInfoEXT* = object - description*: array[VK_MAX_DESCRIPTION_SIZE, char] - vendorFaultCode*: uint64 - vendorFaultData*: uint64 - VkDeviceFaultCountsEXT* = object - sType*: VkStructureType - pNext*: pointer - addressInfoCount*: uint32 - vendorInfoCount*: uint32 - vendorBinarySize*: VkDeviceSize - VkDeviceFaultInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - description*: array[VK_MAX_DESCRIPTION_SIZE, char] - pAddressInfos*: ptr VkDeviceFaultAddressInfoEXT - pVendorInfos*: ptr VkDeviceFaultVendorInfoEXT - pVendorBinaryData*: pointer - VkDeviceFaultVendorBinaryHeaderVersionOneEXT* = object - headerSize*: uint32 - headerVersion*: VkDeviceFaultVendorBinaryHeaderVersionEXT - vendorID*: uint32 - deviceID*: uint32 - driverVersion*: uint32 - pipelineCacheUUID*: array[VK_UUID_SIZE, uint8] - applicationNameOffset*: uint32 - applicationVersion*: uint32 - engineNameOffset*: uint32 - VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - pipelineLibraryGroupHandles*: VkBool32 - VkDecompressMemoryRegionNV* = object - srcAddress*: VkDeviceAddress - dstAddress*: VkDeviceAddress - compressedSize*: VkDeviceSize - decompressedSize*: VkDeviceSize - decompressionMethod*: VkMemoryDecompressionMethodFlagsNV - VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM* = object - sType*: VkStructureType - pNext*: pointer - shaderCoreMask*: uint64 - shaderCoreCount*: uint32 - shaderWarpsPerCore*: uint32 - VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM* = object - sType*: VkStructureType - pNext*: pointer - shaderCoreBuiltins*: VkBool32 - VkSurfacePresentModeEXT* = object - sType*: VkStructureType - pNext*: pointer - presentMode*: VkPresentModeKHR - VkSurfacePresentScalingCapabilitiesEXT* = object - sType*: VkStructureType - pNext*: pointer - supportedPresentScaling*: VkPresentScalingFlagsEXT - supportedPresentGravityX*: VkPresentGravityFlagsEXT - supportedPresentGravityY*: VkPresentGravityFlagsEXT - minScaledImageExtent*: VkExtent2D - maxScaledImageExtent*: VkExtent2D - VkSurfacePresentModeCompatibilityEXT* = object - sType*: VkStructureType - pNext*: pointer - presentModeCount*: uint32 - pPresentModes*: ptr VkPresentModeKHR - VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* = object - sType*: VkStructureType - pNext*: pointer - swapchainMaintenance1*: VkBool32 - VkSwapchainPresentFenceInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - swapchainCount*: uint32 - pFences*: ptr VkFence - VkSwapchainPresentModesCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - presentModeCount*: uint32 - pPresentModes*: ptr VkPresentModeKHR - VkSwapchainPresentModeInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - swapchainCount*: uint32 - pPresentModes*: ptr VkPresentModeKHR - VkSwapchainPresentScalingCreateInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - scalingBehavior*: VkPresentScalingFlagsEXT - presentGravityX*: VkPresentGravityFlagsEXT - presentGravityY*: VkPresentGravityFlagsEXT - VkReleaseSwapchainImagesInfoEXT* = object - sType*: VkStructureType - pNext*: pointer - swapchain*: VkSwapchainKHR - imageIndexCount*: uint32 - pImageIndices*: ptr uint32 - VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV* = object - sType*: VkStructureType - pNext*: pointer - rayTracingInvocationReorder*: VkBool32 - VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV* = object - sType*: VkStructureType - pNext*: pointer - rayTracingInvocationReorderReorderingHint*: VkRayTracingInvocationReorderModeNV - VkDirectDriverLoadingInfoLUNARG* = object - sType*: VkStructureType - pNext*: pointer - flags*: VkDirectDriverLoadingFlagsLUNARG - pfnGetInstanceProcAddr*: PFN_vkGetInstanceProcAddrLUNARG - VkDirectDriverLoadingListLUNARG* = object - sType*: VkStructureType - pNext*: pointer - mode*: VkDirectDriverLoadingModeLUNARG - driverCount*: uint32 - pDrivers*: ptr VkDirectDriverLoadingInfoLUNARG - VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM* = object - sType*: VkStructureType - pNext*: pointer - multiviewPerViewViewports*: VkBool32 - VkPhysicalDeviceShaderCorePropertiesARM* = object - sType*: VkStructureType - pNext*: pointer - pixelRate*: uint32 - texelRate*: uint32 - fmaRate*: uint32 - VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM* = object - sType*: VkStructureType - pNext*: pointer - multiviewPerViewRenderAreas*: VkBool32 - VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM* = object - sType*: VkStructureType - pNext*: pointer - perViewRenderAreaCount*: uint32 - pPerViewRenderAreas*: ptr VkRect2D -# feature VK_VERSION_1_0 -var - vkCreateInstance*: proc(pCreateInfo: ptr VkInstanceCreateInfo, pAllocator: ptr VkAllocationCallbacks, pInstance: ptr VkInstance): VkResult {.stdcall.} - vkDestroyInstance*: proc(instance: VkInstance, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkEnumeratePhysicalDevices*: proc(instance: VkInstance, pPhysicalDeviceCount: ptr uint32, pPhysicalDevices: ptr VkPhysicalDevice): VkResult {.stdcall.} - vkGetPhysicalDeviceFeatures*: proc(physicalDevice: VkPhysicalDevice, pFeatures: ptr VkPhysicalDeviceFeatures): void {.stdcall.} - vkGetPhysicalDeviceFormatProperties*: proc(physicalDevice: VkPhysicalDevice, format: VkFormat, pFormatProperties: ptr VkFormatProperties): void {.stdcall.} - vkGetPhysicalDeviceImageFormatProperties*: proc(physicalDevice: VkPhysicalDevice, format: VkFormat, thetype: VkImageType, tiling: VkImageTiling, usage: VkImageUsageFlags, flags: VkImageCreateFlags, pImageFormatProperties: ptr VkImageFormatProperties): VkResult {.stdcall.} - vkGetPhysicalDeviceProperties*: proc(physicalDevice: VkPhysicalDevice, pProperties: ptr VkPhysicalDeviceProperties): void {.stdcall.} - vkGetPhysicalDeviceQueueFamilyProperties*: proc(physicalDevice: VkPhysicalDevice, pQueueFamilyPropertyCount: ptr uint32, pQueueFamilyProperties: ptr VkQueueFamilyProperties): void {.stdcall.} - vkGetPhysicalDeviceMemoryProperties*: proc(physicalDevice: VkPhysicalDevice, pMemoryProperties: ptr VkPhysicalDeviceMemoryProperties): void {.stdcall.} - vkGetDeviceProcAddr*: proc(device: VkDevice, pName: cstring): PFN_vkVoidFunction {.stdcall.} - vkCreateDevice*: proc(physicalDevice: VkPhysicalDevice, pCreateInfo: ptr VkDeviceCreateInfo, pAllocator: ptr VkAllocationCallbacks, pDevice: ptr VkDevice): VkResult {.stdcall.} - vkDestroyDevice*: proc(device: VkDevice, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkEnumerateInstanceExtensionProperties*: proc(pLayerName: cstring, pPropertyCount: ptr uint32, pProperties: ptr VkExtensionProperties): VkResult {.stdcall.} - vkEnumerateDeviceExtensionProperties*: proc(physicalDevice: VkPhysicalDevice, pLayerName: cstring, pPropertyCount: ptr uint32, pProperties: ptr VkExtensionProperties): VkResult {.stdcall.} - vkEnumerateInstanceLayerProperties*: proc(pPropertyCount: ptr uint32, pProperties: ptr VkLayerProperties): VkResult {.stdcall.} - vkEnumerateDeviceLayerProperties*: proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkLayerProperties): VkResult {.stdcall.} - vkGetDeviceQueue*: proc(device: VkDevice, queueFamilyIndex: uint32, queueIndex: uint32, pQueue: ptr VkQueue): void {.stdcall.} - vkQueueSubmit*: proc(queue: VkQueue, submitCount: uint32, pSubmits: ptr VkSubmitInfo, fence: VkFence): VkResult {.stdcall.} - vkQueueWaitIdle*: proc(queue: VkQueue): VkResult {.stdcall.} - vkDeviceWaitIdle*: proc(device: VkDevice): VkResult {.stdcall.} - vkAllocateMemory*: proc(device: VkDevice, pAllocateInfo: ptr VkMemoryAllocateInfo, pAllocator: ptr VkAllocationCallbacks, pMemory: ptr VkDeviceMemory): VkResult {.stdcall.} - vkFreeMemory*: proc(device: VkDevice, memory: VkDeviceMemory, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkMapMemory*: proc(device: VkDevice, memory: VkDeviceMemory, offset: VkDeviceSize, size: VkDeviceSize, flags: VkMemoryMapFlags, ppData: ptr pointer): VkResult {.stdcall.} - vkUnmapMemory*: proc(device: VkDevice, memory: VkDeviceMemory): void {.stdcall.} - vkFlushMappedMemoryRanges*: proc(device: VkDevice, memoryRangeCount: uint32, pMemoryRanges: ptr VkMappedMemoryRange): VkResult {.stdcall.} - vkInvalidateMappedMemoryRanges*: proc(device: VkDevice, memoryRangeCount: uint32, pMemoryRanges: ptr VkMappedMemoryRange): VkResult {.stdcall.} - vkGetDeviceMemoryCommitment*: proc(device: VkDevice, memory: VkDeviceMemory, pCommittedMemoryInBytes: ptr VkDeviceSize): void {.stdcall.} - vkBindBufferMemory*: proc(device: VkDevice, buffer: VkBuffer, memory: VkDeviceMemory, memoryOffset: VkDeviceSize): VkResult {.stdcall.} - vkBindImageMemory*: proc(device: VkDevice, image: VkImage, memory: VkDeviceMemory, memoryOffset: VkDeviceSize): VkResult {.stdcall.} - vkGetBufferMemoryRequirements*: proc(device: VkDevice, buffer: VkBuffer, pMemoryRequirements: ptr VkMemoryRequirements): void {.stdcall.} - vkGetImageMemoryRequirements*: proc(device: VkDevice, image: VkImage, pMemoryRequirements: ptr VkMemoryRequirements): void {.stdcall.} - vkGetImageSparseMemoryRequirements*: proc(device: VkDevice, image: VkImage, pSparseMemoryRequirementCount: ptr uint32, pSparseMemoryRequirements: ptr VkSparseImageMemoryRequirements): void {.stdcall.} - vkGetPhysicalDeviceSparseImageFormatProperties*: proc(physicalDevice: VkPhysicalDevice, format: VkFormat, thetype: VkImageType, samples: VkSampleCountFlagBits, usage: VkImageUsageFlags, tiling: VkImageTiling, pPropertyCount: ptr uint32, pProperties: ptr VkSparseImageFormatProperties): void {.stdcall.} - vkQueueBindSparse*: proc(queue: VkQueue, bindInfoCount: uint32, pBindInfo: ptr VkBindSparseInfo, fence: VkFence): VkResult {.stdcall.} - vkCreateFence*: proc(device: VkDevice, pCreateInfo: ptr VkFenceCreateInfo, pAllocator: ptr VkAllocationCallbacks, pFence: ptr VkFence): VkResult {.stdcall.} - vkDestroyFence*: proc(device: VkDevice, fence: VkFence, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkResetFences*: proc(device: VkDevice, fenceCount: uint32, pFences: ptr VkFence): VkResult {.stdcall.} - vkGetFenceStatus*: proc(device: VkDevice, fence: VkFence): VkResult {.stdcall.} - vkWaitForFences*: proc(device: VkDevice, fenceCount: uint32, pFences: ptr VkFence, waitAll: VkBool32, timeout: uint64): VkResult {.stdcall.} - vkCreateSemaphore*: proc(device: VkDevice, pCreateInfo: ptr VkSemaphoreCreateInfo, pAllocator: ptr VkAllocationCallbacks, pSemaphore: ptr VkSemaphore): VkResult {.stdcall.} - vkDestroySemaphore*: proc(device: VkDevice, semaphore: VkSemaphore, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreateEvent*: proc(device: VkDevice, pCreateInfo: ptr VkEventCreateInfo, pAllocator: ptr VkAllocationCallbacks, pEvent: ptr VkEvent): VkResult {.stdcall.} - vkDestroyEvent*: proc(device: VkDevice, event: VkEvent, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkGetEventStatus*: proc(device: VkDevice, event: VkEvent): VkResult {.stdcall.} - vkSetEvent*: proc(device: VkDevice, event: VkEvent): VkResult {.stdcall.} - vkResetEvent*: proc(device: VkDevice, event: VkEvent): VkResult {.stdcall.} - vkCreateQueryPool*: proc(device: VkDevice, pCreateInfo: ptr VkQueryPoolCreateInfo, pAllocator: ptr VkAllocationCallbacks, pQueryPool: ptr VkQueryPool): VkResult {.stdcall.} - vkDestroyQueryPool*: proc(device: VkDevice, queryPool: VkQueryPool, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkGetQueryPoolResults*: proc(device: VkDevice, queryPool: VkQueryPool, firstQuery: uint32, queryCount: uint32, dataSize: csize_t, pData: pointer, stride: VkDeviceSize, flags: VkQueryResultFlags): VkResult {.stdcall.} - vkCreateBuffer*: proc(device: VkDevice, pCreateInfo: ptr VkBufferCreateInfo, pAllocator: ptr VkAllocationCallbacks, pBuffer: ptr VkBuffer): VkResult {.stdcall.} - vkDestroyBuffer*: proc(device: VkDevice, buffer: VkBuffer, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreateBufferView*: proc(device: VkDevice, pCreateInfo: ptr VkBufferViewCreateInfo, pAllocator: ptr VkAllocationCallbacks, pView: ptr VkBufferView): VkResult {.stdcall.} - vkDestroyBufferView*: proc(device: VkDevice, bufferView: VkBufferView, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreateImage*: proc(device: VkDevice, pCreateInfo: ptr VkImageCreateInfo, pAllocator: ptr VkAllocationCallbacks, pImage: ptr VkImage): VkResult {.stdcall.} - vkDestroyImage*: proc(device: VkDevice, image: VkImage, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkGetImageSubresourceLayout*: proc(device: VkDevice, image: VkImage, pSubresource: ptr VkImageSubresource, pLayout: ptr VkSubresourceLayout): void {.stdcall.} - vkCreateImageView*: proc(device: VkDevice, pCreateInfo: ptr VkImageViewCreateInfo, pAllocator: ptr VkAllocationCallbacks, pView: ptr VkImageView): VkResult {.stdcall.} - vkDestroyImageView*: proc(device: VkDevice, imageView: VkImageView, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreateShaderModule*: proc(device: VkDevice, pCreateInfo: ptr VkShaderModuleCreateInfo, pAllocator: ptr VkAllocationCallbacks, pShaderModule: ptr VkShaderModule): VkResult {.stdcall.} - vkDestroyShaderModule*: proc(device: VkDevice, shaderModule: VkShaderModule, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreatePipelineCache*: proc(device: VkDevice, pCreateInfo: ptr VkPipelineCacheCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPipelineCache: ptr VkPipelineCache): VkResult {.stdcall.} - vkDestroyPipelineCache*: proc(device: VkDevice, pipelineCache: VkPipelineCache, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkGetPipelineCacheData*: proc(device: VkDevice, pipelineCache: VkPipelineCache, pDataSize: ptr csize_t, pData: pointer): VkResult {.stdcall.} - vkMergePipelineCaches*: proc(device: VkDevice, dstCache: VkPipelineCache, srcCacheCount: uint32, pSrcCaches: ptr VkPipelineCache): VkResult {.stdcall.} - vkCreateGraphicsPipelines*: proc(device: VkDevice, pipelineCache: VkPipelineCache, createInfoCount: uint32, pCreateInfos: ptr VkGraphicsPipelineCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPipelines: ptr VkPipeline): VkResult {.stdcall.} - vkCreateComputePipelines*: proc(device: VkDevice, pipelineCache: VkPipelineCache, createInfoCount: uint32, pCreateInfos: ptr VkComputePipelineCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPipelines: ptr VkPipeline): VkResult {.stdcall.} - vkDestroyPipeline*: proc(device: VkDevice, pipeline: VkPipeline, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreatePipelineLayout*: proc(device: VkDevice, pCreateInfo: ptr VkPipelineLayoutCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPipelineLayout: ptr VkPipelineLayout): VkResult {.stdcall.} - vkDestroyPipelineLayout*: proc(device: VkDevice, pipelineLayout: VkPipelineLayout, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreateSampler*: proc(device: VkDevice, pCreateInfo: ptr VkSamplerCreateInfo, pAllocator: ptr VkAllocationCallbacks, pSampler: ptr VkSampler): VkResult {.stdcall.} - vkDestroySampler*: proc(device: VkDevice, sampler: VkSampler, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreateDescriptorSetLayout*: proc(device: VkDevice, pCreateInfo: ptr VkDescriptorSetLayoutCreateInfo, pAllocator: ptr VkAllocationCallbacks, pSetLayout: ptr VkDescriptorSetLayout): VkResult {.stdcall.} - vkDestroyDescriptorSetLayout*: proc(device: VkDevice, descriptorSetLayout: VkDescriptorSetLayout, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreateDescriptorPool*: proc(device: VkDevice, pCreateInfo: ptr VkDescriptorPoolCreateInfo, pAllocator: ptr VkAllocationCallbacks, pDescriptorPool: ptr VkDescriptorPool): VkResult {.stdcall.} - vkDestroyDescriptorPool*: proc(device: VkDevice, descriptorPool: VkDescriptorPool, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkResetDescriptorPool*: proc(device: VkDevice, descriptorPool: VkDescriptorPool, flags: VkDescriptorPoolResetFlags): VkResult {.stdcall.} - vkAllocateDescriptorSets*: proc(device: VkDevice, pAllocateInfo: ptr VkDescriptorSetAllocateInfo, pDescriptorSets: ptr VkDescriptorSet): VkResult {.stdcall.} - vkFreeDescriptorSets*: proc(device: VkDevice, descriptorPool: VkDescriptorPool, descriptorSetCount: uint32, pDescriptorSets: ptr VkDescriptorSet): VkResult {.stdcall.} - vkUpdateDescriptorSets*: proc(device: VkDevice, descriptorWriteCount: uint32, pDescriptorWrites: ptr VkWriteDescriptorSet, descriptorCopyCount: uint32, pDescriptorCopies: ptr VkCopyDescriptorSet): void {.stdcall.} - vkCreateFramebuffer*: proc(device: VkDevice, pCreateInfo: ptr VkFramebufferCreateInfo, pAllocator: ptr VkAllocationCallbacks, pFramebuffer: ptr VkFramebuffer): VkResult {.stdcall.} - vkDestroyFramebuffer*: proc(device: VkDevice, framebuffer: VkFramebuffer, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreateRenderPass*: proc(device: VkDevice, pCreateInfo: ptr VkRenderPassCreateInfo, pAllocator: ptr VkAllocationCallbacks, pRenderPass: ptr VkRenderPass): VkResult {.stdcall.} - vkDestroyRenderPass*: proc(device: VkDevice, renderPass: VkRenderPass, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkGetRenderAreaGranularity*: proc(device: VkDevice, renderPass: VkRenderPass, pGranularity: ptr VkExtent2D): void {.stdcall.} - vkCreateCommandPool*: proc(device: VkDevice, pCreateInfo: ptr VkCommandPoolCreateInfo, pAllocator: ptr VkAllocationCallbacks, pCommandPool: ptr VkCommandPool): VkResult {.stdcall.} - vkDestroyCommandPool*: proc(device: VkDevice, commandPool: VkCommandPool, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkResetCommandPool*: proc(device: VkDevice, commandPool: VkCommandPool, flags: VkCommandPoolResetFlags): VkResult {.stdcall.} - vkAllocateCommandBuffers*: proc(device: VkDevice, pAllocateInfo: ptr VkCommandBufferAllocateInfo, pCommandBuffers: ptr VkCommandBuffer): VkResult {.stdcall.} - vkFreeCommandBuffers*: proc(device: VkDevice, commandPool: VkCommandPool, commandBufferCount: uint32, pCommandBuffers: ptr VkCommandBuffer): void {.stdcall.} - vkBeginCommandBuffer*: proc(commandBuffer: VkCommandBuffer, pBeginInfo: ptr VkCommandBufferBeginInfo): VkResult {.stdcall.} - vkEndCommandBuffer*: proc(commandBuffer: VkCommandBuffer): VkResult {.stdcall.} - vkResetCommandBuffer*: proc(commandBuffer: VkCommandBuffer, flags: VkCommandBufferResetFlags): VkResult {.stdcall.} - vkCmdBindPipeline*: proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, pipeline: VkPipeline): void {.stdcall.} - vkCmdSetViewport*: proc(commandBuffer: VkCommandBuffer, firstViewport: uint32, viewportCount: uint32, pViewports: ptr VkViewport): void {.stdcall.} - vkCmdSetScissor*: proc(commandBuffer: VkCommandBuffer, firstScissor: uint32, scissorCount: uint32, pScissors: ptr VkRect2D): void {.stdcall.} - vkCmdSetLineWidth*: proc(commandBuffer: VkCommandBuffer, lineWidth: float32): void {.stdcall.} - vkCmdSetDepthBias*: proc(commandBuffer: VkCommandBuffer, depthBiasConstantFactor: float32, depthBiasClamp: float32, depthBiasSlopeFactor: float32): void {.stdcall.} - vkCmdSetBlendConstants*: proc(commandBuffer: VkCommandBuffer, blendConstants: array[4, float32]): void {.stdcall.} - vkCmdSetDepthBounds*: proc(commandBuffer: VkCommandBuffer, minDepthBounds: float32, maxDepthBounds: float32): void {.stdcall.} - vkCmdSetStencilCompareMask*: proc(commandBuffer: VkCommandBuffer, faceMask: VkStencilFaceFlags, compareMask: uint32): void {.stdcall.} - vkCmdSetStencilWriteMask*: proc(commandBuffer: VkCommandBuffer, faceMask: VkStencilFaceFlags, writeMask: uint32): void {.stdcall.} - vkCmdSetStencilReference*: proc(commandBuffer: VkCommandBuffer, faceMask: VkStencilFaceFlags, reference: uint32): void {.stdcall.} - vkCmdBindDescriptorSets*: proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, layout: VkPipelineLayout, firstSet: uint32, descriptorSetCount: uint32, pDescriptorSets: ptr VkDescriptorSet, dynamicOffsetCount: uint32, pDynamicOffsets: ptr uint32): void {.stdcall.} - vkCmdBindIndexBuffer*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, indexType: VkIndexType): void {.stdcall.} - vkCmdBindVertexBuffers*: proc(commandBuffer: VkCommandBuffer, firstBinding: uint32, bindingCount: uint32, pBuffers: ptr VkBuffer, pOffsets: ptr VkDeviceSize): void {.stdcall.} - vkCmdDraw*: proc(commandBuffer: VkCommandBuffer, vertexCount: uint32, instanceCount: uint32, firstVertex: uint32, firstInstance: uint32): void {.stdcall.} - vkCmdDrawIndexed*: proc(commandBuffer: VkCommandBuffer, indexCount: uint32, instanceCount: uint32, firstIndex: uint32, vertexOffset: int32, firstInstance: uint32): void {.stdcall.} - vkCmdDrawIndirect*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, drawCount: uint32, stride: uint32): void {.stdcall.} - vkCmdDrawIndexedIndirect*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, drawCount: uint32, stride: uint32): void {.stdcall.} - vkCmdDispatch*: proc(commandBuffer: VkCommandBuffer, groupCountX: uint32, groupCountY: uint32, groupCountZ: uint32): void {.stdcall.} - vkCmdDispatchIndirect*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize): void {.stdcall.} - vkCmdCopyBuffer*: proc(commandBuffer: VkCommandBuffer, srcBuffer: VkBuffer, dstBuffer: VkBuffer, regionCount: uint32, pRegions: ptr VkBufferCopy): void {.stdcall.} - vkCmdCopyImage*: proc(commandBuffer: VkCommandBuffer, srcImage: VkImage, srcImageLayout: VkImageLayout, dstImage: VkImage, dstImageLayout: VkImageLayout, regionCount: uint32, pRegions: ptr VkImageCopy): void {.stdcall.} - vkCmdBlitImage*: proc(commandBuffer: VkCommandBuffer, srcImage: VkImage, srcImageLayout: VkImageLayout, dstImage: VkImage, dstImageLayout: VkImageLayout, regionCount: uint32, pRegions: ptr VkImageBlit, filter: VkFilter): void {.stdcall.} - vkCmdCopyBufferToImage*: proc(commandBuffer: VkCommandBuffer, srcBuffer: VkBuffer, dstImage: VkImage, dstImageLayout: VkImageLayout, regionCount: uint32, pRegions: ptr VkBufferImageCopy): void {.stdcall.} - vkCmdCopyImageToBuffer*: proc(commandBuffer: VkCommandBuffer, srcImage: VkImage, srcImageLayout: VkImageLayout, dstBuffer: VkBuffer, regionCount: uint32, pRegions: ptr VkBufferImageCopy): void {.stdcall.} - vkCmdUpdateBuffer*: proc(commandBuffer: VkCommandBuffer, dstBuffer: VkBuffer, dstOffset: VkDeviceSize, dataSize: VkDeviceSize, pData: pointer): void {.stdcall.} - vkCmdFillBuffer*: proc(commandBuffer: VkCommandBuffer, dstBuffer: VkBuffer, dstOffset: VkDeviceSize, size: VkDeviceSize, data: uint32): void {.stdcall.} - vkCmdClearColorImage*: proc(commandBuffer: VkCommandBuffer, image: VkImage, imageLayout: VkImageLayout, pColor: ptr VkClearColorValue, rangeCount: uint32, pRanges: ptr VkImageSubresourceRange): void {.stdcall.} - vkCmdClearDepthStencilImage*: proc(commandBuffer: VkCommandBuffer, image: VkImage, imageLayout: VkImageLayout, pDepthStencil: ptr VkClearDepthStencilValue, rangeCount: uint32, pRanges: ptr VkImageSubresourceRange): void {.stdcall.} - vkCmdClearAttachments*: proc(commandBuffer: VkCommandBuffer, attachmentCount: uint32, pAttachments: ptr VkClearAttachment, rectCount: uint32, pRects: ptr VkClearRect): void {.stdcall.} - vkCmdResolveImage*: proc(commandBuffer: VkCommandBuffer, srcImage: VkImage, srcImageLayout: VkImageLayout, dstImage: VkImage, dstImageLayout: VkImageLayout, regionCount: uint32, pRegions: ptr VkImageResolve): void {.stdcall.} - vkCmdSetEvent*: proc(commandBuffer: VkCommandBuffer, event: VkEvent, stageMask: VkPipelineStageFlags): void {.stdcall.} - vkCmdResetEvent*: proc(commandBuffer: VkCommandBuffer, event: VkEvent, stageMask: VkPipelineStageFlags): void {.stdcall.} - vkCmdWaitEvents*: proc(commandBuffer: VkCommandBuffer, eventCount: uint32, pEvents: ptr VkEvent, srcStageMask: VkPipelineStageFlags, dstStageMask: VkPipelineStageFlags, memoryBarrierCount: uint32, pMemoryBarriers: ptr VkMemoryBarrier, bufferMemoryBarrierCount: uint32, pBufferMemoryBarriers: ptr VkBufferMemoryBarrier, imageMemoryBarrierCount: uint32, pImageMemoryBarriers: ptr VkImageMemoryBarrier): void {.stdcall.} - vkCmdPipelineBarrier*: proc(commandBuffer: VkCommandBuffer, srcStageMask: VkPipelineStageFlags, dstStageMask: VkPipelineStageFlags, dependencyFlags: VkDependencyFlags, memoryBarrierCount: uint32, pMemoryBarriers: ptr VkMemoryBarrier, bufferMemoryBarrierCount: uint32, pBufferMemoryBarriers: ptr VkBufferMemoryBarrier, imageMemoryBarrierCount: uint32, pImageMemoryBarriers: ptr VkImageMemoryBarrier): void {.stdcall.} - vkCmdBeginQuery*: proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, query: uint32, flags: VkQueryControlFlags): void {.stdcall.} - vkCmdEndQuery*: proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, query: uint32): void {.stdcall.} - vkCmdResetQueryPool*: proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, firstQuery: uint32, queryCount: uint32): void {.stdcall.} - vkCmdWriteTimestamp*: proc(commandBuffer: VkCommandBuffer, pipelineStage: VkPipelineStageFlagBits, queryPool: VkQueryPool, query: uint32): void {.stdcall.} - vkCmdCopyQueryPoolResults*: proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, firstQuery: uint32, queryCount: uint32, dstBuffer: VkBuffer, dstOffset: VkDeviceSize, stride: VkDeviceSize, flags: VkQueryResultFlags): void {.stdcall.} - vkCmdPushConstants*: proc(commandBuffer: VkCommandBuffer, layout: VkPipelineLayout, stageFlags: VkShaderStageFlags, offset: uint32, size: uint32, pValues: pointer): void {.stdcall.} - vkCmdBeginRenderPass*: proc(commandBuffer: VkCommandBuffer, pRenderPassBegin: ptr VkRenderPassBeginInfo, contents: VkSubpassContents): void {.stdcall.} - vkCmdNextSubpass*: proc(commandBuffer: VkCommandBuffer, contents: VkSubpassContents): void {.stdcall.} - vkCmdEndRenderPass*: proc(commandBuffer: VkCommandBuffer): void {.stdcall.} - vkCmdExecuteCommands*: proc(commandBuffer: VkCommandBuffer, commandBufferCount: uint32, pCommandBuffers: ptr VkCommandBuffer): void {.stdcall.} -proc loadVK_VERSION_1_0*(instance: VkInstance) = - vkDestroyInstance = cast[proc(instance: VkInstance, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyInstance")) - vkEnumeratePhysicalDevices = cast[proc(instance: VkInstance, pPhysicalDeviceCount: ptr uint32, pPhysicalDevices: ptr VkPhysicalDevice): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices")) - vkGetPhysicalDeviceFeatures = cast[proc(physicalDevice: VkPhysicalDevice, pFeatures: ptr VkPhysicalDeviceFeatures): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures")) - vkGetPhysicalDeviceFormatProperties = cast[proc(physicalDevice: VkPhysicalDevice, format: VkFormat, pFormatProperties: ptr VkFormatProperties): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties")) - vkGetPhysicalDeviceImageFormatProperties = cast[proc(physicalDevice: VkPhysicalDevice, format: VkFormat, thetype: VkImageType, tiling: VkImageTiling, usage: VkImageUsageFlags, flags: VkImageCreateFlags, pImageFormatProperties: ptr VkImageFormatProperties): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties")) - vkGetPhysicalDeviceProperties = cast[proc(physicalDevice: VkPhysicalDevice, pProperties: ptr VkPhysicalDeviceProperties): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties")) - vkGetPhysicalDeviceQueueFamilyProperties = cast[proc(physicalDevice: VkPhysicalDevice, pQueueFamilyPropertyCount: ptr uint32, pQueueFamilyProperties: ptr VkQueueFamilyProperties): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties")) - vkGetPhysicalDeviceMemoryProperties = cast[proc(physicalDevice: VkPhysicalDevice, pMemoryProperties: ptr VkPhysicalDeviceMemoryProperties): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties")) - vkGetDeviceProcAddr = cast[proc(device: VkDevice, pName: cstring): PFN_vkVoidFunction {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceProcAddr")) - vkCreateDevice = cast[proc(physicalDevice: VkPhysicalDevice, pCreateInfo: ptr VkDeviceCreateInfo, pAllocator: ptr VkAllocationCallbacks, pDevice: ptr VkDevice): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateDevice")) - vkDestroyDevice = cast[proc(device: VkDevice, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyDevice")) - vkEnumerateDeviceExtensionProperties = cast[proc(physicalDevice: VkPhysicalDevice, pLayerName: cstring, pPropertyCount: ptr uint32, pProperties: ptr VkExtensionProperties): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties")) - vkEnumerateDeviceLayerProperties = cast[proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkLayerProperties): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties")) - vkGetDeviceQueue = cast[proc(device: VkDevice, queueFamilyIndex: uint32, queueIndex: uint32, pQueue: ptr VkQueue): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceQueue")) - vkQueueSubmit = cast[proc(queue: VkQueue, submitCount: uint32, pSubmits: ptr VkSubmitInfo, fence: VkFence): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkQueueSubmit")) - vkQueueWaitIdle = cast[proc(queue: VkQueue): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkQueueWaitIdle")) - vkDeviceWaitIdle = cast[proc(device: VkDevice): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDeviceWaitIdle")) - vkAllocateMemory = cast[proc(device: VkDevice, pAllocateInfo: ptr VkMemoryAllocateInfo, pAllocator: ptr VkAllocationCallbacks, pMemory: ptr VkDeviceMemory): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkAllocateMemory")) - vkFreeMemory = cast[proc(device: VkDevice, memory: VkDeviceMemory, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkFreeMemory")) - vkMapMemory = cast[proc(device: VkDevice, memory: VkDeviceMemory, offset: VkDeviceSize, size: VkDeviceSize, flags: VkMemoryMapFlags, ppData: ptr pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkMapMemory")) - vkUnmapMemory = cast[proc(device: VkDevice, memory: VkDeviceMemory): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkUnmapMemory")) - vkFlushMappedMemoryRanges = cast[proc(device: VkDevice, memoryRangeCount: uint32, pMemoryRanges: ptr VkMappedMemoryRange): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkFlushMappedMemoryRanges")) - vkInvalidateMappedMemoryRanges = cast[proc(device: VkDevice, memoryRangeCount: uint32, pMemoryRanges: ptr VkMappedMemoryRange): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkInvalidateMappedMemoryRanges")) - vkGetDeviceMemoryCommitment = cast[proc(device: VkDevice, memory: VkDeviceMemory, pCommittedMemoryInBytes: ptr VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceMemoryCommitment")) - vkBindBufferMemory = cast[proc(device: VkDevice, buffer: VkBuffer, memory: VkDeviceMemory, memoryOffset: VkDeviceSize): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkBindBufferMemory")) - vkBindImageMemory = cast[proc(device: VkDevice, image: VkImage, memory: VkDeviceMemory, memoryOffset: VkDeviceSize): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkBindImageMemory")) - vkGetBufferMemoryRequirements = cast[proc(device: VkDevice, buffer: VkBuffer, pMemoryRequirements: ptr VkMemoryRequirements): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements")) - vkGetImageMemoryRequirements = cast[proc(device: VkDevice, image: VkImage, pMemoryRequirements: ptr VkMemoryRequirements): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageMemoryRequirements")) - vkGetImageSparseMemoryRequirements = cast[proc(device: VkDevice, image: VkImage, pSparseMemoryRequirementCount: ptr uint32, pSparseMemoryRequirements: ptr VkSparseImageMemoryRequirements): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements")) - vkGetPhysicalDeviceSparseImageFormatProperties = cast[proc(physicalDevice: VkPhysicalDevice, format: VkFormat, thetype: VkImageType, samples: VkSampleCountFlagBits, usage: VkImageUsageFlags, tiling: VkImageTiling, pPropertyCount: ptr uint32, pProperties: ptr VkSparseImageFormatProperties): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties")) - vkQueueBindSparse = cast[proc(queue: VkQueue, bindInfoCount: uint32, pBindInfo: ptr VkBindSparseInfo, fence: VkFence): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkQueueBindSparse")) - vkCreateFence = cast[proc(device: VkDevice, pCreateInfo: ptr VkFenceCreateInfo, pAllocator: ptr VkAllocationCallbacks, pFence: ptr VkFence): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateFence")) - vkDestroyFence = cast[proc(device: VkDevice, fence: VkFence, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyFence")) - vkResetFences = cast[proc(device: VkDevice, fenceCount: uint32, pFences: ptr VkFence): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkResetFences")) - vkGetFenceStatus = cast[proc(device: VkDevice, fence: VkFence): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetFenceStatus")) - vkWaitForFences = cast[proc(device: VkDevice, fenceCount: uint32, pFences: ptr VkFence, waitAll: VkBool32, timeout: uint64): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkWaitForFences")) - vkCreateSemaphore = cast[proc(device: VkDevice, pCreateInfo: ptr VkSemaphoreCreateInfo, pAllocator: ptr VkAllocationCallbacks, pSemaphore: ptr VkSemaphore): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateSemaphore")) - vkDestroySemaphore = cast[proc(device: VkDevice, semaphore: VkSemaphore, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroySemaphore")) - vkCreateEvent = cast[proc(device: VkDevice, pCreateInfo: ptr VkEventCreateInfo, pAllocator: ptr VkAllocationCallbacks, pEvent: ptr VkEvent): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateEvent")) - vkDestroyEvent = cast[proc(device: VkDevice, event: VkEvent, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyEvent")) - vkGetEventStatus = cast[proc(device: VkDevice, event: VkEvent): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetEventStatus")) - vkSetEvent = cast[proc(device: VkDevice, event: VkEvent): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkSetEvent")) - vkResetEvent = cast[proc(device: VkDevice, event: VkEvent): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkResetEvent")) - vkCreateQueryPool = cast[proc(device: VkDevice, pCreateInfo: ptr VkQueryPoolCreateInfo, pAllocator: ptr VkAllocationCallbacks, pQueryPool: ptr VkQueryPool): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateQueryPool")) - vkDestroyQueryPool = cast[proc(device: VkDevice, queryPool: VkQueryPool, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyQueryPool")) - vkGetQueryPoolResults = cast[proc(device: VkDevice, queryPool: VkQueryPool, firstQuery: uint32, queryCount: uint32, dataSize: csize_t, pData: pointer, stride: VkDeviceSize, flags: VkQueryResultFlags): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetQueryPoolResults")) - vkCreateBuffer = cast[proc(device: VkDevice, pCreateInfo: ptr VkBufferCreateInfo, pAllocator: ptr VkAllocationCallbacks, pBuffer: ptr VkBuffer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateBuffer")) - vkDestroyBuffer = cast[proc(device: VkDevice, buffer: VkBuffer, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyBuffer")) - vkCreateBufferView = cast[proc(device: VkDevice, pCreateInfo: ptr VkBufferViewCreateInfo, pAllocator: ptr VkAllocationCallbacks, pView: ptr VkBufferView): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateBufferView")) - vkDestroyBufferView = cast[proc(device: VkDevice, bufferView: VkBufferView, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyBufferView")) - vkCreateImage = cast[proc(device: VkDevice, pCreateInfo: ptr VkImageCreateInfo, pAllocator: ptr VkAllocationCallbacks, pImage: ptr VkImage): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateImage")) - vkDestroyImage = cast[proc(device: VkDevice, image: VkImage, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyImage")) - vkGetImageSubresourceLayout = cast[proc(device: VkDevice, image: VkImage, pSubresource: ptr VkImageSubresource, pLayout: ptr VkSubresourceLayout): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageSubresourceLayout")) - vkCreateImageView = cast[proc(device: VkDevice, pCreateInfo: ptr VkImageViewCreateInfo, pAllocator: ptr VkAllocationCallbacks, pView: ptr VkImageView): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateImageView")) - vkDestroyImageView = cast[proc(device: VkDevice, imageView: VkImageView, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyImageView")) - vkCreateShaderModule = cast[proc(device: VkDevice, pCreateInfo: ptr VkShaderModuleCreateInfo, pAllocator: ptr VkAllocationCallbacks, pShaderModule: ptr VkShaderModule): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateShaderModule")) - vkDestroyShaderModule = cast[proc(device: VkDevice, shaderModule: VkShaderModule, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyShaderModule")) - vkCreatePipelineCache = cast[proc(device: VkDevice, pCreateInfo: ptr VkPipelineCacheCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPipelineCache: ptr VkPipelineCache): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreatePipelineCache")) - vkDestroyPipelineCache = cast[proc(device: VkDevice, pipelineCache: VkPipelineCache, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyPipelineCache")) - vkGetPipelineCacheData = cast[proc(device: VkDevice, pipelineCache: VkPipelineCache, pDataSize: ptr csize_t, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPipelineCacheData")) - vkMergePipelineCaches = cast[proc(device: VkDevice, dstCache: VkPipelineCache, srcCacheCount: uint32, pSrcCaches: ptr VkPipelineCache): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkMergePipelineCaches")) - vkCreateGraphicsPipelines = cast[proc(device: VkDevice, pipelineCache: VkPipelineCache, createInfoCount: uint32, pCreateInfos: ptr VkGraphicsPipelineCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPipelines: ptr VkPipeline): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateGraphicsPipelines")) - vkCreateComputePipelines = cast[proc(device: VkDevice, pipelineCache: VkPipelineCache, createInfoCount: uint32, pCreateInfos: ptr VkComputePipelineCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPipelines: ptr VkPipeline): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateComputePipelines")) - vkDestroyPipeline = cast[proc(device: VkDevice, pipeline: VkPipeline, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyPipeline")) - vkCreatePipelineLayout = cast[proc(device: VkDevice, pCreateInfo: ptr VkPipelineLayoutCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPipelineLayout: ptr VkPipelineLayout): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreatePipelineLayout")) - vkDestroyPipelineLayout = cast[proc(device: VkDevice, pipelineLayout: VkPipelineLayout, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyPipelineLayout")) - vkCreateSampler = cast[proc(device: VkDevice, pCreateInfo: ptr VkSamplerCreateInfo, pAllocator: ptr VkAllocationCallbacks, pSampler: ptr VkSampler): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateSampler")) - vkDestroySampler = cast[proc(device: VkDevice, sampler: VkSampler, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroySampler")) - vkCreateDescriptorSetLayout = cast[proc(device: VkDevice, pCreateInfo: ptr VkDescriptorSetLayoutCreateInfo, pAllocator: ptr VkAllocationCallbacks, pSetLayout: ptr VkDescriptorSetLayout): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateDescriptorSetLayout")) - vkDestroyDescriptorSetLayout = cast[proc(device: VkDevice, descriptorSetLayout: VkDescriptorSetLayout, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyDescriptorSetLayout")) - vkCreateDescriptorPool = cast[proc(device: VkDevice, pCreateInfo: ptr VkDescriptorPoolCreateInfo, pAllocator: ptr VkAllocationCallbacks, pDescriptorPool: ptr VkDescriptorPool): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateDescriptorPool")) - vkDestroyDescriptorPool = cast[proc(device: VkDevice, descriptorPool: VkDescriptorPool, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyDescriptorPool")) - vkResetDescriptorPool = cast[proc(device: VkDevice, descriptorPool: VkDescriptorPool, flags: VkDescriptorPoolResetFlags): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkResetDescriptorPool")) - vkAllocateDescriptorSets = cast[proc(device: VkDevice, pAllocateInfo: ptr VkDescriptorSetAllocateInfo, pDescriptorSets: ptr VkDescriptorSet): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkAllocateDescriptorSets")) - vkFreeDescriptorSets = cast[proc(device: VkDevice, descriptorPool: VkDescriptorPool, descriptorSetCount: uint32, pDescriptorSets: ptr VkDescriptorSet): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkFreeDescriptorSets")) - vkUpdateDescriptorSets = cast[proc(device: VkDevice, descriptorWriteCount: uint32, pDescriptorWrites: ptr VkWriteDescriptorSet, descriptorCopyCount: uint32, pDescriptorCopies: ptr VkCopyDescriptorSet): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSets")) - vkCreateFramebuffer = cast[proc(device: VkDevice, pCreateInfo: ptr VkFramebufferCreateInfo, pAllocator: ptr VkAllocationCallbacks, pFramebuffer: ptr VkFramebuffer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateFramebuffer")) - vkDestroyFramebuffer = cast[proc(device: VkDevice, framebuffer: VkFramebuffer, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyFramebuffer")) - vkCreateRenderPass = cast[proc(device: VkDevice, pCreateInfo: ptr VkRenderPassCreateInfo, pAllocator: ptr VkAllocationCallbacks, pRenderPass: ptr VkRenderPass): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateRenderPass")) - vkDestroyRenderPass = cast[proc(device: VkDevice, renderPass: VkRenderPass, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyRenderPass")) - vkGetRenderAreaGranularity = cast[proc(device: VkDevice, renderPass: VkRenderPass, pGranularity: ptr VkExtent2D): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetRenderAreaGranularity")) - vkCreateCommandPool = cast[proc(device: VkDevice, pCreateInfo: ptr VkCommandPoolCreateInfo, pAllocator: ptr VkAllocationCallbacks, pCommandPool: ptr VkCommandPool): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateCommandPool")) - vkDestroyCommandPool = cast[proc(device: VkDevice, commandPool: VkCommandPool, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyCommandPool")) - vkResetCommandPool = cast[proc(device: VkDevice, commandPool: VkCommandPool, flags: VkCommandPoolResetFlags): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkResetCommandPool")) - vkAllocateCommandBuffers = cast[proc(device: VkDevice, pAllocateInfo: ptr VkCommandBufferAllocateInfo, pCommandBuffers: ptr VkCommandBuffer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkAllocateCommandBuffers")) - vkFreeCommandBuffers = cast[proc(device: VkDevice, commandPool: VkCommandPool, commandBufferCount: uint32, pCommandBuffers: ptr VkCommandBuffer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkFreeCommandBuffers")) - vkBeginCommandBuffer = cast[proc(commandBuffer: VkCommandBuffer, pBeginInfo: ptr VkCommandBufferBeginInfo): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkBeginCommandBuffer")) - vkEndCommandBuffer = cast[proc(commandBuffer: VkCommandBuffer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkEndCommandBuffer")) - vkResetCommandBuffer = cast[proc(commandBuffer: VkCommandBuffer, flags: VkCommandBufferResetFlags): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkResetCommandBuffer")) - vkCmdBindPipeline = cast[proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, pipeline: VkPipeline): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindPipeline")) - vkCmdSetViewport = cast[proc(commandBuffer: VkCommandBuffer, firstViewport: uint32, viewportCount: uint32, pViewports: ptr VkViewport): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetViewport")) - vkCmdSetScissor = cast[proc(commandBuffer: VkCommandBuffer, firstScissor: uint32, scissorCount: uint32, pScissors: ptr VkRect2D): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetScissor")) - vkCmdSetLineWidth = cast[proc(commandBuffer: VkCommandBuffer, lineWidth: float32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetLineWidth")) - vkCmdSetDepthBias = cast[proc(commandBuffer: VkCommandBuffer, depthBiasConstantFactor: float32, depthBiasClamp: float32, depthBiasSlopeFactor: float32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthBias")) - vkCmdSetBlendConstants = cast[proc(commandBuffer: VkCommandBuffer, blendConstants: array[4, float32]): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetBlendConstants")) - vkCmdSetDepthBounds = cast[proc(commandBuffer: VkCommandBuffer, minDepthBounds: float32, maxDepthBounds: float32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthBounds")) - vkCmdSetStencilCompareMask = cast[proc(commandBuffer: VkCommandBuffer, faceMask: VkStencilFaceFlags, compareMask: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetStencilCompareMask")) - vkCmdSetStencilWriteMask = cast[proc(commandBuffer: VkCommandBuffer, faceMask: VkStencilFaceFlags, writeMask: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetStencilWriteMask")) - vkCmdSetStencilReference = cast[proc(commandBuffer: VkCommandBuffer, faceMask: VkStencilFaceFlags, reference: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetStencilReference")) - vkCmdBindDescriptorSets = cast[proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, layout: VkPipelineLayout, firstSet: uint32, descriptorSetCount: uint32, pDescriptorSets: ptr VkDescriptorSet, dynamicOffsetCount: uint32, pDynamicOffsets: ptr uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindDescriptorSets")) - vkCmdBindIndexBuffer = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, indexType: VkIndexType): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindIndexBuffer")) - vkCmdBindVertexBuffers = cast[proc(commandBuffer: VkCommandBuffer, firstBinding: uint32, bindingCount: uint32, pBuffers: ptr VkBuffer, pOffsets: ptr VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindVertexBuffers")) - vkCmdDraw = cast[proc(commandBuffer: VkCommandBuffer, vertexCount: uint32, instanceCount: uint32, firstVertex: uint32, firstInstance: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDraw")) - vkCmdDrawIndexed = cast[proc(commandBuffer: VkCommandBuffer, indexCount: uint32, instanceCount: uint32, firstIndex: uint32, vertexOffset: int32, firstInstance: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawIndexed")) - vkCmdDrawIndirect = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, drawCount: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawIndirect")) - vkCmdDrawIndexedIndirect = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, drawCount: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirect")) - vkCmdDispatch = cast[proc(commandBuffer: VkCommandBuffer, groupCountX: uint32, groupCountY: uint32, groupCountZ: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDispatch")) - vkCmdDispatchIndirect = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDispatchIndirect")) - vkCmdCopyBuffer = cast[proc(commandBuffer: VkCommandBuffer, srcBuffer: VkBuffer, dstBuffer: VkBuffer, regionCount: uint32, pRegions: ptr VkBufferCopy): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyBuffer")) - vkCmdCopyImage = cast[proc(commandBuffer: VkCommandBuffer, srcImage: VkImage, srcImageLayout: VkImageLayout, dstImage: VkImage, dstImageLayout: VkImageLayout, regionCount: uint32, pRegions: ptr VkImageCopy): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyImage")) - vkCmdBlitImage = cast[proc(commandBuffer: VkCommandBuffer, srcImage: VkImage, srcImageLayout: VkImageLayout, dstImage: VkImage, dstImageLayout: VkImageLayout, regionCount: uint32, pRegions: ptr VkImageBlit, filter: VkFilter): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBlitImage")) - vkCmdCopyBufferToImage = cast[proc(commandBuffer: VkCommandBuffer, srcBuffer: VkBuffer, dstImage: VkImage, dstImageLayout: VkImageLayout, regionCount: uint32, pRegions: ptr VkBufferImageCopy): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyBufferToImage")) - vkCmdCopyImageToBuffer = cast[proc(commandBuffer: VkCommandBuffer, srcImage: VkImage, srcImageLayout: VkImageLayout, dstBuffer: VkBuffer, regionCount: uint32, pRegions: ptr VkBufferImageCopy): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer")) - vkCmdUpdateBuffer = cast[proc(commandBuffer: VkCommandBuffer, dstBuffer: VkBuffer, dstOffset: VkDeviceSize, dataSize: VkDeviceSize, pData: pointer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdUpdateBuffer")) - vkCmdFillBuffer = cast[proc(commandBuffer: VkCommandBuffer, dstBuffer: VkBuffer, dstOffset: VkDeviceSize, size: VkDeviceSize, data: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdFillBuffer")) - vkCmdClearColorImage = cast[proc(commandBuffer: VkCommandBuffer, image: VkImage, imageLayout: VkImageLayout, pColor: ptr VkClearColorValue, rangeCount: uint32, pRanges: ptr VkImageSubresourceRange): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdClearColorImage")) - vkCmdClearDepthStencilImage = cast[proc(commandBuffer: VkCommandBuffer, image: VkImage, imageLayout: VkImageLayout, pDepthStencil: ptr VkClearDepthStencilValue, rangeCount: uint32, pRanges: ptr VkImageSubresourceRange): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdClearDepthStencilImage")) - vkCmdClearAttachments = cast[proc(commandBuffer: VkCommandBuffer, attachmentCount: uint32, pAttachments: ptr VkClearAttachment, rectCount: uint32, pRects: ptr VkClearRect): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdClearAttachments")) - vkCmdResolveImage = cast[proc(commandBuffer: VkCommandBuffer, srcImage: VkImage, srcImageLayout: VkImageLayout, dstImage: VkImage, dstImageLayout: VkImageLayout, regionCount: uint32, pRegions: ptr VkImageResolve): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdResolveImage")) - vkCmdSetEvent = cast[proc(commandBuffer: VkCommandBuffer, event: VkEvent, stageMask: VkPipelineStageFlags): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetEvent")) - vkCmdResetEvent = cast[proc(commandBuffer: VkCommandBuffer, event: VkEvent, stageMask: VkPipelineStageFlags): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdResetEvent")) - vkCmdWaitEvents = cast[proc(commandBuffer: VkCommandBuffer, eventCount: uint32, pEvents: ptr VkEvent, srcStageMask: VkPipelineStageFlags, dstStageMask: VkPipelineStageFlags, memoryBarrierCount: uint32, pMemoryBarriers: ptr VkMemoryBarrier, bufferMemoryBarrierCount: uint32, pBufferMemoryBarriers: ptr VkBufferMemoryBarrier, imageMemoryBarrierCount: uint32, pImageMemoryBarriers: ptr VkImageMemoryBarrier): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdWaitEvents")) - vkCmdPipelineBarrier = cast[proc(commandBuffer: VkCommandBuffer, srcStageMask: VkPipelineStageFlags, dstStageMask: VkPipelineStageFlags, dependencyFlags: VkDependencyFlags, memoryBarrierCount: uint32, pMemoryBarriers: ptr VkMemoryBarrier, bufferMemoryBarrierCount: uint32, pBufferMemoryBarriers: ptr VkBufferMemoryBarrier, imageMemoryBarrierCount: uint32, pImageMemoryBarriers: ptr VkImageMemoryBarrier): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdPipelineBarrier")) - vkCmdBeginQuery = cast[proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, query: uint32, flags: VkQueryControlFlags): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBeginQuery")) - vkCmdEndQuery = cast[proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, query: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdEndQuery")) - vkCmdResetQueryPool = cast[proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, firstQuery: uint32, queryCount: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdResetQueryPool")) - vkCmdWriteTimestamp = cast[proc(commandBuffer: VkCommandBuffer, pipelineStage: VkPipelineStageFlagBits, queryPool: VkQueryPool, query: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdWriteTimestamp")) - vkCmdCopyQueryPoolResults = cast[proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, firstQuery: uint32, queryCount: uint32, dstBuffer: VkBuffer, dstOffset: VkDeviceSize, stride: VkDeviceSize, flags: VkQueryResultFlags): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyQueryPoolResults")) - vkCmdPushConstants = cast[proc(commandBuffer: VkCommandBuffer, layout: VkPipelineLayout, stageFlags: VkShaderStageFlags, offset: uint32, size: uint32, pValues: pointer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdPushConstants")) - vkCmdBeginRenderPass = cast[proc(commandBuffer: VkCommandBuffer, pRenderPassBegin: ptr VkRenderPassBeginInfo, contents: VkSubpassContents): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass")) - vkCmdNextSubpass = cast[proc(commandBuffer: VkCommandBuffer, contents: VkSubpassContents): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdNextSubpass")) - vkCmdEndRenderPass = cast[proc(commandBuffer: VkCommandBuffer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass")) - vkCmdExecuteCommands = cast[proc(commandBuffer: VkCommandBuffer, commandBufferCount: uint32, pCommandBuffers: ptr VkCommandBuffer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdExecuteCommands")) - -# feature VK_VERSION_1_1 -var - vkEnumerateInstanceVersion*: proc(pApiVersion: ptr uint32): VkResult {.stdcall.} - vkBindBufferMemory2*: proc(device: VkDevice, bindInfoCount: uint32, pBindInfos: ptr VkBindBufferMemoryInfo): VkResult {.stdcall.} - vkBindImageMemory2*: proc(device: VkDevice, bindInfoCount: uint32, pBindInfos: ptr VkBindImageMemoryInfo): VkResult {.stdcall.} - vkGetDeviceGroupPeerMemoryFeatures*: proc(device: VkDevice, heapIndex: uint32, localDeviceIndex: uint32, remoteDeviceIndex: uint32, pPeerMemoryFeatures: ptr VkPeerMemoryFeatureFlags): void {.stdcall.} - vkCmdSetDeviceMask*: proc(commandBuffer: VkCommandBuffer, deviceMask: uint32): void {.stdcall.} - vkCmdDispatchBase*: proc(commandBuffer: VkCommandBuffer, baseGroupX: uint32, baseGroupY: uint32, baseGroupZ: uint32, groupCountX: uint32, groupCountY: uint32, groupCountZ: uint32): void {.stdcall.} - vkEnumeratePhysicalDeviceGroups*: proc(instance: VkInstance, pPhysicalDeviceGroupCount: ptr uint32, pPhysicalDeviceGroupProperties: ptr VkPhysicalDeviceGroupProperties): VkResult {.stdcall.} - vkGetImageMemoryRequirements2*: proc(device: VkDevice, pInfo: ptr VkImageMemoryRequirementsInfo2, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.} - vkGetBufferMemoryRequirements2*: proc(device: VkDevice, pInfo: ptr VkBufferMemoryRequirementsInfo2, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.} - vkGetImageSparseMemoryRequirements2*: proc(device: VkDevice, pInfo: ptr VkImageSparseMemoryRequirementsInfo2, pSparseMemoryRequirementCount: ptr uint32, pSparseMemoryRequirements: ptr VkSparseImageMemoryRequirements2): void {.stdcall.} - vkGetPhysicalDeviceFeatures2*: proc(physicalDevice: VkPhysicalDevice, pFeatures: ptr VkPhysicalDeviceFeatures2): void {.stdcall.} - vkGetPhysicalDeviceProperties2*: proc(physicalDevice: VkPhysicalDevice, pProperties: ptr VkPhysicalDeviceProperties2): void {.stdcall.} - vkGetPhysicalDeviceFormatProperties2*: proc(physicalDevice: VkPhysicalDevice, format: VkFormat, pFormatProperties: ptr VkFormatProperties2): void {.stdcall.} - vkGetPhysicalDeviceImageFormatProperties2*: proc(physicalDevice: VkPhysicalDevice, pImageFormatInfo: ptr VkPhysicalDeviceImageFormatInfo2, pImageFormatProperties: ptr VkImageFormatProperties2): VkResult {.stdcall.} - vkGetPhysicalDeviceQueueFamilyProperties2*: proc(physicalDevice: VkPhysicalDevice, pQueueFamilyPropertyCount: ptr uint32, pQueueFamilyProperties: ptr VkQueueFamilyProperties2): void {.stdcall.} - vkGetPhysicalDeviceMemoryProperties2*: proc(physicalDevice: VkPhysicalDevice, pMemoryProperties: ptr VkPhysicalDeviceMemoryProperties2): void {.stdcall.} - vkGetPhysicalDeviceSparseImageFormatProperties2*: proc(physicalDevice: VkPhysicalDevice, pFormatInfo: ptr VkPhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ptr uint32, pProperties: ptr VkSparseImageFormatProperties2): void {.stdcall.} - vkTrimCommandPool*: proc(device: VkDevice, commandPool: VkCommandPool, flags: VkCommandPoolTrimFlags): void {.stdcall.} - vkGetDeviceQueue2*: proc(device: VkDevice, pQueueInfo: ptr VkDeviceQueueInfo2, pQueue: ptr VkQueue): void {.stdcall.} - vkCreateSamplerYcbcrConversion*: proc(device: VkDevice, pCreateInfo: ptr VkSamplerYcbcrConversionCreateInfo, pAllocator: ptr VkAllocationCallbacks, pYcbcrConversion: ptr VkSamplerYcbcrConversion): VkResult {.stdcall.} - vkDestroySamplerYcbcrConversion*: proc(device: VkDevice, ycbcrConversion: VkSamplerYcbcrConversion, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCreateDescriptorUpdateTemplate*: proc(device: VkDevice, pCreateInfo: ptr VkDescriptorUpdateTemplateCreateInfo, pAllocator: ptr VkAllocationCallbacks, pDescriptorUpdateTemplate: ptr VkDescriptorUpdateTemplate): VkResult {.stdcall.} - vkDestroyDescriptorUpdateTemplate*: proc(device: VkDevice, descriptorUpdateTemplate: VkDescriptorUpdateTemplate, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkUpdateDescriptorSetWithTemplate*: proc(device: VkDevice, descriptorSet: VkDescriptorSet, descriptorUpdateTemplate: VkDescriptorUpdateTemplate, pData: pointer): void {.stdcall.} - vkGetPhysicalDeviceExternalBufferProperties*: proc(physicalDevice: VkPhysicalDevice, pExternalBufferInfo: ptr VkPhysicalDeviceExternalBufferInfo, pExternalBufferProperties: ptr VkExternalBufferProperties): void {.stdcall.} - vkGetPhysicalDeviceExternalFenceProperties*: proc(physicalDevice: VkPhysicalDevice, pExternalFenceInfo: ptr VkPhysicalDeviceExternalFenceInfo, pExternalFenceProperties: ptr VkExternalFenceProperties): void {.stdcall.} - vkGetPhysicalDeviceExternalSemaphoreProperties*: proc(physicalDevice: VkPhysicalDevice, pExternalSemaphoreInfo: ptr VkPhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: ptr VkExternalSemaphoreProperties): void {.stdcall.} - vkGetDescriptorSetLayoutSupport*: proc(device: VkDevice, pCreateInfo: ptr VkDescriptorSetLayoutCreateInfo, pSupport: ptr VkDescriptorSetLayoutSupport): void {.stdcall.} -proc loadVK_VERSION_1_1*(instance: VkInstance) = - vkBindBufferMemory2 = cast[proc(device: VkDevice, bindInfoCount: uint32, pBindInfos: ptr VkBindBufferMemoryInfo): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkBindBufferMemory2")) - vkBindImageMemory2 = cast[proc(device: VkDevice, bindInfoCount: uint32, pBindInfos: ptr VkBindImageMemoryInfo): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkBindImageMemory2")) - vkGetDeviceGroupPeerMemoryFeatures = cast[proc(device: VkDevice, heapIndex: uint32, localDeviceIndex: uint32, remoteDeviceIndex: uint32, pPeerMemoryFeatures: ptr VkPeerMemoryFeatureFlags): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceGroupPeerMemoryFeatures")) - vkCmdSetDeviceMask = cast[proc(commandBuffer: VkCommandBuffer, deviceMask: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDeviceMask")) - vkCmdDispatchBase = cast[proc(commandBuffer: VkCommandBuffer, baseGroupX: uint32, baseGroupY: uint32, baseGroupZ: uint32, groupCountX: uint32, groupCountY: uint32, groupCountZ: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDispatchBase")) - vkEnumeratePhysicalDeviceGroups = cast[proc(instance: VkInstance, pPhysicalDeviceGroupCount: ptr uint32, pPhysicalDeviceGroupProperties: ptr VkPhysicalDeviceGroupProperties): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroups")) - vkGetImageMemoryRequirements2 = cast[proc(device: VkDevice, pInfo: ptr VkImageMemoryRequirementsInfo2, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageMemoryRequirements2")) - vkGetBufferMemoryRequirements2 = cast[proc(device: VkDevice, pInfo: ptr VkBufferMemoryRequirementsInfo2, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements2")) - vkGetImageSparseMemoryRequirements2 = cast[proc(device: VkDevice, pInfo: ptr VkImageSparseMemoryRequirementsInfo2, pSparseMemoryRequirementCount: ptr uint32, pSparseMemoryRequirements: ptr VkSparseImageMemoryRequirements2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements2")) - vkGetPhysicalDeviceFeatures2 = cast[proc(physicalDevice: VkPhysicalDevice, pFeatures: ptr VkPhysicalDeviceFeatures2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2")) - vkGetPhysicalDeviceProperties2 = cast[proc(physicalDevice: VkPhysicalDevice, pProperties: ptr VkPhysicalDeviceProperties2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2")) - vkGetPhysicalDeviceFormatProperties2 = cast[proc(physicalDevice: VkPhysicalDevice, format: VkFormat, pFormatProperties: ptr VkFormatProperties2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2")) - vkGetPhysicalDeviceImageFormatProperties2 = cast[proc(physicalDevice: VkPhysicalDevice, pImageFormatInfo: ptr VkPhysicalDeviceImageFormatInfo2, pImageFormatProperties: ptr VkImageFormatProperties2): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2")) - vkGetPhysicalDeviceQueueFamilyProperties2 = cast[proc(physicalDevice: VkPhysicalDevice, pQueueFamilyPropertyCount: ptr uint32, pQueueFamilyProperties: ptr VkQueueFamilyProperties2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2")) - vkGetPhysicalDeviceMemoryProperties2 = cast[proc(physicalDevice: VkPhysicalDevice, pMemoryProperties: ptr VkPhysicalDeviceMemoryProperties2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2")) - vkGetPhysicalDeviceSparseImageFormatProperties2 = cast[proc(physicalDevice: VkPhysicalDevice, pFormatInfo: ptr VkPhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ptr uint32, pProperties: ptr VkSparseImageFormatProperties2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2")) - vkTrimCommandPool = cast[proc(device: VkDevice, commandPool: VkCommandPool, flags: VkCommandPoolTrimFlags): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkTrimCommandPool")) - vkGetDeviceQueue2 = cast[proc(device: VkDevice, pQueueInfo: ptr VkDeviceQueueInfo2, pQueue: ptr VkQueue): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceQueue2")) - vkCreateSamplerYcbcrConversion = cast[proc(device: VkDevice, pCreateInfo: ptr VkSamplerYcbcrConversionCreateInfo, pAllocator: ptr VkAllocationCallbacks, pYcbcrConversion: ptr VkSamplerYcbcrConversion): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateSamplerYcbcrConversion")) - vkDestroySamplerYcbcrConversion = cast[proc(device: VkDevice, ycbcrConversion: VkSamplerYcbcrConversion, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroySamplerYcbcrConversion")) - vkCreateDescriptorUpdateTemplate = cast[proc(device: VkDevice, pCreateInfo: ptr VkDescriptorUpdateTemplateCreateInfo, pAllocator: ptr VkAllocationCallbacks, pDescriptorUpdateTemplate: ptr VkDescriptorUpdateTemplate): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateDescriptorUpdateTemplate")) - vkDestroyDescriptorUpdateTemplate = cast[proc(device: VkDevice, descriptorUpdateTemplate: VkDescriptorUpdateTemplate, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyDescriptorUpdateTemplate")) - vkUpdateDescriptorSetWithTemplate = cast[proc(device: VkDevice, descriptorSet: VkDescriptorSet, descriptorUpdateTemplate: VkDescriptorUpdateTemplate, pData: pointer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplate")) - vkGetPhysicalDeviceExternalBufferProperties = cast[proc(physicalDevice: VkPhysicalDevice, pExternalBufferInfo: ptr VkPhysicalDeviceExternalBufferInfo, pExternalBufferProperties: ptr VkExternalBufferProperties): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferProperties")) - vkGetPhysicalDeviceExternalFenceProperties = cast[proc(physicalDevice: VkPhysicalDevice, pExternalFenceInfo: ptr VkPhysicalDeviceExternalFenceInfo, pExternalFenceProperties: ptr VkExternalFenceProperties): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFenceProperties")) - vkGetPhysicalDeviceExternalSemaphoreProperties = cast[proc(physicalDevice: VkPhysicalDevice, pExternalSemaphoreInfo: ptr VkPhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: ptr VkExternalSemaphoreProperties): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphoreProperties")) - vkGetDescriptorSetLayoutSupport = cast[proc(device: VkDevice, pCreateInfo: ptr VkDescriptorSetLayoutCreateInfo, pSupport: ptr VkDescriptorSetLayoutSupport): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDescriptorSetLayoutSupport")) - -# feature VK_VERSION_1_2 -var - vkCmdDrawIndirectCount*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, countBuffer: VkBuffer, countBufferOffset: VkDeviceSize, maxDrawCount: uint32, stride: uint32): void {.stdcall.} - vkCmdDrawIndexedIndirectCount*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, countBuffer: VkBuffer, countBufferOffset: VkDeviceSize, maxDrawCount: uint32, stride: uint32): void {.stdcall.} - vkCreateRenderPass2*: proc(device: VkDevice, pCreateInfo: ptr VkRenderPassCreateInfo2, pAllocator: ptr VkAllocationCallbacks, pRenderPass: ptr VkRenderPass): VkResult {.stdcall.} - vkCmdBeginRenderPass2*: proc(commandBuffer: VkCommandBuffer, pRenderPassBegin: ptr VkRenderPassBeginInfo, pSubpassBeginInfo: ptr VkSubpassBeginInfo): void {.stdcall.} - vkCmdNextSubpass2*: proc(commandBuffer: VkCommandBuffer, pSubpassBeginInfo: ptr VkSubpassBeginInfo, pSubpassEndInfo: ptr VkSubpassEndInfo): void {.stdcall.} - vkCmdEndRenderPass2*: proc(commandBuffer: VkCommandBuffer, pSubpassEndInfo: ptr VkSubpassEndInfo): void {.stdcall.} - vkResetQueryPool*: proc(device: VkDevice, queryPool: VkQueryPool, firstQuery: uint32, queryCount: uint32): void {.stdcall.} - vkGetSemaphoreCounterValue*: proc(device: VkDevice, semaphore: VkSemaphore, pValue: ptr uint64): VkResult {.stdcall.} - vkWaitSemaphores*: proc(device: VkDevice, pWaitInfo: ptr VkSemaphoreWaitInfo, timeout: uint64): VkResult {.stdcall.} - vkSignalSemaphore*: proc(device: VkDevice, pSignalInfo: ptr VkSemaphoreSignalInfo): VkResult {.stdcall.} - vkGetBufferDeviceAddress*: proc(device: VkDevice, pInfo: ptr VkBufferDeviceAddressInfo): VkDeviceAddress {.stdcall.} - vkGetBufferOpaqueCaptureAddress*: proc(device: VkDevice, pInfo: ptr VkBufferDeviceAddressInfo): uint64 {.stdcall.} - vkGetDeviceMemoryOpaqueCaptureAddress*: proc(device: VkDevice, pInfo: ptr VkDeviceMemoryOpaqueCaptureAddressInfo): uint64 {.stdcall.} -proc loadVK_VERSION_1_2*(instance: VkInstance) = - vkCmdDrawIndirectCount = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, countBuffer: VkBuffer, countBufferOffset: VkDeviceSize, maxDrawCount: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawIndirectCount")) - vkCmdDrawIndexedIndirectCount = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, countBuffer: VkBuffer, countBufferOffset: VkDeviceSize, maxDrawCount: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCount")) - vkCreateRenderPass2 = cast[proc(device: VkDevice, pCreateInfo: ptr VkRenderPassCreateInfo2, pAllocator: ptr VkAllocationCallbacks, pRenderPass: ptr VkRenderPass): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateRenderPass2")) - vkCmdBeginRenderPass2 = cast[proc(commandBuffer: VkCommandBuffer, pRenderPassBegin: ptr VkRenderPassBeginInfo, pSubpassBeginInfo: ptr VkSubpassBeginInfo): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass2")) - vkCmdNextSubpass2 = cast[proc(commandBuffer: VkCommandBuffer, pSubpassBeginInfo: ptr VkSubpassBeginInfo, pSubpassEndInfo: ptr VkSubpassEndInfo): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdNextSubpass2")) - vkCmdEndRenderPass2 = cast[proc(commandBuffer: VkCommandBuffer, pSubpassEndInfo: ptr VkSubpassEndInfo): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass2")) - vkResetQueryPool = cast[proc(device: VkDevice, queryPool: VkQueryPool, firstQuery: uint32, queryCount: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkResetQueryPool")) - vkGetSemaphoreCounterValue = cast[proc(device: VkDevice, semaphore: VkSemaphore, pValue: ptr uint64): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetSemaphoreCounterValue")) - vkWaitSemaphores = cast[proc(device: VkDevice, pWaitInfo: ptr VkSemaphoreWaitInfo, timeout: uint64): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkWaitSemaphores")) - vkSignalSemaphore = cast[proc(device: VkDevice, pSignalInfo: ptr VkSemaphoreSignalInfo): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkSignalSemaphore")) - vkGetBufferDeviceAddress = cast[proc(device: VkDevice, pInfo: ptr VkBufferDeviceAddressInfo): VkDeviceAddress {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetBufferDeviceAddress")) - vkGetBufferOpaqueCaptureAddress = cast[proc(device: VkDevice, pInfo: ptr VkBufferDeviceAddressInfo): uint64 {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetBufferOpaqueCaptureAddress")) - vkGetDeviceMemoryOpaqueCaptureAddress = cast[proc(device: VkDevice, pInfo: ptr VkDeviceMemoryOpaqueCaptureAddressInfo): uint64 {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceMemoryOpaqueCaptureAddress")) - -# feature VK_VERSION_1_3 -var - vkGetPhysicalDeviceToolProperties*: proc(physicalDevice: VkPhysicalDevice, pToolCount: ptr uint32, pToolProperties: ptr VkPhysicalDeviceToolProperties): VkResult {.stdcall.} - vkCreatePrivateDataSlot*: proc(device: VkDevice, pCreateInfo: ptr VkPrivateDataSlotCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPrivateDataSlot: ptr VkPrivateDataSlot): VkResult {.stdcall.} - vkDestroyPrivateDataSlot*: proc(device: VkDevice, privateDataSlot: VkPrivateDataSlot, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkSetPrivateData*: proc(device: VkDevice, objectType: VkObjectType, objectHandle: uint64, privateDataSlot: VkPrivateDataSlot, data: uint64): VkResult {.stdcall.} - vkGetPrivateData*: proc(device: VkDevice, objectType: VkObjectType, objectHandle: uint64, privateDataSlot: VkPrivateDataSlot, pData: ptr uint64): void {.stdcall.} - vkCmdSetEvent2*: proc(commandBuffer: VkCommandBuffer, event: VkEvent, pDependencyInfo: ptr VkDependencyInfo): void {.stdcall.} - vkCmdResetEvent2*: proc(commandBuffer: VkCommandBuffer, event: VkEvent, stageMask: VkPipelineStageFlags2): void {.stdcall.} - vkCmdWaitEvents2*: proc(commandBuffer: VkCommandBuffer, eventCount: uint32, pEvents: ptr VkEvent, pDependencyInfos: ptr VkDependencyInfo): void {.stdcall.} - vkCmdPipelineBarrier2*: proc(commandBuffer: VkCommandBuffer, pDependencyInfo: ptr VkDependencyInfo): void {.stdcall.} - vkCmdWriteTimestamp2*: proc(commandBuffer: VkCommandBuffer, stage: VkPipelineStageFlags2, queryPool: VkQueryPool, query: uint32): void {.stdcall.} - vkQueueSubmit2*: proc(queue: VkQueue, submitCount: uint32, pSubmits: ptr VkSubmitInfo2, fence: VkFence): VkResult {.stdcall.} - vkCmdCopyBuffer2*: proc(commandBuffer: VkCommandBuffer, pCopyBufferInfo: ptr VkCopyBufferInfo2): void {.stdcall.} - vkCmdCopyImage2*: proc(commandBuffer: VkCommandBuffer, pCopyImageInfo: ptr VkCopyImageInfo2): void {.stdcall.} - vkCmdCopyBufferToImage2*: proc(commandBuffer: VkCommandBuffer, pCopyBufferToImageInfo: ptr VkCopyBufferToImageInfo2): void {.stdcall.} - vkCmdCopyImageToBuffer2*: proc(commandBuffer: VkCommandBuffer, pCopyImageToBufferInfo: ptr VkCopyImageToBufferInfo2): void {.stdcall.} - vkCmdBlitImage2*: proc(commandBuffer: VkCommandBuffer, pBlitImageInfo: ptr VkBlitImageInfo2): void {.stdcall.} - vkCmdResolveImage2*: proc(commandBuffer: VkCommandBuffer, pResolveImageInfo: ptr VkResolveImageInfo2): void {.stdcall.} - vkCmdBeginRendering*: proc(commandBuffer: VkCommandBuffer, pRenderingInfo: ptr VkRenderingInfo): void {.stdcall.} - vkCmdEndRendering*: proc(commandBuffer: VkCommandBuffer): void {.stdcall.} - vkCmdSetCullMode*: proc(commandBuffer: VkCommandBuffer, cullMode: VkCullModeFlags): void {.stdcall.} - vkCmdSetFrontFace*: proc(commandBuffer: VkCommandBuffer, frontFace: VkFrontFace): void {.stdcall.} - vkCmdSetPrimitiveTopology*: proc(commandBuffer: VkCommandBuffer, primitiveTopology: VkPrimitiveTopology): void {.stdcall.} - vkCmdSetViewportWithCount*: proc(commandBuffer: VkCommandBuffer, viewportCount: uint32, pViewports: ptr VkViewport): void {.stdcall.} - vkCmdSetScissorWithCount*: proc(commandBuffer: VkCommandBuffer, scissorCount: uint32, pScissors: ptr VkRect2D): void {.stdcall.} - vkCmdBindVertexBuffers2*: proc(commandBuffer: VkCommandBuffer, firstBinding: uint32, bindingCount: uint32, pBuffers: ptr VkBuffer, pOffsets: ptr VkDeviceSize, pSizes: ptr VkDeviceSize, pStrides: ptr VkDeviceSize): void {.stdcall.} - vkCmdSetDepthTestEnable*: proc(commandBuffer: VkCommandBuffer, depthTestEnable: VkBool32): void {.stdcall.} - vkCmdSetDepthWriteEnable*: proc(commandBuffer: VkCommandBuffer, depthWriteEnable: VkBool32): void {.stdcall.} - vkCmdSetDepthCompareOp*: proc(commandBuffer: VkCommandBuffer, depthCompareOp: VkCompareOp): void {.stdcall.} - vkCmdSetDepthBoundsTestEnable*: proc(commandBuffer: VkCommandBuffer, depthBoundsTestEnable: VkBool32): void {.stdcall.} - vkCmdSetStencilTestEnable*: proc(commandBuffer: VkCommandBuffer, stencilTestEnable: VkBool32): void {.stdcall.} - vkCmdSetStencilOp*: proc(commandBuffer: VkCommandBuffer, faceMask: VkStencilFaceFlags, failOp: VkStencilOp, passOp: VkStencilOp, depthFailOp: VkStencilOp, compareOp: VkCompareOp): void {.stdcall.} - vkCmdSetRasterizerDiscardEnable*: proc(commandBuffer: VkCommandBuffer, rasterizerDiscardEnable: VkBool32): void {.stdcall.} - vkCmdSetDepthBiasEnable*: proc(commandBuffer: VkCommandBuffer, depthBiasEnable: VkBool32): void {.stdcall.} - vkCmdSetPrimitiveRestartEnable*: proc(commandBuffer: VkCommandBuffer, primitiveRestartEnable: VkBool32): void {.stdcall.} - vkGetDeviceBufferMemoryRequirements*: proc(device: VkDevice, pInfo: ptr VkDeviceBufferMemoryRequirements, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.} - vkGetDeviceImageMemoryRequirements*: proc(device: VkDevice, pInfo: ptr VkDeviceImageMemoryRequirements, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.} - vkGetDeviceImageSparseMemoryRequirements*: proc(device: VkDevice, pInfo: ptr VkDeviceImageMemoryRequirements, pSparseMemoryRequirementCount: ptr uint32, pSparseMemoryRequirements: ptr VkSparseImageMemoryRequirements2): void {.stdcall.} -proc loadVK_VERSION_1_3*(instance: VkInstance) = - vkGetPhysicalDeviceToolProperties = cast[proc(physicalDevice: VkPhysicalDevice, pToolCount: ptr uint32, pToolProperties: ptr VkPhysicalDeviceToolProperties): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceToolProperties")) - vkCreatePrivateDataSlot = cast[proc(device: VkDevice, pCreateInfo: ptr VkPrivateDataSlotCreateInfo, pAllocator: ptr VkAllocationCallbacks, pPrivateDataSlot: ptr VkPrivateDataSlot): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreatePrivateDataSlot")) - vkDestroyPrivateDataSlot = cast[proc(device: VkDevice, privateDataSlot: VkPrivateDataSlot, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyPrivateDataSlot")) - vkSetPrivateData = cast[proc(device: VkDevice, objectType: VkObjectType, objectHandle: uint64, privateDataSlot: VkPrivateDataSlot, data: uint64): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkSetPrivateData")) - vkGetPrivateData = cast[proc(device: VkDevice, objectType: VkObjectType, objectHandle: uint64, privateDataSlot: VkPrivateDataSlot, pData: ptr uint64): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPrivateData")) - vkCmdSetEvent2 = cast[proc(commandBuffer: VkCommandBuffer, event: VkEvent, pDependencyInfo: ptr VkDependencyInfo): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetEvent2")) - vkCmdResetEvent2 = cast[proc(commandBuffer: VkCommandBuffer, event: VkEvent, stageMask: VkPipelineStageFlags2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdResetEvent2")) - vkCmdWaitEvents2 = cast[proc(commandBuffer: VkCommandBuffer, eventCount: uint32, pEvents: ptr VkEvent, pDependencyInfos: ptr VkDependencyInfo): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdWaitEvents2")) - vkCmdPipelineBarrier2 = cast[proc(commandBuffer: VkCommandBuffer, pDependencyInfo: ptr VkDependencyInfo): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdPipelineBarrier2")) - vkCmdWriteTimestamp2 = cast[proc(commandBuffer: VkCommandBuffer, stage: VkPipelineStageFlags2, queryPool: VkQueryPool, query: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdWriteTimestamp2")) - vkQueueSubmit2 = cast[proc(queue: VkQueue, submitCount: uint32, pSubmits: ptr VkSubmitInfo2, fence: VkFence): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkQueueSubmit2")) - vkCmdCopyBuffer2 = cast[proc(commandBuffer: VkCommandBuffer, pCopyBufferInfo: ptr VkCopyBufferInfo2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyBuffer2")) - vkCmdCopyImage2 = cast[proc(commandBuffer: VkCommandBuffer, pCopyImageInfo: ptr VkCopyImageInfo2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyImage2")) - vkCmdCopyBufferToImage2 = cast[proc(commandBuffer: VkCommandBuffer, pCopyBufferToImageInfo: ptr VkCopyBufferToImageInfo2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyBufferToImage2")) - vkCmdCopyImageToBuffer2 = cast[proc(commandBuffer: VkCommandBuffer, pCopyImageToBufferInfo: ptr VkCopyImageToBufferInfo2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer2")) - vkCmdBlitImage2 = cast[proc(commandBuffer: VkCommandBuffer, pBlitImageInfo: ptr VkBlitImageInfo2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBlitImage2")) - vkCmdResolveImage2 = cast[proc(commandBuffer: VkCommandBuffer, pResolveImageInfo: ptr VkResolveImageInfo2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdResolveImage2")) - vkCmdBeginRendering = cast[proc(commandBuffer: VkCommandBuffer, pRenderingInfo: ptr VkRenderingInfo): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBeginRendering")) - vkCmdEndRendering = cast[proc(commandBuffer: VkCommandBuffer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdEndRendering")) - vkCmdSetCullMode = cast[proc(commandBuffer: VkCommandBuffer, cullMode: VkCullModeFlags): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetCullMode")) - vkCmdSetFrontFace = cast[proc(commandBuffer: VkCommandBuffer, frontFace: VkFrontFace): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetFrontFace")) - vkCmdSetPrimitiveTopology = cast[proc(commandBuffer: VkCommandBuffer, primitiveTopology: VkPrimitiveTopology): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetPrimitiveTopology")) - vkCmdSetViewportWithCount = cast[proc(commandBuffer: VkCommandBuffer, viewportCount: uint32, pViewports: ptr VkViewport): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetViewportWithCount")) - vkCmdSetScissorWithCount = cast[proc(commandBuffer: VkCommandBuffer, scissorCount: uint32, pScissors: ptr VkRect2D): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetScissorWithCount")) - vkCmdBindVertexBuffers2 = cast[proc(commandBuffer: VkCommandBuffer, firstBinding: uint32, bindingCount: uint32, pBuffers: ptr VkBuffer, pOffsets: ptr VkDeviceSize, pSizes: ptr VkDeviceSize, pStrides: ptr VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindVertexBuffers2")) - vkCmdSetDepthTestEnable = cast[proc(commandBuffer: VkCommandBuffer, depthTestEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthTestEnable")) - vkCmdSetDepthWriteEnable = cast[proc(commandBuffer: VkCommandBuffer, depthWriteEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthWriteEnable")) - vkCmdSetDepthCompareOp = cast[proc(commandBuffer: VkCommandBuffer, depthCompareOp: VkCompareOp): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthCompareOp")) - vkCmdSetDepthBoundsTestEnable = cast[proc(commandBuffer: VkCommandBuffer, depthBoundsTestEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthBoundsTestEnable")) - vkCmdSetStencilTestEnable = cast[proc(commandBuffer: VkCommandBuffer, stencilTestEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetStencilTestEnable")) - vkCmdSetStencilOp = cast[proc(commandBuffer: VkCommandBuffer, faceMask: VkStencilFaceFlags, failOp: VkStencilOp, passOp: VkStencilOp, depthFailOp: VkStencilOp, compareOp: VkCompareOp): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetStencilOp")) - vkCmdSetRasterizerDiscardEnable = cast[proc(commandBuffer: VkCommandBuffer, rasterizerDiscardEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetRasterizerDiscardEnable")) - vkCmdSetDepthBiasEnable = cast[proc(commandBuffer: VkCommandBuffer, depthBiasEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthBiasEnable")) - vkCmdSetPrimitiveRestartEnable = cast[proc(commandBuffer: VkCommandBuffer, primitiveRestartEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetPrimitiveRestartEnable")) - vkGetDeviceBufferMemoryRequirements = cast[proc(device: VkDevice, pInfo: ptr VkDeviceBufferMemoryRequirements, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceBufferMemoryRequirements")) - vkGetDeviceImageMemoryRequirements = cast[proc(device: VkDevice, pInfo: ptr VkDeviceImageMemoryRequirements, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceImageMemoryRequirements")) - vkGetDeviceImageSparseMemoryRequirements = cast[proc(device: VkDevice, pInfo: ptr VkDeviceImageMemoryRequirements, pSparseMemoryRequirementCount: ptr uint32, pSparseMemoryRequirements: ptr VkSparseImageMemoryRequirements2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceImageSparseMemoryRequirements")) - - -proc loadVulkan*(instance: VkInstance) = - loadVK_VERSION_1_0(instance) - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_2(instance) - loadVK_VERSION_1_3(instance) - -proc loadVK_NV_geometry_shader_passthrough*(instance: VkInstance) = - discard - -proc loadVK_EXT_rasterization_order_attachment_access*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_IMG_format_pvrtc*(instance: VkInstance) = - discard - -proc loadVK_AMD_shader_fragment_mask*(instance: VkInstance) = - discard - -proc loadVK_EXT_primitive_topology_list_restart*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_KHR_global_priority*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_QCOM_image_processing*(instance: VkInstance) = - loadVK_VERSION_1_3(instance) - -# extension VK_AMD_shader_info -var - vkGetShaderInfoAMD*: proc(device: VkDevice, pipeline: VkPipeline, shaderStage: VkShaderStageFlagBits, infoType: VkShaderInfoTypeAMD, pInfoSize: ptr csize_t, pInfo: pointer): VkResult {.stdcall.} -proc loadVK_AMD_shader_info*(instance: VkInstance) = - vkGetShaderInfoAMD = cast[proc(device: VkDevice, pipeline: VkPipeline, shaderStage: VkShaderStageFlagBits, infoType: VkShaderInfoTypeAMD, pInfoSize: ptr csize_t, pInfo: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetShaderInfoAMD")) - -proc loadVK_AMD_gpu_shader_int16*(instance: VkInstance) = - discard - -proc loadVK_EXT_pipeline_robustness*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_sample_locations -var - vkCmdSetSampleLocationsEXT*: proc(commandBuffer: VkCommandBuffer, pSampleLocationsInfo: ptr VkSampleLocationsInfoEXT): void {.stdcall.} - vkGetPhysicalDeviceMultisamplePropertiesEXT*: proc(physicalDevice: VkPhysicalDevice, samples: VkSampleCountFlagBits, pMultisampleProperties: ptr VkMultisamplePropertiesEXT): void {.stdcall.} -proc loadVK_EXT_sample_locations*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdSetSampleLocationsEXT = cast[proc(commandBuffer: VkCommandBuffer, pSampleLocationsInfo: ptr VkSampleLocationsInfoEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetSampleLocationsEXT")) - vkGetPhysicalDeviceMultisamplePropertiesEXT = cast[proc(physicalDevice: VkPhysicalDevice, samples: VkSampleCountFlagBits, pMultisampleProperties: ptr VkMultisamplePropertiesEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT")) - -# extension VK_EXT_descriptor_buffer -var - vkGetDescriptorSetLayoutSizeEXT*: proc(device: VkDevice, layout: VkDescriptorSetLayout, pLayoutSizeInBytes: ptr VkDeviceSize): void {.stdcall.} - vkGetDescriptorSetLayoutBindingOffsetEXT*: proc(device: VkDevice, layout: VkDescriptorSetLayout, binding: uint32, pOffset: ptr VkDeviceSize): void {.stdcall.} - vkGetDescriptorEXT*: proc(device: VkDevice, pDescriptorInfo: ptr VkDescriptorGetInfoEXT, dataSize: csize_t, pDescriptor: pointer): void {.stdcall.} - vkCmdBindDescriptorBuffersEXT*: proc(commandBuffer: VkCommandBuffer, bufferCount: uint32, pBindingInfos: ptr VkDescriptorBufferBindingInfoEXT): void {.stdcall.} - vkCmdSetDescriptorBufferOffsetsEXT*: proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, layout: VkPipelineLayout, firstSet: uint32, setCount: uint32, pBufferIndices: ptr uint32, pOffsets: ptr VkDeviceSize): void {.stdcall.} - vkCmdBindDescriptorBufferEmbeddedSamplersEXT*: proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, layout: VkPipelineLayout, set: uint32): void {.stdcall.} - vkGetBufferOpaqueCaptureDescriptorDataEXT*: proc(device: VkDevice, pInfo: ptr VkBufferCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.} - vkGetImageOpaqueCaptureDescriptorDataEXT*: proc(device: VkDevice, pInfo: ptr VkImageCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.} - vkGetImageViewOpaqueCaptureDescriptorDataEXT*: proc(device: VkDevice, pInfo: ptr VkImageViewCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.} - vkGetSamplerOpaqueCaptureDescriptorDataEXT*: proc(device: VkDevice, pInfo: ptr VkSamplerCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.} - vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT*: proc(device: VkDevice, pInfo: ptr VkAccelerationStructureCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.} -proc loadVK_EXT_descriptor_buffer*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_2(instance) - loadVK_VERSION_1_3(instance) - loadVK_VERSION_1_2(instance) - vkGetDescriptorSetLayoutSizeEXT = cast[proc(device: VkDevice, layout: VkDescriptorSetLayout, pLayoutSizeInBytes: ptr VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDescriptorSetLayoutSizeEXT")) - vkGetDescriptorSetLayoutBindingOffsetEXT = cast[proc(device: VkDevice, layout: VkDescriptorSetLayout, binding: uint32, pOffset: ptr VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDescriptorSetLayoutBindingOffsetEXT")) - vkGetDescriptorEXT = cast[proc(device: VkDevice, pDescriptorInfo: ptr VkDescriptorGetInfoEXT, dataSize: csize_t, pDescriptor: pointer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDescriptorEXT")) - vkCmdBindDescriptorBuffersEXT = cast[proc(commandBuffer: VkCommandBuffer, bufferCount: uint32, pBindingInfos: ptr VkDescriptorBufferBindingInfoEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindDescriptorBuffersEXT")) - vkCmdSetDescriptorBufferOffsetsEXT = cast[proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, layout: VkPipelineLayout, firstSet: uint32, setCount: uint32, pBufferIndices: ptr uint32, pOffsets: ptr VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDescriptorBufferOffsetsEXT")) - vkCmdBindDescriptorBufferEmbeddedSamplersEXT = cast[proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, layout: VkPipelineLayout, set: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindDescriptorBufferEmbeddedSamplersEXT")) - vkGetBufferOpaqueCaptureDescriptorDataEXT = cast[proc(device: VkDevice, pInfo: ptr VkBufferCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetBufferOpaqueCaptureDescriptorDataEXT")) - vkGetImageOpaqueCaptureDescriptorDataEXT = cast[proc(device: VkDevice, pInfo: ptr VkImageCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageOpaqueCaptureDescriptorDataEXT")) - vkGetImageViewOpaqueCaptureDescriptorDataEXT = cast[proc(device: VkDevice, pInfo: ptr VkImageViewCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageViewOpaqueCaptureDescriptorDataEXT")) - vkGetSamplerOpaqueCaptureDescriptorDataEXT = cast[proc(device: VkDevice, pInfo: ptr VkSamplerCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetSamplerOpaqueCaptureDescriptorDataEXT")) - vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT = cast[proc(device: VkDevice, pInfo: ptr VkAccelerationStructureCaptureDescriptorDataInfoEXT, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT")) - -# extension VK_KHR_performance_query -var - vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR*: proc(physicalDevice: VkPhysicalDevice, queueFamilyIndex: uint32, pCounterCount: ptr uint32, pCounters: ptr VkPerformanceCounterKHR, pCounterDescriptions: ptr VkPerformanceCounterDescriptionKHR): VkResult {.stdcall.} - vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR*: proc(physicalDevice: VkPhysicalDevice, pPerformanceQueryCreateInfo: ptr VkQueryPoolPerformanceCreateInfoKHR, pNumPasses: ptr uint32): void {.stdcall.} - vkAcquireProfilingLockKHR*: proc(device: VkDevice, pInfo: ptr VkAcquireProfilingLockInfoKHR): VkResult {.stdcall.} - vkReleaseProfilingLockKHR*: proc(device: VkDevice): void {.stdcall.} -proc loadVK_KHR_performance_query*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = cast[proc(physicalDevice: VkPhysicalDevice, queueFamilyIndex: uint32, pCounterCount: ptr uint32, pCounters: ptr VkPerformanceCounterKHR, pCounterDescriptions: ptr VkPerformanceCounterDescriptionKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR")) - vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = cast[proc(physicalDevice: VkPhysicalDevice, pPerformanceQueryCreateInfo: ptr VkQueryPoolPerformanceCreateInfoKHR, pNumPasses: ptr uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR")) - vkAcquireProfilingLockKHR = cast[proc(device: VkDevice, pInfo: ptr VkAcquireProfilingLockInfoKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkAcquireProfilingLockKHR")) - vkReleaseProfilingLockKHR = cast[proc(device: VkDevice): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkReleaseProfilingLockKHR")) - -proc loadVK_GOOGLE_user_type*(instance: VkInstance) = - discard - -# extension VK_EXT_debug_report -var - vkCreateDebugReportCallbackEXT*: proc(instance: VkInstance, pCreateInfo: ptr VkDebugReportCallbackCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pCallback: ptr VkDebugReportCallbackEXT): VkResult {.stdcall.} - vkDestroyDebugReportCallbackEXT*: proc(instance: VkInstance, callback: VkDebugReportCallbackEXT, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkDebugReportMessageEXT*: proc(instance: VkInstance, flags: VkDebugReportFlagsEXT, objectType: VkDebugReportObjectTypeEXT, theobject: uint64, location: csize_t, messageCode: int32, pLayerPrefix: cstring, pMessage: cstring): void {.stdcall.} -proc loadVK_EXT_debug_report*(instance: VkInstance) = - vkCreateDebugReportCallbackEXT = cast[proc(instance: VkInstance, pCreateInfo: ptr VkDebugReportCallbackCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pCallback: ptr VkDebugReportCallbackEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT")) - vkDestroyDebugReportCallbackEXT = cast[proc(instance: VkInstance, callback: VkDebugReportCallbackEXT, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT")) - vkDebugReportMessageEXT = cast[proc(instance: VkInstance, flags: VkDebugReportFlagsEXT, objectType: VkDebugReportObjectTypeEXT, theobject: uint64, location: csize_t, messageCode: int32, pLayerPrefix: cstring, pMessage: cstring): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDebugReportMessageEXT")) - -proc loadVK_EXT_multisampled_render_to_single_sampled*(instance: VkInstance) = - loadVK_VERSION_1_2(instance) - loadVK_VERSION_1_2(instance) - -proc loadVK_AMD_negative_viewport_height*(instance: VkInstance) = - discard - -proc loadVK_EXT_provoking_vertex*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_NV_device_diagnostics_config*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_NV_shader_subgroup_partitioned*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_image_sliced_view_of_3d*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_1(instance) - -proc loadVK_AMD_shader_image_load_store_lod*(instance: VkInstance) = - discard - -proc loadVK_INTEL_shader_integer_functions2*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_image_2d_view_of_3d*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_1(instance) - -# extension VK_NV_shading_rate_image -var - vkCmdBindShadingRateImageNV*: proc(commandBuffer: VkCommandBuffer, imageView: VkImageView, imageLayout: VkImageLayout): void {.stdcall.} - vkCmdSetViewportShadingRatePaletteNV*: proc(commandBuffer: VkCommandBuffer, firstViewport: uint32, viewportCount: uint32, pShadingRatePalettes: ptr VkShadingRatePaletteNV): void {.stdcall.} - vkCmdSetCoarseSampleOrderNV*: proc(commandBuffer: VkCommandBuffer, sampleOrderType: VkCoarseSampleOrderTypeNV, customSampleOrderCount: uint32, pCustomSampleOrders: ptr VkCoarseSampleOrderCustomNV): void {.stdcall.} -proc loadVK_NV_shading_rate_image*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdBindShadingRateImageNV = cast[proc(commandBuffer: VkCommandBuffer, imageView: VkImageView, imageLayout: VkImageLayout): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindShadingRateImageNV")) - vkCmdSetViewportShadingRatePaletteNV = cast[proc(commandBuffer: VkCommandBuffer, firstViewport: uint32, viewportCount: uint32, pShadingRatePalettes: ptr VkShadingRatePaletteNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetViewportShadingRatePaletteNV")) - vkCmdSetCoarseSampleOrderNV = cast[proc(commandBuffer: VkCommandBuffer, sampleOrderType: VkCoarseSampleOrderTypeNV, customSampleOrderCount: uint32, pCustomSampleOrders: ptr VkCoarseSampleOrderCustomNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetCoarseSampleOrderNV")) - -proc loadVK_EXT_fragment_density_map*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_NV_device_diagnostic_checkpoints -var - vkCmdSetCheckpointNV*: proc(commandBuffer: VkCommandBuffer, pCheckpointMarker: pointer): void {.stdcall.} - vkGetQueueCheckpointDataNV*: proc(queue: VkQueue, pCheckpointDataCount: ptr uint32, pCheckpointData: ptr VkCheckpointDataNV): void {.stdcall.} -proc loadVK_NV_device_diagnostic_checkpoints*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdSetCheckpointNV = cast[proc(commandBuffer: VkCommandBuffer, pCheckpointMarker: pointer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetCheckpointNV")) - vkGetQueueCheckpointDataNV = cast[proc(queue: VkQueue, pCheckpointDataCount: ptr uint32, pCheckpointData: ptr VkCheckpointDataNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetQueueCheckpointDataNV")) - -proc loadVK_EXT_pci_bus_info*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_queue_family_foreign*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_debug_utils -var - vkSetDebugUtilsObjectNameEXT*: proc(device: VkDevice, pNameInfo: ptr VkDebugUtilsObjectNameInfoEXT): VkResult {.stdcall.} - vkSetDebugUtilsObjectTagEXT*: proc(device: VkDevice, pTagInfo: ptr VkDebugUtilsObjectTagInfoEXT): VkResult {.stdcall.} - vkQueueBeginDebugUtilsLabelEXT*: proc(queue: VkQueue, pLabelInfo: ptr VkDebugUtilsLabelEXT): void {.stdcall.} - vkQueueEndDebugUtilsLabelEXT*: proc(queue: VkQueue): void {.stdcall.} - vkQueueInsertDebugUtilsLabelEXT*: proc(queue: VkQueue, pLabelInfo: ptr VkDebugUtilsLabelEXT): void {.stdcall.} - vkCmdBeginDebugUtilsLabelEXT*: proc(commandBuffer: VkCommandBuffer, pLabelInfo: ptr VkDebugUtilsLabelEXT): void {.stdcall.} - vkCmdEndDebugUtilsLabelEXT*: proc(commandBuffer: VkCommandBuffer): void {.stdcall.} - vkCmdInsertDebugUtilsLabelEXT*: proc(commandBuffer: VkCommandBuffer, pLabelInfo: ptr VkDebugUtilsLabelEXT): void {.stdcall.} - vkCreateDebugUtilsMessengerEXT*: proc(instance: VkInstance, pCreateInfo: ptr VkDebugUtilsMessengerCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pMessenger: ptr VkDebugUtilsMessengerEXT): VkResult {.stdcall.} - vkDestroyDebugUtilsMessengerEXT*: proc(instance: VkInstance, messenger: VkDebugUtilsMessengerEXT, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkSubmitDebugUtilsMessageEXT*: proc(instance: VkInstance, messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT, messageTypes: VkDebugUtilsMessageTypeFlagsEXT, pCallbackData: ptr VkDebugUtilsMessengerCallbackDataEXT): void {.stdcall.} -proc loadVK_EXT_debug_utils*(instance: VkInstance) = - vkSetDebugUtilsObjectNameEXT = cast[proc(device: VkDevice, pNameInfo: ptr VkDebugUtilsObjectNameInfoEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkSetDebugUtilsObjectNameEXT")) - vkSetDebugUtilsObjectTagEXT = cast[proc(device: VkDevice, pTagInfo: ptr VkDebugUtilsObjectTagInfoEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkSetDebugUtilsObjectTagEXT")) - vkQueueBeginDebugUtilsLabelEXT = cast[proc(queue: VkQueue, pLabelInfo: ptr VkDebugUtilsLabelEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkQueueBeginDebugUtilsLabelEXT")) - vkQueueEndDebugUtilsLabelEXT = cast[proc(queue: VkQueue): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkQueueEndDebugUtilsLabelEXT")) - vkQueueInsertDebugUtilsLabelEXT = cast[proc(queue: VkQueue, pLabelInfo: ptr VkDebugUtilsLabelEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkQueueInsertDebugUtilsLabelEXT")) - vkCmdBeginDebugUtilsLabelEXT = cast[proc(commandBuffer: VkCommandBuffer, pLabelInfo: ptr VkDebugUtilsLabelEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBeginDebugUtilsLabelEXT")) - vkCmdEndDebugUtilsLabelEXT = cast[proc(commandBuffer: VkCommandBuffer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdEndDebugUtilsLabelEXT")) - vkCmdInsertDebugUtilsLabelEXT = cast[proc(commandBuffer: VkCommandBuffer, pLabelInfo: ptr VkDebugUtilsLabelEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdInsertDebugUtilsLabelEXT")) - vkCreateDebugUtilsMessengerEXT = cast[proc(instance: VkInstance, pCreateInfo: ptr VkDebugUtilsMessengerCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pMessenger: ptr VkDebugUtilsMessengerEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT")) - vkDestroyDebugUtilsMessengerEXT = cast[proc(instance: VkInstance, messenger: VkDebugUtilsMessengerEXT, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT")) - vkSubmitDebugUtilsMessageEXT = cast[proc(instance: VkInstance, messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT, messageTypes: VkDebugUtilsMessageTypeFlagsEXT, pCallbackData: ptr VkDebugUtilsMessengerCallbackDataEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkSubmitDebugUtilsMessageEXT")) - -proc loadVK_KHR_portability_enumeration*(instance: VkInstance) = - discard - -proc loadVK_EXT_memory_priority*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_AMD_shader_core_properties*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_KHR_external_fence_fd -var - vkImportFenceFdKHR*: proc(device: VkDevice, pImportFenceFdInfo: ptr VkImportFenceFdInfoKHR): VkResult {.stdcall.} - vkGetFenceFdKHR*: proc(device: VkDevice, pGetFdInfo: ptr VkFenceGetFdInfoKHR, pFd: ptr cint): VkResult {.stdcall.} -proc loadVK_KHR_external_fence_fd*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkImportFenceFdKHR = cast[proc(device: VkDevice, pImportFenceFdInfo: ptr VkImportFenceFdInfoKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkImportFenceFdKHR")) - vkGetFenceFdKHR = cast[proc(device: VkDevice, pGetFdInfo: ptr VkFenceGetFdInfoKHR, pFd: ptr cint): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetFenceFdKHR")) - -# extension VK_NV_device_generated_commands -var - vkGetGeneratedCommandsMemoryRequirementsNV*: proc(device: VkDevice, pInfo: ptr VkGeneratedCommandsMemoryRequirementsInfoNV, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.} - vkCmdPreprocessGeneratedCommandsNV*: proc(commandBuffer: VkCommandBuffer, pGeneratedCommandsInfo: ptr VkGeneratedCommandsInfoNV): void {.stdcall.} - vkCmdExecuteGeneratedCommandsNV*: proc(commandBuffer: VkCommandBuffer, isPreprocessed: VkBool32, pGeneratedCommandsInfo: ptr VkGeneratedCommandsInfoNV): void {.stdcall.} - vkCmdBindPipelineShaderGroupNV*: proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, pipeline: VkPipeline, groupIndex: uint32): void {.stdcall.} - vkCreateIndirectCommandsLayoutNV*: proc(device: VkDevice, pCreateInfo: ptr VkIndirectCommandsLayoutCreateInfoNV, pAllocator: ptr VkAllocationCallbacks, pIndirectCommandsLayout: ptr VkIndirectCommandsLayoutNV): VkResult {.stdcall.} - vkDestroyIndirectCommandsLayoutNV*: proc(device: VkDevice, indirectCommandsLayout: VkIndirectCommandsLayoutNV, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} -proc loadVK_NV_device_generated_commands*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_2(instance) - vkGetGeneratedCommandsMemoryRequirementsNV = cast[proc(device: VkDevice, pInfo: ptr VkGeneratedCommandsMemoryRequirementsInfoNV, pMemoryRequirements: ptr VkMemoryRequirements2): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetGeneratedCommandsMemoryRequirementsNV")) - vkCmdPreprocessGeneratedCommandsNV = cast[proc(commandBuffer: VkCommandBuffer, pGeneratedCommandsInfo: ptr VkGeneratedCommandsInfoNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdPreprocessGeneratedCommandsNV")) - vkCmdExecuteGeneratedCommandsNV = cast[proc(commandBuffer: VkCommandBuffer, isPreprocessed: VkBool32, pGeneratedCommandsInfo: ptr VkGeneratedCommandsInfoNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdExecuteGeneratedCommandsNV")) - vkCmdBindPipelineShaderGroupNV = cast[proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, pipeline: VkPipeline, groupIndex: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindPipelineShaderGroupNV")) - vkCreateIndirectCommandsLayoutNV = cast[proc(device: VkDevice, pCreateInfo: ptr VkIndirectCommandsLayoutCreateInfoNV, pAllocator: ptr VkAllocationCallbacks, pIndirectCommandsLayout: ptr VkIndirectCommandsLayoutNV): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateIndirectCommandsLayoutNV")) - vkDestroyIndirectCommandsLayoutNV = cast[proc(device: VkDevice, indirectCommandsLayout: VkIndirectCommandsLayoutNV, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyIndirectCommandsLayoutNV")) - -proc loadVK_NV_viewport_array2*(instance: VkInstance) = - discard - -proc loadVK_NVX_multiview_per_view_attributes*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_KHR_external_memory_fd -var - vkGetMemoryFdKHR*: proc(device: VkDevice, pGetFdInfo: ptr VkMemoryGetFdInfoKHR, pFd: ptr cint): VkResult {.stdcall.} - vkGetMemoryFdPropertiesKHR*: proc(device: VkDevice, handleType: VkExternalMemoryHandleTypeFlagBits, fd: cint, pMemoryFdProperties: ptr VkMemoryFdPropertiesKHR): VkResult {.stdcall.} -proc loadVK_KHR_external_memory_fd*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetMemoryFdKHR = cast[proc(device: VkDevice, pGetFdInfo: ptr VkMemoryGetFdInfoKHR, pFd: ptr cint): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetMemoryFdKHR")) - vkGetMemoryFdPropertiesKHR = cast[proc(device: VkDevice, handleType: VkExternalMemoryHandleTypeFlagBits, fd: cint, pMemoryFdProperties: ptr VkMemoryFdPropertiesKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetMemoryFdPropertiesKHR")) - -proc loadVK_EXT_rgba10x6_formats*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_NV_dedicated_allocation_image_aliasing*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_1(instance) - -# extension VK_NV_cooperative_matrix -var - vkGetPhysicalDeviceCooperativeMatrixPropertiesNV*: proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkCooperativeMatrixPropertiesNV): VkResult {.stdcall.} -proc loadVK_NV_cooperative_matrix*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = cast[proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkCooperativeMatrixPropertiesNV): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV")) - -proc loadVK_EXT_depth_clamp_zero_one*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_NV_linear_color_attachment*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_shader_subgroup_ballot*(instance: VkInstance) = - discard - -# extension VK_EXT_image_drm_format_modifier -var - vkGetImageDrmFormatModifierPropertiesEXT*: proc(device: VkDevice, image: VkImage, pProperties: ptr VkImageDrmFormatModifierPropertiesEXT): VkResult {.stdcall.} -proc loadVK_EXT_image_drm_format_modifier*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_2(instance) - loadVK_VERSION_1_1(instance) - vkGetImageDrmFormatModifierPropertiesEXT = cast[proc(device: VkDevice, image: VkImage, pProperties: ptr VkImageDrmFormatModifierPropertiesEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageDrmFormatModifierPropertiesEXT")) - -# extension VK_EXT_mesh_shader -var - vkCmdDrawMeshTasksEXT*: proc(commandBuffer: VkCommandBuffer, groupCountX: uint32, groupCountY: uint32, groupCountZ: uint32): void {.stdcall.} - vkCmdDrawMeshTasksIndirectEXT*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, drawCount: uint32, stride: uint32): void {.stdcall.} - vkCmdDrawMeshTasksIndirectCountEXT*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, countBuffer: VkBuffer, countBufferOffset: VkDeviceSize, maxDrawCount: uint32, stride: uint32): void {.stdcall.} -proc loadVK_EXT_mesh_shader*(instance: VkInstance) = - loadVK_VERSION_1_2(instance) - vkCmdDrawMeshTasksEXT = cast[proc(commandBuffer: VkCommandBuffer, groupCountX: uint32, groupCountY: uint32, groupCountZ: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksEXT")) - vkCmdDrawMeshTasksIndirectEXT = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, drawCount: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectEXT")) - vkCmdDrawMeshTasksIndirectCountEXT = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, countBuffer: VkBuffer, countBufferOffset: VkDeviceSize, maxDrawCount: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectCountEXT")) - -# extension VK_EXT_transform_feedback -var - vkCmdBindTransformFeedbackBuffersEXT*: proc(commandBuffer: VkCommandBuffer, firstBinding: uint32, bindingCount: uint32, pBuffers: ptr VkBuffer, pOffsets: ptr VkDeviceSize, pSizes: ptr VkDeviceSize): void {.stdcall.} - vkCmdBeginTransformFeedbackEXT*: proc(commandBuffer: VkCommandBuffer, firstCounterBuffer: uint32, counterBufferCount: uint32, pCounterBuffers: ptr VkBuffer, pCounterBufferOffsets: ptr VkDeviceSize): void {.stdcall.} - vkCmdEndTransformFeedbackEXT*: proc(commandBuffer: VkCommandBuffer, firstCounterBuffer: uint32, counterBufferCount: uint32, pCounterBuffers: ptr VkBuffer, pCounterBufferOffsets: ptr VkDeviceSize): void {.stdcall.} - vkCmdBeginQueryIndexedEXT*: proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, query: uint32, flags: VkQueryControlFlags, index: uint32): void {.stdcall.} - vkCmdEndQueryIndexedEXT*: proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, query: uint32, index: uint32): void {.stdcall.} - vkCmdDrawIndirectByteCountEXT*: proc(commandBuffer: VkCommandBuffer, instanceCount: uint32, firstInstance: uint32, counterBuffer: VkBuffer, counterBufferOffset: VkDeviceSize, counterOffset: uint32, vertexStride: uint32): void {.stdcall.} -proc loadVK_EXT_transform_feedback*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdBindTransformFeedbackBuffersEXT = cast[proc(commandBuffer: VkCommandBuffer, firstBinding: uint32, bindingCount: uint32, pBuffers: ptr VkBuffer, pOffsets: ptr VkDeviceSize, pSizes: ptr VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindTransformFeedbackBuffersEXT")) - vkCmdBeginTransformFeedbackEXT = cast[proc(commandBuffer: VkCommandBuffer, firstCounterBuffer: uint32, counterBufferCount: uint32, pCounterBuffers: ptr VkBuffer, pCounterBufferOffsets: ptr VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBeginTransformFeedbackEXT")) - vkCmdEndTransformFeedbackEXT = cast[proc(commandBuffer: VkCommandBuffer, firstCounterBuffer: uint32, counterBufferCount: uint32, pCounterBuffers: ptr VkBuffer, pCounterBufferOffsets: ptr VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdEndTransformFeedbackEXT")) - vkCmdBeginQueryIndexedEXT = cast[proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, query: uint32, flags: VkQueryControlFlags, index: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBeginQueryIndexedEXT")) - vkCmdEndQueryIndexedEXT = cast[proc(commandBuffer: VkCommandBuffer, queryPool: VkQueryPool, query: uint32, index: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdEndQueryIndexedEXT")) - vkCmdDrawIndirectByteCountEXT = cast[proc(commandBuffer: VkCommandBuffer, instanceCount: uint32, firstInstance: uint32, counterBuffer: VkBuffer, counterBufferOffset: VkDeviceSize, counterOffset: uint32, vertexStride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawIndirectByteCountEXT")) - -proc loadVK_AMD_shader_early_and_late_fragment_tests*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_AMD_shader_core_properties2*(instance: VkInstance) = - loadVK_AMD_shader_core_properties(instance) - -proc loadVK_GOOGLE_hlsl_functionality1*(instance: VkInstance) = - discard - -proc loadVK_EXT_robustness2*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_image_view_min_lod*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_AMD_shader_trinary_minmax*(instance: VkInstance) = - discard - -proc loadVK_EXT_custom_border_color*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_AMD_rasterization_order*(instance: VkInstance) = - discard - -# extension VK_EXT_vertex_input_dynamic_state -var - vkCmdSetVertexInputEXT*: proc(commandBuffer: VkCommandBuffer, vertexBindingDescriptionCount: uint32, pVertexBindingDescriptions: ptr VkVertexInputBindingDescription2EXT, vertexAttributeDescriptionCount: uint32, pVertexAttributeDescriptions: ptr VkVertexInputAttributeDescription2EXT): void {.stdcall.} -proc loadVK_EXT_vertex_input_dynamic_state*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdSetVertexInputEXT = cast[proc(commandBuffer: VkCommandBuffer, vertexBindingDescriptionCount: uint32, pVertexBindingDescriptions: ptr VkVertexInputBindingDescription2EXT, vertexAttributeDescriptionCount: uint32, pVertexAttributeDescriptions: ptr VkVertexInputAttributeDescription2EXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetVertexInputEXT")) - -# extension VK_KHR_fragment_shading_rate -var - vkGetPhysicalDeviceFragmentShadingRatesKHR*: proc(physicalDevice: VkPhysicalDevice, pFragmentShadingRateCount: ptr uint32, pFragmentShadingRates: ptr VkPhysicalDeviceFragmentShadingRateKHR): VkResult {.stdcall.} - vkCmdSetFragmentShadingRateKHR*: proc(commandBuffer: VkCommandBuffer, pFragmentSize: ptr VkExtent2D, combinerOps: array[2, VkFragmentShadingRateCombinerOpKHR]): void {.stdcall.} -proc loadVK_KHR_fragment_shading_rate*(instance: VkInstance) = - loadVK_VERSION_1_2(instance) - loadVK_VERSION_1_1(instance) - vkGetPhysicalDeviceFragmentShadingRatesKHR = cast[proc(physicalDevice: VkPhysicalDevice, pFragmentShadingRateCount: ptr uint32, pFragmentShadingRates: ptr VkPhysicalDeviceFragmentShadingRateKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR")) - vkCmdSetFragmentShadingRateKHR = cast[proc(commandBuffer: VkCommandBuffer, pFragmentSize: ptr VkExtent2D, combinerOps: array[2, VkFragmentShadingRateCombinerOpKHR]): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetFragmentShadingRateKHR")) - -proc loadVK_EXT_depth_clip_enable*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_subpass_merge_feedback*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_KHR_external_semaphore_fd -var - vkImportSemaphoreFdKHR*: proc(device: VkDevice, pImportSemaphoreFdInfo: ptr VkImportSemaphoreFdInfoKHR): VkResult {.stdcall.} - vkGetSemaphoreFdKHR*: proc(device: VkDevice, pGetFdInfo: ptr VkSemaphoreGetFdInfoKHR, pFd: ptr cint): VkResult {.stdcall.} -proc loadVK_KHR_external_semaphore_fd*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkImportSemaphoreFdKHR = cast[proc(device: VkDevice, pImportSemaphoreFdInfo: ptr VkImportSemaphoreFdInfoKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkImportSemaphoreFdKHR")) - vkGetSemaphoreFdKHR = cast[proc(device: VkDevice, pGetFdInfo: ptr VkSemaphoreGetFdInfoKHR, pFd: ptr cint): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetSemaphoreFdKHR")) - -proc loadVK_KHR_fragment_shader_barycentric*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_memory_budget*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_AMD_device_coherent_memory*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_device_memory_report*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_AMD_memory_overallocation_behavior*(instance: VkInstance) = - discard - -# extension VK_NV_mesh_shader -var - vkCmdDrawMeshTasksNV*: proc(commandBuffer: VkCommandBuffer, taskCount: uint32, firstTask: uint32): void {.stdcall.} - vkCmdDrawMeshTasksIndirectNV*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, drawCount: uint32, stride: uint32): void {.stdcall.} - vkCmdDrawMeshTasksIndirectCountNV*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, countBuffer: VkBuffer, countBufferOffset: VkDeviceSize, maxDrawCount: uint32, stride: uint32): void {.stdcall.} -proc loadVK_NV_mesh_shader*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdDrawMeshTasksNV = cast[proc(commandBuffer: VkCommandBuffer, taskCount: uint32, firstTask: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksNV")) - vkCmdDrawMeshTasksIndirectNV = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, drawCount: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectNV")) - vkCmdDrawMeshTasksIndirectCountNV = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize, countBuffer: VkBuffer, countBufferOffset: VkDeviceSize, maxDrawCount: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectCountNV")) - -# extension VK_EXT_image_compression_control -var - vkGetImageSubresourceLayout2EXT*: proc(device: VkDevice, image: VkImage, pSubresource: ptr VkImageSubresource2EXT, pLayout: ptr VkSubresourceLayout2EXT): void {.stdcall.} -proc loadVK_EXT_image_compression_control*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetImageSubresourceLayout2EXT = cast[proc(device: VkDevice, image: VkImage, pSubresource: ptr VkImageSubresource2EXT, pLayout: ptr VkSubresourceLayout2EXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageSubresourceLayout2EXT")) - -# extension VK_EXT_buffer_device_address -var - vkGetBufferDeviceAddressEXT*: proc(device: VkDevice, pInfo: ptr VkBufferDeviceAddressInfo): VkDeviceAddress {.stdcall.} -proc loadVK_EXT_buffer_device_address*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetBufferDeviceAddressEXT = vkGetBufferDeviceAddress - -proc loadVK_QCOM_render_pass_shader_resolve*(instance: VkInstance) = - discard - -proc loadVK_EXT_depth_range_unrestricted*(instance: VkInstance) = - discard - -# extension VK_HUAWEI_subpass_shading -var - vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI*: proc(device: VkDevice, renderpass: VkRenderPass, pMaxWorkgroupSize: ptr VkExtent2D): VkResult {.stdcall.} - vkCmdSubpassShadingHUAWEI*: proc(commandBuffer: VkCommandBuffer): void {.stdcall.} -proc loadVK_HUAWEI_subpass_shading*(instance: VkInstance) = - loadVK_VERSION_1_2(instance) - loadVK_VERSION_1_3(instance) - vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = cast[proc(device: VkDevice, renderpass: VkRenderPass, pMaxWorkgroupSize: ptr VkExtent2D): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI")) - vkCmdSubpassShadingHUAWEI = cast[proc(commandBuffer: VkCommandBuffer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSubpassShadingHUAWEI")) - -# extension VK_VALVE_descriptor_set_host_mapping -var - vkGetDescriptorSetLayoutHostMappingInfoVALVE*: proc(device: VkDevice, pBindingReference: ptr VkDescriptorSetBindingReferenceVALVE, pHostMapping: ptr VkDescriptorSetLayoutHostMappingInfoVALVE): void {.stdcall.} - vkGetDescriptorSetHostMappingVALVE*: proc(device: VkDevice, descriptorSet: VkDescriptorSet, ppData: ptr pointer): void {.stdcall.} -proc loadVK_VALVE_descriptor_set_host_mapping*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetDescriptorSetLayoutHostMappingInfoVALVE = cast[proc(device: VkDevice, pBindingReference: ptr VkDescriptorSetBindingReferenceVALVE, pHostMapping: ptr VkDescriptorSetLayoutHostMappingInfoVALVE): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDescriptorSetLayoutHostMappingInfoVALVE")) - vkGetDescriptorSetHostMappingVALVE = cast[proc(device: VkDevice, descriptorSet: VkDescriptorSet, ppData: ptr pointer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDescriptorSetHostMappingVALVE")) - -# extension VK_NV_external_memory_capabilities -var - vkGetPhysicalDeviceExternalImageFormatPropertiesNV*: proc(physicalDevice: VkPhysicalDevice, format: VkFormat, thetype: VkImageType, tiling: VkImageTiling, usage: VkImageUsageFlags, flags: VkImageCreateFlags, externalHandleType: VkExternalMemoryHandleTypeFlagsNV, pExternalImageFormatProperties: ptr VkExternalImageFormatPropertiesNV): VkResult {.stdcall.} -proc loadVK_NV_external_memory_capabilities*(instance: VkInstance) = - vkGetPhysicalDeviceExternalImageFormatPropertiesNV = cast[proc(physicalDevice: VkPhysicalDevice, format: VkFormat, thetype: VkImageType, tiling: VkImageTiling, usage: VkImageUsageFlags, flags: VkImageCreateFlags, externalHandleType: VkExternalMemoryHandleTypeFlagsNV, pExternalImageFormatProperties: ptr VkExternalImageFormatPropertiesNV): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV")) - -# extension VK_NV_optical_flow -var - vkGetPhysicalDeviceOpticalFlowImageFormatsNV*: proc(physicalDevice: VkPhysicalDevice, pOpticalFlowImageFormatInfo: ptr VkOpticalFlowImageFormatInfoNV, pFormatCount: ptr uint32, pImageFormatProperties: ptr VkOpticalFlowImageFormatPropertiesNV): VkResult {.stdcall.} - vkCreateOpticalFlowSessionNV*: proc(device: VkDevice, pCreateInfo: ptr VkOpticalFlowSessionCreateInfoNV, pAllocator: ptr VkAllocationCallbacks, pSession: ptr VkOpticalFlowSessionNV): VkResult {.stdcall.} - vkDestroyOpticalFlowSessionNV*: proc(device: VkDevice, session: VkOpticalFlowSessionNV, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkBindOpticalFlowSessionImageNV*: proc(device: VkDevice, session: VkOpticalFlowSessionNV, bindingPoint: VkOpticalFlowSessionBindingPointNV, view: VkImageView, layout: VkImageLayout): VkResult {.stdcall.} - vkCmdOpticalFlowExecuteNV*: proc(commandBuffer: VkCommandBuffer, session: VkOpticalFlowSessionNV, pExecuteInfo: ptr VkOpticalFlowExecuteInfoNV): void {.stdcall.} -proc loadVK_NV_optical_flow*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_3(instance) - loadVK_VERSION_1_3(instance) - vkGetPhysicalDeviceOpticalFlowImageFormatsNV = cast[proc(physicalDevice: VkPhysicalDevice, pOpticalFlowImageFormatInfo: ptr VkOpticalFlowImageFormatInfoNV, pFormatCount: ptr uint32, pImageFormatProperties: ptr VkOpticalFlowImageFormatPropertiesNV): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceOpticalFlowImageFormatsNV")) - vkCreateOpticalFlowSessionNV = cast[proc(device: VkDevice, pCreateInfo: ptr VkOpticalFlowSessionCreateInfoNV, pAllocator: ptr VkAllocationCallbacks, pSession: ptr VkOpticalFlowSessionNV): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateOpticalFlowSessionNV")) - vkDestroyOpticalFlowSessionNV = cast[proc(device: VkDevice, session: VkOpticalFlowSessionNV, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyOpticalFlowSessionNV")) - vkBindOpticalFlowSessionImageNV = cast[proc(device: VkDevice, session: VkOpticalFlowSessionNV, bindingPoint: VkOpticalFlowSessionBindingPointNV, view: VkImageView, layout: VkImageLayout): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkBindOpticalFlowSessionImageNV")) - vkCmdOpticalFlowExecuteNV = cast[proc(commandBuffer: VkCommandBuffer, session: VkOpticalFlowSessionNV, pExecuteInfo: ptr VkOpticalFlowExecuteInfoNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdOpticalFlowExecuteNV")) - -proc loadVK_EXT_vertex_attribute_divisor*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_line_rasterization -var - vkCmdSetLineStippleEXT*: proc(commandBuffer: VkCommandBuffer, lineStippleFactor: uint32, lineStipplePattern: uint16): void {.stdcall.} -proc loadVK_EXT_line_rasterization*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdSetLineStippleEXT = cast[proc(commandBuffer: VkCommandBuffer, lineStippleFactor: uint32, lineStipplePattern: uint16): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetLineStippleEXT")) - -proc loadVK_AMD_texture_gather_bias_lod*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_KHR_shader_subgroup_uniform_control_flow*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_external_memory_dma_buf*(instance: VkInstance) = - loadVK_KHR_external_memory_fd(instance) - -proc loadVK_IMG_filter_cubic*(instance: VkInstance) = - discard - -proc loadVK_AMD_shader_ballot*(instance: VkInstance) = - discard - -# extension VK_AMD_buffer_marker -var - vkCmdWriteBufferMarkerAMD*: proc(commandBuffer: VkCommandBuffer, pipelineStage: VkPipelineStageFlagBits, dstBuffer: VkBuffer, dstOffset: VkDeviceSize, marker: uint32): void {.stdcall.} -proc loadVK_AMD_buffer_marker*(instance: VkInstance) = - vkCmdWriteBufferMarkerAMD = cast[proc(commandBuffer: VkCommandBuffer, pipelineStage: VkPipelineStageFlagBits, dstBuffer: VkBuffer, dstOffset: VkDeviceSize, marker: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdWriteBufferMarkerAMD")) - -proc loadVK_NV_corner_sampled_image*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_KHR_pipeline_library*(instance: VkInstance) = - discard - -proc loadVK_EXT_blend_operation_advanced*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_NV_scissor_exclusive -var - vkCmdSetExclusiveScissorEnableNV*: proc(commandBuffer: VkCommandBuffer, firstExclusiveScissor: uint32, exclusiveScissorCount: uint32, pExclusiveScissorEnables: ptr VkBool32): void {.stdcall.} - vkCmdSetExclusiveScissorNV*: proc(commandBuffer: VkCommandBuffer, firstExclusiveScissor: uint32, exclusiveScissorCount: uint32, pExclusiveScissors: ptr VkRect2D): void {.stdcall.} -proc loadVK_NV_scissor_exclusive*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdSetExclusiveScissorEnableNV = cast[proc(commandBuffer: VkCommandBuffer, firstExclusiveScissor: uint32, exclusiveScissorCount: uint32, pExclusiveScissorEnables: ptr VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetExclusiveScissorEnableNV")) - vkCmdSetExclusiveScissorNV = cast[proc(commandBuffer: VkCommandBuffer, firstExclusiveScissor: uint32, exclusiveScissorCount: uint32, pExclusiveScissors: ptr VkRect2D): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetExclusiveScissorNV")) - -proc loadVK_NV_framebuffer_mixed_samples*(instance: VkInstance) = - discard - -proc loadVK_NV_sample_mask_override_coverage*(instance: VkInstance) = - discard - -proc loadVK_EXT_filter_cubic*(instance: VkInstance) = - discard - -# extension VK_KHR_pipeline_executable_properties -var - vkGetPipelineExecutablePropertiesKHR*: proc(device: VkDevice, pPipelineInfo: ptr VkPipelineInfoKHR, pExecutableCount: ptr uint32, pProperties: ptr VkPipelineExecutablePropertiesKHR): VkResult {.stdcall.} - vkGetPipelineExecutableStatisticsKHR*: proc(device: VkDevice, pExecutableInfo: ptr VkPipelineExecutableInfoKHR, pStatisticCount: ptr uint32, pStatistics: ptr VkPipelineExecutableStatisticKHR): VkResult {.stdcall.} - vkGetPipelineExecutableInternalRepresentationsKHR*: proc(device: VkDevice, pExecutableInfo: ptr VkPipelineExecutableInfoKHR, pInternalRepresentationCount: ptr uint32, pInternalRepresentations: ptr VkPipelineExecutableInternalRepresentationKHR): VkResult {.stdcall.} -proc loadVK_KHR_pipeline_executable_properties*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetPipelineExecutablePropertiesKHR = cast[proc(device: VkDevice, pPipelineInfo: ptr VkPipelineInfoKHR, pExecutableCount: ptr uint32, pProperties: ptr VkPipelineExecutablePropertiesKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPipelineExecutablePropertiesKHR")) - vkGetPipelineExecutableStatisticsKHR = cast[proc(device: VkDevice, pExecutableInfo: ptr VkPipelineExecutableInfoKHR, pStatisticCount: ptr uint32, pStatistics: ptr VkPipelineExecutableStatisticKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPipelineExecutableStatisticsKHR")) - vkGetPipelineExecutableInternalRepresentationsKHR = cast[proc(device: VkDevice, pExecutableInfo: ptr VkPipelineExecutableInfoKHR, pInternalRepresentationCount: ptr uint32, pInternalRepresentations: ptr VkPipelineExecutableInternalRepresentationKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPipelineExecutableInternalRepresentationsKHR")) - -# extension VK_EXT_extended_dynamic_state3 -var - vkCmdSetTessellationDomainOriginEXT*: proc(commandBuffer: VkCommandBuffer, domainOrigin: VkTessellationDomainOrigin): void {.stdcall.} - vkCmdSetDepthClampEnableEXT*: proc(commandBuffer: VkCommandBuffer, depthClampEnable: VkBool32): void {.stdcall.} - vkCmdSetPolygonModeEXT*: proc(commandBuffer: VkCommandBuffer, polygonMode: VkPolygonMode): void {.stdcall.} - vkCmdSetRasterizationSamplesEXT*: proc(commandBuffer: VkCommandBuffer, rasterizationSamples: VkSampleCountFlagBits): void {.stdcall.} - vkCmdSetSampleMaskEXT*: proc(commandBuffer: VkCommandBuffer, samples: VkSampleCountFlagBits, pSampleMask: ptr VkSampleMask): void {.stdcall.} - vkCmdSetAlphaToCoverageEnableEXT*: proc(commandBuffer: VkCommandBuffer, alphaToCoverageEnable: VkBool32): void {.stdcall.} - vkCmdSetAlphaToOneEnableEXT*: proc(commandBuffer: VkCommandBuffer, alphaToOneEnable: VkBool32): void {.stdcall.} - vkCmdSetLogicOpEnableEXT*: proc(commandBuffer: VkCommandBuffer, logicOpEnable: VkBool32): void {.stdcall.} - vkCmdSetColorBlendEnableEXT*: proc(commandBuffer: VkCommandBuffer, firstAttachment: uint32, attachmentCount: uint32, pColorBlendEnables: ptr VkBool32): void {.stdcall.} - vkCmdSetColorBlendEquationEXT*: proc(commandBuffer: VkCommandBuffer, firstAttachment: uint32, attachmentCount: uint32, pColorBlendEquations: ptr VkColorBlendEquationEXT): void {.stdcall.} - vkCmdSetColorWriteMaskEXT*: proc(commandBuffer: VkCommandBuffer, firstAttachment: uint32, attachmentCount: uint32, pColorWriteMasks: ptr VkColorComponentFlags): void {.stdcall.} - vkCmdSetRasterizationStreamEXT*: proc(commandBuffer: VkCommandBuffer, rasterizationStream: uint32): void {.stdcall.} - vkCmdSetConservativeRasterizationModeEXT*: proc(commandBuffer: VkCommandBuffer, conservativeRasterizationMode: VkConservativeRasterizationModeEXT): void {.stdcall.} - vkCmdSetExtraPrimitiveOverestimationSizeEXT*: proc(commandBuffer: VkCommandBuffer, extraPrimitiveOverestimationSize: float32): void {.stdcall.} - vkCmdSetDepthClipEnableEXT*: proc(commandBuffer: VkCommandBuffer, depthClipEnable: VkBool32): void {.stdcall.} - vkCmdSetSampleLocationsEnableEXT*: proc(commandBuffer: VkCommandBuffer, sampleLocationsEnable: VkBool32): void {.stdcall.} - vkCmdSetColorBlendAdvancedEXT*: proc(commandBuffer: VkCommandBuffer, firstAttachment: uint32, attachmentCount: uint32, pColorBlendAdvanced: ptr VkColorBlendAdvancedEXT): void {.stdcall.} - vkCmdSetProvokingVertexModeEXT*: proc(commandBuffer: VkCommandBuffer, provokingVertexMode: VkProvokingVertexModeEXT): void {.stdcall.} - vkCmdSetLineRasterizationModeEXT*: proc(commandBuffer: VkCommandBuffer, lineRasterizationMode: VkLineRasterizationModeEXT): void {.stdcall.} - vkCmdSetLineStippleEnableEXT*: proc(commandBuffer: VkCommandBuffer, stippledLineEnable: VkBool32): void {.stdcall.} - vkCmdSetDepthClipNegativeOneToOneEXT*: proc(commandBuffer: VkCommandBuffer, negativeOneToOne: VkBool32): void {.stdcall.} - vkCmdSetViewportWScalingEnableNV*: proc(commandBuffer: VkCommandBuffer, viewportWScalingEnable: VkBool32): void {.stdcall.} - vkCmdSetViewportSwizzleNV*: proc(commandBuffer: VkCommandBuffer, firstViewport: uint32, viewportCount: uint32, pViewportSwizzles: ptr VkViewportSwizzleNV): void {.stdcall.} - vkCmdSetCoverageToColorEnableNV*: proc(commandBuffer: VkCommandBuffer, coverageToColorEnable: VkBool32): void {.stdcall.} - vkCmdSetCoverageToColorLocationNV*: proc(commandBuffer: VkCommandBuffer, coverageToColorLocation: uint32): void {.stdcall.} - vkCmdSetCoverageModulationModeNV*: proc(commandBuffer: VkCommandBuffer, coverageModulationMode: VkCoverageModulationModeNV): void {.stdcall.} - vkCmdSetCoverageModulationTableEnableNV*: proc(commandBuffer: VkCommandBuffer, coverageModulationTableEnable: VkBool32): void {.stdcall.} - vkCmdSetCoverageModulationTableNV*: proc(commandBuffer: VkCommandBuffer, coverageModulationTableCount: uint32, pCoverageModulationTable: ptr float32): void {.stdcall.} - vkCmdSetShadingRateImageEnableNV*: proc(commandBuffer: VkCommandBuffer, shadingRateImageEnable: VkBool32): void {.stdcall.} - vkCmdSetRepresentativeFragmentTestEnableNV*: proc(commandBuffer: VkCommandBuffer, representativeFragmentTestEnable: VkBool32): void {.stdcall.} - vkCmdSetCoverageReductionModeNV*: proc(commandBuffer: VkCommandBuffer, coverageReductionMode: VkCoverageReductionModeNV): void {.stdcall.} -proc loadVK_EXT_extended_dynamic_state3*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdSetTessellationDomainOriginEXT = cast[proc(commandBuffer: VkCommandBuffer, domainOrigin: VkTessellationDomainOrigin): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetTessellationDomainOriginEXT")) - vkCmdSetDepthClampEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, depthClampEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthClampEnableEXT")) - vkCmdSetPolygonModeEXT = cast[proc(commandBuffer: VkCommandBuffer, polygonMode: VkPolygonMode): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetPolygonModeEXT")) - vkCmdSetRasterizationSamplesEXT = cast[proc(commandBuffer: VkCommandBuffer, rasterizationSamples: VkSampleCountFlagBits): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetRasterizationSamplesEXT")) - vkCmdSetSampleMaskEXT = cast[proc(commandBuffer: VkCommandBuffer, samples: VkSampleCountFlagBits, pSampleMask: ptr VkSampleMask): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetSampleMaskEXT")) - vkCmdSetAlphaToCoverageEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, alphaToCoverageEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetAlphaToCoverageEnableEXT")) - vkCmdSetAlphaToOneEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, alphaToOneEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetAlphaToOneEnableEXT")) - vkCmdSetLogicOpEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, logicOpEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetLogicOpEnableEXT")) - vkCmdSetColorBlendEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, firstAttachment: uint32, attachmentCount: uint32, pColorBlendEnables: ptr VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetColorBlendEnableEXT")) - vkCmdSetColorBlendEquationEXT = cast[proc(commandBuffer: VkCommandBuffer, firstAttachment: uint32, attachmentCount: uint32, pColorBlendEquations: ptr VkColorBlendEquationEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetColorBlendEquationEXT")) - vkCmdSetColorWriteMaskEXT = cast[proc(commandBuffer: VkCommandBuffer, firstAttachment: uint32, attachmentCount: uint32, pColorWriteMasks: ptr VkColorComponentFlags): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetColorWriteMaskEXT")) - vkCmdSetRasterizationStreamEXT = cast[proc(commandBuffer: VkCommandBuffer, rasterizationStream: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetRasterizationStreamEXT")) - vkCmdSetConservativeRasterizationModeEXT = cast[proc(commandBuffer: VkCommandBuffer, conservativeRasterizationMode: VkConservativeRasterizationModeEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetConservativeRasterizationModeEXT")) - vkCmdSetExtraPrimitiveOverestimationSizeEXT = cast[proc(commandBuffer: VkCommandBuffer, extraPrimitiveOverestimationSize: float32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetExtraPrimitiveOverestimationSizeEXT")) - vkCmdSetDepthClipEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, depthClipEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthClipEnableEXT")) - vkCmdSetSampleLocationsEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, sampleLocationsEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetSampleLocationsEnableEXT")) - vkCmdSetColorBlendAdvancedEXT = cast[proc(commandBuffer: VkCommandBuffer, firstAttachment: uint32, attachmentCount: uint32, pColorBlendAdvanced: ptr VkColorBlendAdvancedEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetColorBlendAdvancedEXT")) - vkCmdSetProvokingVertexModeEXT = cast[proc(commandBuffer: VkCommandBuffer, provokingVertexMode: VkProvokingVertexModeEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetProvokingVertexModeEXT")) - vkCmdSetLineRasterizationModeEXT = cast[proc(commandBuffer: VkCommandBuffer, lineRasterizationMode: VkLineRasterizationModeEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetLineRasterizationModeEXT")) - vkCmdSetLineStippleEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, stippledLineEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetLineStippleEnableEXT")) - vkCmdSetDepthClipNegativeOneToOneEXT = cast[proc(commandBuffer: VkCommandBuffer, negativeOneToOne: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDepthClipNegativeOneToOneEXT")) - vkCmdSetViewportWScalingEnableNV = cast[proc(commandBuffer: VkCommandBuffer, viewportWScalingEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetViewportWScalingEnableNV")) - vkCmdSetViewportSwizzleNV = cast[proc(commandBuffer: VkCommandBuffer, firstViewport: uint32, viewportCount: uint32, pViewportSwizzles: ptr VkViewportSwizzleNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetViewportSwizzleNV")) - vkCmdSetCoverageToColorEnableNV = cast[proc(commandBuffer: VkCommandBuffer, coverageToColorEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetCoverageToColorEnableNV")) - vkCmdSetCoverageToColorLocationNV = cast[proc(commandBuffer: VkCommandBuffer, coverageToColorLocation: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetCoverageToColorLocationNV")) - vkCmdSetCoverageModulationModeNV = cast[proc(commandBuffer: VkCommandBuffer, coverageModulationMode: VkCoverageModulationModeNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetCoverageModulationModeNV")) - vkCmdSetCoverageModulationTableEnableNV = cast[proc(commandBuffer: VkCommandBuffer, coverageModulationTableEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetCoverageModulationTableEnableNV")) - vkCmdSetCoverageModulationTableNV = cast[proc(commandBuffer: VkCommandBuffer, coverageModulationTableCount: uint32, pCoverageModulationTable: ptr float32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetCoverageModulationTableNV")) - vkCmdSetShadingRateImageEnableNV = cast[proc(commandBuffer: VkCommandBuffer, shadingRateImageEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetShadingRateImageEnableNV")) - vkCmdSetRepresentativeFragmentTestEnableNV = cast[proc(commandBuffer: VkCommandBuffer, representativeFragmentTestEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetRepresentativeFragmentTestEnableNV")) - vkCmdSetCoverageReductionModeNV = cast[proc(commandBuffer: VkCommandBuffer, coverageReductionMode: VkCoverageReductionModeNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetCoverageReductionModeNV")) - -proc loadVK_EXT_device_address_binding_report*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_EXT_debug_utils(instance) - -# extension VK_NV_clip_space_w_scaling -var - vkCmdSetViewportWScalingNV*: proc(commandBuffer: VkCommandBuffer, firstViewport: uint32, viewportCount: uint32, pViewportWScalings: ptr VkViewportWScalingNV): void {.stdcall.} -proc loadVK_NV_clip_space_w_scaling*(instance: VkInstance) = - vkCmdSetViewportWScalingNV = cast[proc(commandBuffer: VkCommandBuffer, firstViewport: uint32, viewportCount: uint32, pViewportWScalings: ptr VkViewportWScalingNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetViewportWScalingNV")) - -proc loadVK_NV_fill_rectangle*(instance: VkInstance) = - discard - -proc loadVK_EXT_shader_image_atomic_int64*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_ycbcr_image_arrays*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_calibrated_timestamps -var - vkGetPhysicalDeviceCalibrateableTimeDomainsEXT*: proc(physicalDevice: VkPhysicalDevice, pTimeDomainCount: ptr uint32, pTimeDomains: ptr VkTimeDomainEXT): VkResult {.stdcall.} - vkGetCalibratedTimestampsEXT*: proc(device: VkDevice, timestampCount: uint32, pTimestampInfos: ptr VkCalibratedTimestampInfoEXT, pTimestamps: ptr uint64, pMaxDeviation: ptr uint64): VkResult {.stdcall.} -proc loadVK_EXT_calibrated_timestamps*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = cast[proc(physicalDevice: VkPhysicalDevice, pTimeDomainCount: ptr uint32, pTimeDomains: ptr VkTimeDomainEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT")) - vkGetCalibratedTimestampsEXT = cast[proc(device: VkDevice, timestampCount: uint32, pTimestampInfos: ptr VkCalibratedTimestampInfoEXT, pTimestamps: ptr uint64, pMaxDeviation: ptr uint64): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetCalibratedTimestampsEXT")) - -proc loadVK_EXT_attachment_feedback_loop_layout*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_AMD_mixed_attachment_samples*(instance: VkInstance) = - discard - -# extension VK_EXT_external_memory_host -var - vkGetMemoryHostPointerPropertiesEXT*: proc(device: VkDevice, handleType: VkExternalMemoryHandleTypeFlagBits, pHostPointer: pointer, pMemoryHostPointerProperties: ptr VkMemoryHostPointerPropertiesEXT): VkResult {.stdcall.} -proc loadVK_EXT_external_memory_host*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetMemoryHostPointerPropertiesEXT = cast[proc(device: VkDevice, handleType: VkExternalMemoryHandleTypeFlagBits, pHostPointer: pointer, pMemoryHostPointerProperties: ptr VkMemoryHostPointerPropertiesEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetMemoryHostPointerPropertiesEXT")) - -proc loadVK_ARM_shader_core_properties*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_shader_module_identifier -var - vkGetShaderModuleIdentifierEXT*: proc(device: VkDevice, shaderModule: VkShaderModule, pIdentifier: ptr VkShaderModuleIdentifierEXT): void {.stdcall.} - vkGetShaderModuleCreateInfoIdentifierEXT*: proc(device: VkDevice, pCreateInfo: ptr VkShaderModuleCreateInfo, pIdentifier: ptr VkShaderModuleIdentifierEXT): void {.stdcall.} -proc loadVK_EXT_shader_module_identifier*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_3(instance) - vkGetShaderModuleIdentifierEXT = cast[proc(device: VkDevice, shaderModule: VkShaderModule, pIdentifier: ptr VkShaderModuleIdentifierEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetShaderModuleIdentifierEXT")) - vkGetShaderModuleCreateInfoIdentifierEXT = cast[proc(device: VkDevice, pCreateInfo: ptr VkShaderModuleCreateInfo, pIdentifier: ptr VkShaderModuleIdentifierEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetShaderModuleCreateInfoIdentifierEXT")) - -proc loadVK_EXT_border_color_swizzle*(instance: VkInstance) = - loadVK_EXT_custom_border_color(instance) - -# extension VK_NV_memory_decompression -var - vkCmdDecompressMemoryNV*: proc(commandBuffer: VkCommandBuffer, decompressRegionCount: uint32, pDecompressMemoryRegions: ptr VkDecompressMemoryRegionNV): void {.stdcall.} - vkCmdDecompressMemoryIndirectCountNV*: proc(commandBuffer: VkCommandBuffer, indirectCommandsAddress: VkDeviceAddress, indirectCommandsCountAddress: VkDeviceAddress, stride: uint32): void {.stdcall.} -proc loadVK_NV_memory_decompression*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_2(instance) - vkCmdDecompressMemoryNV = cast[proc(commandBuffer: VkCommandBuffer, decompressRegionCount: uint32, pDecompressMemoryRegions: ptr VkDecompressMemoryRegionNV): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDecompressMemoryNV")) - vkCmdDecompressMemoryIndirectCountNV = cast[proc(commandBuffer: VkCommandBuffer, indirectCommandsAddress: VkDeviceAddress, indirectCommandsCountAddress: VkDeviceAddress, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDecompressMemoryIndirectCountNV")) - -proc loadVK_EXT_fragment_shader_interlock*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_NV_coverage_reduction_mode -var - vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV*: proc(physicalDevice: VkPhysicalDevice, pCombinationCount: ptr uint32, pCombinations: ptr VkFramebufferMixedSamplesCombinationNV): VkResult {.stdcall.} -proc loadVK_NV_coverage_reduction_mode*(instance: VkInstance) = - loadVK_NV_framebuffer_mixed_samples(instance) - loadVK_VERSION_1_1(instance) - vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = cast[proc(physicalDevice: VkPhysicalDevice, pCombinationCount: ptr uint32, pCombinations: ptr VkFramebufferMixedSamplesCombinationNV): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV")) - -proc loadVK_NV_glsl_shader*(instance: VkInstance) = - discard - -proc loadVK_KHR_shader_clock*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_QCOM_tile_properties -var - vkGetFramebufferTilePropertiesQCOM*: proc(device: VkDevice, framebuffer: VkFramebuffer, pPropertiesCount: ptr uint32, pProperties: ptr VkTilePropertiesQCOM): VkResult {.stdcall.} - vkGetDynamicRenderingTilePropertiesQCOM*: proc(device: VkDevice, pRenderingInfo: ptr VkRenderingInfo, pProperties: ptr VkTilePropertiesQCOM): VkResult {.stdcall.} -proc loadVK_QCOM_tile_properties*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetFramebufferTilePropertiesQCOM = cast[proc(device: VkDevice, framebuffer: VkFramebuffer, pPropertiesCount: ptr uint32, pProperties: ptr VkTilePropertiesQCOM): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetFramebufferTilePropertiesQCOM")) - vkGetDynamicRenderingTilePropertiesQCOM = cast[proc(device: VkDevice, pRenderingInfo: ptr VkRenderingInfo, pProperties: ptr VkTilePropertiesQCOM): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDynamicRenderingTilePropertiesQCOM")) - -# extension VK_KHR_push_descriptor -var - vkCmdPushDescriptorSetKHR*: proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, layout: VkPipelineLayout, set: uint32, descriptorWriteCount: uint32, pDescriptorWrites: ptr VkWriteDescriptorSet): void {.stdcall.} - vkCmdPushDescriptorSetWithTemplateKHR*: proc(commandBuffer: VkCommandBuffer, descriptorUpdateTemplate: VkDescriptorUpdateTemplate, layout: VkPipelineLayout, set: uint32, pData: pointer): void {.stdcall.} -proc loadVK_KHR_push_descriptor*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdPushDescriptorSetKHR = cast[proc(commandBuffer: VkCommandBuffer, pipelineBindPoint: VkPipelineBindPoint, layout: VkPipelineLayout, set: uint32, descriptorWriteCount: uint32, pDescriptorWrites: ptr VkWriteDescriptorSet): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdPushDescriptorSetKHR")) - vkCmdPushDescriptorSetWithTemplateKHR = cast[proc(commandBuffer: VkCommandBuffer, descriptorUpdateTemplate: VkDescriptorUpdateTemplate, layout: VkPipelineLayout, set: uint32, pData: pointer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdPushDescriptorSetWithTemplateKHR")) - vkCmdPushDescriptorSetWithTemplateKHR = cast[proc(commandBuffer: VkCommandBuffer, descriptorUpdateTemplate: VkDescriptorUpdateTemplate, layout: VkPipelineLayout, set: uint32, pData: pointer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdPushDescriptorSetWithTemplateKHR")) - -proc loadVK_NV_viewport_swizzle*(instance: VkInstance) = - discard - -proc loadVK_NV_external_memory*(instance: VkInstance) = - loadVK_NV_external_memory_capabilities(instance) - -proc loadVK_EXT_depth_clip_control*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_validation_flags*(instance: VkInstance) = - discard - -proc loadVK_EXT_conservative_rasterization*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_AMD_gcn_shader*(instance: VkInstance) = - discard - -# extension VK_INTEL_performance_query -var - vkInitializePerformanceApiINTEL*: proc(device: VkDevice, pInitializeInfo: ptr VkInitializePerformanceApiInfoINTEL): VkResult {.stdcall.} - vkUninitializePerformanceApiINTEL*: proc(device: VkDevice): void {.stdcall.} - vkCmdSetPerformanceMarkerINTEL*: proc(commandBuffer: VkCommandBuffer, pMarkerInfo: ptr VkPerformanceMarkerInfoINTEL): VkResult {.stdcall.} - vkCmdSetPerformanceStreamMarkerINTEL*: proc(commandBuffer: VkCommandBuffer, pMarkerInfo: ptr VkPerformanceStreamMarkerInfoINTEL): VkResult {.stdcall.} - vkCmdSetPerformanceOverrideINTEL*: proc(commandBuffer: VkCommandBuffer, pOverrideInfo: ptr VkPerformanceOverrideInfoINTEL): VkResult {.stdcall.} - vkAcquirePerformanceConfigurationINTEL*: proc(device: VkDevice, pAcquireInfo: ptr VkPerformanceConfigurationAcquireInfoINTEL, pConfiguration: ptr VkPerformanceConfigurationINTEL): VkResult {.stdcall.} - vkReleasePerformanceConfigurationINTEL*: proc(device: VkDevice, configuration: VkPerformanceConfigurationINTEL): VkResult {.stdcall.} - vkQueueSetPerformanceConfigurationINTEL*: proc(queue: VkQueue, configuration: VkPerformanceConfigurationINTEL): VkResult {.stdcall.} - vkGetPerformanceParameterINTEL*: proc(device: VkDevice, parameter: VkPerformanceParameterTypeINTEL, pValue: ptr VkPerformanceValueINTEL): VkResult {.stdcall.} -proc loadVK_INTEL_performance_query*(instance: VkInstance) = - vkInitializePerformanceApiINTEL = cast[proc(device: VkDevice, pInitializeInfo: ptr VkInitializePerformanceApiInfoINTEL): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkInitializePerformanceApiINTEL")) - vkUninitializePerformanceApiINTEL = cast[proc(device: VkDevice): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkUninitializePerformanceApiINTEL")) - vkCmdSetPerformanceMarkerINTEL = cast[proc(commandBuffer: VkCommandBuffer, pMarkerInfo: ptr VkPerformanceMarkerInfoINTEL): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetPerformanceMarkerINTEL")) - vkCmdSetPerformanceStreamMarkerINTEL = cast[proc(commandBuffer: VkCommandBuffer, pMarkerInfo: ptr VkPerformanceStreamMarkerInfoINTEL): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetPerformanceStreamMarkerINTEL")) - vkCmdSetPerformanceOverrideINTEL = cast[proc(commandBuffer: VkCommandBuffer, pOverrideInfo: ptr VkPerformanceOverrideInfoINTEL): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetPerformanceOverrideINTEL")) - vkAcquirePerformanceConfigurationINTEL = cast[proc(device: VkDevice, pAcquireInfo: ptr VkPerformanceConfigurationAcquireInfoINTEL, pConfiguration: ptr VkPerformanceConfigurationINTEL): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkAcquirePerformanceConfigurationINTEL")) - vkReleasePerformanceConfigurationINTEL = cast[proc(device: VkDevice, configuration: VkPerformanceConfigurationINTEL): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkReleasePerformanceConfigurationINTEL")) - vkQueueSetPerformanceConfigurationINTEL = cast[proc(queue: VkQueue, configuration: VkPerformanceConfigurationINTEL): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkQueueSetPerformanceConfigurationINTEL")) - vkGetPerformanceParameterINTEL = cast[proc(device: VkDevice, parameter: VkPerformanceParameterTypeINTEL, pValue: ptr VkPerformanceValueINTEL): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPerformanceParameterINTEL")) - -proc loadVK_EXT_primitives_generated_query*(instance: VkInstance) = - loadVK_EXT_transform_feedback(instance) - -proc loadVK_AMD_pipeline_compiler_control*(instance: VkInstance) = - discard - -proc loadVK_EXT_post_depth_coverage*(instance: VkInstance) = - discard - -# extension VK_EXT_conditional_rendering -var - vkCmdBeginConditionalRenderingEXT*: proc(commandBuffer: VkCommandBuffer, pConditionalRenderingBegin: ptr VkConditionalRenderingBeginInfoEXT): void {.stdcall.} - vkCmdEndConditionalRenderingEXT*: proc(commandBuffer: VkCommandBuffer): void {.stdcall.} -proc loadVK_EXT_conditional_rendering*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdBeginConditionalRenderingEXT = cast[proc(commandBuffer: VkCommandBuffer, pConditionalRenderingBegin: ptr VkConditionalRenderingBeginInfoEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBeginConditionalRenderingEXT")) - vkCmdEndConditionalRenderingEXT = cast[proc(commandBuffer: VkCommandBuffer): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdEndConditionalRenderingEXT")) - -proc loadVK_QCOM_multiview_per_view_viewports*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_multi_draw -var - vkCmdDrawMultiEXT*: proc(commandBuffer: VkCommandBuffer, drawCount: uint32, pVertexInfo: ptr VkMultiDrawInfoEXT, instanceCount: uint32, firstInstance: uint32, stride: uint32): void {.stdcall.} - vkCmdDrawMultiIndexedEXT*: proc(commandBuffer: VkCommandBuffer, drawCount: uint32, pIndexInfo: ptr VkMultiDrawIndexedInfoEXT, instanceCount: uint32, firstInstance: uint32, stride: uint32, pVertexOffset: ptr int32): void {.stdcall.} -proc loadVK_EXT_multi_draw*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdDrawMultiEXT = cast[proc(commandBuffer: VkCommandBuffer, drawCount: uint32, pVertexInfo: ptr VkMultiDrawInfoEXT, instanceCount: uint32, firstInstance: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawMultiEXT")) - vkCmdDrawMultiIndexedEXT = cast[proc(commandBuffer: VkCommandBuffer, drawCount: uint32, pIndexInfo: ptr VkMultiDrawIndexedInfoEXT, instanceCount: uint32, firstInstance: uint32, stride: uint32, pVertexOffset: ptr int32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawMultiIndexedEXT")) - -proc loadVK_NV_fragment_coverage_to_color*(instance: VkInstance) = - discard - -proc loadVK_EXT_load_store_op_none*(instance: VkInstance) = - discard - -proc loadVK_EXT_validation_features*(instance: VkInstance) = - discard - -proc loadVK_KHR_workgroup_memory_explicit_layout*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_index_type_uint8*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_GOOGLE_decorate_string*(instance: VkInstance) = - discard - -proc loadVK_EXT_shader_atomic_float*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_pipeline_properties -var - vkGetPipelinePropertiesEXT*: proc(device: VkDevice, pPipelineInfo: ptr VkPipelineInfoEXT, pPipelineProperties: ptr VkBaseOutStructure): VkResult {.stdcall.} -proc loadVK_EXT_pipeline_properties*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetPipelinePropertiesEXT = cast[proc(device: VkDevice, pPipelineInfo: ptr VkPipelineInfoEXT, pPipelineProperties: ptr VkBaseOutStructure): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPipelinePropertiesEXT")) - -proc loadVK_EXT_graphics_pipeline_library*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_KHR_pipeline_library(instance) - -# extension VK_KHR_surface -var - vkDestroySurfaceKHR*: proc(instance: VkInstance, surface: VkSurfaceKHR, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkGetPhysicalDeviceSurfaceSupportKHR*: proc(physicalDevice: VkPhysicalDevice, queueFamilyIndex: uint32, surface: VkSurfaceKHR, pSupported: ptr VkBool32): VkResult {.stdcall.} - vkGetPhysicalDeviceSurfaceCapabilitiesKHR*: proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pSurfaceCapabilities: ptr VkSurfaceCapabilitiesKHR): VkResult {.stdcall.} - vkGetPhysicalDeviceSurfaceFormatsKHR*: proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pSurfaceFormatCount: ptr uint32, pSurfaceFormats: ptr VkSurfaceFormatKHR): VkResult {.stdcall.} - vkGetPhysicalDeviceSurfacePresentModesKHR*: proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pPresentModeCount: ptr uint32, pPresentModes: ptr VkPresentModeKHR): VkResult {.stdcall.} -proc loadVK_KHR_surface*(instance: VkInstance) = - vkDestroySurfaceKHR = cast[proc(instance: VkInstance, surface: VkSurfaceKHR, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR")) - vkGetPhysicalDeviceSurfaceSupportKHR = cast[proc(physicalDevice: VkPhysicalDevice, queueFamilyIndex: uint32, surface: VkSurfaceKHR, pSupported: ptr VkBool32): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR")) - vkGetPhysicalDeviceSurfaceCapabilitiesKHR = cast[proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pSurfaceCapabilities: ptr VkSurfaceCapabilitiesKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR")) - vkGetPhysicalDeviceSurfaceFormatsKHR = cast[proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pSurfaceFormatCount: ptr uint32, pSurfaceFormats: ptr VkSurfaceFormatKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR")) - vkGetPhysicalDeviceSurfacePresentModesKHR = cast[proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pPresentModeCount: ptr uint32, pPresentModes: ptr VkPresentModeKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR")) - -proc loadVK_AMD_gpu_shader_half_float*(instance: VkInstance) = - discard - -# extension VK_KHR_deferred_host_operations -var - vkCreateDeferredOperationKHR*: proc(device: VkDevice, pAllocator: ptr VkAllocationCallbacks, pDeferredOperation: ptr VkDeferredOperationKHR): VkResult {.stdcall.} - vkDestroyDeferredOperationKHR*: proc(device: VkDevice, operation: VkDeferredOperationKHR, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkGetDeferredOperationMaxConcurrencyKHR*: proc(device: VkDevice, operation: VkDeferredOperationKHR): uint32 {.stdcall.} - vkGetDeferredOperationResultKHR*: proc(device: VkDevice, operation: VkDeferredOperationKHR): VkResult {.stdcall.} - vkDeferredOperationJoinKHR*: proc(device: VkDevice, operation: VkDeferredOperationKHR): VkResult {.stdcall.} -proc loadVK_KHR_deferred_host_operations*(instance: VkInstance) = - vkCreateDeferredOperationKHR = cast[proc(device: VkDevice, pAllocator: ptr VkAllocationCallbacks, pDeferredOperation: ptr VkDeferredOperationKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateDeferredOperationKHR")) - vkDestroyDeferredOperationKHR = cast[proc(device: VkDevice, operation: VkDeferredOperationKHR, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyDeferredOperationKHR")) - vkGetDeferredOperationMaxConcurrencyKHR = cast[proc(device: VkDevice, operation: VkDeferredOperationKHR): uint32 {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeferredOperationMaxConcurrencyKHR")) - vkGetDeferredOperationResultKHR = cast[proc(device: VkDevice, operation: VkDeferredOperationKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeferredOperationResultKHR")) - vkDeferredOperationJoinKHR = cast[proc(device: VkDevice, operation: VkDeferredOperationKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDeferredOperationJoinKHR")) - -proc loadVK_NV_dedicated_allocation*(instance: VkInstance) = - discard - -# extension VK_NVX_image_view_handle -var - vkGetImageViewHandleNVX*: proc(device: VkDevice, pInfo: ptr VkImageViewHandleInfoNVX): uint32 {.stdcall.} - vkGetImageViewAddressNVX*: proc(device: VkDevice, imageView: VkImageView, pProperties: ptr VkImageViewAddressPropertiesNVX): VkResult {.stdcall.} -proc loadVK_NVX_image_view_handle*(instance: VkInstance) = - vkGetImageViewHandleNVX = cast[proc(device: VkDevice, pInfo: ptr VkImageViewHandleInfoNVX): uint32 {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageViewHandleNVX")) - vkGetImageViewAddressNVX = cast[proc(device: VkDevice, imageView: VkImageView, pProperties: ptr VkImageViewAddressPropertiesNVX): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetImageViewAddressNVX")) - -proc loadVK_EXT_non_seamless_cube_map*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_QCOM_render_pass_store_ops*(instance: VkInstance) = - discard - -# extension VK_EXT_device_fault -var - vkGetDeviceFaultInfoEXT*: proc(device: VkDevice, pFaultCounts: ptr VkDeviceFaultCountsEXT, pFaultInfo: ptr VkDeviceFaultInfoEXT): VkResult {.stdcall.} -proc loadVK_EXT_device_fault*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetDeviceFaultInfoEXT = cast[proc(device: VkDevice, pFaultCounts: ptr VkDeviceFaultCountsEXT, pFaultInfo: ptr VkDeviceFaultInfoEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceFaultInfoEXT")) - -proc loadVK_EXT_mutable_descriptor_type*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_color_write_enable -var - vkCmdSetColorWriteEnableEXT*: proc(commandBuffer: VkCommandBuffer, attachmentCount: uint32, pColorWriteEnables: ptr VkBool32): void {.stdcall.} -proc loadVK_EXT_color_write_enable*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdSetColorWriteEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, attachmentCount: uint32, pColorWriteEnables: ptr VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetColorWriteEnableEXT")) - -proc loadVK_SEC_amigo_profiling*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_NVX_binary_import -var - vkCreateCuModuleNVX*: proc(device: VkDevice, pCreateInfo: ptr VkCuModuleCreateInfoNVX, pAllocator: ptr VkAllocationCallbacks, pModule: ptr VkCuModuleNVX): VkResult {.stdcall.} - vkCreateCuFunctionNVX*: proc(device: VkDevice, pCreateInfo: ptr VkCuFunctionCreateInfoNVX, pAllocator: ptr VkAllocationCallbacks, pFunction: ptr VkCuFunctionNVX): VkResult {.stdcall.} - vkDestroyCuModuleNVX*: proc(device: VkDevice, module: VkCuModuleNVX, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkDestroyCuFunctionNVX*: proc(device: VkDevice, function: VkCuFunctionNVX, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCmdCuLaunchKernelNVX*: proc(commandBuffer: VkCommandBuffer, pLaunchInfo: ptr VkCuLaunchInfoNVX): void {.stdcall.} -proc loadVK_NVX_binary_import*(instance: VkInstance) = - vkCreateCuModuleNVX = cast[proc(device: VkDevice, pCreateInfo: ptr VkCuModuleCreateInfoNVX, pAllocator: ptr VkAllocationCallbacks, pModule: ptr VkCuModuleNVX): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateCuModuleNVX")) - vkCreateCuFunctionNVX = cast[proc(device: VkDevice, pCreateInfo: ptr VkCuFunctionCreateInfoNVX, pAllocator: ptr VkAllocationCallbacks, pFunction: ptr VkCuFunctionNVX): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateCuFunctionNVX")) - vkDestroyCuModuleNVX = cast[proc(device: VkDevice, module: VkCuModuleNVX, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyCuModuleNVX")) - vkDestroyCuFunctionNVX = cast[proc(device: VkDevice, function: VkCuFunctionNVX, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyCuFunctionNVX")) - vkCmdCuLaunchKernelNVX = cast[proc(commandBuffer: VkCommandBuffer, pLaunchInfo: ptr VkCuLaunchInfoNVX): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCuLaunchKernelNVX")) - -proc loadVK_NV_representative_fragment_test*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_validation_cache -var - vkCreateValidationCacheEXT*: proc(device: VkDevice, pCreateInfo: ptr VkValidationCacheCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pValidationCache: ptr VkValidationCacheEXT): VkResult {.stdcall.} - vkDestroyValidationCacheEXT*: proc(device: VkDevice, validationCache: VkValidationCacheEXT, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkMergeValidationCachesEXT*: proc(device: VkDevice, dstCache: VkValidationCacheEXT, srcCacheCount: uint32, pSrcCaches: ptr VkValidationCacheEXT): VkResult {.stdcall.} - vkGetValidationCacheDataEXT*: proc(device: VkDevice, validationCache: VkValidationCacheEXT, pDataSize: ptr csize_t, pData: pointer): VkResult {.stdcall.} -proc loadVK_EXT_validation_cache*(instance: VkInstance) = - vkCreateValidationCacheEXT = cast[proc(device: VkDevice, pCreateInfo: ptr VkValidationCacheCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pValidationCache: ptr VkValidationCacheEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateValidationCacheEXT")) - vkDestroyValidationCacheEXT = cast[proc(device: VkDevice, validationCache: VkValidationCacheEXT, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyValidationCacheEXT")) - vkMergeValidationCachesEXT = cast[proc(device: VkDevice, dstCache: VkValidationCacheEXT, srcCacheCount: uint32, pSrcCaches: ptr VkValidationCacheEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkMergeValidationCachesEXT")) - vkGetValidationCacheDataEXT = cast[proc(device: VkDevice, validationCache: VkValidationCacheEXT, pDataSize: ptr csize_t, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetValidationCacheDataEXT")) - -proc loadVK_NV_inherited_viewport_scissor*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_legacy_dithering*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_physical_device_drm*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_pipeline_protected_access*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_EXT_discard_rectangles -var - vkCmdSetDiscardRectangleEXT*: proc(commandBuffer: VkCommandBuffer, firstDiscardRectangle: uint32, discardRectangleCount: uint32, pDiscardRectangles: ptr VkRect2D): void {.stdcall.} - vkCmdSetDiscardRectangleEnableEXT*: proc(commandBuffer: VkCommandBuffer, discardRectangleEnable: VkBool32): void {.stdcall.} - vkCmdSetDiscardRectangleModeEXT*: proc(commandBuffer: VkCommandBuffer, discardRectangleMode: VkDiscardRectangleModeEXT): void {.stdcall.} -proc loadVK_EXT_discard_rectangles*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdSetDiscardRectangleEXT = cast[proc(commandBuffer: VkCommandBuffer, firstDiscardRectangle: uint32, discardRectangleCount: uint32, pDiscardRectangles: ptr VkRect2D): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDiscardRectangleEXT")) - vkCmdSetDiscardRectangleEnableEXT = cast[proc(commandBuffer: VkCommandBuffer, discardRectangleEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDiscardRectangleEnableEXT")) - vkCmdSetDiscardRectangleModeEXT = cast[proc(commandBuffer: VkCommandBuffer, discardRectangleMode: VkDiscardRectangleModeEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetDiscardRectangleModeEXT")) - -proc loadVK_EXT_shader_stencil_export*(instance: VkInstance) = - discard - -# extension VK_NV_external_memory_rdma -var - vkGetMemoryRemoteAddressNV*: proc(device: VkDevice, pMemoryGetRemoteAddressInfo: ptr VkMemoryGetRemoteAddressInfoNV, pAddress: ptr VkRemoteAddressNV): VkResult {.stdcall.} -proc loadVK_NV_external_memory_rdma*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkGetMemoryRemoteAddressNV = cast[proc(device: VkDevice, pMemoryGetRemoteAddressInfo: ptr VkMemoryGetRemoteAddressInfoNV, pAddress: ptr VkRemoteAddressNV): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetMemoryRemoteAddressNV")) - -proc loadVK_ARM_shader_core_builtins*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_QCOM_multiview_per_view_render_areas*(instance: VkInstance) = - discard - -proc loadVK_LUNARG_direct_driver_loading*(instance: VkInstance) = - discard - -proc loadVK_AMD_shader_explicit_vertex_parameter*(instance: VkInstance) = - discard - -# extension VK_EXT_headless_surface -var - vkCreateHeadlessSurfaceEXT*: proc(instance: VkInstance, pCreateInfo: ptr VkHeadlessSurfaceCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pSurface: ptr VkSurfaceKHR): VkResult {.stdcall.} -proc loadVK_EXT_headless_surface*(instance: VkInstance) = - loadVK_KHR_surface(instance) - vkCreateHeadlessSurfaceEXT = cast[proc(instance: VkInstance, pCreateInfo: ptr VkHeadlessSurfaceCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pSurface: ptr VkSurfaceKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateHeadlessSurfaceEXT")) - -proc loadVK_NV_shader_sm_builtins*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_EXT_shader_subgroup_vote*(instance: VkInstance) = - discard - -# extension VK_NV_copy_memory_indirect -var - vkCmdCopyMemoryIndirectNV*: proc(commandBuffer: VkCommandBuffer, copyBufferAddress: VkDeviceAddress, copyCount: uint32, stride: uint32): void {.stdcall.} - vkCmdCopyMemoryToImageIndirectNV*: proc(commandBuffer: VkCommandBuffer, copyBufferAddress: VkDeviceAddress, copyCount: uint32, stride: uint32, dstImage: VkImage, dstImageLayout: VkImageLayout, pImageSubresources: ptr VkImageSubresourceLayers): void {.stdcall.} -proc loadVK_NV_copy_memory_indirect*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_2(instance) - vkCmdCopyMemoryIndirectNV = cast[proc(commandBuffer: VkCommandBuffer, copyBufferAddress: VkDeviceAddress, copyCount: uint32, stride: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyMemoryIndirectNV")) - vkCmdCopyMemoryToImageIndirectNV = cast[proc(commandBuffer: VkCommandBuffer, copyBufferAddress: VkDeviceAddress, copyCount: uint32, stride: uint32, dstImage: VkImage, dstImageLayout: VkImageLayout, pImageSubresources: ptr VkImageSubresourceLayers): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyMemoryToImageIndirectNV")) - -proc loadVK_EXT_astc_decode_mode*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -# extension VK_KHR_get_surface_capabilities2 -var - vkGetPhysicalDeviceSurfaceCapabilities2KHR*: proc(physicalDevice: VkPhysicalDevice, pSurfaceInfo: ptr VkPhysicalDeviceSurfaceInfo2KHR, pSurfaceCapabilities: ptr VkSurfaceCapabilities2KHR): VkResult {.stdcall.} - vkGetPhysicalDeviceSurfaceFormats2KHR*: proc(physicalDevice: VkPhysicalDevice, pSurfaceInfo: ptr VkPhysicalDeviceSurfaceInfo2KHR, pSurfaceFormatCount: ptr uint32, pSurfaceFormats: ptr VkSurfaceFormat2KHR): VkResult {.stdcall.} -proc loadVK_KHR_get_surface_capabilities2*(instance: VkInstance) = - loadVK_KHR_surface(instance) - vkGetPhysicalDeviceSurfaceCapabilities2KHR = cast[proc(physicalDevice: VkPhysicalDevice, pSurfaceInfo: ptr VkPhysicalDeviceSurfaceInfo2KHR, pSurfaceCapabilities: ptr VkSurfaceCapabilities2KHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR")) - vkGetPhysicalDeviceSurfaceFormats2KHR = cast[proc(physicalDevice: VkPhysicalDevice, pSurfaceInfo: ptr VkPhysicalDeviceSurfaceInfo2KHR, pSurfaceFormatCount: ptr uint32, pSurfaceFormats: ptr VkSurfaceFormat2KHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormats2KHR")) - -# extension VK_HUAWEI_cluster_culling_shader -var - vkCmdDrawClusterHUAWEI*: proc(commandBuffer: VkCommandBuffer, groupCountX: uint32, groupCountY: uint32, groupCountZ: uint32): void {.stdcall.} - vkCmdDrawClusterIndirectHUAWEI*: proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize): void {.stdcall.} -proc loadVK_HUAWEI_cluster_culling_shader*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - vkCmdDrawClusterHUAWEI = cast[proc(commandBuffer: VkCommandBuffer, groupCountX: uint32, groupCountY: uint32, groupCountZ: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawClusterHUAWEI")) - vkCmdDrawClusterIndirectHUAWEI = cast[proc(commandBuffer: VkCommandBuffer, buffer: VkBuffer, offset: VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdDrawClusterIndirectHUAWEI")) - -proc loadVK_KHR_surface_protected_capabilities*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_KHR_get_surface_capabilities2(instance) - -proc loadVK_NV_shader_image_footprint*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_NV_compute_shader_derivatives*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - -proc loadVK_QCOM_fragment_density_map_offset*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_EXT_fragment_density_map(instance) - -proc loadVK_EXT_shader_atomic_float2*(instance: VkInstance) = - loadVK_EXT_shader_atomic_float(instance) - -# extension VK_EXT_pageable_device_local_memory -var - vkSetDeviceMemoryPriorityEXT*: proc(device: VkDevice, memory: VkDeviceMemory, priority: float32): void {.stdcall.} -proc loadVK_EXT_pageable_device_local_memory*(instance: VkInstance) = - loadVK_EXT_memory_priority(instance) - vkSetDeviceMemoryPriorityEXT = cast[proc(device: VkDevice, memory: VkDeviceMemory, priority: float32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkSetDeviceMemoryPriorityEXT")) - -# extension VK_KHR_swapchain -var - vkCreateSwapchainKHR*: proc(device: VkDevice, pCreateInfo: ptr VkSwapchainCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pSwapchain: ptr VkSwapchainKHR): VkResult {.stdcall.} - vkDestroySwapchainKHR*: proc(device: VkDevice, swapchain: VkSwapchainKHR, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkGetSwapchainImagesKHR*: proc(device: VkDevice, swapchain: VkSwapchainKHR, pSwapchainImageCount: ptr uint32, pSwapchainImages: ptr VkImage): VkResult {.stdcall.} - vkAcquireNextImageKHR*: proc(device: VkDevice, swapchain: VkSwapchainKHR, timeout: uint64, semaphore: VkSemaphore, fence: VkFence, pImageIndex: ptr uint32): VkResult {.stdcall.} - vkQueuePresentKHR*: proc(queue: VkQueue, pPresentInfo: ptr VkPresentInfoKHR): VkResult {.stdcall.} - vkGetDeviceGroupPresentCapabilitiesKHR*: proc(device: VkDevice, pDeviceGroupPresentCapabilities: ptr VkDeviceGroupPresentCapabilitiesKHR): VkResult {.stdcall.} - vkGetDeviceGroupSurfacePresentModesKHR*: proc(device: VkDevice, surface: VkSurfaceKHR, pModes: ptr VkDeviceGroupPresentModeFlagsKHR): VkResult {.stdcall.} - vkGetPhysicalDevicePresentRectanglesKHR*: proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pRectCount: ptr uint32, pRects: ptr VkRect2D): VkResult {.stdcall.} - vkAcquireNextImage2KHR*: proc(device: VkDevice, pAcquireInfo: ptr VkAcquireNextImageInfoKHR, pImageIndex: ptr uint32): VkResult {.stdcall.} -proc loadVK_KHR_swapchain*(instance: VkInstance) = - loadVK_KHR_surface(instance) - vkCreateSwapchainKHR = cast[proc(device: VkDevice, pCreateInfo: ptr VkSwapchainCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pSwapchain: ptr VkSwapchainKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateSwapchainKHR")) - vkDestroySwapchainKHR = cast[proc(device: VkDevice, swapchain: VkSwapchainKHR, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroySwapchainKHR")) - vkGetSwapchainImagesKHR = cast[proc(device: VkDevice, swapchain: VkSwapchainKHR, pSwapchainImageCount: ptr uint32, pSwapchainImages: ptr VkImage): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetSwapchainImagesKHR")) - vkAcquireNextImageKHR = cast[proc(device: VkDevice, swapchain: VkSwapchainKHR, timeout: uint64, semaphore: VkSemaphore, fence: VkFence, pImageIndex: ptr uint32): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkAcquireNextImageKHR")) - vkQueuePresentKHR = cast[proc(queue: VkQueue, pPresentInfo: ptr VkPresentInfoKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkQueuePresentKHR")) - vkGetDeviceGroupPresentCapabilitiesKHR = cast[proc(device: VkDevice, pDeviceGroupPresentCapabilities: ptr VkDeviceGroupPresentCapabilitiesKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceGroupPresentCapabilitiesKHR")) - vkGetDeviceGroupSurfacePresentModesKHR = cast[proc(device: VkDevice, surface: VkSurfaceKHR, pModes: ptr VkDeviceGroupPresentModeFlagsKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceGroupSurfacePresentModesKHR")) - vkGetPhysicalDevicePresentRectanglesKHR = cast[proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pRectCount: ptr uint32, pRects: ptr VkRect2D): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDevicePresentRectanglesKHR")) - vkAcquireNextImage2KHR = cast[proc(device: VkDevice, pAcquireInfo: ptr VkAcquireNextImageInfoKHR, pImageIndex: ptr uint32): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkAcquireNextImage2KHR")) - -proc loadVK_EXT_fragment_density_map2*(instance: VkInstance) = - loadVK_EXT_fragment_density_map(instance) - -# extension VK_NV_fragment_shading_rate_enums -var - vkCmdSetFragmentShadingRateEnumNV*: proc(commandBuffer: VkCommandBuffer, shadingRate: VkFragmentShadingRateNV, combinerOps: array[2, VkFragmentShadingRateCombinerOpKHR]): void {.stdcall.} -proc loadVK_NV_fragment_shading_rate_enums*(instance: VkInstance) = - loadVK_KHR_fragment_shading_rate(instance) - vkCmdSetFragmentShadingRateEnumNV = cast[proc(commandBuffer: VkCommandBuffer, shadingRate: VkFragmentShadingRateNV, combinerOps: array[2, VkFragmentShadingRateCombinerOpKHR]): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetFragmentShadingRateEnumNV")) - -# extension VK_AMD_display_native_hdr -var - vkSetLocalDimmingAMD*: proc(device: VkDevice, swapChain: VkSwapchainKHR, localDimmingEnable: VkBool32): void {.stdcall.} -proc loadVK_AMD_display_native_hdr*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_KHR_get_surface_capabilities2(instance) - loadVK_KHR_swapchain(instance) - vkSetLocalDimmingAMD = cast[proc(device: VkDevice, swapChain: VkSwapchainKHR, localDimmingEnable: VkBool32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkSetLocalDimmingAMD")) - -proc loadVK_NV_present_barrier*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_KHR_surface(instance) - loadVK_KHR_get_surface_capabilities2(instance) - loadVK_KHR_swapchain(instance) - -proc loadVK_QCOM_rotated_copy_commands*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - loadVK_VERSION_1_3(instance) - -proc loadVK_EXT_surface_maintenance1*(instance: VkInstance) = - loadVK_KHR_surface(instance) - loadVK_KHR_get_surface_capabilities2(instance) - -# extension VK_KHR_acceleration_structure -var - vkCreateAccelerationStructureKHR*: proc(device: VkDevice, pCreateInfo: ptr VkAccelerationStructureCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pAccelerationStructure: ptr VkAccelerationStructureKHR): VkResult {.stdcall.} - vkDestroyAccelerationStructureKHR*: proc(device: VkDevice, accelerationStructure: VkAccelerationStructureKHR, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCmdBuildAccelerationStructuresKHR*: proc(commandBuffer: VkCommandBuffer, infoCount: uint32, pInfos: ptr VkAccelerationStructureBuildGeometryInfoKHR, ppBuildRangeInfos: ptr ptr VkAccelerationStructureBuildRangeInfoKHR): void {.stdcall.} - vkCmdBuildAccelerationStructuresIndirectKHR*: proc(commandBuffer: VkCommandBuffer, infoCount: uint32, pInfos: ptr VkAccelerationStructureBuildGeometryInfoKHR, pIndirectDeviceAddresses: ptr VkDeviceAddress, pIndirectStrides: ptr uint32, ppMaxPrimitiveCounts: ptr ptr uint32): void {.stdcall.} - vkBuildAccelerationStructuresKHR*: proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, infoCount: uint32, pInfos: ptr VkAccelerationStructureBuildGeometryInfoKHR, ppBuildRangeInfos: ptr ptr VkAccelerationStructureBuildRangeInfoKHR): VkResult {.stdcall.} - vkCopyAccelerationStructureKHR*: proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyAccelerationStructureInfoKHR): VkResult {.stdcall.} - vkCopyAccelerationStructureToMemoryKHR*: proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyAccelerationStructureToMemoryInfoKHR): VkResult {.stdcall.} - vkCopyMemoryToAccelerationStructureKHR*: proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyMemoryToAccelerationStructureInfoKHR): VkResult {.stdcall.} - vkWriteAccelerationStructuresPropertiesKHR*: proc(device: VkDevice, accelerationStructureCount: uint32, pAccelerationStructures: ptr VkAccelerationStructureKHR, queryType: VkQueryType, dataSize: csize_t, pData: pointer, stride: csize_t): VkResult {.stdcall.} - vkCmdCopyAccelerationStructureKHR*: proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyAccelerationStructureInfoKHR): void {.stdcall.} - vkCmdCopyAccelerationStructureToMemoryKHR*: proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyAccelerationStructureToMemoryInfoKHR): void {.stdcall.} - vkCmdCopyMemoryToAccelerationStructureKHR*: proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyMemoryToAccelerationStructureInfoKHR): void {.stdcall.} - vkGetAccelerationStructureDeviceAddressKHR*: proc(device: VkDevice, pInfo: ptr VkAccelerationStructureDeviceAddressInfoKHR): VkDeviceAddress {.stdcall.} - vkCmdWriteAccelerationStructuresPropertiesKHR*: proc(commandBuffer: VkCommandBuffer, accelerationStructureCount: uint32, pAccelerationStructures: ptr VkAccelerationStructureKHR, queryType: VkQueryType, queryPool: VkQueryPool, firstQuery: uint32): void {.stdcall.} - vkGetDeviceAccelerationStructureCompatibilityKHR*: proc(device: VkDevice, pVersionInfo: ptr VkAccelerationStructureVersionInfoKHR, pCompatibility: ptr VkAccelerationStructureCompatibilityKHR): void {.stdcall.} - vkGetAccelerationStructureBuildSizesKHR*: proc(device: VkDevice, buildType: VkAccelerationStructureBuildTypeKHR, pBuildInfo: ptr VkAccelerationStructureBuildGeometryInfoKHR, pMaxPrimitiveCounts: ptr uint32, pSizeInfo: ptr VkAccelerationStructureBuildSizesInfoKHR): void {.stdcall.} -proc loadVK_KHR_acceleration_structure*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_2(instance) - loadVK_VERSION_1_2(instance) - loadVK_KHR_deferred_host_operations(instance) - vkCreateAccelerationStructureKHR = cast[proc(device: VkDevice, pCreateInfo: ptr VkAccelerationStructureCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pAccelerationStructure: ptr VkAccelerationStructureKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateAccelerationStructureKHR")) - vkDestroyAccelerationStructureKHR = cast[proc(device: VkDevice, accelerationStructure: VkAccelerationStructureKHR, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyAccelerationStructureKHR")) - vkCmdBuildAccelerationStructuresKHR = cast[proc(commandBuffer: VkCommandBuffer, infoCount: uint32, pInfos: ptr VkAccelerationStructureBuildGeometryInfoKHR, ppBuildRangeInfos: ptr ptr VkAccelerationStructureBuildRangeInfoKHR): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBuildAccelerationStructuresKHR")) - vkCmdBuildAccelerationStructuresIndirectKHR = cast[proc(commandBuffer: VkCommandBuffer, infoCount: uint32, pInfos: ptr VkAccelerationStructureBuildGeometryInfoKHR, pIndirectDeviceAddresses: ptr VkDeviceAddress, pIndirectStrides: ptr uint32, ppMaxPrimitiveCounts: ptr ptr uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBuildAccelerationStructuresIndirectKHR")) - vkBuildAccelerationStructuresKHR = cast[proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, infoCount: uint32, pInfos: ptr VkAccelerationStructureBuildGeometryInfoKHR, ppBuildRangeInfos: ptr ptr VkAccelerationStructureBuildRangeInfoKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkBuildAccelerationStructuresKHR")) - vkCopyAccelerationStructureKHR = cast[proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyAccelerationStructureInfoKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCopyAccelerationStructureKHR")) - vkCopyAccelerationStructureToMemoryKHR = cast[proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyAccelerationStructureToMemoryInfoKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCopyAccelerationStructureToMemoryKHR")) - vkCopyMemoryToAccelerationStructureKHR = cast[proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyMemoryToAccelerationStructureInfoKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCopyMemoryToAccelerationStructureKHR")) - vkWriteAccelerationStructuresPropertiesKHR = cast[proc(device: VkDevice, accelerationStructureCount: uint32, pAccelerationStructures: ptr VkAccelerationStructureKHR, queryType: VkQueryType, dataSize: csize_t, pData: pointer, stride: csize_t): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkWriteAccelerationStructuresPropertiesKHR")) - vkCmdCopyAccelerationStructureKHR = cast[proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyAccelerationStructureInfoKHR): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyAccelerationStructureKHR")) - vkCmdCopyAccelerationStructureToMemoryKHR = cast[proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyAccelerationStructureToMemoryInfoKHR): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyAccelerationStructureToMemoryKHR")) - vkCmdCopyMemoryToAccelerationStructureKHR = cast[proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyMemoryToAccelerationStructureInfoKHR): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyMemoryToAccelerationStructureKHR")) - vkGetAccelerationStructureDeviceAddressKHR = cast[proc(device: VkDevice, pInfo: ptr VkAccelerationStructureDeviceAddressInfoKHR): VkDeviceAddress {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureDeviceAddressKHR")) - vkCmdWriteAccelerationStructuresPropertiesKHR = cast[proc(commandBuffer: VkCommandBuffer, accelerationStructureCount: uint32, pAccelerationStructures: ptr VkAccelerationStructureKHR, queryType: VkQueryType, queryPool: VkQueryPool, firstQuery: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdWriteAccelerationStructuresPropertiesKHR")) - vkGetDeviceAccelerationStructureCompatibilityKHR = cast[proc(device: VkDevice, pVersionInfo: ptr VkAccelerationStructureVersionInfoKHR, pCompatibility: ptr VkAccelerationStructureCompatibilityKHR): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceAccelerationStructureCompatibilityKHR")) - vkGetAccelerationStructureBuildSizesKHR = cast[proc(device: VkDevice, buildType: VkAccelerationStructureBuildTypeKHR, pBuildInfo: ptr VkAccelerationStructureBuildGeometryInfoKHR, pMaxPrimitiveCounts: ptr uint32, pSizeInfo: ptr VkAccelerationStructureBuildSizesInfoKHR): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureBuildSizesKHR")) - -# extension VK_GOOGLE_display_timing -var - vkGetRefreshCycleDurationGOOGLE*: proc(device: VkDevice, swapchain: VkSwapchainKHR, pDisplayTimingProperties: ptr VkRefreshCycleDurationGOOGLE): VkResult {.stdcall.} - vkGetPastPresentationTimingGOOGLE*: proc(device: VkDevice, swapchain: VkSwapchainKHR, pPresentationTimingCount: ptr uint32, pPresentationTimings: ptr VkPastPresentationTimingGOOGLE): VkResult {.stdcall.} -proc loadVK_GOOGLE_display_timing*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - vkGetRefreshCycleDurationGOOGLE = cast[proc(device: VkDevice, swapchain: VkSwapchainKHR, pDisplayTimingProperties: ptr VkRefreshCycleDurationGOOGLE): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetRefreshCycleDurationGOOGLE")) - vkGetPastPresentationTimingGOOGLE = cast[proc(device: VkDevice, swapchain: VkSwapchainKHR, pPresentationTimingCount: ptr uint32, pPresentationTimings: ptr VkPastPresentationTimingGOOGLE): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPastPresentationTimingGOOGLE")) - -proc loadVK_QCOM_render_pass_transform*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - loadVK_KHR_surface(instance) - -proc loadVK_GOOGLE_surfaceless_query*(instance: VkInstance) = - loadVK_KHR_surface(instance) - -proc loadVK_EXT_image_compression_control_swapchain*(instance: VkInstance) = - loadVK_EXT_image_compression_control(instance) - -# extension VK_KHR_display -var - vkGetPhysicalDeviceDisplayPropertiesKHR*: proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayPropertiesKHR): VkResult {.stdcall.} - vkGetPhysicalDeviceDisplayPlanePropertiesKHR*: proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayPlanePropertiesKHR): VkResult {.stdcall.} - vkGetDisplayPlaneSupportedDisplaysKHR*: proc(physicalDevice: VkPhysicalDevice, planeIndex: uint32, pDisplayCount: ptr uint32, pDisplays: ptr VkDisplayKHR): VkResult {.stdcall.} - vkGetDisplayModePropertiesKHR*: proc(physicalDevice: VkPhysicalDevice, display: VkDisplayKHR, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayModePropertiesKHR): VkResult {.stdcall.} - vkCreateDisplayModeKHR*: proc(physicalDevice: VkPhysicalDevice, display: VkDisplayKHR, pCreateInfo: ptr VkDisplayModeCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pMode: ptr VkDisplayModeKHR): VkResult {.stdcall.} - vkGetDisplayPlaneCapabilitiesKHR*: proc(physicalDevice: VkPhysicalDevice, mode: VkDisplayModeKHR, planeIndex: uint32, pCapabilities: ptr VkDisplayPlaneCapabilitiesKHR): VkResult {.stdcall.} - vkCreateDisplayPlaneSurfaceKHR*: proc(instance: VkInstance, pCreateInfo: ptr VkDisplaySurfaceCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pSurface: ptr VkSurfaceKHR): VkResult {.stdcall.} -proc loadVK_KHR_display*(instance: VkInstance) = - loadVK_KHR_surface(instance) - vkGetPhysicalDeviceDisplayPropertiesKHR = cast[proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayPropertiesKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR")) - vkGetPhysicalDeviceDisplayPlanePropertiesKHR = cast[proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayPlanePropertiesKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR")) - vkGetDisplayPlaneSupportedDisplaysKHR = cast[proc(physicalDevice: VkPhysicalDevice, planeIndex: uint32, pDisplayCount: ptr uint32, pDisplays: ptr VkDisplayKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDisplayPlaneSupportedDisplaysKHR")) - vkGetDisplayModePropertiesKHR = cast[proc(physicalDevice: VkPhysicalDevice, display: VkDisplayKHR, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayModePropertiesKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDisplayModePropertiesKHR")) - vkCreateDisplayModeKHR = cast[proc(physicalDevice: VkPhysicalDevice, display: VkDisplayKHR, pCreateInfo: ptr VkDisplayModeCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pMode: ptr VkDisplayModeKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateDisplayModeKHR")) - vkGetDisplayPlaneCapabilitiesKHR = cast[proc(physicalDevice: VkPhysicalDevice, mode: VkDisplayModeKHR, planeIndex: uint32, pCapabilities: ptr VkDisplayPlaneCapabilitiesKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilitiesKHR")) - vkCreateDisplayPlaneSurfaceKHR = cast[proc(instance: VkInstance, pCreateInfo: ptr VkDisplaySurfaceCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pSurface: ptr VkSurfaceKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateDisplayPlaneSurfaceKHR")) - -# extension VK_EXT_swapchain_maintenance1 -var - vkReleaseSwapchainImagesEXT*: proc(device: VkDevice, pReleaseInfo: ptr VkReleaseSwapchainImagesInfoEXT): VkResult {.stdcall.} -proc loadVK_EXT_swapchain_maintenance1*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - loadVK_EXT_surface_maintenance1(instance) - loadVK_VERSION_1_1(instance) - vkReleaseSwapchainImagesEXT = cast[proc(device: VkDevice, pReleaseInfo: ptr VkReleaseSwapchainImagesInfoEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkReleaseSwapchainImagesEXT")) - -# extension VK_EXT_direct_mode_display -var - vkReleaseDisplayEXT*: proc(physicalDevice: VkPhysicalDevice, display: VkDisplayKHR): VkResult {.stdcall.} -proc loadVK_EXT_direct_mode_display*(instance: VkInstance) = - loadVK_KHR_display(instance) - vkReleaseDisplayEXT = cast[proc(physicalDevice: VkPhysicalDevice, display: VkDisplayKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkReleaseDisplayEXT")) - -proc loadVK_KHR_swapchain_mutable_format*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_2(instance) - -proc loadVK_EXT_swapchain_colorspace*(instance: VkInstance) = - loadVK_KHR_surface(instance) - -# extension VK_EXT_opacity_micromap -var - vkCreateMicromapEXT*: proc(device: VkDevice, pCreateInfo: ptr VkMicromapCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pMicromap: ptr VkMicromapEXT): VkResult {.stdcall.} - vkDestroyMicromapEXT*: proc(device: VkDevice, micromap: VkMicromapEXT, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkCmdBuildMicromapsEXT*: proc(commandBuffer: VkCommandBuffer, infoCount: uint32, pInfos: ptr VkMicromapBuildInfoEXT): void {.stdcall.} - vkBuildMicromapsEXT*: proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, infoCount: uint32, pInfos: ptr VkMicromapBuildInfoEXT): VkResult {.stdcall.} - vkCopyMicromapEXT*: proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyMicromapInfoEXT): VkResult {.stdcall.} - vkCopyMicromapToMemoryEXT*: proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyMicromapToMemoryInfoEXT): VkResult {.stdcall.} - vkCopyMemoryToMicromapEXT*: proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyMemoryToMicromapInfoEXT): VkResult {.stdcall.} - vkWriteMicromapsPropertiesEXT*: proc(device: VkDevice, micromapCount: uint32, pMicromaps: ptr VkMicromapEXT, queryType: VkQueryType, dataSize: csize_t, pData: pointer, stride: csize_t): VkResult {.stdcall.} - vkCmdCopyMicromapEXT*: proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyMicromapInfoEXT): void {.stdcall.} - vkCmdCopyMicromapToMemoryEXT*: proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyMicromapToMemoryInfoEXT): void {.stdcall.} - vkCmdCopyMemoryToMicromapEXT*: proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyMemoryToMicromapInfoEXT): void {.stdcall.} - vkCmdWriteMicromapsPropertiesEXT*: proc(commandBuffer: VkCommandBuffer, micromapCount: uint32, pMicromaps: ptr VkMicromapEXT, queryType: VkQueryType, queryPool: VkQueryPool, firstQuery: uint32): void {.stdcall.} - vkGetDeviceMicromapCompatibilityEXT*: proc(device: VkDevice, pVersionInfo: ptr VkMicromapVersionInfoEXT, pCompatibility: ptr VkAccelerationStructureCompatibilityKHR): void {.stdcall.} - vkGetMicromapBuildSizesEXT*: proc(device: VkDevice, buildType: VkAccelerationStructureBuildTypeKHR, pBuildInfo: ptr VkMicromapBuildInfoEXT, pSizeInfo: ptr VkMicromapBuildSizesInfoEXT): void {.stdcall.} -proc loadVK_EXT_opacity_micromap*(instance: VkInstance) = - loadVK_KHR_acceleration_structure(instance) - loadVK_VERSION_1_3(instance) - vkCreateMicromapEXT = cast[proc(device: VkDevice, pCreateInfo: ptr VkMicromapCreateInfoEXT, pAllocator: ptr VkAllocationCallbacks, pMicromap: ptr VkMicromapEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateMicromapEXT")) - vkDestroyMicromapEXT = cast[proc(device: VkDevice, micromap: VkMicromapEXT, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyMicromapEXT")) - vkCmdBuildMicromapsEXT = cast[proc(commandBuffer: VkCommandBuffer, infoCount: uint32, pInfos: ptr VkMicromapBuildInfoEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBuildMicromapsEXT")) - vkBuildMicromapsEXT = cast[proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, infoCount: uint32, pInfos: ptr VkMicromapBuildInfoEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkBuildMicromapsEXT")) - vkCopyMicromapEXT = cast[proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyMicromapInfoEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCopyMicromapEXT")) - vkCopyMicromapToMemoryEXT = cast[proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyMicromapToMemoryInfoEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCopyMicromapToMemoryEXT")) - vkCopyMemoryToMicromapEXT = cast[proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pInfo: ptr VkCopyMemoryToMicromapInfoEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCopyMemoryToMicromapEXT")) - vkWriteMicromapsPropertiesEXT = cast[proc(device: VkDevice, micromapCount: uint32, pMicromaps: ptr VkMicromapEXT, queryType: VkQueryType, dataSize: csize_t, pData: pointer, stride: csize_t): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkWriteMicromapsPropertiesEXT")) - vkCmdCopyMicromapEXT = cast[proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyMicromapInfoEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyMicromapEXT")) - vkCmdCopyMicromapToMemoryEXT = cast[proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyMicromapToMemoryInfoEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyMicromapToMemoryEXT")) - vkCmdCopyMemoryToMicromapEXT = cast[proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkCopyMemoryToMicromapInfoEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyMemoryToMicromapEXT")) - vkCmdWriteMicromapsPropertiesEXT = cast[proc(commandBuffer: VkCommandBuffer, micromapCount: uint32, pMicromaps: ptr VkMicromapEXT, queryType: VkQueryType, queryPool: VkQueryPool, firstQuery: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdWriteMicromapsPropertiesEXT")) - vkGetDeviceMicromapCompatibilityEXT = cast[proc(device: VkDevice, pVersionInfo: ptr VkMicromapVersionInfoEXT, pCompatibility: ptr VkAccelerationStructureCompatibilityKHR): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDeviceMicromapCompatibilityEXT")) - vkGetMicromapBuildSizesEXT = cast[proc(device: VkDevice, buildType: VkAccelerationStructureBuildTypeKHR, pBuildInfo: ptr VkMicromapBuildInfoEXT, pSizeInfo: ptr VkMicromapBuildSizesInfoEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetMicromapBuildSizesEXT")) - -proc loadVK_KHR_incremental_present*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - -# extension VK_KHR_shared_presentable_image -var - vkGetSwapchainStatusKHR*: proc(device: VkDevice, swapchain: VkSwapchainKHR): VkResult {.stdcall.} -proc loadVK_KHR_shared_presentable_image*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - loadVK_VERSION_1_1(instance) - loadVK_KHR_get_surface_capabilities2(instance) - vkGetSwapchainStatusKHR = cast[proc(device: VkDevice, swapchain: VkSwapchainKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetSwapchainStatusKHR")) - -# extension VK_EXT_hdr_metadata -var - vkSetHdrMetadataEXT*: proc(device: VkDevice, swapchainCount: uint32, pSwapchains: ptr VkSwapchainKHR, pMetadata: ptr VkHdrMetadataEXT): void {.stdcall.} -proc loadVK_EXT_hdr_metadata*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - vkSetHdrMetadataEXT = cast[proc(device: VkDevice, swapchainCount: uint32, pSwapchains: ptr VkSwapchainKHR, pMetadata: ptr VkHdrMetadataEXT): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkSetHdrMetadataEXT")) - -proc loadVK_KHR_present_id*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - loadVK_VERSION_1_1(instance) - -# extension VK_KHR_ray_tracing_maintenance1 -var - vkCmdTraceRaysIndirect2KHR*: proc(commandBuffer: VkCommandBuffer, indirectDeviceAddress: VkDeviceAddress): void {.stdcall.} -proc loadVK_KHR_ray_tracing_maintenance1*(instance: VkInstance) = - loadVK_KHR_acceleration_structure(instance) - vkCmdTraceRaysIndirect2KHR = cast[proc(commandBuffer: VkCommandBuffer, indirectDeviceAddress: VkDeviceAddress): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdTraceRaysIndirect2KHR")) - -# extension VK_KHR_ray_tracing_pipeline -var - vkCmdTraceRaysKHR*: proc(commandBuffer: VkCommandBuffer, pRaygenShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pMissShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pHitShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pCallableShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, width: uint32, height: uint32, depth: uint32): void {.stdcall.} - vkCreateRayTracingPipelinesKHR*: proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pipelineCache: VkPipelineCache, createInfoCount: uint32, pCreateInfos: ptr VkRayTracingPipelineCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pPipelines: ptr VkPipeline): VkResult {.stdcall.} - vkGetRayTracingShaderGroupHandlesKHR*: proc(device: VkDevice, pipeline: VkPipeline, firstGroup: uint32, groupCount: uint32, dataSize: csize_t, pData: pointer): VkResult {.stdcall.} - vkGetRayTracingCaptureReplayShaderGroupHandlesKHR*: proc(device: VkDevice, pipeline: VkPipeline, firstGroup: uint32, groupCount: uint32, dataSize: csize_t, pData: pointer): VkResult {.stdcall.} - vkCmdTraceRaysIndirectKHR*: proc(commandBuffer: VkCommandBuffer, pRaygenShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pMissShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pHitShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pCallableShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, indirectDeviceAddress: VkDeviceAddress): void {.stdcall.} - vkGetRayTracingShaderGroupStackSizeKHR*: proc(device: VkDevice, pipeline: VkPipeline, group: uint32, groupShader: VkShaderGroupShaderKHR): VkDeviceSize {.stdcall.} - vkCmdSetRayTracingPipelineStackSizeKHR*: proc(commandBuffer: VkCommandBuffer, pipelineStackSize: uint32): void {.stdcall.} -proc loadVK_KHR_ray_tracing_pipeline*(instance: VkInstance) = - loadVK_VERSION_1_2(instance) - loadVK_KHR_acceleration_structure(instance) - vkCmdTraceRaysKHR = cast[proc(commandBuffer: VkCommandBuffer, pRaygenShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pMissShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pHitShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pCallableShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, width: uint32, height: uint32, depth: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdTraceRaysKHR")) - vkCreateRayTracingPipelinesKHR = cast[proc(device: VkDevice, deferredOperation: VkDeferredOperationKHR, pipelineCache: VkPipelineCache, createInfoCount: uint32, pCreateInfos: ptr VkRayTracingPipelineCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pPipelines: ptr VkPipeline): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateRayTracingPipelinesKHR")) - vkGetRayTracingShaderGroupHandlesKHR = cast[proc(device: VkDevice, pipeline: VkPipeline, firstGroup: uint32, groupCount: uint32, dataSize: csize_t, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupHandlesKHR")) - vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = cast[proc(device: VkDevice, pipeline: VkPipeline, firstGroup: uint32, groupCount: uint32, dataSize: csize_t, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR")) - vkCmdTraceRaysIndirectKHR = cast[proc(commandBuffer: VkCommandBuffer, pRaygenShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pMissShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pHitShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, pCallableShaderBindingTable: ptr VkStridedDeviceAddressRegionKHR, indirectDeviceAddress: VkDeviceAddress): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdTraceRaysIndirectKHR")) - vkGetRayTracingShaderGroupStackSizeKHR = cast[proc(device: VkDevice, pipeline: VkPipeline, group: uint32, groupShader: VkShaderGroupShaderKHR): VkDeviceSize {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupStackSizeKHR")) - vkCmdSetRayTracingPipelineStackSizeKHR = cast[proc(commandBuffer: VkCommandBuffer, pipelineStackSize: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdSetRayTracingPipelineStackSizeKHR")) - -# extension VK_HUAWEI_invocation_mask -var - vkCmdBindInvocationMaskHUAWEI*: proc(commandBuffer: VkCommandBuffer, imageView: VkImageView, imageLayout: VkImageLayout): void {.stdcall.} -proc loadVK_HUAWEI_invocation_mask*(instance: VkInstance) = - loadVK_KHR_ray_tracing_pipeline(instance) - loadVK_VERSION_1_3(instance) - vkCmdBindInvocationMaskHUAWEI = cast[proc(commandBuffer: VkCommandBuffer, imageView: VkImageView, imageLayout: VkImageLayout): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBindInvocationMaskHUAWEI")) - -# extension VK_EXT_display_surface_counter -var - vkGetPhysicalDeviceSurfaceCapabilities2EXT*: proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pSurfaceCapabilities: ptr VkSurfaceCapabilities2EXT): VkResult {.stdcall.} -proc loadVK_EXT_display_surface_counter*(instance: VkInstance) = - loadVK_KHR_display(instance) - vkGetPhysicalDeviceSurfaceCapabilities2EXT = cast[proc(physicalDevice: VkPhysicalDevice, surface: VkSurfaceKHR, pSurfaceCapabilities: ptr VkSurfaceCapabilities2EXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")) - -# extension VK_KHR_get_display_properties2 -var - vkGetPhysicalDeviceDisplayProperties2KHR*: proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayProperties2KHR): VkResult {.stdcall.} - vkGetPhysicalDeviceDisplayPlaneProperties2KHR*: proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayPlaneProperties2KHR): VkResult {.stdcall.} - vkGetDisplayModeProperties2KHR*: proc(physicalDevice: VkPhysicalDevice, display: VkDisplayKHR, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayModeProperties2KHR): VkResult {.stdcall.} - vkGetDisplayPlaneCapabilities2KHR*: proc(physicalDevice: VkPhysicalDevice, pDisplayPlaneInfo: ptr VkDisplayPlaneInfo2KHR, pCapabilities: ptr VkDisplayPlaneCapabilities2KHR): VkResult {.stdcall.} -proc loadVK_KHR_get_display_properties2*(instance: VkInstance) = - loadVK_KHR_display(instance) - vkGetPhysicalDeviceDisplayProperties2KHR = cast[proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayProperties2KHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayProperties2KHR")) - vkGetPhysicalDeviceDisplayPlaneProperties2KHR = cast[proc(physicalDevice: VkPhysicalDevice, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayPlaneProperties2KHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR")) - vkGetDisplayModeProperties2KHR = cast[proc(physicalDevice: VkPhysicalDevice, display: VkDisplayKHR, pPropertyCount: ptr uint32, pProperties: ptr VkDisplayModeProperties2KHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDisplayModeProperties2KHR")) - vkGetDisplayPlaneCapabilities2KHR = cast[proc(physicalDevice: VkPhysicalDevice, pDisplayPlaneInfo: ptr VkDisplayPlaneInfo2KHR, pCapabilities: ptr VkDisplayPlaneCapabilities2KHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilities2KHR")) - -proc loadVK_KHR_ray_query*(instance: VkInstance) = - loadVK_VERSION_1_2(instance) - loadVK_KHR_acceleration_structure(instance) - -# extension VK_KHR_display_swapchain -var - vkCreateSharedSwapchainsKHR*: proc(device: VkDevice, swapchainCount: uint32, pCreateInfos: ptr VkSwapchainCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pSwapchains: ptr VkSwapchainKHR): VkResult {.stdcall.} -proc loadVK_KHR_display_swapchain*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - loadVK_KHR_display(instance) - vkCreateSharedSwapchainsKHR = cast[proc(device: VkDevice, swapchainCount: uint32, pCreateInfos: ptr VkSwapchainCreateInfoKHR, pAllocator: ptr VkAllocationCallbacks, pSwapchains: ptr VkSwapchainKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateSharedSwapchainsKHR")) - -# extension VK_EXT_acquire_drm_display -var - vkAcquireDrmDisplayEXT*: proc(physicalDevice: VkPhysicalDevice, drmFd: int32, display: VkDisplayKHR): VkResult {.stdcall.} - vkGetDrmDisplayEXT*: proc(physicalDevice: VkPhysicalDevice, drmFd: int32, connectorId: uint32, display: ptr VkDisplayKHR): VkResult {.stdcall.} -proc loadVK_EXT_acquire_drm_display*(instance: VkInstance) = - loadVK_EXT_direct_mode_display(instance) - vkAcquireDrmDisplayEXT = cast[proc(physicalDevice: VkPhysicalDevice, drmFd: int32, display: VkDisplayKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkAcquireDrmDisplayEXT")) - vkGetDrmDisplayEXT = cast[proc(physicalDevice: VkPhysicalDevice, drmFd: int32, connectorId: uint32, display: ptr VkDisplayKHR): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetDrmDisplayEXT")) - -# extension VK_EXT_display_control -var - vkDisplayPowerControlEXT*: proc(device: VkDevice, display: VkDisplayKHR, pDisplayPowerInfo: ptr VkDisplayPowerInfoEXT): VkResult {.stdcall.} - vkRegisterDeviceEventEXT*: proc(device: VkDevice, pDeviceEventInfo: ptr VkDeviceEventInfoEXT, pAllocator: ptr VkAllocationCallbacks, pFence: ptr VkFence): VkResult {.stdcall.} - vkRegisterDisplayEventEXT*: proc(device: VkDevice, display: VkDisplayKHR, pDisplayEventInfo: ptr VkDisplayEventInfoEXT, pAllocator: ptr VkAllocationCallbacks, pFence: ptr VkFence): VkResult {.stdcall.} - vkGetSwapchainCounterEXT*: proc(device: VkDevice, swapchain: VkSwapchainKHR, counter: VkSurfaceCounterFlagBitsEXT, pCounterValue: ptr uint64): VkResult {.stdcall.} -proc loadVK_EXT_display_control*(instance: VkInstance) = - loadVK_EXT_display_surface_counter(instance) - loadVK_KHR_swapchain(instance) - vkDisplayPowerControlEXT = cast[proc(device: VkDevice, display: VkDisplayKHR, pDisplayPowerInfo: ptr VkDisplayPowerInfoEXT): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDisplayPowerControlEXT")) - vkRegisterDeviceEventEXT = cast[proc(device: VkDevice, pDeviceEventInfo: ptr VkDeviceEventInfoEXT, pAllocator: ptr VkAllocationCallbacks, pFence: ptr VkFence): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkRegisterDeviceEventEXT")) - vkRegisterDisplayEventEXT = cast[proc(device: VkDevice, display: VkDisplayKHR, pDisplayEventInfo: ptr VkDisplayEventInfoEXT, pAllocator: ptr VkAllocationCallbacks, pFence: ptr VkFence): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkRegisterDisplayEventEXT")) - vkGetSwapchainCounterEXT = cast[proc(device: VkDevice, swapchain: VkSwapchainKHR, counter: VkSurfaceCounterFlagBitsEXT, pCounterValue: ptr uint64): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetSwapchainCounterEXT")) - -proc loadVK_NV_ray_tracing_motion_blur*(instance: VkInstance) = - loadVK_KHR_ray_tracing_pipeline(instance) - -proc loadVK_EXT_pipeline_library_group_handles*(instance: VkInstance) = - loadVK_KHR_ray_tracing_pipeline(instance) - loadVK_KHR_pipeline_library(instance) - -# extension VK_NV_ray_tracing -var - vkCreateAccelerationStructureNV*: proc(device: VkDevice, pCreateInfo: ptr VkAccelerationStructureCreateInfoNV, pAllocator: ptr VkAllocationCallbacks, pAccelerationStructure: ptr VkAccelerationStructureNV): VkResult {.stdcall.} - vkDestroyAccelerationStructureNV*: proc(device: VkDevice, accelerationStructure: VkAccelerationStructureNV, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.} - vkGetAccelerationStructureMemoryRequirementsNV*: proc(device: VkDevice, pInfo: ptr VkAccelerationStructureMemoryRequirementsInfoNV, pMemoryRequirements: ptr VkMemoryRequirements2KHR): void {.stdcall.} - vkBindAccelerationStructureMemoryNV*: proc(device: VkDevice, bindInfoCount: uint32, pBindInfos: ptr VkBindAccelerationStructureMemoryInfoNV): VkResult {.stdcall.} - vkCmdBuildAccelerationStructureNV*: proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkAccelerationStructureInfoNV, instanceData: VkBuffer, instanceOffset: VkDeviceSize, update: VkBool32, dst: VkAccelerationStructureNV, src: VkAccelerationStructureNV, scratch: VkBuffer, scratchOffset: VkDeviceSize): void {.stdcall.} - vkCmdCopyAccelerationStructureNV*: proc(commandBuffer: VkCommandBuffer, dst: VkAccelerationStructureNV, src: VkAccelerationStructureNV, mode: VkCopyAccelerationStructureModeKHR): void {.stdcall.} - vkCmdTraceRaysNV*: proc(commandBuffer: VkCommandBuffer, raygenShaderBindingTableBuffer: VkBuffer, raygenShaderBindingOffset: VkDeviceSize, missShaderBindingTableBuffer: VkBuffer, missShaderBindingOffset: VkDeviceSize, missShaderBindingStride: VkDeviceSize, hitShaderBindingTableBuffer: VkBuffer, hitShaderBindingOffset: VkDeviceSize, hitShaderBindingStride: VkDeviceSize, callableShaderBindingTableBuffer: VkBuffer, callableShaderBindingOffset: VkDeviceSize, callableShaderBindingStride: VkDeviceSize, width: uint32, height: uint32, depth: uint32): void {.stdcall.} - vkCreateRayTracingPipelinesNV*: proc(device: VkDevice, pipelineCache: VkPipelineCache, createInfoCount: uint32, pCreateInfos: ptr VkRayTracingPipelineCreateInfoNV, pAllocator: ptr VkAllocationCallbacks, pPipelines: ptr VkPipeline): VkResult {.stdcall.} - vkGetRayTracingShaderGroupHandlesNV*: proc(device: VkDevice, pipeline: VkPipeline, firstGroup: uint32, groupCount: uint32, dataSize: csize_t, pData: pointer): VkResult {.stdcall.} - vkGetAccelerationStructureHandleNV*: proc(device: VkDevice, accelerationStructure: VkAccelerationStructureNV, dataSize: csize_t, pData: pointer): VkResult {.stdcall.} - vkCmdWriteAccelerationStructuresPropertiesNV*: proc(commandBuffer: VkCommandBuffer, accelerationStructureCount: uint32, pAccelerationStructures: ptr VkAccelerationStructureNV, queryType: VkQueryType, queryPool: VkQueryPool, firstQuery: uint32): void {.stdcall.} - vkCompileDeferredNV*: proc(device: VkDevice, pipeline: VkPipeline, shader: uint32): VkResult {.stdcall.} -proc loadVK_NV_ray_tracing*(instance: VkInstance) = - loadVK_VERSION_1_1(instance) - loadVK_VERSION_1_1(instance) - vkCreateAccelerationStructureNV = cast[proc(device: VkDevice, pCreateInfo: ptr VkAccelerationStructureCreateInfoNV, pAllocator: ptr VkAllocationCallbacks, pAccelerationStructure: ptr VkAccelerationStructureNV): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateAccelerationStructureNV")) - vkDestroyAccelerationStructureNV = cast[proc(device: VkDevice, accelerationStructure: VkAccelerationStructureNV, pAllocator: ptr VkAllocationCallbacks): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkDestroyAccelerationStructureNV")) - vkGetAccelerationStructureMemoryRequirementsNV = cast[proc(device: VkDevice, pInfo: ptr VkAccelerationStructureMemoryRequirementsInfoNV, pMemoryRequirements: ptr VkMemoryRequirements2KHR): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureMemoryRequirementsNV")) - vkBindAccelerationStructureMemoryNV = cast[proc(device: VkDevice, bindInfoCount: uint32, pBindInfos: ptr VkBindAccelerationStructureMemoryInfoNV): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkBindAccelerationStructureMemoryNV")) - vkCmdBuildAccelerationStructureNV = cast[proc(commandBuffer: VkCommandBuffer, pInfo: ptr VkAccelerationStructureInfoNV, instanceData: VkBuffer, instanceOffset: VkDeviceSize, update: VkBool32, dst: VkAccelerationStructureNV, src: VkAccelerationStructureNV, scratch: VkBuffer, scratchOffset: VkDeviceSize): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdBuildAccelerationStructureNV")) - vkCmdCopyAccelerationStructureNV = cast[proc(commandBuffer: VkCommandBuffer, dst: VkAccelerationStructureNV, src: VkAccelerationStructureNV, mode: VkCopyAccelerationStructureModeKHR): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdCopyAccelerationStructureNV")) - vkCmdTraceRaysNV = cast[proc(commandBuffer: VkCommandBuffer, raygenShaderBindingTableBuffer: VkBuffer, raygenShaderBindingOffset: VkDeviceSize, missShaderBindingTableBuffer: VkBuffer, missShaderBindingOffset: VkDeviceSize, missShaderBindingStride: VkDeviceSize, hitShaderBindingTableBuffer: VkBuffer, hitShaderBindingOffset: VkDeviceSize, hitShaderBindingStride: VkDeviceSize, callableShaderBindingTableBuffer: VkBuffer, callableShaderBindingOffset: VkDeviceSize, callableShaderBindingStride: VkDeviceSize, width: uint32, height: uint32, depth: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdTraceRaysNV")) - vkCreateRayTracingPipelinesNV = cast[proc(device: VkDevice, pipelineCache: VkPipelineCache, createInfoCount: uint32, pCreateInfos: ptr VkRayTracingPipelineCreateInfoNV, pAllocator: ptr VkAllocationCallbacks, pPipelines: ptr VkPipeline): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateRayTracingPipelinesNV")) - vkGetRayTracingShaderGroupHandlesNV = vkGetRayTracingShaderGroupHandlesKHR - vkGetAccelerationStructureHandleNV = cast[proc(device: VkDevice, accelerationStructure: VkAccelerationStructureNV, dataSize: csize_t, pData: pointer): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureHandleNV")) - vkCmdWriteAccelerationStructuresPropertiesNV = cast[proc(commandBuffer: VkCommandBuffer, accelerationStructureCount: uint32, pAccelerationStructures: ptr VkAccelerationStructureNV, queryType: VkQueryType, queryPool: VkQueryPool, firstQuery: uint32): void {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCmdWriteAccelerationStructuresPropertiesNV")) - vkCompileDeferredNV = cast[proc(device: VkDevice, pipeline: VkPipeline, shader: uint32): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCompileDeferredNV")) - -# extension VK_KHR_present_wait -var - vkWaitForPresentKHR*: proc(device: VkDevice, swapchain: VkSwapchainKHR, presentId: uint64, timeout: uint64): VkResult {.stdcall.} -proc loadVK_KHR_present_wait*(instance: VkInstance) = - loadVK_KHR_swapchain(instance) - loadVK_KHR_present_id(instance) - vkWaitForPresentKHR = cast[proc(device: VkDevice, swapchain: VkSwapchainKHR, presentId: uint64, timeout: uint64): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkWaitForPresentKHR")) - -proc loadVK_NV_ray_tracing_invocation_reorder*(instance: VkInstance) = - loadVK_KHR_ray_tracing_pipeline(instance) - -var EXTENSION_LOADERS = { - "VK_NV_optical_flow": loadVK_NV_optical_flow, - "VK_EXT_vertex_attribute_divisor": loadVK_EXT_vertex_attribute_divisor, - "VK_EXT_pipeline_library_group_handles": loadVK_EXT_pipeline_library_group_handles, - "VK_NV_geometry_shader_passthrough": loadVK_NV_geometry_shader_passthrough, - "VK_EXT_line_rasterization": loadVK_EXT_line_rasterization, - "VK_EXT_rasterization_order_attachment_access": loadVK_EXT_rasterization_order_attachment_access, - "VK_EXT_shader_atomic_float2": loadVK_EXT_shader_atomic_float2, - "VK_IMG_format_pvrtc": loadVK_IMG_format_pvrtc, - "VK_AMD_texture_gather_bias_lod": loadVK_AMD_texture_gather_bias_lod, - "VK_KHR_shader_subgroup_uniform_control_flow": loadVK_KHR_shader_subgroup_uniform_control_flow, - "VK_AMD_shader_fragment_mask": loadVK_AMD_shader_fragment_mask, - "VK_EXT_external_memory_dma_buf": loadVK_EXT_external_memory_dma_buf, - "VK_IMG_filter_cubic": loadVK_IMG_filter_cubic, - "VK_EXT_pageable_device_local_memory": loadVK_EXT_pageable_device_local_memory, - "VK_EXT_primitive_topology_list_restart": loadVK_EXT_primitive_topology_list_restart, - "VK_KHR_global_priority": loadVK_KHR_global_priority, - "VK_AMD_shader_ballot": loadVK_AMD_shader_ballot, - "VK_AMD_buffer_marker": loadVK_AMD_buffer_marker, - "VK_NV_corner_sampled_image": loadVK_NV_corner_sampled_image, - "VK_NV_ray_tracing_invocation_reorder": loadVK_NV_ray_tracing_invocation_reorder, - "VK_QCOM_image_processing": loadVK_QCOM_image_processing, - "VK_AMD_shader_info": loadVK_AMD_shader_info, - "VK_KHR_pipeline_library": loadVK_KHR_pipeline_library, - "VK_EXT_blend_operation_advanced": loadVK_EXT_blend_operation_advanced, - "VK_AMD_gpu_shader_int16": loadVK_AMD_gpu_shader_int16, - "VK_EXT_pipeline_robustness": loadVK_EXT_pipeline_robustness, - "VK_NV_scissor_exclusive": loadVK_NV_scissor_exclusive, - "VK_EXT_sample_locations": loadVK_EXT_sample_locations, - "VK_NV_framebuffer_mixed_samples": loadVK_NV_framebuffer_mixed_samples, - "VK_NV_sample_mask_override_coverage": loadVK_NV_sample_mask_override_coverage, - "VK_KHR_present_id": loadVK_KHR_present_id, - "VK_EXT_descriptor_buffer": loadVK_EXT_descriptor_buffer, - "VK_EXT_filter_cubic": loadVK_EXT_filter_cubic, - "VK_KHR_pipeline_executable_properties": loadVK_KHR_pipeline_executable_properties, - "VK_EXT_extended_dynamic_state3": loadVK_EXT_extended_dynamic_state3, - "VK_KHR_performance_query": loadVK_KHR_performance_query, - "VK_GOOGLE_user_type": loadVK_GOOGLE_user_type, - "VK_KHR_ray_tracing_maintenance1": loadVK_KHR_ray_tracing_maintenance1, - "VK_EXT_debug_report": loadVK_EXT_debug_report, - "VK_EXT_multisampled_render_to_single_sampled": loadVK_EXT_multisampled_render_to_single_sampled, - "VK_EXT_device_address_binding_report": loadVK_EXT_device_address_binding_report, - "VK_NV_clip_space_w_scaling": loadVK_NV_clip_space_w_scaling, - "VK_NV_fill_rectangle": loadVK_NV_fill_rectangle, - "VK_EXT_shader_image_atomic_int64": loadVK_EXT_shader_image_atomic_int64, - "VK_KHR_swapchain": loadVK_KHR_swapchain, - "VK_NV_ray_tracing": loadVK_NV_ray_tracing, - "VK_EXT_swapchain_maintenance1": loadVK_EXT_swapchain_maintenance1, - "VK_KHR_ray_tracing_pipeline": loadVK_KHR_ray_tracing_pipeline, - "VK_EXT_ycbcr_image_arrays": loadVK_EXT_ycbcr_image_arrays, - "VK_AMD_negative_viewport_height": loadVK_AMD_negative_viewport_height, - "VK_EXT_provoking_vertex": loadVK_EXT_provoking_vertex, - "VK_EXT_calibrated_timestamps": loadVK_EXT_calibrated_timestamps, - "VK_EXT_attachment_feedback_loop_layout": loadVK_EXT_attachment_feedback_loop_layout, - "VK_AMD_mixed_attachment_samples": loadVK_AMD_mixed_attachment_samples, - "VK_HUAWEI_invocation_mask": loadVK_HUAWEI_invocation_mask, - "VK_EXT_external_memory_host": loadVK_EXT_external_memory_host, - "VK_NV_device_diagnostics_config": loadVK_NV_device_diagnostics_config, - "VK_EXT_fragment_density_map2": loadVK_EXT_fragment_density_map2, - "VK_NV_shader_subgroup_partitioned": loadVK_NV_shader_subgroup_partitioned, - "VK_EXT_image_sliced_view_of_3d": loadVK_EXT_image_sliced_view_of_3d, - "VK_NV_fragment_shading_rate_enums": loadVK_NV_fragment_shading_rate_enums, - "VK_EXT_display_surface_counter": loadVK_EXT_display_surface_counter, - "VK_ARM_shader_core_properties": loadVK_ARM_shader_core_properties, - "VK_EXT_shader_module_identifier": loadVK_EXT_shader_module_identifier, - "VK_EXT_border_color_swizzle": loadVK_EXT_border_color_swizzle, - "VK_AMD_shader_image_load_store_lod": loadVK_AMD_shader_image_load_store_lod, - "VK_AMD_display_native_hdr": loadVK_AMD_display_native_hdr, - "VK_NV_memory_decompression": loadVK_NV_memory_decompression, - "VK_EXT_direct_mode_display": loadVK_EXT_direct_mode_display, - "VK_EXT_fragment_shader_interlock": loadVK_EXT_fragment_shader_interlock, - "VK_NV_coverage_reduction_mode": loadVK_NV_coverage_reduction_mode, - "VK_KHR_get_display_properties2": loadVK_KHR_get_display_properties2, - "VK_INTEL_shader_integer_functions2": loadVK_INTEL_shader_integer_functions2, - "VK_NV_glsl_shader": loadVK_NV_glsl_shader, - "VK_KHR_shader_clock": loadVK_KHR_shader_clock, - "VK_EXT_image_2d_view_of_3d": loadVK_EXT_image_2d_view_of_3d, - "VK_QCOM_tile_properties": loadVK_QCOM_tile_properties, - "VK_KHR_push_descriptor": loadVK_KHR_push_descriptor, - "VK_NV_viewport_swizzle": loadVK_NV_viewport_swizzle, - "VK_KHR_ray_query": loadVK_KHR_ray_query, - "VK_KHR_present_wait": loadVK_KHR_present_wait, - "VK_NV_shading_rate_image": loadVK_NV_shading_rate_image, - "VK_EXT_fragment_density_map": loadVK_EXT_fragment_density_map, - "VK_NV_device_diagnostic_checkpoints": loadVK_NV_device_diagnostic_checkpoints, - "VK_EXT_pci_bus_info": loadVK_EXT_pci_bus_info, - "VK_NV_external_memory": loadVK_NV_external_memory, - "VK_EXT_queue_family_foreign": loadVK_EXT_queue_family_foreign, - "VK_KHR_swapchain_mutable_format": loadVK_KHR_swapchain_mutable_format, - "VK_EXT_depth_clip_control": loadVK_EXT_depth_clip_control, - "VK_EXT_debug_utils": loadVK_EXT_debug_utils, - "VK_KHR_portability_enumeration": loadVK_KHR_portability_enumeration, - "VK_EXT_memory_priority": loadVK_EXT_memory_priority, - "VK_EXT_validation_flags": loadVK_EXT_validation_flags, - "VK_AMD_shader_core_properties": loadVK_AMD_shader_core_properties, - "VK_EXT_conservative_rasterization": loadVK_EXT_conservative_rasterization, - "VK_KHR_external_fence_fd": loadVK_KHR_external_fence_fd, - "VK_NV_device_generated_commands": loadVK_NV_device_generated_commands, - "VK_NV_present_barrier": loadVK_NV_present_barrier, - "VK_AMD_gcn_shader": loadVK_AMD_gcn_shader, - "VK_NV_viewport_array2": loadVK_NV_viewport_array2, - "VK_INTEL_performance_query": loadVK_INTEL_performance_query, - "VK_NVX_multiview_per_view_attributes": loadVK_NVX_multiview_per_view_attributes, - "VK_EXT_primitives_generated_query": loadVK_EXT_primitives_generated_query, - "VK_AMD_pipeline_compiler_control": loadVK_AMD_pipeline_compiler_control, - "VK_EXT_post_depth_coverage": loadVK_EXT_post_depth_coverage, - "VK_EXT_rgba10x6_formats": loadVK_EXT_rgba10x6_formats, - "VK_KHR_external_memory_fd": loadVK_KHR_external_memory_fd, - "VK_NV_dedicated_allocation_image_aliasing": loadVK_NV_dedicated_allocation_image_aliasing, - "VK_NV_cooperative_matrix": loadVK_NV_cooperative_matrix, - "VK_EXT_depth_clamp_zero_one": loadVK_EXT_depth_clamp_zero_one, - "VK_EXT_conditional_rendering": loadVK_EXT_conditional_rendering, - "VK_QCOM_multiview_per_view_viewports": loadVK_QCOM_multiview_per_view_viewports, - "VK_NV_linear_color_attachment": loadVK_NV_linear_color_attachment, - "VK_EXT_shader_subgroup_ballot": loadVK_EXT_shader_subgroup_ballot, - "VK_EXT_multi_draw": loadVK_EXT_multi_draw, - "VK_NV_fragment_coverage_to_color": loadVK_NV_fragment_coverage_to_color, - "VK_EXT_load_store_op_none": loadVK_EXT_load_store_op_none, - "VK_QCOM_rotated_copy_commands": loadVK_QCOM_rotated_copy_commands, - "VK_EXT_surface_maintenance1": loadVK_EXT_surface_maintenance1, - "VK_EXT_swapchain_colorspace": loadVK_EXT_swapchain_colorspace, - "VK_EXT_image_drm_format_modifier": loadVK_EXT_image_drm_format_modifier, - "VK_EXT_validation_features": loadVK_EXT_validation_features, - "VK_KHR_workgroup_memory_explicit_layout": loadVK_KHR_workgroup_memory_explicit_layout, - "VK_EXT_index_type_uint8": loadVK_EXT_index_type_uint8, - "VK_EXT_mesh_shader": loadVK_EXT_mesh_shader, - "VK_AMD_shader_early_and_late_fragment_tests": loadVK_AMD_shader_early_and_late_fragment_tests, - "VK_KHR_display_swapchain": loadVK_KHR_display_swapchain, - "VK_EXT_transform_feedback": loadVK_EXT_transform_feedback, - "VK_GOOGLE_decorate_string": loadVK_GOOGLE_decorate_string, - "VK_EXT_shader_atomic_float": loadVK_EXT_shader_atomic_float, - "VK_EXT_acquire_drm_display": loadVK_EXT_acquire_drm_display, - "VK_EXT_pipeline_properties": loadVK_EXT_pipeline_properties, - "VK_EXT_graphics_pipeline_library": loadVK_EXT_graphics_pipeline_library, - "VK_KHR_acceleration_structure": loadVK_KHR_acceleration_structure, - "VK_AMD_shader_core_properties2": loadVK_AMD_shader_core_properties2, - "VK_KHR_surface": loadVK_KHR_surface, - "VK_AMD_gpu_shader_half_float": loadVK_AMD_gpu_shader_half_float, - "VK_KHR_deferred_host_operations": loadVK_KHR_deferred_host_operations, - "VK_NV_dedicated_allocation": loadVK_NV_dedicated_allocation, - "VK_GOOGLE_hlsl_functionality1": loadVK_GOOGLE_hlsl_functionality1, - "VK_EXT_robustness2": loadVK_EXT_robustness2, - "VK_NVX_image_view_handle": loadVK_NVX_image_view_handle, - "VK_EXT_non_seamless_cube_map": loadVK_EXT_non_seamless_cube_map, - "VK_EXT_opacity_micromap": loadVK_EXT_opacity_micromap, - "VK_EXT_image_view_min_lod": loadVK_EXT_image_view_min_lod, - "VK_AMD_shader_trinary_minmax": loadVK_AMD_shader_trinary_minmax, - "VK_QCOM_render_pass_store_ops": loadVK_QCOM_render_pass_store_ops, - "VK_EXT_device_fault": loadVK_EXT_device_fault, - "VK_EXT_custom_border_color": loadVK_EXT_custom_border_color, - "VK_EXT_mutable_descriptor_type": loadVK_EXT_mutable_descriptor_type, - "VK_AMD_rasterization_order": loadVK_AMD_rasterization_order, - "VK_EXT_vertex_input_dynamic_state": loadVK_EXT_vertex_input_dynamic_state, - "VK_KHR_incremental_present": loadVK_KHR_incremental_present, - "VK_KHR_fragment_shading_rate": loadVK_KHR_fragment_shading_rate, - "VK_EXT_color_write_enable": loadVK_EXT_color_write_enable, - "VK_SEC_amigo_profiling": loadVK_SEC_amigo_profiling, - "VK_GOOGLE_display_timing": loadVK_GOOGLE_display_timing, - "VK_NVX_binary_import": loadVK_NVX_binary_import, - "VK_EXT_depth_clip_enable": loadVK_EXT_depth_clip_enable, - "VK_EXT_subpass_merge_feedback": loadVK_EXT_subpass_merge_feedback, - "VK_NV_representative_fragment_test": loadVK_NV_representative_fragment_test, - "VK_EXT_validation_cache": loadVK_EXT_validation_cache, - "VK_EXT_display_control": loadVK_EXT_display_control, - "VK_KHR_external_semaphore_fd": loadVK_KHR_external_semaphore_fd, - "VK_KHR_fragment_shader_barycentric": loadVK_KHR_fragment_shader_barycentric, - "VK_NV_inherited_viewport_scissor": loadVK_NV_inherited_viewport_scissor, - "VK_EXT_legacy_dithering": loadVK_EXT_legacy_dithering, - "VK_NV_ray_tracing_motion_blur": loadVK_NV_ray_tracing_motion_blur, - "VK_EXT_physical_device_drm": loadVK_EXT_physical_device_drm, - "VK_EXT_pipeline_protected_access": loadVK_EXT_pipeline_protected_access, - "VK_QCOM_render_pass_transform": loadVK_QCOM_render_pass_transform, - "VK_GOOGLE_surfaceless_query": loadVK_GOOGLE_surfaceless_query, - "VK_EXT_memory_budget": loadVK_EXT_memory_budget, - "VK_EXT_discard_rectangles": loadVK_EXT_discard_rectangles, - "VK_EXT_shader_stencil_export": loadVK_EXT_shader_stencil_export, - "VK_KHR_shared_presentable_image": loadVK_KHR_shared_presentable_image, - "VK_NV_external_memory_rdma": loadVK_NV_external_memory_rdma, - "VK_EXT_image_compression_control_swapchain": loadVK_EXT_image_compression_control_swapchain, - "VK_EXT_hdr_metadata": loadVK_EXT_hdr_metadata, - "VK_AMD_device_coherent_memory": loadVK_AMD_device_coherent_memory, - "VK_EXT_device_memory_report": loadVK_EXT_device_memory_report, - "VK_ARM_shader_core_builtins": loadVK_ARM_shader_core_builtins, - "VK_QCOM_multiview_per_view_render_areas": loadVK_QCOM_multiview_per_view_render_areas, - "VK_LUNARG_direct_driver_loading": loadVK_LUNARG_direct_driver_loading, - "VK_AMD_memory_overallocation_behavior": loadVK_AMD_memory_overallocation_behavior, - "VK_NV_mesh_shader": loadVK_NV_mesh_shader, - "VK_AMD_shader_explicit_vertex_parameter": loadVK_AMD_shader_explicit_vertex_parameter, - "VK_EXT_headless_surface": loadVK_EXT_headless_surface, - "VK_NV_shader_sm_builtins": loadVK_NV_shader_sm_builtins, - "VK_EXT_shader_subgroup_vote": loadVK_EXT_shader_subgroup_vote, - "VK_NV_copy_memory_indirect": loadVK_NV_copy_memory_indirect, - "VK_EXT_image_compression_control": loadVK_EXT_image_compression_control, - "VK_EXT_astc_decode_mode": loadVK_EXT_astc_decode_mode, - "VK_EXT_buffer_device_address": loadVK_EXT_buffer_device_address, - "VK_KHR_get_surface_capabilities2": loadVK_KHR_get_surface_capabilities2, - "VK_KHR_display": loadVK_KHR_display, - "VK_QCOM_render_pass_shader_resolve": loadVK_QCOM_render_pass_shader_resolve, - "VK_EXT_depth_range_unrestricted": loadVK_EXT_depth_range_unrestricted, - "VK_HUAWEI_subpass_shading": loadVK_HUAWEI_subpass_shading, - "VK_VALVE_descriptor_set_host_mapping": loadVK_VALVE_descriptor_set_host_mapping, - "VK_HUAWEI_cluster_culling_shader": loadVK_HUAWEI_cluster_culling_shader, - "VK_KHR_surface_protected_capabilities": loadVK_KHR_surface_protected_capabilities, - "VK_NV_shader_image_footprint": loadVK_NV_shader_image_footprint, - "VK_NV_external_memory_capabilities": loadVK_NV_external_memory_capabilities, - "VK_NV_compute_shader_derivatives": loadVK_NV_compute_shader_derivatives, - "VK_QCOM_fragment_density_map_offset": loadVK_QCOM_fragment_density_map_offset, -}.toTable -when defined(VK_USE_PLATFORM_XLIB_KHR): - include ../vulkan/platform/xlib - EXTENSION_LOADERS["VK_KHR_xlib_surface"] = loadVK_KHR_xlib_surface -when defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT): - include ../vulkan/platform/xlib_xrandr - EXTENSION_LOADERS["VK_EXT_acquire_xlib_display"] = loadVK_EXT_acquire_xlib_display -when defined(VK_USE_PLATFORM_XCB_KHR): - include ../vulkan/platform/xcb - EXTENSION_LOADERS["VK_KHR_xcb_surface"] = loadVK_KHR_xcb_surface -when defined(VK_USE_PLATFORM_WAYLAND_KHR): - include ../vulkan/platform/wayland - EXTENSION_LOADERS["VK_KHR_wayland_surface"] = loadVK_KHR_wayland_surface -when defined(VK_USE_PLATFORM_DIRECTFB_EXT): - include ../vulkan/platform/directfb - EXTENSION_LOADERS["VK_EXT_directfb_surface"] = loadVK_EXT_directfb_surface -when defined(VK_USE_PLATFORM_ANDROID_KHR): - include ../vulkan/platform/android - EXTENSION_LOADERS["VK_KHR_android_surface"] = loadVK_KHR_android_surface - EXTENSION_LOADERS["VK_ANDROID_external_memory_android_hardware_buffer"] = loadVK_ANDROID_external_memory_android_hardware_buffer -when defined(VK_USE_PLATFORM_WIN32_KHR): - include ../vulkan/platform/win32 - EXTENSION_LOADERS["VK_KHR_external_semaphore_win32"] = loadVK_KHR_external_semaphore_win32 - EXTENSION_LOADERS["VK_EXT_full_screen_exclusive"] = loadVK_EXT_full_screen_exclusive - EXTENSION_LOADERS["VK_NV_external_memory_win32"] = loadVK_NV_external_memory_win32 - EXTENSION_LOADERS["VK_KHR_external_memory_win32"] = loadVK_KHR_external_memory_win32 - EXTENSION_LOADERS["VK_NV_acquire_winrt_display"] = loadVK_NV_acquire_winrt_display - EXTENSION_LOADERS["VK_KHR_win32_surface"] = loadVK_KHR_win32_surface - EXTENSION_LOADERS["VK_KHR_external_fence_win32"] = loadVK_KHR_external_fence_win32 - EXTENSION_LOADERS["VK_KHR_win32_keyed_mutex"] = loadVK_KHR_win32_keyed_mutex -when defined(VK_USE_PLATFORM_VI_NN): - include ../vulkan/platform/vi - EXTENSION_LOADERS["VK_NN_vi_surface"] = loadVK_NN_vi_surface -when defined(VK_USE_PLATFORM_IOS_MVK): - include ../vulkan/platform/ios - EXTENSION_LOADERS["VK_MVK_ios_surface"] = loadVK_MVK_ios_surface -when defined(VK_USE_PLATFORM_MACOS_MVK): - include ../vulkan/platform/macos - EXTENSION_LOADERS["VK_MVK_macos_surface"] = loadVK_MVK_macos_surface -when defined(VK_USE_PLATFORM_METAL_EXT): - include ../vulkan/platform/metal - EXTENSION_LOADERS["VK_EXT_metal_objects"] = loadVK_EXT_metal_objects - EXTENSION_LOADERS["VK_EXT_metal_surface"] = loadVK_EXT_metal_surface -when defined(VK_USE_PLATFORM_FUCHSIA): - include ../vulkan/platform/fuchsia - EXTENSION_LOADERS["VK_FUCHSIA_external_semaphore"] = loadVK_FUCHSIA_external_semaphore - EXTENSION_LOADERS["VK_FUCHSIA_imagepipe_surface"] = loadVK_FUCHSIA_imagepipe_surface - EXTENSION_LOADERS["VK_FUCHSIA_external_memory"] = loadVK_FUCHSIA_external_memory - EXTENSION_LOADERS["VK_FUCHSIA_buffer_collection"] = loadVK_FUCHSIA_buffer_collection -when defined(VK_USE_PLATFORM_GGP): - include ../vulkan/platform/ggp - EXTENSION_LOADERS["VK_GGP_frame_token"] = loadVK_GGP_frame_token - EXTENSION_LOADERS["VK_GGP_stream_descriptor_surface"] = loadVK_GGP_stream_descriptor_surface -when defined(VK_USE_PLATFORM_SCI): - include ../vulkan/platform/sci -when defined(VK_ENABLE_BETA_EXTENSIONS): - include ../vulkan/platform/provisional - EXTENSION_LOADERS["VK_KHR_video_encode_queue"] = loadVK_KHR_video_encode_queue - EXTENSION_LOADERS["VK_KHR_video_queue"] = loadVK_KHR_video_queue - EXTENSION_LOADERS["VK_EXT_video_encode_h264"] = loadVK_EXT_video_encode_h264 - EXTENSION_LOADERS["VK_EXT_video_encode_h265"] = loadVK_EXT_video_encode_h265 - EXTENSION_LOADERS["VK_KHR_video_decode_queue"] = loadVK_KHR_video_decode_queue - EXTENSION_LOADERS["VK_KHR_video_decode_h264"] = loadVK_KHR_video_decode_h264 - EXTENSION_LOADERS["VK_KHR_portability_subset"] = loadVK_KHR_portability_subset - EXTENSION_LOADERS["VK_KHR_video_decode_h265"] = loadVK_KHR_video_decode_h265 -when defined(VK_USE_PLATFORM_SCREEN_QNX): - include ../vulkan/platform/screen - EXTENSION_LOADERS["VK_QNX_screen_surface"] = loadVK_QNX_screen_surface - -proc loadExtension*(instance: VkInstance, extension: string) = - if extension in EXTENSION_LOADERS: - EXTENSION_LOADERS[extension](instance) - -# load global functions immediately -block globalFunctions: - let instance = VkInstance(0) - vkEnumerateInstanceVersion = cast[proc(pApiVersion: ptr uint32): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkEnumerateInstanceVersion")) - vkEnumerateInstanceExtensionProperties = cast[proc(pLayerName: cstring, pPropertyCount: ptr uint32, pProperties: ptr VkExtensionProperties): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkEnumerateInstanceExtensionProperties")) - vkEnumerateInstanceLayerProperties = cast[proc(pPropertyCount: ptr uint32, pProperties: ptr VkLayerProperties): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkEnumerateInstanceLayerProperties")) - vkCreateInstance = cast[proc(pCreateInfo: ptr VkInstanceCreateInfo, pAllocator: ptr VkAllocationCallbacks, pInstance: ptr VkInstance): VkResult {.stdcall.}](vkGetInstanceProcAddr(instance, "vkCreateInstance")) - -converter NimBool2VkBool*(a: bool): VkBool32 = VkBool32(a) diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/panel.nim --- a/semiconginev2/old/panel.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,160 +0,0 @@ -import std/strformat -import std/tables - -import ./core -import ./mesh -import ./material -import ./vulkan/shader -import ./events - -const - # font shader - SHADER_ATTRIB_PREFIX = "semicon_panel_" - MAX_PANEL_MATERIALS = 10 - POSITION_ATTRIB = SHADER_ATTRIB_PREFIX & "position" - UV_ATTRIB = SHADER_ATTRIB_PREFIX & "uv" - PANEL_MATERIAL_TYPE* = MaterialType( - name: "default-panel-material-type", - vertexAttributes: {POSITION_ATTRIB: Vec3F32, UV_ATTRIB: Vec2F32}.toTable, - instanceAttributes: {TRANSFORM_ATTRIB: Mat4F32, MATERIALINDEX_ATTRIBUTE: UInt16}.toTable, - attributes: {"panelTexture": TextureType, "color": Vec4F32}.toTable, - ) - PANEL_SHADER* = CreateShaderConfiguration( - name = "panel shader", - inputs = [ - Attr[Mat4](TRANSFORM_ATTRIB, memoryPerformanceHint = PreferFastWrite, perInstance = true), - Attr[Vec3f](POSITION_ATTRIB, memoryPerformanceHint = PreferFastWrite), - Attr[Vec2f](UV_ATTRIB, memoryPerformanceHint = PreferFastWrite), - Attr[uint16](MATERIALINDEX_ATTRIBUTE, memoryPerformanceHint = PreferFastRead, perInstance = true), - ], - intermediates = [ - Attr[Vec2f]("uvFrag"), - Attr[uint16]("materialIndexOut", noInterpolation = true) - ], - outputs = [Attr[Vec4f]("color")], - uniforms = [Attr[Vec4f]("color", arrayCount = MAX_PANEL_MATERIALS), Attr[float32](ASPECT_RATIO_ATTRIBUTE)], - samplers = [Attr[Texture]("panelTexture", arrayCount = MAX_PANEL_MATERIALS)], - vertexCode = &""" - gl_Position = vec4({POSITION_ATTRIB}.x, {POSITION_ATTRIB}.y * Uniforms.{ASPECT_RATIO_ATTRIBUTE}, {POSITION_ATTRIB}.z, 1.0) * {TRANSFORM_ATTRIB}; - uvFrag = {UV_ATTRIB}; - materialIndexOut = {MATERIALINDEX_ATTRIBUTE}; - """, - fragmentCode = &"""color = Uniforms.color[materialIndexOut] * texture(panelTexture[materialIndexOut], uvFrag);""" - ) - -var instanceCounter = 0 - -type - Panel* = object - texture: Texture - horizontalAlignment: HorizontalAlignment = Center - verticalAlignment: VerticalAlignment = Center - dirty: bool - mesh*: Mesh - # input handling - onMouseDown*: proc(panel: var Panel, buttons: set[MouseButton]) - onMouseUp*: proc(panel: var Panel, buttons: set[MouseButton]) - onMouseEnter*: proc(panel: var Panel) - onMouseMove*: proc(panel: var Panel) - onMouseLeave*: proc(panel: var Panel) - hasMouse*: bool - -proc `$`*(panel: Panel): string = - &"Panel {panel.mesh}" - -proc Refresh*(panel: var Panel) = - if not panel.dirty: - return - - var - offsetX = case panel.horizontalAlignment - of Left: 0.5 - of Center: 0 - of Right: -0.5 - offsetY = case panel.verticalAlignment - of Top: 0.5 - of Center: 0 - of Bottom: -0.5 - - panel.mesh[POSITION_ATTRIB, 0] = NewVec3f(-0.5 + offsetX, -0.5 + offsetY) - panel.mesh[POSITION_ATTRIB, 1] = NewVec3f(+0.5 + offsetX, -0.5 + offsetY) - panel.mesh[POSITION_ATTRIB, 2] = NewVec3f(+0.5 + offsetX, +0.5 + offsetY) - panel.mesh[POSITION_ATTRIB, 3] = NewVec3f(-0.5 + offsetX, +0.5 + offsetY) - - panel.dirty = false - -proc InitPanel*( - transform = Unit4, - color = NewVec4f(1, 1, 1, 1), - texture = EMPTY_TEXTURE, - horizontalAlignment = HorizontalAlignment.Center, - verticalAlignment = VerticalAlignment.Center, - onMouseDown: proc(panel: var Panel, buttons: set[MouseButton]) = nil, - onMouseUp: proc(panel: var Panel, buttons: set[MouseButton]) = nil, - onMouseEnter: proc(panel: var Panel) = nil, - onMouseMove: proc(panel: var Panel) = nil, - onMouseLeave: proc(panel: var Panel) = nil, -): Panel = - - result = Panel( - texture: texture, - horizontalAlignment: horizontalAlignment, - verticalAlignment: verticalAlignment, - onMouseDown: onMouseDown, - onMouseUp: onMouseUp, - onMouseEnter: onMouseEnter, - onMouseMove: onMouseMove, - onMouseLeave: onMouseLeave, - dirty: true, - ) - - result.mesh = NewMesh( - name = &"panel-{instanceCounter}", - positions = newSeq[Vec3f](4), - indices = @[ - [uint16(0), uint16(1), uint16(2)], - [uint16(2), uint16(3), uint16(0)], - ], - uvs = @[NewVec2f(0, 1), NewVec2f(1, 1), NewVec2f(1, 0), NewVec2f(0, 0)], - transform = transform - ) - result.mesh[].RenameAttribute("position", POSITION_ATTRIB) - result.mesh[].RenameAttribute("uv", UV_ATTRIB) - result.mesh.material = InitMaterialData( - theType = PANEL_MATERIAL_TYPE, - name = "Panel material", - attributes = {"panelTexture": InitDataList(@[texture]), "color": InitDataList(@[color])}, - ) - inc instanceCounter - result.Refresh() - -proc Color*(panel: Panel): Vec4f = - panel.mesh.material["color", 0, Vec4f] -proc `color=`*(panel: var Panel, value: Vec4f) = - if value != panel.mesh.material["color", 0, Vec4f]: - panel.mesh.material["color", 0] = value - -proc HorizontalAlignment*(panel: Panel): HorizontalAlignment = - panel.horizontalAlignment -proc `horizontalAlignment=`*(panel: var Panel, value: HorizontalAlignment) = - if value != panel.horizontalAlignment: - panel.horizontalAlignment = value - panel.dirty = true - -proc VerticalAlignment*(panel: Panel): VerticalAlignment = - panel.verticalAlignment -proc `verticalAlignment=`*(panel: var Panel, value: VerticalAlignment) = - if value != panel.verticalAlignment: - panel.verticalAlignment = value - panel.dirty = true - -proc Contains*(panel: Panel, p: Vec2f, aspectRatio: float32): bool = - let - cursor = panel.mesh.transform.Inversed * p.ToVec3 - p1 = panel.mesh[POSITION_ATTRIB, 0, Vec3f] - p2 = panel.mesh[POSITION_ATTRIB, 2, Vec3f] - left = min(p1.x, p2.x) - right = max(p1.x, p2.x) - top = min(p1.y * aspectRatio, p2.y * aspectRatio) - bottom = max(p1.y * aspectRatio, p2.y * aspectRatio) - return left <= cursor.x and cursor.x <= right and top <= cursor.y and cursor.y <= bottom diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/resources.nim --- a/semiconginev2/old/resources.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,222 +0,0 @@ -import std/parsecfg -import std/streams -import std/algorithm -import std/json -import std/strutils -import std/sequtils -import std/strformat -import std/os -import std/sets -import std/unicode - -import ./core -import ./resources/image -import ./resources/audio -import ./resources/mesh -import ./resources/font -import ./mesh -import ./material - -export image -export audio -export mesh - -type - ResourceBundlingType = enum - Dir # Directories - Zip # Zip files - Exe # Embeded in executable - -const - thebundletype = parseEnum[ResourceBundlingType](PACKAGETYPE.toLowerAscii().capitalizeAscii()) - ASCII_CHARSET = PrintableChars.toSeq.toRunes - DEFAULT_PACKAGE = "default" - -# resource loading - -func normalizeDir(dir: string): string = - result = dir - if result.startsWith("./"): - result = result[2 .. ^1] - if result.startsWith("/"): - result = result[1 .. ^1] - result = dir.replace('\\', '/') - if not result.endsWith("/") and result != "": - result = result & "/" - -when thebundletype == Dir: - - proc resourceRoot(): string = - getAppDir().absolutePath().joinPath(RESOURCEROOT) - proc packageRoot(package: string): string = - resourceRoot().joinPath(package) - - proc loadResource_intern(path: string, package: string): Stream = - let realpath = package.packageRoot().joinPath(path) - if not realpath.fileExists(): - raise newException(Exception, &"Resource {path} not found (checked {realpath})") - newFileStream(realpath, fmRead) - - proc modList_intern(): seq[string] = - for kind, file in walkDir(resourceRoot(), relative = true): - if kind == pcDir: - result.add file - - iterator walkResources_intern(dir: string, package = DEFAULT_PACKAGE): string = - for file in walkDirRec(package.packageRoot().joinPath(dir), relative = true): - yield file - - iterator ls_intern(dir: string, package: string): tuple[kind: PathComponent, path: string] = - for i in walkDir(package.packageRoot().joinPath(dir), relative = true): - yield i - -elif thebundletype == Zip: - - import ./thirdparty/zippy/zippy/ziparchives - - proc resourceRoot(): string = - absolutePath(getAppDir()).joinPath(RESOURCEROOT) - proc packageRoot(package: string): string = - resourceRoot().joinPath(package) - - proc loadResource_intern(path: string, package: string): Stream = - let archive = openZipArchive(package.packageRoot() & ".zip") - try: - result = newStringStream(archive.extractFile(path)) - except ZippyError: - raise newException(Exception, &"Resource {path} not found") - archive.close() - - proc modList_intern(): seq[string] = - for kind, file in walkDir(resourceRoot(), relative = true): - if kind == pcFile and file.endsWith(".zip"): - result.add file[0 ..< ^4] - - iterator walkResources_intern(dir: string, package = DEFAULT_PACKAGE): string = - let archive = openZipArchive(package.packageRoot() & ".zip") - let normDir = dir.normalizeDir() - for i in archive.walkFiles: - if i.startsWith(normDir): - yield i - archive.close() - - iterator ls_intern(dir: string, package: string): tuple[kind: PathComponent, path: string] = - let archive = openZipArchive(package.packageRoot() & ".zip") - let normDir = dir.normalizeDir() - var yielded: HashSet[string] - - for i in archive.walkFiles: - if i.startsWith(normDir): - let components = i[normDir.len .. ^1].split('/', maxsplit = 1) - if components.len == 1: - if not (components[0] in yielded): - yield (kind: pcFile, path: components[0]) - else: - if not (components[0] in yielded): - yield (kind: pcDir, path: components[0]) - yielded.incl components[0] - archive.close() - -elif thebundletype == Exe: - - import std/tables - - const BUILD_RESOURCEROOT* {.strdefine.}: string = "" - - proc loadResources(): Table[string, Table[string, string]] {.compileTime.} = - when BUILD_RESOURCEROOT == "": - {.warning: "BUILD_RESOURCEROOT is empty, no resources will be packaged".} - return - else: - for kind, packageDir in walkDir(BUILD_RESOURCEROOT): - if kind == pcDir: - let package = packageDir.splitPath.tail - result[package] = Table[string, string]() - for resourcefile in walkDirRec(packageDir, relative = true): - result[package][resourcefile.replace('\\', '/')] = staticRead(packageDir.joinPath(resourcefile)) - const bundledResources = loadResources() - - proc loadResource_intern(path: string, package: string): Stream = - if not (path in bundledResources[package]): - raise newException(Exception, &"Resource {path} not found") - newStringStream(bundledResources[package][path]) - - proc modList_intern(): seq[string] = - result = bundledResources.keys().toSeq() - - iterator walkResources_intern(dir: string, package = DEFAULT_PACKAGE): string = - for i in bundledResources[package].keys: - yield i - - iterator ls_intern(dir: string, package: string): tuple[kind: PathComponent, path: string] = - let normDir = dir.normalizeDir() - var yielded: HashSet[string] - - for i in bundledResources[package].keys: - if i.startsWith(normDir): - let components = i[normDir.len .. ^1].split('/', maxsplit = 1) - if components.len == 1: - if not (components[0] in yielded): - yield (kind: pcFile, path: components[0]) - else: - if not (components[0] in yielded): - yield (kind: pcDir, path: components[0]) - yielded.incl components[0] - -proc LoadResource*(path: string, package = DEFAULT_PACKAGE): Stream = - loadResource_intern(path, package = package) - -proc LoadImage*[T](path: string, package = DEFAULT_PACKAGE): Image[RGBAPixel] = - if path.splitFile().ext.toLowerAscii == ".bmp": - loadResource_intern(path, package = package).ReadBMP() - elif path.splitFile().ext.toLowerAscii == ".png": - loadResource_intern(path, package = package).ReadPNG() - else: - raise newException(Exception, "Unsupported image file type: " & path) - -proc LoadAudio*(path: string, package = DEFAULT_PACKAGE): Sound = - if path.splitFile().ext.toLowerAscii == ".au": - loadResource_intern(path, package = package).ReadAU() - elif path.splitFile().ext.toLowerAscii == ".ogg": - loadResource_intern(path, package = package).ReadVorbis() - else: - raise newException(Exception, "Unsupported audio file type: " & path) - -proc LoadJson*(path: string, package = DEFAULT_PACKAGE): JsonNode = - path.loadResource_intern(package = package).readAll().parseJson() - -proc LoadConfig*(path: string, package = DEFAULT_PACKAGE): Config = - path.loadResource_intern(package = package).loadConfig(filename = path) - -proc LoadFont*( - path: string, - name = "", - lineHeightPixels = 80'f32, - additional_codepoints: openArray[Rune] = [], - charset = ASCII_CHARSET, - package = DEFAULT_PACKAGE -): Font = - var thename = name - if thename == "": - thename = path.splitFile().name - loadResource_intern(path, package = package).ReadTrueType(name, charset & additional_codepoints.toSeq, lineHeightPixels) - -proc LoadMeshes*(path: string, defaultMaterial: MaterialType, package = DEFAULT_PACKAGE): seq[MeshTree] = - loadResource_intern(path, package = package).ReadglTF(defaultMaterial) - -proc LoadFirstMesh*(path: string, defaultMaterial: MaterialType, package = DEFAULT_PACKAGE): Mesh = - loadResource_intern(path, package = package).ReadglTF(defaultMaterial)[0].toSeq[0] - -proc Packages*(): seq[string] = - modList_intern() - -proc WalkResources*(dir = "", package = DEFAULT_PACKAGE): seq[string] = - for i in walkResources_intern(dir, package = package): - if i.startsWith(dir): - result.add i - result.sort() - -proc List*(dir: string, package = DEFAULT_PACKAGE): seq[tuple[kind: PathComponent, path: string]] = - for i in ls_intern(dir = dir, package = package): - result.add i - result.sort() diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/resources/audio.nim --- a/semiconginev2/old/resources/audio.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -import std/os -import std/streams -import std/strformat -import std/endians - -import ../core/audiotypes - -type - Encoding {.size: sizeof(uint32).} = enum - # Unspecified = 0 - # Uint8Ulaw = 1 - # Int8 = 2 - Int16 = 3 - # Int24 = 4 - # Int32 = 5 - # Float32 = 6 - # Float64 = 7 - - AuHeader = object - magicNumber: uint32 - dataOffset: uint32 - dataSize: uint32 - encoding: Encoding - sampleRate: uint32 - channels: uint32 - -proc readSample(stream: Stream, encoding: Encoding, channels: int): Sample = - result[0] = stream.readint16() - swapEndian16(addr result[0], addr result[0]) - - if channels == 2: - result[1] = stream.readint16() - swapEndian16(addr result[1], addr result[1]) - else: - result[1] = result[0] - -# https://en.wikipedia.org/wiki/Au_file_format -proc ReadAU*(stream: Stream): Sound = - var header: AuHeader - - for name, value in fieldPairs(header): - var bytes: array[4, uint8] - stream.read(bytes) - swap(bytes[0], bytes[3]) - swap(bytes[1], bytes[2]) - value = cast[typeof(value)](bytes) - - assert header.magicNumber == 0x2e736e64 - if header.sampleRate != AUDIO_SAMPLE_RATE: - raise newException(Exception, &"Only support sample rate of {AUDIO_SAMPLE_RATE} Hz but got {header.sampleRate} Hz, please resample (e.g. ffmpeg -i -ar {AUDIO_SAMPLE_RATE} )") - if not (header.channels in [1'u32, 2'u32]): - raise newException(Exception, "Only support mono and stereo audio at the moment (1 or 2 channels), but found " & $header.channels) - - var annotation: string - stream.read(annotation) - - result = new Sound - stream.setPosition(int(header.dataOffset)) - while not stream.atEnd(): - result[].add stream.readSample(header.encoding, int(header.channels)) - -{.compile: currentSourcePath.parentDir() & "/stb_vorbis.c".} - -proc stb_vorbis_decode_memory(mem: pointer, len: cint, channels: ptr cint, sample_rate: ptr cint, output: ptr ptr cshort): cint {.importc.} -proc free(p: pointer) {.importc.} - -proc ReadVorbis*(stream: Stream): Sound = - var - data = stream.readAll() - channels: cint - sampleRate: cint - output: ptr cshort - - var nSamples = stb_vorbis_decode_memory(addr data[0], cint(data.len), addr channels, addr sampleRate, addr output) - - if nSamples < 0: - raise newException(Exception, &"Unable to read ogg/vorbis sound file, error code: {nSamples}") - if sampleRate != AUDIO_SAMPLE_RATE: - raise newException(Exception, &"Only support sample rate of {AUDIO_SAMPLE_RATE} Hz but got {sampleRate} Hz, please resample (e.g. ffmpeg -i -acodec libvorbis -ar {AUDIO_SAMPLE_RATE} )") - - result = new Sound - if channels == 2: - result[].setLen(int(nSamples)) - copyMem(addr result[][0], output, nSamples * sizeof(Sample)) - free(output) - elif channels == 1: - for i in 0 ..< nSamples: - let value = cast[ptr UncheckedArray[int16]](output)[i] - result[].add [value, value] - free(output) - else: - free(output) - raise newException(Exception, "Only support mono and stereo audio at the moment (1 or 2 channels), but found " & $channels) diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/resources/image.nim --- a/semiconginev2/old/resources/image.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,163 +0,0 @@ -import std/os -# import std/syncio -import std/streams -import std/bitops -import std/strformat - -import ../core/imagetypes -import ../core/utils - -const COMPRESSION_BI_RGB = 0'u32 -const COMPRESSION_BI_BITFIELDS = 3'u32 -const COMPRESSION_BI_ALPHABITFIELDS = 6'u32 -type - BitmapFileHeader = object - magicbytes: array[2, char] - filesize: uint32 - reserved1: uint16 - reserved2: uint16 - dataStart: uint32 - DIBHeader = object - headersize: uint32 - width: int32 - height: int32 - colorPlanes: uint16 - bitsPerPixel: uint16 - compression: uint32 - imageDataSize: uint32 # unused - resolutionX: int32 # unused - resolutionY: int32 # unused - nColors: uint32 # unused - nImportantColors: uint32 # unused - bitMaskRed: uint32 - bitMaskGreen: uint32 - bitMaskBlue: uint32 - bitMaskAlpha: uint32 - colorSpace: array[4, char] # not used yet - colorSpaceEndpoints: array[36, uint8] # unused - gammaRed: uint32 # not used yet - gammaGreen: uint32 # not used yet - gammaBlue: uint32 # not used yet - -proc ReadBMP*(stream: Stream): Image[RGBAPixel] = - var - bitmapFileHeader: BitmapFileHeader - dibHeader: DIBHeader - - for name, value in fieldPairs(bitmapFileHeader): - stream.read(value) - if bitmapFileHeader.magicbytes != ['B', 'M']: - raise newException(Exception, "Cannot open image, invalid magic bytes (is this really a BMP bitmap?)") - for name, value in fieldPairs(dibHeader): - - when name in ["bitMaskRed", "bitMaskGreen", "bitMaskBlue"]: - if dibHeader.compression in [COMPRESSION_BI_BITFIELDS, COMPRESSION_BI_ALPHABITFIELDS]: - stream.read(value) - elif name == "bitMaskAlpha": - if dibHeader.compression == COMPRESSION_BI_ALPHABITFIELDS: - stream.read(value) - else: - stream.read(value) - - when name == "headersize": - if value != 124: - raise newException(Exception, "Cannot open image, only BITMAPV5 supported") - elif name == "colorPlanes": - assert value == 1 - elif name == "bitsPerPixel": - if not (value in [24'u16, 32'u16]): - raise newException(Exception, "Cannot open image, only depth of 24 and 32 supported") - elif name == "compression": - if not (value in [0'u32, 3'u32]): - raise newException(Exception, "Cannot open image, only BI_RGB and BI_BITFIELDS are supported compressions") - elif name == "colorSpace": - swap(value[0], value[3]) - swap(value[1], value[2]) - stream.setPosition(int(bitmapFileHeader.dataStart)) - var - padding = ((int32(dibHeader.bitsPerPixel div 8)) * dibHeader.width) mod 4 - data = newSeq[RGBAPixel](dibHeader.width * abs(dibHeader.height)) - if padding > 0: - padding = 4 - padding - for row in 0 ..< abs(dibHeader.height): - for col in 0 ..< dibHeader.width: - - var pixel: RGBAPixel = [0'u8, 0'u8, 0'u8, 255'u8] - # if we got channeld bitmasks - if dibHeader.compression in [COMPRESSION_BI_BITFIELDS, COMPRESSION_BI_ALPHABITFIELDS]: - var value = stream.readUint32() - pixel[0] = uint8((value and dibHeader.bitMaskRed) shr dibHeader.bitMaskRed.countTrailingZeroBits) - pixel[1] = uint8((value and dibHeader.bitMaskGreen) shr dibHeader.bitMaskGreen.countTrailingZeroBits) - pixel[2] = uint8((value and dibHeader.bitMaskBlue) shr dibHeader.bitMaskBlue.countTrailingZeroBits) - if dibHeader.compression == COMPRESSION_BI_ALPHABITFIELDS: - pixel[3] = uint8((value and dibHeader.bitMaskAlpha) shr dibHeader.bitMaskAlpha.countTrailingZeroBits) - # if we got plain RGB(A), using little endian - elif dibHeader.compression == COMPRESSION_BI_RGB: - let nChannels = int(dibHeader.bitsPerPixel) div 8 - for i in 1 .. nChannels: - stream.read(pixel[nChannels - i]) - else: - raise newException(Exception, "Cannot open image, only BI_RGB and BI_BITFIELDS are supported compressions") - - # determine whether we read top-to-bottom or bottom-to-top - var row_mult: int = (if dibHeader.height < 0: row else: dibHeader.height - row - 1) - data[row_mult * dibHeader.width + col] = pixel - stream.setPosition(stream.getPosition() + padding) - - result = NewImage(width = dibHeader.width.uint32, height = abs(dibHeader.height).uint32, imagedata = data) - -{.compile: currentSourcePath.parentDir() & "/lodepng.c".} - -proc lodepng_decode32(out_data: ptr cstring, w: ptr cuint, h: ptr cuint, in_data: cstring, insize: csize_t): cuint {.importc.} -proc lodepng_encode_memory(out_data: ptr cstring, outsize: ptr csize_t, image: cstring, w: cuint, h: cuint, colorType: cint, bitdepth: cuint): cuint {.importc.} - -proc free(p: pointer) {.importc.} # for some reason the lodepng pointer can only properly be freed with the native free - -proc ReadPNG*(stream: Stream): Image[RGBAPixel] = - let indata = stream.readAll() - var w, h: cuint - var data: cstring - - if lodepng_decode32(out_data = addr data, w = addr w, h = addr h, in_data = cstring(indata), insize = csize_t(indata.len)) != 0: - raise newException(Exception, "An error occured while loading PNG file") - - let imagesize = w * h * 4 - var imagedata = newSeq[RGBAPixel](w * h) - copyMem(addr imagedata[0], data, imagesize) - - free(data) - - result = NewImage(width = w, height = h, imagedata = imagedata) - -proc ToPNG*[T: Pixel](image: Image[T]): seq[uint8] = - when T is GrayPixel: - let pngType = 0 # hardcoded in lodepng.h - else: - let pngType = 6 # hardcoded in lodepng.h - var - pngData: cstring - pngSize: csize_t - for y in 0 ..< image.height: - for x in 0 ..< image.width: - discard - let ret = lodepng_encode_memory( - addr pngData, - addr pngSize, - cast[cstring](image.imagedata.ToCPointer), - cuint(image.width), - cuint(image.height), - cint(pngType), - 8, - ) - assert ret == 0, &"There was an error with generating the PNG data for image {image}, result was: {ret}" - result = newSeq[uint8](pngSize) - for i in 0 ..< pngSize: - result[i] = uint8(pngData[i]) - free(pngData) - -proc WritePNG*[T: Pixel](image: Image[T], filename: string) = - let f = filename.open(mode = fmWrite) - let data = image.toPNG() - let written = f.writeBytes(data, 0, data.len) - assert written == data.len, &"There was an error while saving '{filename}': only {written} of {data.len} bytes were written" - f.close() diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/resources/lodepng.c --- a/semiconginev2/old/resources/lodepng.c Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6991 +0,0 @@ -/* -LodePNG version 20230410 - -Copyright (c) 2005-2023 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -/* -The manual and changelog are in the header file "lodepng.h" -Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. -*/ - -#include "lodepng.h" - -#ifdef LODEPNG_COMPILE_DISK -#include /* LONG_MAX */ -#include /* file handling */ -#endif /* LODEPNG_COMPILE_DISK */ - -#ifdef LODEPNG_COMPILE_ALLOCATORS -#include /* allocations */ -#endif /* LODEPNG_COMPILE_ALLOCATORS */ - -#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ -#pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ -#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ -#endif /*_MSC_VER */ - -const char* LODEPNG_VERSION_STRING = "20230410"; - -/* -This source file is divided into the following large parts. The code sections -with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. --Tools for C and common code for PNG and Zlib --C Code for Zlib (huffman, deflate, ...) --C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) --The C++ wrapper around all of the above -*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // Tools for C, and common code for PNG and Zlib. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*The malloc, realloc and free functions defined here with "lodepng_" in front -of the name, so that you can easily change them to others related to your -platform if needed. Everything else in the code calls these. Pass --DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out -#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and -define them in your own project's source files without needing to change -lodepng source code. Don't forget to remove "static" if you copypaste them -from here.*/ - -#ifdef LODEPNG_COMPILE_ALLOCATORS -static void* lodepng_malloc(size_t size) { -#ifdef LODEPNG_MAX_ALLOC - if(size > LODEPNG_MAX_ALLOC) return 0; -#endif - return malloc(size); -} - -/* NOTE: when realloc returns NULL, it leaves the original memory untouched */ -static void* lodepng_realloc(void* ptr, size_t new_size) { -#ifdef LODEPNG_MAX_ALLOC - if(new_size > LODEPNG_MAX_ALLOC) return 0; -#endif - return realloc(ptr, new_size); -} - -static void lodepng_free(void* ptr) { - free(ptr); -} -#else /*LODEPNG_COMPILE_ALLOCATORS*/ -/* TODO: support giving additional void* payload to the custom allocators */ -void* lodepng_malloc(size_t size); -void* lodepng_realloc(void* ptr, size_t new_size); -void lodepng_free(void* ptr); -#endif /*LODEPNG_COMPILE_ALLOCATORS*/ - -/* convince the compiler to inline a function, for use when this measurably improves performance */ -/* inline is not available in C90, but use it when supported by the compiler */ -#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || (defined(__cplusplus) && (__cplusplus >= 199711L)) -#define LODEPNG_INLINE inline -#else -#define LODEPNG_INLINE /* not available */ -#endif - -/* restrict is not available in C90, but use it when supported by the compiler */ -#if (defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) ||\ - (defined(_MSC_VER) && (_MSC_VER >= 1400)) || \ - (defined(__WATCOMC__) && (__WATCOMC__ >= 1250) && !defined(__cplusplus)) -#define LODEPNG_RESTRICT __restrict -#else -#define LODEPNG_RESTRICT /* not available */ -#endif - -/* Replacements for C library functions such as memcpy and strlen, to support platforms -where a full C library is not available. The compiler can recognize them and compile -to something as fast. */ - -static void lodepng_memcpy(void* LODEPNG_RESTRICT dst, - const void* LODEPNG_RESTRICT src, size_t size) { - size_t i; - for(i = 0; i < size; i++) ((char*)dst)[i] = ((const char*)src)[i]; -} - -static void lodepng_memset(void* LODEPNG_RESTRICT dst, - int value, size_t num) { - size_t i; - for(i = 0; i < num; i++) ((char*)dst)[i] = (char)value; -} - -/* does not check memory out of bounds, do not use on untrusted data */ -static size_t lodepng_strlen(const char* a) { - const char* orig = a; - /* avoid warning about unused function in case of disabled COMPILE... macros */ - (void)(&lodepng_strlen); - while(*a) a++; - return (size_t)(a - orig); -} - -#define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define LODEPNG_MIN(a, b) (((a) < (b)) ? (a) : (b)) - -#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER) -/* Safely check if adding two integers will overflow (no undefined -behavior, compiler removing the code, etc...) and output result. */ -static int lodepng_addofl(size_t a, size_t b, size_t* result) { - *result = a + b; /* Unsigned addition is well defined and safe in C90 */ - return *result < a; -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)*/ - -#ifdef LODEPNG_COMPILE_DECODER -/* Safely check if multiplying two integers will overflow (no undefined -behavior, compiler removing the code, etc...) and output result. */ -static int lodepng_mulofl(size_t a, size_t b, size_t* result) { - *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */ - return (a != 0 && *result / a != b); -} - -#ifdef LODEPNG_COMPILE_ZLIB -/* Safely check if a + b > c, even if overflow could happen. */ -static int lodepng_gtofl(size_t a, size_t b, size_t c) { - size_t d; - if(lodepng_addofl(a, b, &d)) return 1; - return d > c; -} -#endif /*LODEPNG_COMPILE_ZLIB*/ -#endif /*LODEPNG_COMPILE_DECODER*/ - - -/* -Often in case of an error a value is assigned to a variable and then it breaks -out of a loop (to go to the cleanup phase of a function). This macro does that. -It makes the error handling code shorter and more readable. - -Example: if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83); -*/ -#define CERROR_BREAK(errorvar, code){\ - errorvar = code;\ - break;\ -} - -/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ -#define ERROR_BREAK(code) CERROR_BREAK(error, code) - -/*Set error var to the error code, and return it.*/ -#define CERROR_RETURN_ERROR(errorvar, code){\ - errorvar = code;\ - return code;\ -} - -/*Try the code, if it returns error, also return the error.*/ -#define CERROR_TRY_RETURN(call){\ - unsigned error = call;\ - if(error) return error;\ -} - -/*Set error var to the error code, and return from the void function.*/ -#define CERROR_RETURN(errorvar, code){\ - errorvar = code;\ - return;\ -} - -/* -About uivector, ucvector and string: --All of them wrap dynamic arrays or text strings in a similar way. --LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. --The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. --They're not used in the interface, only internally in this file as static functions. --As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. -*/ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_ENCODER -/*dynamic vector of unsigned ints*/ -typedef struct uivector { - unsigned* data; - size_t size; /*size in number of unsigned longs*/ - size_t allocsize; /*allocated size in bytes*/ -} uivector; - -static void uivector_cleanup(void* p) { - ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; - lodepng_free(((uivector*)p)->data); - ((uivector*)p)->data = NULL; -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_resize(uivector* p, size_t size) { - size_t allocsize = size * sizeof(unsigned); - if(allocsize > p->allocsize) { - size_t newsize = allocsize + (p->allocsize >> 1u); - void* data = lodepng_realloc(p->data, newsize); - if(data) { - p->allocsize = newsize; - p->data = (unsigned*)data; - } - else return 0; /*error: not enough memory*/ - } - p->size = size; - return 1; /*success*/ -} - -static void uivector_init(uivector* p) { - p->data = NULL; - p->size = p->allocsize = 0; -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_push_back(uivector* p, unsigned c) { - if(!uivector_resize(p, p->size + 1)) return 0; - p->data[p->size - 1] = c; - return 1; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* /////////////////////////////////////////////////////////////////////////// */ - -/*dynamic vector of unsigned chars*/ -typedef struct ucvector { - unsigned char* data; - size_t size; /*used size*/ - size_t allocsize; /*allocated size*/ -} ucvector; - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_reserve(ucvector* p, size_t size) { - if(size > p->allocsize) { - size_t newsize = size + (p->allocsize >> 1u); - void* data = lodepng_realloc(p->data, newsize); - if(data) { - p->allocsize = newsize; - p->data = (unsigned char*)data; - } - else return 0; /*error: not enough memory*/ - } - return 1; /*success*/ -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_resize(ucvector* p, size_t size) { - p->size = size; - return ucvector_reserve(p, size); -} - -static ucvector ucvector_init(unsigned char* buffer, size_t size) { - ucvector v; - v.data = buffer; - v.allocsize = v.size = size; - return v; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -/*free string pointer and set it to NULL*/ -static void string_cleanup(char** out) { - lodepng_free(*out); - *out = NULL; -} - -/*also appends null termination character*/ -static char* alloc_string_sized(const char* in, size_t insize) { - char* out = (char*)lodepng_malloc(insize + 1); - if(out) { - lodepng_memcpy(out, in, insize); - out[insize] = 0; - } - return out; -} - -/* dynamically allocates a new string with a copy of the null terminated input text */ -static char* alloc_string(const char* in) { - return alloc_string_sized(in, lodepng_strlen(in)); -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG) -static unsigned lodepng_read32bitInt(const unsigned char* buffer) { - return (((unsigned)buffer[0] << 24u) | ((unsigned)buffer[1] << 16u) | - ((unsigned)buffer[2] << 8u) | (unsigned)buffer[3]); -} -#endif /*defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)*/ - -#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) -/*buffer must have at least 4 allocated bytes available*/ -static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) { - buffer[0] = (unsigned char)((value >> 24) & 0xff); - buffer[1] = (unsigned char)((value >> 16) & 0xff); - buffer[2] = (unsigned char)((value >> 8) & 0xff); - buffer[3] = (unsigned char)((value ) & 0xff); -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / File IO / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DISK - -/* returns negative value on error. This should be pure C compatible, so no fstat. */ -static long lodepng_filesize(const char* filename) { - FILE* file; - long size; - file = fopen(filename, "rb"); - if(!file) return -1; - - if(fseek(file, 0, SEEK_END) != 0) { - fclose(file); - return -1; - } - - size = ftell(file); - /* It may give LONG_MAX as directory size, this is invalid for us. */ - if(size == LONG_MAX) size = -1; - - fclose(file); - return size; -} - -/* load file into buffer that already has the correct allocated size. Returns error code.*/ -static unsigned lodepng_buffer_file(unsigned char* out, size_t size, const char* filename) { - FILE* file; - size_t readsize; - file = fopen(filename, "rb"); - if(!file) return 78; - - readsize = fread(out, 1, size, file); - fclose(file); - - if(readsize != size) return 78; - return 0; -} - -unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) { - long size = lodepng_filesize(filename); - if(size < 0) return 78; - *outsize = (size_t)size; - - *out = (unsigned char*)lodepng_malloc((size_t)size); - if(!(*out) && size > 0) return 83; /*the above malloc failed*/ - - return lodepng_buffer_file(*out, (size_t)size, filename); -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) { - FILE* file; - file = fopen(filename, "wb" ); - if(!file) return 79; - fwrite(buffer, 1, buffersize, file); - fclose(file); - return 0; -} - -#endif /*LODEPNG_COMPILE_DISK*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of common code and tools. Begin of Zlib related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_ENCODER - -typedef struct { - ucvector* data; - unsigned char bp; /*ok to overflow, indicates bit pos inside byte*/ -} LodePNGBitWriter; - -static void LodePNGBitWriter_init(LodePNGBitWriter* writer, ucvector* data) { - writer->data = data; - writer->bp = 0; -} - -/*TODO: this ignores potential out of memory errors*/ -#define WRITEBIT(writer, bit){\ - /* append new byte */\ - if(((writer->bp) & 7u) == 0) {\ - if(!ucvector_resize(writer->data, writer->data->size + 1)) return;\ - writer->data->data[writer->data->size - 1] = 0;\ - }\ - (writer->data->data[writer->data->size - 1]) |= (bit << ((writer->bp) & 7u));\ - ++writer->bp;\ -} - -/* LSB of value is written first, and LSB of bytes is used first */ -static void writeBits(LodePNGBitWriter* writer, unsigned value, size_t nbits) { - if(nbits == 1) { /* compiler should statically compile this case if nbits == 1 */ - WRITEBIT(writer, value); - } else { - /* TODO: increase output size only once here rather than in each WRITEBIT */ - size_t i; - for(i = 0; i != nbits; ++i) { - WRITEBIT(writer, (unsigned char)((value >> i) & 1)); - } - } -} - -/* This one is to use for adding huffman symbol, the value bits are written MSB first */ -static void writeBitsReversed(LodePNGBitWriter* writer, unsigned value, size_t nbits) { - size_t i; - for(i = 0; i != nbits; ++i) { - /* TODO: increase output size only once here rather than in each WRITEBIT */ - WRITEBIT(writer, (unsigned char)((value >> (nbits - 1u - i)) & 1u)); - } -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -typedef struct { - const unsigned char* data; - size_t size; /*size of data in bytes*/ - size_t bitsize; /*size of data in bits, end of valid bp values, should be 8*size*/ - size_t bp; - unsigned buffer; /*buffer for reading bits. NOTE: 'unsigned' must support at least 32 bits*/ -} LodePNGBitReader; - -/* data size argument is in bytes. Returns error if size too large causing overflow */ -static unsigned LodePNGBitReader_init(LodePNGBitReader* reader, const unsigned char* data, size_t size) { - size_t temp; - reader->data = data; - reader->size = size; - /* size in bits, return error if overflow (if size_t is 32 bit this supports up to 500MB) */ - if(lodepng_mulofl(size, 8u, &reader->bitsize)) return 105; - /*ensure incremented bp can be compared to bitsize without overflow even when it would be incremented 32 too much and - trying to ensure 32 more bits*/ - if(lodepng_addofl(reader->bitsize, 64u, &temp)) return 105; - reader->bp = 0; - reader->buffer = 0; - return 0; /*ok*/ -} - -/* -ensureBits functions: -Ensures the reader can at least read nbits bits in one or more readBits calls, -safely even if not enough bits are available. -The nbits parameter is unused but is given for documentation purposes, error -checking for amount of bits must be done beforehand. -*/ - -/*See ensureBits documentation above. This one ensures up to 9 bits */ -static LODEPNG_INLINE void ensureBits9(LodePNGBitReader* reader, size_t nbits) { - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 1u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u); - reader->buffer >>= (reader->bp & 7u); - } else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer = reader->data[start + 0]; - reader->buffer >>= (reader->bp & 7u); - } - (void)nbits; -} - -/*See ensureBits documentation above. This one ensures up to 17 bits */ -static LODEPNG_INLINE void ensureBits17(LodePNGBitReader* reader, size_t nbits) { - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 2u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | - ((unsigned)reader->data[start + 2] << 16u); - reader->buffer >>= (reader->bp & 7u); - } else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); - reader->buffer >>= (reader->bp & 7u); - } - (void)nbits; -} - -/*See ensureBits documentation above. This one ensures up to 25 bits */ -static LODEPNG_INLINE void ensureBits25(LodePNGBitReader* reader, size_t nbits) { - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 3u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | - ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); - reader->buffer >>= (reader->bp & 7u); - } else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); - if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); - reader->buffer >>= (reader->bp & 7u); - } - (void)nbits; -} - -/*See ensureBits documentation above. This one ensures up to 32 bits */ -static LODEPNG_INLINE void ensureBits32(LodePNGBitReader* reader, size_t nbits) { - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 4u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | - ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); - reader->buffer >>= (reader->bp & 7u); - reader->buffer |= (((unsigned)reader->data[start + 4] << 24u) << (8u - (reader->bp & 7u))); - } else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); - if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); - if(start + 3u < size) reader->buffer |= ((unsigned)reader->data[start + 3] << 24u); - reader->buffer >>= (reader->bp & 7u); - } - (void)nbits; -} - -/* Get bits without advancing the bit pointer. Must have enough bits available with ensureBits. Max nbits is 31. */ -static LODEPNG_INLINE unsigned peekBits(LodePNGBitReader* reader, size_t nbits) { - /* The shift allows nbits to be only up to 31. */ - return reader->buffer & ((1u << nbits) - 1u); -} - -/* Must have enough bits available with ensureBits */ -static LODEPNG_INLINE void advanceBits(LodePNGBitReader* reader, size_t nbits) { - reader->buffer >>= nbits; - reader->bp += nbits; -} - -/* Must have enough bits available with ensureBits */ -static LODEPNG_INLINE unsigned readBits(LodePNGBitReader* reader, size_t nbits) { - unsigned result = peekBits(reader, nbits); - advanceBits(reader, nbits); - return result; -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -static unsigned reverseBits(unsigned bits, unsigned num) { - /*TODO: implement faster lookup table based version when needed*/ - unsigned i, result = 0; - for(i = 0; i < num; i++) result |= ((bits >> (num - i - 1u)) & 1u) << i; - return result; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflate - Huffman / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#define FIRST_LENGTH_CODE_INDEX 257 -#define LAST_LENGTH_CODE_INDEX 285 -/*256 literals, the end code, some length codes, and 2 unused codes*/ -#define NUM_DEFLATE_CODE_SYMBOLS 288 -/*the distance codes have their own symbols, 30 used, 2 unused*/ -#define NUM_DISTANCE_SYMBOLS 32 -/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ -#define NUM_CODE_LENGTH_CODES 19 - -/*the base lengths represented by codes 257-285*/ -static const unsigned LENGTHBASE[29] - = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, - 67, 83, 99, 115, 131, 163, 195, 227, 258}; - -/*the extra bits used by codes 257-285 (added to base length)*/ -static const unsigned LENGTHEXTRA[29] - = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 5, 5, 5, 5, 0}; - -/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ -static const unsigned DISTANCEBASE[30] - = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, - 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; - -/*the extra bits of backwards distances (added to base)*/ -static const unsigned DISTANCEEXTRA[30] - = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, - 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; - -/*the order in which "code length alphabet code lengths" are stored as specified by deflate, out of this the huffman -tree of the dynamic huffman tree lengths is generated*/ -static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] - = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -/* ////////////////////////////////////////////////////////////////////////// */ - -/* -Huffman tree struct, containing multiple representations of the tree -*/ -typedef struct HuffmanTree { - unsigned* codes; /*the huffman codes (bit patterns representing the symbols)*/ - unsigned* lengths; /*the lengths of the huffman codes*/ - unsigned maxbitlen; /*maximum number of bits a single code can get*/ - unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ - /* for reading only */ - unsigned char* table_len; /*length of symbol from lookup table, or max length if secondary lookup needed*/ - unsigned short* table_value; /*value of symbol from lookup table, or pointer to secondary table if needed*/ -} HuffmanTree; - -static void HuffmanTree_init(HuffmanTree* tree) { - tree->codes = 0; - tree->lengths = 0; - tree->table_len = 0; - tree->table_value = 0; -} - -static void HuffmanTree_cleanup(HuffmanTree* tree) { - lodepng_free(tree->codes); - lodepng_free(tree->lengths); - lodepng_free(tree->table_len); - lodepng_free(tree->table_value); -} - -/* amount of bits for first huffman table lookup (aka root bits), see HuffmanTree_makeTable and huffmanDecodeSymbol.*/ -/* values 8u and 9u work the fastest */ -#define FIRSTBITS 9u - -/* a symbol value too big to represent any valid symbol, to indicate reading disallowed huffman bits combination, -which is possible in case of only 0 or 1 present symbols. */ -#define INVALIDSYMBOL 65535u - -/* make table for huffman decoding */ -static unsigned HuffmanTree_makeTable(HuffmanTree* tree) { - static const unsigned headsize = 1u << FIRSTBITS; /*size of the first table*/ - static const unsigned mask = (1u << FIRSTBITS) /*headsize*/ - 1u; - size_t i, numpresent, pointer, size; /*total table size*/ - unsigned* maxlens = (unsigned*)lodepng_malloc(headsize * sizeof(unsigned)); - if(!maxlens) return 83; /*alloc fail*/ - - /* compute maxlens: max total bit length of symbols sharing prefix in the first table*/ - lodepng_memset(maxlens, 0, headsize * sizeof(*maxlens)); - for(i = 0; i < tree->numcodes; i++) { - unsigned symbol = tree->codes[i]; - unsigned l = tree->lengths[i]; - unsigned index; - if(l <= FIRSTBITS) continue; /*symbols that fit in first table don't increase secondary table size*/ - /*get the FIRSTBITS MSBs, the MSBs of the symbol are encoded first. See later comment about the reversing*/ - index = reverseBits(symbol >> (l - FIRSTBITS), FIRSTBITS); - maxlens[index] = LODEPNG_MAX(maxlens[index], l); - } - /* compute total table size: size of first table plus all secondary tables for symbols longer than FIRSTBITS */ - size = headsize; - for(i = 0; i < headsize; ++i) { - unsigned l = maxlens[i]; - if(l > FIRSTBITS) size += (1u << (l - FIRSTBITS)); - } - tree->table_len = (unsigned char*)lodepng_malloc(size * sizeof(*tree->table_len)); - tree->table_value = (unsigned short*)lodepng_malloc(size * sizeof(*tree->table_value)); - if(!tree->table_len || !tree->table_value) { - lodepng_free(maxlens); - /* freeing tree->table values is done at a higher scope */ - return 83; /*alloc fail*/ - } - /*initialize with an invalid length to indicate unused entries*/ - for(i = 0; i < size; ++i) tree->table_len[i] = 16; - - /*fill in the first table for long symbols: max prefix size and pointer to secondary tables*/ - pointer = headsize; - for(i = 0; i < headsize; ++i) { - unsigned l = maxlens[i]; - if(l <= FIRSTBITS) continue; - tree->table_len[i] = l; - tree->table_value[i] = pointer; - pointer += (1u << (l - FIRSTBITS)); - } - lodepng_free(maxlens); - - /*fill in the first table for short symbols, or secondary table for long symbols*/ - numpresent = 0; - for(i = 0; i < tree->numcodes; ++i) { - unsigned l = tree->lengths[i]; - unsigned symbol, reverse; - if(l == 0) continue; - symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/ - /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/ - reverse = reverseBits(symbol, l); - numpresent++; - - if(l <= FIRSTBITS) { - /*short symbol, fully in first table, replicated num times if l < FIRSTBITS*/ - unsigned num = 1u << (FIRSTBITS - l); - unsigned j; - for(j = 0; j < num; ++j) { - /*bit reader will read the l bits of symbol first, the remaining FIRSTBITS - l bits go to the MSB's*/ - unsigned index = reverse | (j << l); - if(tree->table_len[index] != 16) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ - tree->table_len[index] = l; - tree->table_value[index] = i; - } - } else { - /*long symbol, shares prefix with other long symbols in first lookup table, needs second lookup*/ - /*the FIRSTBITS MSBs of the symbol are the first table index*/ - unsigned index = reverse & mask; - unsigned maxlen = tree->table_len[index]; - /*log2 of secondary table length, should be >= l - FIRSTBITS*/ - unsigned tablelen = maxlen - FIRSTBITS; - unsigned start = tree->table_value[index]; /*starting index in secondary table*/ - unsigned num = 1u << (tablelen - (l - FIRSTBITS)); /*amount of entries of this symbol in secondary table*/ - unsigned j; - if(maxlen < l) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ - for(j = 0; j < num; ++j) { - unsigned reverse2 = reverse >> FIRSTBITS; /* l - FIRSTBITS bits */ - unsigned index2 = start + (reverse2 | (j << (l - FIRSTBITS))); - tree->table_len[index2] = l; - tree->table_value[index2] = i; - } - } - } - - if(numpresent < 2) { - /* In case of exactly 1 symbol, in theory the huffman symbol needs 0 bits, - but deflate uses 1 bit instead. In case of 0 symbols, no symbols can - appear at all, but such huffman tree could still exist (e.g. if distance - codes are never used). In both cases, not all symbols of the table will be - filled in. Fill them in with an invalid symbol value so returning them from - huffmanDecodeSymbol will cause error. */ - for(i = 0; i < size; ++i) { - if(tree->table_len[i] == 16) { - /* As length, use a value smaller than FIRSTBITS for the head table, - and a value larger than FIRSTBITS for the secondary table, to ensure - valid behavior for advanceBits when reading this symbol. */ - tree->table_len[i] = (i < headsize) ? 1 : (FIRSTBITS + 1); - tree->table_value[i] = INVALIDSYMBOL; - } - } - } else { - /* A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. - If that is not the case (due to too long length codes), the table will not - have been fully used, and this is an error (not all bit combinations can be - decoded): an oversubscribed huffman tree, indicated by error 55. */ - for(i = 0; i < size; ++i) { - if(tree->table_len[i] == 16) return 55; - } - } - - return 0; -} - -/* -Second step for the ...makeFromLengths and ...makeFromFrequencies functions. -numcodes, lengths and maxbitlen must already be filled in correctly. return -value is error. -*/ -static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) { - unsigned* blcount; - unsigned* nextcode; - unsigned error = 0; - unsigned bits, n; - - tree->codes = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); - blcount = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); - nextcode = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); - if(!tree->codes || !blcount || !nextcode) error = 83; /*alloc fail*/ - - if(!error) { - for(n = 0; n != tree->maxbitlen + 1; n++) blcount[n] = nextcode[n] = 0; - /*step 1: count number of instances of each code length*/ - for(bits = 0; bits != tree->numcodes; ++bits) ++blcount[tree->lengths[bits]]; - /*step 2: generate the nextcode values*/ - for(bits = 1; bits <= tree->maxbitlen; ++bits) { - nextcode[bits] = (nextcode[bits - 1] + blcount[bits - 1]) << 1u; - } - /*step 3: generate all the codes*/ - for(n = 0; n != tree->numcodes; ++n) { - if(tree->lengths[n] != 0) { - tree->codes[n] = nextcode[tree->lengths[n]]++; - /*remove superfluous bits from the code*/ - tree->codes[n] &= ((1u << tree->lengths[n]) - 1u); - } - } - } - - lodepng_free(blcount); - lodepng_free(nextcode); - - if(!error) error = HuffmanTree_makeTable(tree); - return error; -} - -/* -given the code lengths (as stored in the PNG file), generate the tree as defined -by Deflate. maxbitlen is the maximum bits that a code in the tree can have. -return value is error. -*/ -static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, - size_t numcodes, unsigned maxbitlen) { - unsigned i; - tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - tree->maxbitlen = maxbitlen; - return HuffmanTree_makeFromLengths2(tree); -} - -#ifdef LODEPNG_COMPILE_ENCODER - -/*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", -Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ - -/*chain node for boundary package merge*/ -typedef struct BPMNode { - int weight; /*the sum of all weights in this chain*/ - unsigned index; /*index of this leaf node (called "count" in the paper)*/ - struct BPMNode* tail; /*the next nodes in this chain (null if last)*/ - int in_use; -} BPMNode; - -/*lists of chains*/ -typedef struct BPMLists { - /*memory pool*/ - unsigned memsize; - BPMNode* memory; - unsigned numfree; - unsigned nextfree; - BPMNode** freelist; - /*two heads of lookahead chains per list*/ - unsigned listsize; - BPMNode** chains0; - BPMNode** chains1; -} BPMLists; - -/*creates a new chain node with the given parameters, from the memory in the lists */ -static BPMNode* bpmnode_create(BPMLists* lists, int weight, unsigned index, BPMNode* tail) { - unsigned i; - BPMNode* result; - - /*memory full, so garbage collect*/ - if(lists->nextfree >= lists->numfree) { - /*mark only those that are in use*/ - for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; - for(i = 0; i != lists->listsize; ++i) { - BPMNode* node; - for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; - for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; - } - /*collect those that are free*/ - lists->numfree = 0; - for(i = 0; i != lists->memsize; ++i) { - if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; - } - lists->nextfree = 0; - } - - result = lists->freelist[lists->nextfree++]; - result->weight = weight; - result->index = index; - result->tail = tail; - return result; -} - -/*sort the leaves with stable mergesort*/ -static void bpmnode_sort(BPMNode* leaves, size_t num) { - BPMNode* mem = (BPMNode*)lodepng_malloc(sizeof(*leaves) * num); - size_t width, counter = 0; - for(width = 1; width < num; width *= 2) { - BPMNode* a = (counter & 1) ? mem : leaves; - BPMNode* b = (counter & 1) ? leaves : mem; - size_t p; - for(p = 0; p < num; p += 2 * width) { - size_t q = (p + width > num) ? num : (p + width); - size_t r = (p + 2 * width > num) ? num : (p + 2 * width); - size_t i = p, j = q, k; - for(k = p; k < r; k++) { - if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++]; - else b[k] = a[j++]; - } - } - counter++; - } - if(counter & 1) lodepng_memcpy(leaves, mem, sizeof(*leaves) * num); - lodepng_free(mem); -} - -/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ -static void boundaryPM(BPMLists* lists, BPMNode* leaves, size_t numpresent, int c, int num) { - unsigned lastindex = lists->chains1[c]->index; - - if(c == 0) { - if(lastindex >= numpresent) return; - lists->chains0[c] = lists->chains1[c]; - lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); - } else { - /*sum of the weights of the head nodes of the previous lookahead chains.*/ - int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; - lists->chains0[c] = lists->chains1[c]; - if(lastindex < numpresent && sum > leaves[lastindex].weight) { - lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); - return; - } - lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); - /*in the end we are only interested in the chain of the last list, so no - need to recurse if we're at the last one (this gives measurable speedup)*/ - if(num + 1 < (int)(2 * numpresent - 2)) { - boundaryPM(lists, leaves, numpresent, c - 1, num); - boundaryPM(lists, leaves, numpresent, c - 1, num); - } - } -} - -unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, - size_t numcodes, unsigned maxbitlen) { - unsigned error = 0; - unsigned i; - size_t numpresent = 0; /*number of symbols with non-zero frequency*/ - BPMNode* leaves; /*the symbols, only those with > 0 frequency*/ - - if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ - if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/ - - leaves = (BPMNode*)lodepng_malloc(numcodes * sizeof(*leaves)); - if(!leaves) return 83; /*alloc fail*/ - - for(i = 0; i != numcodes; ++i) { - if(frequencies[i] > 0) { - leaves[numpresent].weight = (int)frequencies[i]; - leaves[numpresent].index = i; - ++numpresent; - } - } - - lodepng_memset(lengths, 0, numcodes * sizeof(*lengths)); - - /*ensure at least two present symbols. There should be at least one symbol - according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To - make these work as well ensure there are at least two symbols. The - Package-Merge code below also doesn't work correctly if there's only one - symbol, it'd give it the theoretical 0 bits but in practice zlib wants 1 bit*/ - if(numpresent == 0) { - lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ - } else if(numpresent == 1) { - lengths[leaves[0].index] = 1; - lengths[leaves[0].index == 0 ? 1 : 0] = 1; - } else { - BPMLists lists; - BPMNode* node; - - bpmnode_sort(leaves, numpresent); - - lists.listsize = maxbitlen; - lists.memsize = 2 * maxbitlen * (maxbitlen + 1); - lists.nextfree = 0; - lists.numfree = lists.memsize; - lists.memory = (BPMNode*)lodepng_malloc(lists.memsize * sizeof(*lists.memory)); - lists.freelist = (BPMNode**)lodepng_malloc(lists.memsize * sizeof(BPMNode*)); - lists.chains0 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); - lists.chains1 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); - if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/ - - if(!error) { - for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i]; - - bpmnode_create(&lists, leaves[0].weight, 1, 0); - bpmnode_create(&lists, leaves[1].weight, 2, 0); - - for(i = 0; i != lists.listsize; ++i) { - lists.chains0[i] = &lists.memory[0]; - lists.chains1[i] = &lists.memory[1]; - } - - /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/ - for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i); - - for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) { - for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index]; - } - } - - lodepng_free(lists.memory); - lodepng_free(lists.freelist); - lodepng_free(lists.chains0); - lodepng_free(lists.chains1); - } - - lodepng_free(leaves); - return error; -} - -/*Create the Huffman tree given the symbol frequencies*/ -static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, - size_t mincodes, size_t numcodes, unsigned maxbitlen) { - unsigned error = 0; - while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ - tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - tree->maxbitlen = maxbitlen; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - - error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); - if(!error) error = HuffmanTree_makeFromLengths2(tree); - return error; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ -static unsigned generateFixedLitLenTree(HuffmanTree* tree) { - unsigned i, error = 0; - unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ - for(i = 0; i <= 143; ++i) bitlen[i] = 8; - for(i = 144; i <= 255; ++i) bitlen[i] = 9; - for(i = 256; i <= 279; ++i) bitlen[i] = 7; - for(i = 280; i <= 287; ++i) bitlen[i] = 8; - - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ -static unsigned generateFixedDistanceTree(HuffmanTree* tree) { - unsigned i, error = 0; - unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*there are 32 distance codes, but 30-31 are unused*/ - for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* -returns the code. The bit reader must already have been ensured at least 15 bits -*/ -static unsigned huffmanDecodeSymbol(LodePNGBitReader* reader, const HuffmanTree* codetree) { - unsigned short code = peekBits(reader, FIRSTBITS); - unsigned short l = codetree->table_len[code]; - unsigned short value = codetree->table_value[code]; - if(l <= FIRSTBITS) { - advanceBits(reader, l); - return value; - } else { - advanceBits(reader, FIRSTBITS); - value += peekBits(reader, l - FIRSTBITS); - advanceBits(reader, codetree->table_len[value] - FIRSTBITS); - return codetree->table_value[value]; - } -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Inflator (Decompressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*get the tree of a deflated block with fixed tree, as specified in the deflate specification -Returns error code.*/ -static unsigned getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) { - unsigned error = generateFixedLitLenTree(tree_ll); - if(error) return error; - return generateFixedDistanceTree(tree_d); -} - -/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ -static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, - LodePNGBitReader* reader) { - /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ - unsigned error = 0; - unsigned n, HLIT, HDIST, HCLEN, i; - - /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ - unsigned* bitlen_ll = 0; /*lit,len code lengths*/ - unsigned* bitlen_d = 0; /*dist code lengths*/ - /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ - unsigned* bitlen_cl = 0; - HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ - - if(reader->bitsize - reader->bp < 14) return 49; /*error: the bit pointer is or will go past the memory*/ - ensureBits17(reader, 14); - - /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ - HLIT = readBits(reader, 5) + 257; - /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ - HDIST = readBits(reader, 5) + 1; - /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ - HCLEN = readBits(reader, 4) + 4; - - bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); - if(!bitlen_cl) return 83 /*alloc fail*/; - - HuffmanTree_init(&tree_cl); - - while(!error) { - /*read the code length codes out of 3 * (amount of code length codes) bits*/ - if(lodepng_gtofl(reader->bp, HCLEN * 3, reader->bitsize)) { - ERROR_BREAK(50); /*error: the bit pointer is or will go past the memory*/ - } - for(i = 0; i != HCLEN; ++i) { - ensureBits9(reader, 3); /*out of bounds already checked above */ - bitlen_cl[CLCL_ORDER[i]] = readBits(reader, 3); - } - for(i = HCLEN; i != NUM_CODE_LENGTH_CODES; ++i) { - bitlen_cl[CLCL_ORDER[i]] = 0; - } - - error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); - if(error) break; - - /*now we can use this tree to read the lengths for the tree that this function will return*/ - bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); - lodepng_memset(bitlen_ll, 0, NUM_DEFLATE_CODE_SYMBOLS * sizeof(*bitlen_ll)); - lodepng_memset(bitlen_d, 0, NUM_DISTANCE_SYMBOLS * sizeof(*bitlen_d)); - - /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ - i = 0; - while(i < HLIT + HDIST) { - unsigned code; - ensureBits25(reader, 22); /* up to 15 bits for huffman code, up to 7 extra bits below*/ - code = huffmanDecodeSymbol(reader, &tree_cl); - if(code <= 15) /*a length code*/ { - if(i < HLIT) bitlen_ll[i] = code; - else bitlen_d[i - HLIT] = code; - ++i; - } else if(code == 16) /*repeat previous*/ { - unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ - unsigned value; /*set value to the previous code*/ - - if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ - - replength += readBits(reader, 2); - - if(i < HLIT + 1) value = bitlen_ll[i - 1]; - else value = bitlen_d[i - HLIT - 1]; - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; ++n) { - if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ - if(i < HLIT) bitlen_ll[i] = value; - else bitlen_d[i - HLIT] = value; - ++i; - } - } else if(code == 17) /*repeat "0" 3-10 times*/ { - unsigned replength = 3; /*read in the bits that indicate repeat length*/ - replength += readBits(reader, 3); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; ++n) { - if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - ++i; - } - } else if(code == 18) /*repeat "0" 11-138 times*/ { - unsigned replength = 11; /*read in the bits that indicate repeat length*/ - replength += readBits(reader, 7); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; ++n) { - if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - ++i; - } - } else /*if(code == INVALIDSYMBOL)*/ { - ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ - } - /*check if any of the ensureBits above went out of bounds*/ - if(reader->bp > reader->bitsize) { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ - ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - } - } - if(error) break; - - if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ - - /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ - error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); - if(error) break; - error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); - - break; /*end of error-while*/ - } - - lodepng_free(bitlen_cl); - lodepng_free(bitlen_ll); - lodepng_free(bitlen_d); - HuffmanTree_cleanup(&tree_cl); - - return error; -} - -/*inflate a block with dynamic of fixed Huffman tree. btype must be 1 or 2.*/ -static unsigned inflateHuffmanBlock(ucvector* out, LodePNGBitReader* reader, - unsigned btype, size_t max_output_size) { - unsigned error = 0; - HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ - HuffmanTree tree_d; /*the huffman tree for distance codes*/ - const size_t reserved_size = 260; /* must be at least 258 for max length, and a few extra for adding a few extra literals */ - int done = 0; - - if(!ucvector_reserve(out, out->size + reserved_size)) return 83; /*alloc fail*/ - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - if(btype == 1) error = getTreeInflateFixed(&tree_ll, &tree_d); - else /*if(btype == 2)*/ error = getTreeInflateDynamic(&tree_ll, &tree_d, reader); - - - while(!error && !done) /*decode all symbols until end reached, breaks at end code*/ { - /*code_ll is literal, length or end code*/ - unsigned code_ll; - /* ensure enough bits for 2 huffman code reads (15 bits each): if the first is a literal, a second literal is read at once. This - appears to be slightly faster, than ensuring 20 bits here for 1 huffman symbol and the potential 5 extra bits for the length symbol.*/ - ensureBits32(reader, 30); - code_ll = huffmanDecodeSymbol(reader, &tree_ll); - if(code_ll <= 255) { - /*slightly faster code path if multiple literals in a row*/ - out->data[out->size++] = (unsigned char)code_ll; - code_ll = huffmanDecodeSymbol(reader, &tree_ll); - } - if(code_ll <= 255) /*literal symbol*/ { - out->data[out->size++] = (unsigned char)code_ll; - } else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ { - unsigned code_d, distance; - unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ - size_t start, backward, length; - - /*part 1: get length base*/ - length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; - - /*part 2: get extra bits and add the value of that to length*/ - numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; - if(numextrabits_l != 0) { - /* bits already ensured above */ - ensureBits25(reader, 5); - length += readBits(reader, numextrabits_l); - } - - /*part 3: get distance code*/ - ensureBits32(reader, 28); /* up to 15 for the huffman symbol, up to 13 for the extra bits */ - code_d = huffmanDecodeSymbol(reader, &tree_d); - if(code_d > 29) { - if(code_d <= 31) { - ERROR_BREAK(18); /*error: invalid distance code (30-31 are never used)*/ - } else /* if(code_d == INVALIDSYMBOL) */{ - ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ - } - } - distance = DISTANCEBASE[code_d]; - - /*part 4: get extra bits from distance*/ - numextrabits_d = DISTANCEEXTRA[code_d]; - if(numextrabits_d != 0) { - /* bits already ensured above */ - distance += readBits(reader, numextrabits_d); - } - - /*part 5: fill in all the out[n] values based on the length and dist*/ - start = out->size; - if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ - backward = start - distance; - - out->size += length; - if(distance < length) { - size_t forward; - lodepng_memcpy(out->data + start, out->data + backward, distance); - start += distance; - for(forward = distance; forward < length; ++forward) { - out->data[start++] = out->data[backward++]; - } - } else { - lodepng_memcpy(out->data + start, out->data + backward, length); - } - } else if(code_ll == 256) { - done = 1; /*end code, finish the loop*/ - } else /*if(code_ll == INVALIDSYMBOL)*/ { - ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ - } - if(out->allocsize - out->size < reserved_size) { - if(!ucvector_reserve(out, out->size + reserved_size)) ERROR_BREAK(83); /*alloc fail*/ - } - /*check if any of the ensureBits above went out of bounds*/ - if(reader->bp > reader->bitsize) { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ - ERROR_BREAK(51); /*error, bit pointer jumps past memory*/ - } - if(max_output_size && out->size > max_output_size) { - ERROR_BREAK(109); /*error, larger than max size*/ - } - } - - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned inflateNoCompression(ucvector* out, LodePNGBitReader* reader, - const LodePNGDecompressSettings* settings) { - size_t bytepos; - size_t size = reader->size; - unsigned LEN, NLEN, error = 0; - - /*go to first boundary of byte*/ - bytepos = (reader->bp + 7u) >> 3u; - - /*read LEN (2 bytes) and NLEN (2 bytes)*/ - if(bytepos + 4 >= size) return 52; /*error, bit pointer will jump past memory*/ - LEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2; - NLEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2; - - /*check if 16-bit NLEN is really the one's complement of LEN*/ - if(!settings->ignore_nlen && LEN + NLEN != 65535) { - return 21; /*error: NLEN is not one's complement of LEN*/ - } - - if(!ucvector_resize(out, out->size + LEN)) return 83; /*alloc fail*/ - - /*read the literal data: LEN bytes are now stored in the out buffer*/ - if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/ - - /*out->data can be NULL (when LEN is zero), and arithmetics on NULL ptr is undefined*/ - if (LEN) { - lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN); - bytepos += LEN; - } - - reader->bp = bytepos << 3u; - - return error; -} - -static unsigned lodepng_inflatev(ucvector* out, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) { - unsigned BFINAL = 0; - LodePNGBitReader reader; - unsigned error = LodePNGBitReader_init(&reader, in, insize); - - if(error) return error; - - while(!BFINAL) { - unsigned BTYPE; - if(reader.bitsize - reader.bp < 3) return 52; /*error, bit pointer will jump past memory*/ - ensureBits9(&reader, 3); - BFINAL = readBits(&reader, 1); - BTYPE = readBits(&reader, 2); - - if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ - else if(BTYPE == 0) error = inflateNoCompression(out, &reader, settings); /*no compression*/ - else error = inflateHuffmanBlock(out, &reader, BTYPE, settings->max_output_size); /*compression, BTYPE 01 or 10*/ - if(!error && settings->max_output_size && out->size > settings->max_output_size) error = 109; - if(error) break; - } - - return error; -} - -unsigned lodepng_inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) { - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_inflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned inflatev(ucvector* out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) { - if(settings->custom_inflate) { - unsigned error = settings->custom_inflate(&out->data, &out->size, in, insize, settings); - out->allocsize = out->size; - if(error) { - /*the custom inflate is allowed to have its own error codes, however, we translate it to code 110*/ - error = 110; - /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ - if(settings->max_output_size && out->size > settings->max_output_size) error = 109; - } - return error; - } else { - return lodepng_inflatev(out, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflator (Compressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; - -/*search the index in the array, that has the largest value smaller than or equal to the given value, -given array must be sorted (if no value is smaller, it returns the size of the given array)*/ -static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) { - /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/ - size_t left = 1; - size_t right = array_size - 1; - - while(left <= right) { - size_t mid = (left + right) >> 1; - if(array[mid] >= value) right = mid - 1; - else left = mid + 1; - } - if(left >= array_size || array[left] > value) left--; - return left; -} - -static void addLengthDistance(uivector* values, size_t length, size_t distance) { - /*values in encoded vector are those used by deflate: - 0-255: literal bytes - 256: end - 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) - 286-287: invalid*/ - - unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); - unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); - unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); - unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); - - size_t pos = values->size; - /*TODO: return error when this fails (out of memory)*/ - unsigned ok = uivector_resize(values, values->size + 4); - if(ok) { - values->data[pos + 0] = length_code + FIRST_LENGTH_CODE_INDEX; - values->data[pos + 1] = extra_length; - values->data[pos + 2] = dist_code; - values->data[pos + 3] = extra_distance; - } -} - -/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 -bytes as input because 3 is the minimum match length for deflate*/ -static const unsigned HASH_NUM_VALUES = 65536; -static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ - -typedef struct Hash { - int* head; /*hash value to head circular pos - can be outdated if went around window*/ - /*circular pos to prev circular pos*/ - unsigned short* chain; - int* val; /*circular pos to hash value*/ - - /*TODO: do this not only for zeros but for any repeated byte. However for PNG - it's always going to be the zeros that dominate, so not important for PNG*/ - int* headz; /*similar to head, but for chainz*/ - unsigned short* chainz; /*those with same amount of zeros*/ - unsigned short* zeros; /*length of zeros streak, used as a second hash chain*/ -} Hash; - -static unsigned hash_init(Hash* hash, unsigned windowsize) { - unsigned i; - hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); - hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); - hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - - hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - hash->headz = (int*)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); - hash->chainz = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - - if(!hash->head || !hash->chain || !hash->val || !hash->headz|| !hash->chainz || !hash->zeros) { - return 83; /*alloc fail*/ - } - - /*initialize hash table*/ - for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; - for(i = 0; i != windowsize; ++i) hash->val[i] = -1; - for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ - - for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; - for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ - - return 0; -} - -static void hash_cleanup(Hash* hash) { - lodepng_free(hash->head); - lodepng_free(hash->val); - lodepng_free(hash->chain); - - lodepng_free(hash->zeros); - lodepng_free(hash->headz); - lodepng_free(hash->chainz); -} - - - -static unsigned getHash(const unsigned char* data, size_t size, size_t pos) { - unsigned result = 0; - if(pos + 2 < size) { - /*A simple shift and xor hash is used. Since the data of PNGs is dominated - by zeroes due to the filters, a better hash does not have a significant - effect on speed in traversing the chain, and causes more time spend on - calculating the hash.*/ - result ^= ((unsigned)data[pos + 0] << 0u); - result ^= ((unsigned)data[pos + 1] << 4u); - result ^= ((unsigned)data[pos + 2] << 8u); - } else { - size_t amount, i; - if(pos >= size) return 0; - amount = size - pos; - for(i = 0; i != amount; ++i) result ^= ((unsigned)data[pos + i] << (i * 8u)); - } - return result & HASH_BIT_MASK; -} - -static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) { - const unsigned char* start = data + pos; - const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; - if(end > data + size) end = data + size; - data = start; - while(data != end && *data == 0) ++data; - /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ - return (unsigned)(data - start); -} - -/*wpos = pos & (windowsize - 1)*/ -static void updateHashChain(Hash* hash, size_t wpos, unsigned hashval, unsigned short numzeros) { - hash->val[wpos] = (int)hashval; - if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; - hash->head[hashval] = (int)wpos; - - hash->zeros[wpos] = numzeros; - if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; - hash->headz[numzeros] = (int)wpos; -} - -/* -LZ77-encode the data. Return value is error code. The input are raw bytes, the output -is in the form of unsigned integers with codes representing for example literal bytes, or -length/distance pairs. -It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a -sliding window (of windowsize) is used, and all past bytes in that window can be used as -the "dictionary". A brute force search through all possible distances would be slow, and -this hash technique is one out of several ways to speed this up. -*/ -static unsigned encodeLZ77(uivector* out, Hash* hash, - const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, - unsigned minmatch, unsigned nicematch, unsigned lazymatching) { - size_t pos; - unsigned i, error = 0; - /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ - unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8u; - unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; - - unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ - unsigned numzeros = 0; - - unsigned offset; /*the offset represents the distance in LZ77 terminology*/ - unsigned length; - unsigned lazy = 0; - unsigned lazylength = 0, lazyoffset = 0; - unsigned hashval; - unsigned current_offset, current_length; - unsigned prev_offset; - const unsigned char *lastptr, *foreptr, *backptr; - unsigned hashpos; - - if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ - if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ - - if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; - - for(pos = inpos; pos < insize; ++pos) { - size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ - unsigned chainlength = 0; - - hashval = getHash(in, insize, pos); - - if(usezeros && hashval == 0) { - if(numzeros == 0) numzeros = countZeros(in, insize, pos); - else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; - } else { - numzeros = 0; - } - - updateHashChain(hash, wpos, hashval, numzeros); - - /*the length and offset found for the current position*/ - length = 0; - offset = 0; - - hashpos = hash->chain[wpos]; - - lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; - - /*search for the longest string*/ - prev_offset = 0; - for(;;) { - if(chainlength++ >= maxchainlength) break; - current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize); - - if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ - prev_offset = current_offset; - if(current_offset > 0) { - /*test the next characters*/ - foreptr = &in[pos]; - backptr = &in[pos - current_offset]; - - /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ - if(numzeros >= 3) { - unsigned skip = hash->zeros[hashpos]; - if(skip > numzeros) skip = numzeros; - backptr += skip; - foreptr += skip; - } - - while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ { - ++backptr; - ++foreptr; - } - current_length = (unsigned)(foreptr - &in[pos]); - - if(current_length > length) { - length = current_length; /*the longest length*/ - offset = current_offset; /*the offset that is related to this longest length*/ - /*jump out once a length of max length is found (speed gain). This also jumps - out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ - if(current_length >= nicematch) break; - } - } - - if(hashpos == hash->chain[hashpos]) break; - - if(numzeros >= 3 && length > numzeros) { - hashpos = hash->chainz[hashpos]; - if(hash->zeros[hashpos] != numzeros) break; - } else { - hashpos = hash->chain[hashpos]; - /*outdated hash value, happens if particular value was not encountered in whole last window*/ - if(hash->val[hashpos] != (int)hashval) break; - } - } - - if(lazymatching) { - if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) { - lazy = 1; - lazylength = length; - lazyoffset = offset; - continue; /*try the next byte*/ - } - if(lazy) { - lazy = 0; - if(pos == 0) ERROR_BREAK(81); - if(length > lazylength + 1) { - /*push the previous character as literal*/ - if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); - } else { - length = lazylength; - offset = lazyoffset; - hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ - hash->headz[numzeros] = -1; /*idem*/ - --pos; - } - } - } - if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); - - /*encode it as length/distance pair or literal value*/ - if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ { - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } else if(length < minmatch || (length == 3 && offset > 4096)) { - /*compensate for the fact that longer offsets have more extra bits, a - length of only 3 may be not worth it then*/ - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } else { - addLengthDistance(out, length, offset); - for(i = 1; i < length; ++i) { - ++pos; - wpos = pos & (windowsize - 1); - hashval = getHash(in, insize, pos); - if(usezeros && hashval == 0) { - if(numzeros == 0) numzeros = countZeros(in, insize, pos); - else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; - } else { - numzeros = 0; - } - updateHashChain(hash, wpos, hashval, numzeros); - } - } - } /*end of the loop through each character of input*/ - - return error; -} - -/* /////////////////////////////////////////////////////////////////////////// */ - -static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) { - /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, - 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ - - size_t i, numdeflateblocks = (datasize + 65534u) / 65535u; - unsigned datapos = 0; - for(i = 0; i != numdeflateblocks; ++i) { - unsigned BFINAL, BTYPE, LEN, NLEN; - unsigned char firstbyte; - size_t pos = out->size; - - BFINAL = (i == numdeflateblocks - 1); - BTYPE = 0; - - LEN = 65535; - if(datasize - datapos < 65535u) LEN = (unsigned)datasize - datapos; - NLEN = 65535 - LEN; - - if(!ucvector_resize(out, out->size + LEN + 5)) return 83; /*alloc fail*/ - - firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1u) << 1u) + ((BTYPE & 2u) << 1u)); - out->data[pos + 0] = firstbyte; - out->data[pos + 1] = (unsigned char)(LEN & 255); - out->data[pos + 2] = (unsigned char)(LEN >> 8u); - out->data[pos + 3] = (unsigned char)(NLEN & 255); - out->data[pos + 4] = (unsigned char)(NLEN >> 8u); - lodepng_memcpy(out->data + pos + 5, data + datapos, LEN); - datapos += LEN; - } - - return 0; -} - -/* -write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. -tree_ll: the tree for lit and len codes. -tree_d: the tree for distance codes. -*/ -static void writeLZ77data(LodePNGBitWriter* writer, const uivector* lz77_encoded, - const HuffmanTree* tree_ll, const HuffmanTree* tree_d) { - size_t i = 0; - for(i = 0; i != lz77_encoded->size; ++i) { - unsigned val = lz77_encoded->data[i]; - writeBitsReversed(writer, tree_ll->codes[val], tree_ll->lengths[val]); - if(val > 256) /*for a length code, 3 more things have to be added*/ { - unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; - unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; - unsigned length_extra_bits = lz77_encoded->data[++i]; - - unsigned distance_code = lz77_encoded->data[++i]; - - unsigned distance_index = distance_code; - unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; - unsigned distance_extra_bits = lz77_encoded->data[++i]; - - writeBits(writer, length_extra_bits, n_length_extra_bits); - writeBitsReversed(writer, tree_d->codes[distance_code], tree_d->lengths[distance_code]); - writeBits(writer, distance_extra_bits, n_distance_extra_bits); - } - } -} - -/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ -static unsigned deflateDynamic(LodePNGBitWriter* writer, Hash* hash, - const unsigned char* data, size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, unsigned final) { - unsigned error = 0; - - /* - A block is compressed as follows: The PNG data is lz77 encoded, resulting in - literal bytes and length/distance pairs. This is then huffman compressed with - two huffman trees. One huffman tree is used for the lit and len values ("ll"), - another huffman tree is used for the dist values ("d"). These two trees are - stored using their code lengths, and to compress even more these code lengths - are also run-length encoded and huffman compressed. This gives a huffman tree - of code lengths "cl". The code lengths used to describe this third tree are - the code length code lengths ("clcl"). - */ - - /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ - uivector lz77_encoded; - HuffmanTree tree_ll; /*tree for lit,len values*/ - HuffmanTree tree_d; /*tree for distance codes*/ - HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ - unsigned* frequencies_ll = 0; /*frequency of lit,len codes*/ - unsigned* frequencies_d = 0; /*frequency of dist codes*/ - unsigned* frequencies_cl = 0; /*frequency of code length codes*/ - unsigned* bitlen_lld = 0; /*lit,len,dist code lengths (int bits), literally (without repeat codes).*/ - unsigned* bitlen_lld_e = 0; /*bitlen_lld encoded with repeat codes (this is a rudimentary run length compression)*/ - size_t datasize = dataend - datapos; - - /* - If we could call "bitlen_cl" the the code length code lengths ("clcl"), that is the bit lengths of codes to represent - tree_cl in CLCL_ORDER, then due to the huffman compression of huffman tree representations ("two levels"), there are - some analogies: - bitlen_lld is to tree_cl what data is to tree_ll and tree_d. - bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. - bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. - */ - - unsigned BFINAL = final; - size_t i; - size_t numcodes_ll, numcodes_d, numcodes_lld, numcodes_lld_e, numcodes_cl; - unsigned HLIT, HDIST, HCLEN; - - uivector_init(&lz77_encoded); - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - HuffmanTree_init(&tree_cl); - /* could fit on stack, but >1KB is on the larger side so allocate instead */ - frequencies_ll = (unsigned*)lodepng_malloc(286 * sizeof(*frequencies_ll)); - frequencies_d = (unsigned*)lodepng_malloc(30 * sizeof(*frequencies_d)); - frequencies_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); - - if(!frequencies_ll || !frequencies_d || !frequencies_cl) error = 83; /*alloc fail*/ - - /*This while loop never loops due to a break at the end, it is here to - allow breaking out of it to the cleanup phase on error conditions.*/ - while(!error) { - lodepng_memset(frequencies_ll, 0, 286 * sizeof(*frequencies_ll)); - lodepng_memset(frequencies_d, 0, 30 * sizeof(*frequencies_d)); - lodepng_memset(frequencies_cl, 0, NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); - - if(settings->use_lz77) { - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(error) break; - } else { - if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); - for(i = datapos; i < dataend; ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/ - } - - /*Count the frequencies of lit, len and dist codes*/ - for(i = 0; i != lz77_encoded.size; ++i) { - unsigned symbol = lz77_encoded.data[i]; - ++frequencies_ll[symbol]; - if(symbol > 256) { - unsigned dist = lz77_encoded.data[i + 2]; - ++frequencies_d[dist]; - i += 3; - } - } - frequencies_ll[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ - - /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ - error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll, 257, 286, 15); - if(error) break; - /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ - error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d, 2, 30, 15); - if(error) break; - - numcodes_ll = LODEPNG_MIN(tree_ll.numcodes, 286); - numcodes_d = LODEPNG_MIN(tree_d.numcodes, 30); - /*store the code lengths of both generated trees in bitlen_lld*/ - numcodes_lld = numcodes_ll + numcodes_d; - bitlen_lld = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld)); - /*numcodes_lld_e never needs more size than bitlen_lld*/ - bitlen_lld_e = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld_e)); - if(!bitlen_lld || !bitlen_lld_e) ERROR_BREAK(83); /*alloc fail*/ - numcodes_lld_e = 0; - - for(i = 0; i != numcodes_ll; ++i) bitlen_lld[i] = tree_ll.lengths[i]; - for(i = 0; i != numcodes_d; ++i) bitlen_lld[numcodes_ll + i] = tree_d.lengths[i]; - - /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), - 17 (3-10 zeroes), 18 (11-138 zeroes)*/ - for(i = 0; i != numcodes_lld; ++i) { - unsigned j = 0; /*amount of repetitions*/ - while(i + j + 1 < numcodes_lld && bitlen_lld[i + j + 1] == bitlen_lld[i]) ++j; - - if(bitlen_lld[i] == 0 && j >= 2) /*repeat code for zeroes*/ { - ++j; /*include the first zero*/ - if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ { - bitlen_lld_e[numcodes_lld_e++] = 17; - bitlen_lld_e[numcodes_lld_e++] = j - 3; - } else /*repeat code 18 supports max 138 zeroes*/ { - if(j > 138) j = 138; - bitlen_lld_e[numcodes_lld_e++] = 18; - bitlen_lld_e[numcodes_lld_e++] = j - 11; - } - i += (j - 1); - } else if(j >= 3) /*repeat code for value other than zero*/ { - size_t k; - unsigned num = j / 6u, rest = j % 6u; - bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; - for(k = 0; k < num; ++k) { - bitlen_lld_e[numcodes_lld_e++] = 16; - bitlen_lld_e[numcodes_lld_e++] = 6 - 3; - } - if(rest >= 3) { - bitlen_lld_e[numcodes_lld_e++] = 16; - bitlen_lld_e[numcodes_lld_e++] = rest - 3; - } - else j -= rest; - i += j; - } else /*too short to benefit from repeat code*/ { - bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; - } - } - - /*generate tree_cl, the huffmantree of huffmantrees*/ - for(i = 0; i != numcodes_lld_e; ++i) { - ++frequencies_cl[bitlen_lld_e[i]]; - /*after a repeat code come the bits that specify the number of repetitions, - those don't need to be in the frequencies_cl calculation*/ - if(bitlen_lld_e[i] >= 16) ++i; - } - - error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl, - NUM_CODE_LENGTH_CODES, NUM_CODE_LENGTH_CODES, 7); - if(error) break; - - /*compute amount of code-length-code-lengths to output*/ - numcodes_cl = NUM_CODE_LENGTH_CODES; - /*trim zeros at the end (using CLCL_ORDER), but minimum size must be 4 (see HCLEN below)*/ - while(numcodes_cl > 4u && tree_cl.lengths[CLCL_ORDER[numcodes_cl - 1u]] == 0) { - numcodes_cl--; - } - - /* - Write everything into the output - - After the BFINAL and BTYPE, the dynamic block consists out of the following: - - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN - - (HCLEN+4)*3 bits code lengths of code length alphabet - - HLIT + 257 code lengths of lit/length alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - HDIST + 1 code lengths of distance alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - compressed data - - 256 (end code) - */ - - /*Write block type*/ - writeBits(writer, BFINAL, 1); - writeBits(writer, 0, 1); /*first bit of BTYPE "dynamic"*/ - writeBits(writer, 1, 1); /*second bit of BTYPE "dynamic"*/ - - /*write the HLIT, HDIST and HCLEN values*/ - /*all three sizes take trimmed ending zeroes into account, done either by HuffmanTree_makeFromFrequencies - or in the loop for numcodes_cl above, which saves space. */ - HLIT = (unsigned)(numcodes_ll - 257); - HDIST = (unsigned)(numcodes_d - 1); - HCLEN = (unsigned)(numcodes_cl - 4); - writeBits(writer, HLIT, 5); - writeBits(writer, HDIST, 5); - writeBits(writer, HCLEN, 4); - - /*write the code lengths of the code length alphabet ("bitlen_cl")*/ - for(i = 0; i != numcodes_cl; ++i) writeBits(writer, tree_cl.lengths[CLCL_ORDER[i]], 3); - - /*write the lengths of the lit/len AND the dist alphabet*/ - for(i = 0; i != numcodes_lld_e; ++i) { - writeBitsReversed(writer, tree_cl.codes[bitlen_lld_e[i]], tree_cl.lengths[bitlen_lld_e[i]]); - /*extra bits of repeat codes*/ - if(bitlen_lld_e[i] == 16) writeBits(writer, bitlen_lld_e[++i], 2); - else if(bitlen_lld_e[i] == 17) writeBits(writer, bitlen_lld_e[++i], 3); - else if(bitlen_lld_e[i] == 18) writeBits(writer, bitlen_lld_e[++i], 7); - } - - /*write the compressed data symbols*/ - writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); - /*error: the length of the end code 256 must be larger than 0*/ - if(tree_ll.lengths[256] == 0) ERROR_BREAK(64); - - /*write the end code*/ - writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]); - - break; /*end of error-while*/ - } - - /*cleanup*/ - uivector_cleanup(&lz77_encoded); - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - HuffmanTree_cleanup(&tree_cl); - lodepng_free(frequencies_ll); - lodepng_free(frequencies_d); - lodepng_free(frequencies_cl); - lodepng_free(bitlen_lld); - lodepng_free(bitlen_lld_e); - - return error; -} - -static unsigned deflateFixed(LodePNGBitWriter* writer, Hash* hash, - const unsigned char* data, - size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, unsigned final) { - HuffmanTree tree_ll; /*tree for literal values and length codes*/ - HuffmanTree tree_d; /*tree for distance codes*/ - - unsigned BFINAL = final; - unsigned error = 0; - size_t i; - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - error = generateFixedLitLenTree(&tree_ll); - if(!error) error = generateFixedDistanceTree(&tree_d); - - if(!error) { - writeBits(writer, BFINAL, 1); - writeBits(writer, 1, 1); /*first bit of BTYPE*/ - writeBits(writer, 0, 1); /*second bit of BTYPE*/ - - if(settings->use_lz77) /*LZ77 encoded*/ { - uivector lz77_encoded; - uivector_init(&lz77_encoded); - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(!error) writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); - uivector_cleanup(&lz77_encoded); - } else /*no LZ77, but still will be Huffman compressed*/ { - for(i = datapos; i < dataend; ++i) { - writeBitsReversed(writer, tree_ll.codes[data[i]], tree_ll.lengths[data[i]]); - } - } - /*add END code*/ - if(!error) writeBitsReversed(writer,tree_ll.codes[256], tree_ll.lengths[256]); - } - - /*cleanup*/ - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) { - unsigned error = 0; - size_t i, blocksize, numdeflateblocks; - Hash hash; - LodePNGBitWriter writer; - - LodePNGBitWriter_init(&writer, out); - - if(settings->btype > 2) return 61; - else if(settings->btype == 0) return deflateNoCompression(out, in, insize); - else if(settings->btype == 1) blocksize = insize; - else /*if(settings->btype == 2)*/ { - /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/ - blocksize = insize / 8u + 8; - if(blocksize < 65536) blocksize = 65536; - if(blocksize > 262144) blocksize = 262144; - } - - numdeflateblocks = (insize + blocksize - 1) / blocksize; - if(numdeflateblocks == 0) numdeflateblocks = 1; - - error = hash_init(&hash, settings->windowsize); - - if(!error) { - for(i = 0; i != numdeflateblocks && !error; ++i) { - unsigned final = (i == numdeflateblocks - 1); - size_t start = i * blocksize; - size_t end = start + blocksize; - if(end > insize) end = insize; - - if(settings->btype == 1) error = deflateFixed(&writer, &hash, in, start, end, settings, final); - else if(settings->btype == 2) error = deflateDynamic(&writer, &hash, in, start, end, settings, final); - } - } - - hash_cleanup(&hash); - - return error; -} - -unsigned lodepng_deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) { - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_deflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) { - if(settings->custom_deflate) { - unsigned error = settings->custom_deflate(out, outsize, in, insize, settings); - /*the custom deflate is allowed to have its own error codes, however, we translate it to code 111*/ - return error ? 111 : 0; - } else { - return lodepng_deflate(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Adler32 / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) { - unsigned s1 = adler & 0xffffu; - unsigned s2 = (adler >> 16u) & 0xffffu; - - while(len != 0u) { - unsigned i; - /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/ - unsigned amount = len > 5552u ? 5552u : len; - len -= amount; - for(i = 0; i != amount; ++i) { - s1 += (*data++); - s2 += s1; - } - s1 %= 65521u; - s2 %= 65521u; - } - - return (s2 << 16u) | s1; -} - -/*Return the adler32 of the bytes data[0..len-1]*/ -static unsigned adler32(const unsigned char* data, unsigned len) { - return update_adler32(1u, data, len); -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Zlib / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DECODER - -static unsigned lodepng_zlib_decompressv(ucvector* out, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) { - unsigned error = 0; - unsigned CM, CINFO, FDICT; - - if(insize < 2) return 53; /*error, size of zlib data too small*/ - /*read information from zlib header*/ - if((in[0] * 256 + in[1]) % 31 != 0) { - /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ - return 24; - } - - CM = in[0] & 15; - CINFO = (in[0] >> 4) & 15; - /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ - FDICT = (in[1] >> 5) & 1; - /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ - - if(CM != 8 || CINFO > 7) { - /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ - return 25; - } - if(FDICT != 0) { - /*error: the specification of PNG says about the zlib stream: - "The additional flags shall not specify a preset dictionary."*/ - return 26; - } - - error = inflatev(out, in + 2, insize - 2, settings); - if(error) return error; - - if(!settings->ignore_adler32) { - unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); - unsigned checksum = adler32(out->data, (unsigned)(out->size)); - if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ - } - - return 0; /*no error*/ -} - - -unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGDecompressSettings* settings) { - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_zlib_decompressv(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -/*expected_size is expected output size, to avoid intermediate allocations. Set to 0 if not known. */ -static unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size, - const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { - unsigned error; - if(settings->custom_zlib) { - error = settings->custom_zlib(out, outsize, in, insize, settings); - if(error) { - /*the custom zlib is allowed to have its own error codes, however, we translate it to code 110*/ - error = 110; - /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ - if(settings->max_output_size && *outsize > settings->max_output_size) error = 109; - } - } else { - ucvector v = ucvector_init(*out, *outsize); - if(expected_size) { - /*reserve the memory to avoid intermediate reallocations*/ - ucvector_resize(&v, *outsize + expected_size); - v.size = *outsize; - } - error = lodepng_zlib_decompressv(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - } - return error; -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) { - size_t i; - unsigned error; - unsigned char* deflatedata = 0; - size_t deflatesize = 0; - - error = deflate(&deflatedata, &deflatesize, in, insize, settings); - - *out = NULL; - *outsize = 0; - if(!error) { - *outsize = deflatesize + 6; - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!*out) error = 83; /*alloc fail*/ - } - - if(!error) { - unsigned ADLER32 = adler32(in, (unsigned)insize); - /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ - unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ - unsigned FLEVEL = 0; - unsigned FDICT = 0; - unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; - unsigned FCHECK = 31 - CMFFLG % 31; - CMFFLG += FCHECK; - - (*out)[0] = (unsigned char)(CMFFLG >> 8); - (*out)[1] = (unsigned char)(CMFFLG & 255); - for(i = 0; i != deflatesize; ++i) (*out)[i + 2] = deflatedata[i]; - lodepng_set32bitInt(&(*out)[*outsize - 4], ADLER32); - } - - lodepng_free(deflatedata); - return error; -} - -/* compress using the default or custom zlib function */ -static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) { - if(settings->custom_zlib) { - unsigned error = settings->custom_zlib(out, outsize, in, insize, settings); - /*the custom zlib is allowed to have its own error codes, however, we translate it to code 111*/ - return error ? 111 : 0; - } else { - return lodepng_zlib_compress(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#else /*no LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DECODER -static unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size, - const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { - if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ - (void)expected_size; - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER -static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) { - if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/*this is a good tradeoff between speed and compression ratio*/ -#define DEFAULT_WINDOWSIZE 2048 - -void lodepng_compress_settings_init(LodePNGCompressSettings* settings) { - /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ - settings->btype = 2; - settings->use_lz77 = 1; - settings->windowsize = DEFAULT_WINDOWSIZE; - settings->minmatch = 3; - settings->nicematch = 128; - settings->lazymatching = 1; - - settings->custom_zlib = 0; - settings->custom_deflate = 0; - settings->custom_context = 0; -} - -const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; - - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) { - settings->ignore_adler32 = 0; - settings->ignore_nlen = 0; - settings->max_output_size = 0; - - settings->custom_zlib = 0; - settings->custom_inflate = 0; - settings->custom_context = 0; -} - -const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0, 0, 0}; - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of Zlib related code. Begin of PNG related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / CRC32 / */ -/* ////////////////////////////////////////////////////////////////////////// */ - - -#ifdef LODEPNG_COMPILE_CRC - -static const unsigned lodepng_crc32_table0[256] = { - 0x00000000u, 0x77073096u, 0xee0e612cu, 0x990951bau, 0x076dc419u, 0x706af48fu, 0xe963a535u, 0x9e6495a3u, - 0x0edb8832u, 0x79dcb8a4u, 0xe0d5e91eu, 0x97d2d988u, 0x09b64c2bu, 0x7eb17cbdu, 0xe7b82d07u, 0x90bf1d91u, - 0x1db71064u, 0x6ab020f2u, 0xf3b97148u, 0x84be41deu, 0x1adad47du, 0x6ddde4ebu, 0xf4d4b551u, 0x83d385c7u, - 0x136c9856u, 0x646ba8c0u, 0xfd62f97au, 0x8a65c9ecu, 0x14015c4fu, 0x63066cd9u, 0xfa0f3d63u, 0x8d080df5u, - 0x3b6e20c8u, 0x4c69105eu, 0xd56041e4u, 0xa2677172u, 0x3c03e4d1u, 0x4b04d447u, 0xd20d85fdu, 0xa50ab56bu, - 0x35b5a8fau, 0x42b2986cu, 0xdbbbc9d6u, 0xacbcf940u, 0x32d86ce3u, 0x45df5c75u, 0xdcd60dcfu, 0xabd13d59u, - 0x26d930acu, 0x51de003au, 0xc8d75180u, 0xbfd06116u, 0x21b4f4b5u, 0x56b3c423u, 0xcfba9599u, 0xb8bda50fu, - 0x2802b89eu, 0x5f058808u, 0xc60cd9b2u, 0xb10be924u, 0x2f6f7c87u, 0x58684c11u, 0xc1611dabu, 0xb6662d3du, - 0x76dc4190u, 0x01db7106u, 0x98d220bcu, 0xefd5102au, 0x71b18589u, 0x06b6b51fu, 0x9fbfe4a5u, 0xe8b8d433u, - 0x7807c9a2u, 0x0f00f934u, 0x9609a88eu, 0xe10e9818u, 0x7f6a0dbbu, 0x086d3d2du, 0x91646c97u, 0xe6635c01u, - 0x6b6b51f4u, 0x1c6c6162u, 0x856530d8u, 0xf262004eu, 0x6c0695edu, 0x1b01a57bu, 0x8208f4c1u, 0xf50fc457u, - 0x65b0d9c6u, 0x12b7e950u, 0x8bbeb8eau, 0xfcb9887cu, 0x62dd1ddfu, 0x15da2d49u, 0x8cd37cf3u, 0xfbd44c65u, - 0x4db26158u, 0x3ab551ceu, 0xa3bc0074u, 0xd4bb30e2u, 0x4adfa541u, 0x3dd895d7u, 0xa4d1c46du, 0xd3d6f4fbu, - 0x4369e96au, 0x346ed9fcu, 0xad678846u, 0xda60b8d0u, 0x44042d73u, 0x33031de5u, 0xaa0a4c5fu, 0xdd0d7cc9u, - 0x5005713cu, 0x270241aau, 0xbe0b1010u, 0xc90c2086u, 0x5768b525u, 0x206f85b3u, 0xb966d409u, 0xce61e49fu, - 0x5edef90eu, 0x29d9c998u, 0xb0d09822u, 0xc7d7a8b4u, 0x59b33d17u, 0x2eb40d81u, 0xb7bd5c3bu, 0xc0ba6cadu, - 0xedb88320u, 0x9abfb3b6u, 0x03b6e20cu, 0x74b1d29au, 0xead54739u, 0x9dd277afu, 0x04db2615u, 0x73dc1683u, - 0xe3630b12u, 0x94643b84u, 0x0d6d6a3eu, 0x7a6a5aa8u, 0xe40ecf0bu, 0x9309ff9du, 0x0a00ae27u, 0x7d079eb1u, - 0xf00f9344u, 0x8708a3d2u, 0x1e01f268u, 0x6906c2feu, 0xf762575du, 0x806567cbu, 0x196c3671u, 0x6e6b06e7u, - 0xfed41b76u, 0x89d32be0u, 0x10da7a5au, 0x67dd4accu, 0xf9b9df6fu, 0x8ebeeff9u, 0x17b7be43u, 0x60b08ed5u, - 0xd6d6a3e8u, 0xa1d1937eu, 0x38d8c2c4u, 0x4fdff252u, 0xd1bb67f1u, 0xa6bc5767u, 0x3fb506ddu, 0x48b2364bu, - 0xd80d2bdau, 0xaf0a1b4cu, 0x36034af6u, 0x41047a60u, 0xdf60efc3u, 0xa867df55u, 0x316e8eefu, 0x4669be79u, - 0xcb61b38cu, 0xbc66831au, 0x256fd2a0u, 0x5268e236u, 0xcc0c7795u, 0xbb0b4703u, 0x220216b9u, 0x5505262fu, - 0xc5ba3bbeu, 0xb2bd0b28u, 0x2bb45a92u, 0x5cb36a04u, 0xc2d7ffa7u, 0xb5d0cf31u, 0x2cd99e8bu, 0x5bdeae1du, - 0x9b64c2b0u, 0xec63f226u, 0x756aa39cu, 0x026d930au, 0x9c0906a9u, 0xeb0e363fu, 0x72076785u, 0x05005713u, - 0x95bf4a82u, 0xe2b87a14u, 0x7bb12baeu, 0x0cb61b38u, 0x92d28e9bu, 0xe5d5be0du, 0x7cdcefb7u, 0x0bdbdf21u, - 0x86d3d2d4u, 0xf1d4e242u, 0x68ddb3f8u, 0x1fda836eu, 0x81be16cdu, 0xf6b9265bu, 0x6fb077e1u, 0x18b74777u, - 0x88085ae6u, 0xff0f6a70u, 0x66063bcau, 0x11010b5cu, 0x8f659effu, 0xf862ae69u, 0x616bffd3u, 0x166ccf45u, - 0xa00ae278u, 0xd70dd2eeu, 0x4e048354u, 0x3903b3c2u, 0xa7672661u, 0xd06016f7u, 0x4969474du, 0x3e6e77dbu, - 0xaed16a4au, 0xd9d65adcu, 0x40df0b66u, 0x37d83bf0u, 0xa9bcae53u, 0xdebb9ec5u, 0x47b2cf7fu, 0x30b5ffe9u, - 0xbdbdf21cu, 0xcabac28au, 0x53b39330u, 0x24b4a3a6u, 0xbad03605u, 0xcdd70693u, 0x54de5729u, 0x23d967bfu, - 0xb3667a2eu, 0xc4614ab8u, 0x5d681b02u, 0x2a6f2b94u, 0xb40bbe37u, 0xc30c8ea1u, 0x5a05df1bu, 0x2d02ef8du -}; - -static const unsigned lodepng_crc32_table1[256] = { - 0x00000000u, 0x191b3141u, 0x32366282u, 0x2b2d53c3u, 0x646cc504u, 0x7d77f445u, 0x565aa786u, 0x4f4196c7u, - 0xc8d98a08u, 0xd1c2bb49u, 0xfaefe88au, 0xe3f4d9cbu, 0xacb54f0cu, 0xb5ae7e4du, 0x9e832d8eu, 0x87981ccfu, - 0x4ac21251u, 0x53d92310u, 0x78f470d3u, 0x61ef4192u, 0x2eaed755u, 0x37b5e614u, 0x1c98b5d7u, 0x05838496u, - 0x821b9859u, 0x9b00a918u, 0xb02dfadbu, 0xa936cb9au, 0xe6775d5du, 0xff6c6c1cu, 0xd4413fdfu, 0xcd5a0e9eu, - 0x958424a2u, 0x8c9f15e3u, 0xa7b24620u, 0xbea97761u, 0xf1e8e1a6u, 0xe8f3d0e7u, 0xc3de8324u, 0xdac5b265u, - 0x5d5daeaau, 0x44469febu, 0x6f6bcc28u, 0x7670fd69u, 0x39316baeu, 0x202a5aefu, 0x0b07092cu, 0x121c386du, - 0xdf4636f3u, 0xc65d07b2u, 0xed705471u, 0xf46b6530u, 0xbb2af3f7u, 0xa231c2b6u, 0x891c9175u, 0x9007a034u, - 0x179fbcfbu, 0x0e848dbau, 0x25a9de79u, 0x3cb2ef38u, 0x73f379ffu, 0x6ae848beu, 0x41c51b7du, 0x58de2a3cu, - 0xf0794f05u, 0xe9627e44u, 0xc24f2d87u, 0xdb541cc6u, 0x94158a01u, 0x8d0ebb40u, 0xa623e883u, 0xbf38d9c2u, - 0x38a0c50du, 0x21bbf44cu, 0x0a96a78fu, 0x138d96ceu, 0x5ccc0009u, 0x45d73148u, 0x6efa628bu, 0x77e153cau, - 0xbabb5d54u, 0xa3a06c15u, 0x888d3fd6u, 0x91960e97u, 0xded79850u, 0xc7cca911u, 0xece1fad2u, 0xf5facb93u, - 0x7262d75cu, 0x6b79e61du, 0x4054b5deu, 0x594f849fu, 0x160e1258u, 0x0f152319u, 0x243870dau, 0x3d23419bu, - 0x65fd6ba7u, 0x7ce65ae6u, 0x57cb0925u, 0x4ed03864u, 0x0191aea3u, 0x188a9fe2u, 0x33a7cc21u, 0x2abcfd60u, - 0xad24e1afu, 0xb43fd0eeu, 0x9f12832du, 0x8609b26cu, 0xc94824abu, 0xd05315eau, 0xfb7e4629u, 0xe2657768u, - 0x2f3f79f6u, 0x362448b7u, 0x1d091b74u, 0x04122a35u, 0x4b53bcf2u, 0x52488db3u, 0x7965de70u, 0x607eef31u, - 0xe7e6f3feu, 0xfefdc2bfu, 0xd5d0917cu, 0xcccba03du, 0x838a36fau, 0x9a9107bbu, 0xb1bc5478u, 0xa8a76539u, - 0x3b83984bu, 0x2298a90au, 0x09b5fac9u, 0x10aecb88u, 0x5fef5d4fu, 0x46f46c0eu, 0x6dd93fcdu, 0x74c20e8cu, - 0xf35a1243u, 0xea412302u, 0xc16c70c1u, 0xd8774180u, 0x9736d747u, 0x8e2de606u, 0xa500b5c5u, 0xbc1b8484u, - 0x71418a1au, 0x685abb5bu, 0x4377e898u, 0x5a6cd9d9u, 0x152d4f1eu, 0x0c367e5fu, 0x271b2d9cu, 0x3e001cddu, - 0xb9980012u, 0xa0833153u, 0x8bae6290u, 0x92b553d1u, 0xddf4c516u, 0xc4eff457u, 0xefc2a794u, 0xf6d996d5u, - 0xae07bce9u, 0xb71c8da8u, 0x9c31de6bu, 0x852aef2au, 0xca6b79edu, 0xd37048acu, 0xf85d1b6fu, 0xe1462a2eu, - 0x66de36e1u, 0x7fc507a0u, 0x54e85463u, 0x4df36522u, 0x02b2f3e5u, 0x1ba9c2a4u, 0x30849167u, 0x299fa026u, - 0xe4c5aeb8u, 0xfdde9ff9u, 0xd6f3cc3au, 0xcfe8fd7bu, 0x80a96bbcu, 0x99b25afdu, 0xb29f093eu, 0xab84387fu, - 0x2c1c24b0u, 0x350715f1u, 0x1e2a4632u, 0x07317773u, 0x4870e1b4u, 0x516bd0f5u, 0x7a468336u, 0x635db277u, - 0xcbfad74eu, 0xd2e1e60fu, 0xf9ccb5ccu, 0xe0d7848du, 0xaf96124au, 0xb68d230bu, 0x9da070c8u, 0x84bb4189u, - 0x03235d46u, 0x1a386c07u, 0x31153fc4u, 0x280e0e85u, 0x674f9842u, 0x7e54a903u, 0x5579fac0u, 0x4c62cb81u, - 0x8138c51fu, 0x9823f45eu, 0xb30ea79du, 0xaa1596dcu, 0xe554001bu, 0xfc4f315au, 0xd7626299u, 0xce7953d8u, - 0x49e14f17u, 0x50fa7e56u, 0x7bd72d95u, 0x62cc1cd4u, 0x2d8d8a13u, 0x3496bb52u, 0x1fbbe891u, 0x06a0d9d0u, - 0x5e7ef3ecu, 0x4765c2adu, 0x6c48916eu, 0x7553a02fu, 0x3a1236e8u, 0x230907a9u, 0x0824546au, 0x113f652bu, - 0x96a779e4u, 0x8fbc48a5u, 0xa4911b66u, 0xbd8a2a27u, 0xf2cbbce0u, 0xebd08da1u, 0xc0fdde62u, 0xd9e6ef23u, - 0x14bce1bdu, 0x0da7d0fcu, 0x268a833fu, 0x3f91b27eu, 0x70d024b9u, 0x69cb15f8u, 0x42e6463bu, 0x5bfd777au, - 0xdc656bb5u, 0xc57e5af4u, 0xee530937u, 0xf7483876u, 0xb809aeb1u, 0xa1129ff0u, 0x8a3fcc33u, 0x9324fd72u -}; - -static const unsigned lodepng_crc32_table2[256] = { - 0x00000000u, 0x01c26a37u, 0x0384d46eu, 0x0246be59u, 0x0709a8dcu, 0x06cbc2ebu, 0x048d7cb2u, 0x054f1685u, - 0x0e1351b8u, 0x0fd13b8fu, 0x0d9785d6u, 0x0c55efe1u, 0x091af964u, 0x08d89353u, 0x0a9e2d0au, 0x0b5c473du, - 0x1c26a370u, 0x1de4c947u, 0x1fa2771eu, 0x1e601d29u, 0x1b2f0bacu, 0x1aed619bu, 0x18abdfc2u, 0x1969b5f5u, - 0x1235f2c8u, 0x13f798ffu, 0x11b126a6u, 0x10734c91u, 0x153c5a14u, 0x14fe3023u, 0x16b88e7au, 0x177ae44du, - 0x384d46e0u, 0x398f2cd7u, 0x3bc9928eu, 0x3a0bf8b9u, 0x3f44ee3cu, 0x3e86840bu, 0x3cc03a52u, 0x3d025065u, - 0x365e1758u, 0x379c7d6fu, 0x35dac336u, 0x3418a901u, 0x3157bf84u, 0x3095d5b3u, 0x32d36beau, 0x331101ddu, - 0x246be590u, 0x25a98fa7u, 0x27ef31feu, 0x262d5bc9u, 0x23624d4cu, 0x22a0277bu, 0x20e69922u, 0x2124f315u, - 0x2a78b428u, 0x2bbade1fu, 0x29fc6046u, 0x283e0a71u, 0x2d711cf4u, 0x2cb376c3u, 0x2ef5c89au, 0x2f37a2adu, - 0x709a8dc0u, 0x7158e7f7u, 0x731e59aeu, 0x72dc3399u, 0x7793251cu, 0x76514f2bu, 0x7417f172u, 0x75d59b45u, - 0x7e89dc78u, 0x7f4bb64fu, 0x7d0d0816u, 0x7ccf6221u, 0x798074a4u, 0x78421e93u, 0x7a04a0cau, 0x7bc6cafdu, - 0x6cbc2eb0u, 0x6d7e4487u, 0x6f38fadeu, 0x6efa90e9u, 0x6bb5866cu, 0x6a77ec5bu, 0x68315202u, 0x69f33835u, - 0x62af7f08u, 0x636d153fu, 0x612bab66u, 0x60e9c151u, 0x65a6d7d4u, 0x6464bde3u, 0x662203bau, 0x67e0698du, - 0x48d7cb20u, 0x4915a117u, 0x4b531f4eu, 0x4a917579u, 0x4fde63fcu, 0x4e1c09cbu, 0x4c5ab792u, 0x4d98dda5u, - 0x46c49a98u, 0x4706f0afu, 0x45404ef6u, 0x448224c1u, 0x41cd3244u, 0x400f5873u, 0x4249e62au, 0x438b8c1du, - 0x54f16850u, 0x55330267u, 0x5775bc3eu, 0x56b7d609u, 0x53f8c08cu, 0x523aaabbu, 0x507c14e2u, 0x51be7ed5u, - 0x5ae239e8u, 0x5b2053dfu, 0x5966ed86u, 0x58a487b1u, 0x5deb9134u, 0x5c29fb03u, 0x5e6f455au, 0x5fad2f6du, - 0xe1351b80u, 0xe0f771b7u, 0xe2b1cfeeu, 0xe373a5d9u, 0xe63cb35cu, 0xe7fed96bu, 0xe5b86732u, 0xe47a0d05u, - 0xef264a38u, 0xeee4200fu, 0xeca29e56u, 0xed60f461u, 0xe82fe2e4u, 0xe9ed88d3u, 0xebab368au, 0xea695cbdu, - 0xfd13b8f0u, 0xfcd1d2c7u, 0xfe976c9eu, 0xff5506a9u, 0xfa1a102cu, 0xfbd87a1bu, 0xf99ec442u, 0xf85cae75u, - 0xf300e948u, 0xf2c2837fu, 0xf0843d26u, 0xf1465711u, 0xf4094194u, 0xf5cb2ba3u, 0xf78d95fau, 0xf64fffcdu, - 0xd9785d60u, 0xd8ba3757u, 0xdafc890eu, 0xdb3ee339u, 0xde71f5bcu, 0xdfb39f8bu, 0xddf521d2u, 0xdc374be5u, - 0xd76b0cd8u, 0xd6a966efu, 0xd4efd8b6u, 0xd52db281u, 0xd062a404u, 0xd1a0ce33u, 0xd3e6706au, 0xd2241a5du, - 0xc55efe10u, 0xc49c9427u, 0xc6da2a7eu, 0xc7184049u, 0xc25756ccu, 0xc3953cfbu, 0xc1d382a2u, 0xc011e895u, - 0xcb4dafa8u, 0xca8fc59fu, 0xc8c97bc6u, 0xc90b11f1u, 0xcc440774u, 0xcd866d43u, 0xcfc0d31au, 0xce02b92du, - 0x91af9640u, 0x906dfc77u, 0x922b422eu, 0x93e92819u, 0x96a63e9cu, 0x976454abu, 0x9522eaf2u, 0x94e080c5u, - 0x9fbcc7f8u, 0x9e7eadcfu, 0x9c381396u, 0x9dfa79a1u, 0x98b56f24u, 0x99770513u, 0x9b31bb4au, 0x9af3d17du, - 0x8d893530u, 0x8c4b5f07u, 0x8e0de15eu, 0x8fcf8b69u, 0x8a809decu, 0x8b42f7dbu, 0x89044982u, 0x88c623b5u, - 0x839a6488u, 0x82580ebfu, 0x801eb0e6u, 0x81dcdad1u, 0x8493cc54u, 0x8551a663u, 0x8717183au, 0x86d5720du, - 0xa9e2d0a0u, 0xa820ba97u, 0xaa6604ceu, 0xaba46ef9u, 0xaeeb787cu, 0xaf29124bu, 0xad6fac12u, 0xacadc625u, - 0xa7f18118u, 0xa633eb2fu, 0xa4755576u, 0xa5b73f41u, 0xa0f829c4u, 0xa13a43f3u, 0xa37cfdaau, 0xa2be979du, - 0xb5c473d0u, 0xb40619e7u, 0xb640a7beu, 0xb782cd89u, 0xb2cddb0cu, 0xb30fb13bu, 0xb1490f62u, 0xb08b6555u, - 0xbbd72268u, 0xba15485fu, 0xb853f606u, 0xb9919c31u, 0xbcde8ab4u, 0xbd1ce083u, 0xbf5a5edau, 0xbe9834edu -}; - -static const unsigned lodepng_crc32_table3[256] = { - 0x00000000u, 0xb8bc6765u, 0xaa09c88bu, 0x12b5afeeu, 0x8f629757u, 0x37def032u, 0x256b5fdcu, 0x9dd738b9u, - 0xc5b428efu, 0x7d084f8au, 0x6fbde064u, 0xd7018701u, 0x4ad6bfb8u, 0xf26ad8ddu, 0xe0df7733u, 0x58631056u, - 0x5019579fu, 0xe8a530fau, 0xfa109f14u, 0x42acf871u, 0xdf7bc0c8u, 0x67c7a7adu, 0x75720843u, 0xcdce6f26u, - 0x95ad7f70u, 0x2d111815u, 0x3fa4b7fbu, 0x8718d09eu, 0x1acfe827u, 0xa2738f42u, 0xb0c620acu, 0x087a47c9u, - 0xa032af3eu, 0x188ec85bu, 0x0a3b67b5u, 0xb28700d0u, 0x2f503869u, 0x97ec5f0cu, 0x8559f0e2u, 0x3de59787u, - 0x658687d1u, 0xdd3ae0b4u, 0xcf8f4f5au, 0x7733283fu, 0xeae41086u, 0x525877e3u, 0x40edd80du, 0xf851bf68u, - 0xf02bf8a1u, 0x48979fc4u, 0x5a22302au, 0xe29e574fu, 0x7f496ff6u, 0xc7f50893u, 0xd540a77du, 0x6dfcc018u, - 0x359fd04eu, 0x8d23b72bu, 0x9f9618c5u, 0x272a7fa0u, 0xbafd4719u, 0x0241207cu, 0x10f48f92u, 0xa848e8f7u, - 0x9b14583du, 0x23a83f58u, 0x311d90b6u, 0x89a1f7d3u, 0x1476cf6au, 0xaccaa80fu, 0xbe7f07e1u, 0x06c36084u, - 0x5ea070d2u, 0xe61c17b7u, 0xf4a9b859u, 0x4c15df3cu, 0xd1c2e785u, 0x697e80e0u, 0x7bcb2f0eu, 0xc377486bu, - 0xcb0d0fa2u, 0x73b168c7u, 0x6104c729u, 0xd9b8a04cu, 0x446f98f5u, 0xfcd3ff90u, 0xee66507eu, 0x56da371bu, - 0x0eb9274du, 0xb6054028u, 0xa4b0efc6u, 0x1c0c88a3u, 0x81dbb01au, 0x3967d77fu, 0x2bd27891u, 0x936e1ff4u, - 0x3b26f703u, 0x839a9066u, 0x912f3f88u, 0x299358edu, 0xb4446054u, 0x0cf80731u, 0x1e4da8dfu, 0xa6f1cfbau, - 0xfe92dfecu, 0x462eb889u, 0x549b1767u, 0xec277002u, 0x71f048bbu, 0xc94c2fdeu, 0xdbf98030u, 0x6345e755u, - 0x6b3fa09cu, 0xd383c7f9u, 0xc1366817u, 0x798a0f72u, 0xe45d37cbu, 0x5ce150aeu, 0x4e54ff40u, 0xf6e89825u, - 0xae8b8873u, 0x1637ef16u, 0x048240f8u, 0xbc3e279du, 0x21e91f24u, 0x99557841u, 0x8be0d7afu, 0x335cb0cau, - 0xed59b63bu, 0x55e5d15eu, 0x47507eb0u, 0xffec19d5u, 0x623b216cu, 0xda874609u, 0xc832e9e7u, 0x708e8e82u, - 0x28ed9ed4u, 0x9051f9b1u, 0x82e4565fu, 0x3a58313au, 0xa78f0983u, 0x1f336ee6u, 0x0d86c108u, 0xb53aa66du, - 0xbd40e1a4u, 0x05fc86c1u, 0x1749292fu, 0xaff54e4au, 0x322276f3u, 0x8a9e1196u, 0x982bbe78u, 0x2097d91du, - 0x78f4c94bu, 0xc048ae2eu, 0xd2fd01c0u, 0x6a4166a5u, 0xf7965e1cu, 0x4f2a3979u, 0x5d9f9697u, 0xe523f1f2u, - 0x4d6b1905u, 0xf5d77e60u, 0xe762d18eu, 0x5fdeb6ebu, 0xc2098e52u, 0x7ab5e937u, 0x680046d9u, 0xd0bc21bcu, - 0x88df31eau, 0x3063568fu, 0x22d6f961u, 0x9a6a9e04u, 0x07bda6bdu, 0xbf01c1d8u, 0xadb46e36u, 0x15080953u, - 0x1d724e9au, 0xa5ce29ffu, 0xb77b8611u, 0x0fc7e174u, 0x9210d9cdu, 0x2aacbea8u, 0x38191146u, 0x80a57623u, - 0xd8c66675u, 0x607a0110u, 0x72cfaefeu, 0xca73c99bu, 0x57a4f122u, 0xef189647u, 0xfdad39a9u, 0x45115eccu, - 0x764dee06u, 0xcef18963u, 0xdc44268du, 0x64f841e8u, 0xf92f7951u, 0x41931e34u, 0x5326b1dau, 0xeb9ad6bfu, - 0xb3f9c6e9u, 0x0b45a18cu, 0x19f00e62u, 0xa14c6907u, 0x3c9b51beu, 0x842736dbu, 0x96929935u, 0x2e2efe50u, - 0x2654b999u, 0x9ee8defcu, 0x8c5d7112u, 0x34e11677u, 0xa9362eceu, 0x118a49abu, 0x033fe645u, 0xbb838120u, - 0xe3e09176u, 0x5b5cf613u, 0x49e959fdu, 0xf1553e98u, 0x6c820621u, 0xd43e6144u, 0xc68bceaau, 0x7e37a9cfu, - 0xd67f4138u, 0x6ec3265du, 0x7c7689b3u, 0xc4caeed6u, 0x591dd66fu, 0xe1a1b10au, 0xf3141ee4u, 0x4ba87981u, - 0x13cb69d7u, 0xab770eb2u, 0xb9c2a15cu, 0x017ec639u, 0x9ca9fe80u, 0x241599e5u, 0x36a0360bu, 0x8e1c516eu, - 0x866616a7u, 0x3eda71c2u, 0x2c6fde2cu, 0x94d3b949u, 0x090481f0u, 0xb1b8e695u, 0xa30d497bu, 0x1bb12e1eu, - 0x43d23e48u, 0xfb6e592du, 0xe9dbf6c3u, 0x516791a6u, 0xccb0a91fu, 0x740cce7au, 0x66b96194u, 0xde0506f1u -}; - -static const unsigned lodepng_crc32_table4[256] = { - 0x00000000u, 0x3d6029b0u, 0x7ac05360u, 0x47a07ad0u, 0xf580a6c0u, 0xc8e08f70u, 0x8f40f5a0u, 0xb220dc10u, - 0x30704bc1u, 0x0d106271u, 0x4ab018a1u, 0x77d03111u, 0xc5f0ed01u, 0xf890c4b1u, 0xbf30be61u, 0x825097d1u, - 0x60e09782u, 0x5d80be32u, 0x1a20c4e2u, 0x2740ed52u, 0x95603142u, 0xa80018f2u, 0xefa06222u, 0xd2c04b92u, - 0x5090dc43u, 0x6df0f5f3u, 0x2a508f23u, 0x1730a693u, 0xa5107a83u, 0x98705333u, 0xdfd029e3u, 0xe2b00053u, - 0xc1c12f04u, 0xfca106b4u, 0xbb017c64u, 0x866155d4u, 0x344189c4u, 0x0921a074u, 0x4e81daa4u, 0x73e1f314u, - 0xf1b164c5u, 0xccd14d75u, 0x8b7137a5u, 0xb6111e15u, 0x0431c205u, 0x3951ebb5u, 0x7ef19165u, 0x4391b8d5u, - 0xa121b886u, 0x9c419136u, 0xdbe1ebe6u, 0xe681c256u, 0x54a11e46u, 0x69c137f6u, 0x2e614d26u, 0x13016496u, - 0x9151f347u, 0xac31daf7u, 0xeb91a027u, 0xd6f18997u, 0x64d15587u, 0x59b17c37u, 0x1e1106e7u, 0x23712f57u, - 0x58f35849u, 0x659371f9u, 0x22330b29u, 0x1f532299u, 0xad73fe89u, 0x9013d739u, 0xd7b3ade9u, 0xead38459u, - 0x68831388u, 0x55e33a38u, 0x124340e8u, 0x2f236958u, 0x9d03b548u, 0xa0639cf8u, 0xe7c3e628u, 0xdaa3cf98u, - 0x3813cfcbu, 0x0573e67bu, 0x42d39cabu, 0x7fb3b51bu, 0xcd93690bu, 0xf0f340bbu, 0xb7533a6bu, 0x8a3313dbu, - 0x0863840au, 0x3503adbau, 0x72a3d76au, 0x4fc3fedau, 0xfde322cau, 0xc0830b7au, 0x872371aau, 0xba43581au, - 0x9932774du, 0xa4525efdu, 0xe3f2242du, 0xde920d9du, 0x6cb2d18du, 0x51d2f83du, 0x167282edu, 0x2b12ab5du, - 0xa9423c8cu, 0x9422153cu, 0xd3826fecu, 0xeee2465cu, 0x5cc29a4cu, 0x61a2b3fcu, 0x2602c92cu, 0x1b62e09cu, - 0xf9d2e0cfu, 0xc4b2c97fu, 0x8312b3afu, 0xbe729a1fu, 0x0c52460fu, 0x31326fbfu, 0x7692156fu, 0x4bf23cdfu, - 0xc9a2ab0eu, 0xf4c282beu, 0xb362f86eu, 0x8e02d1deu, 0x3c220dceu, 0x0142247eu, 0x46e25eaeu, 0x7b82771eu, - 0xb1e6b092u, 0x8c869922u, 0xcb26e3f2u, 0xf646ca42u, 0x44661652u, 0x79063fe2u, 0x3ea64532u, 0x03c66c82u, - 0x8196fb53u, 0xbcf6d2e3u, 0xfb56a833u, 0xc6368183u, 0x74165d93u, 0x49767423u, 0x0ed60ef3u, 0x33b62743u, - 0xd1062710u, 0xec660ea0u, 0xabc67470u, 0x96a65dc0u, 0x248681d0u, 0x19e6a860u, 0x5e46d2b0u, 0x6326fb00u, - 0xe1766cd1u, 0xdc164561u, 0x9bb63fb1u, 0xa6d61601u, 0x14f6ca11u, 0x2996e3a1u, 0x6e369971u, 0x5356b0c1u, - 0x70279f96u, 0x4d47b626u, 0x0ae7ccf6u, 0x3787e546u, 0x85a73956u, 0xb8c710e6u, 0xff676a36u, 0xc2074386u, - 0x4057d457u, 0x7d37fde7u, 0x3a978737u, 0x07f7ae87u, 0xb5d77297u, 0x88b75b27u, 0xcf1721f7u, 0xf2770847u, - 0x10c70814u, 0x2da721a4u, 0x6a075b74u, 0x576772c4u, 0xe547aed4u, 0xd8278764u, 0x9f87fdb4u, 0xa2e7d404u, - 0x20b743d5u, 0x1dd76a65u, 0x5a7710b5u, 0x67173905u, 0xd537e515u, 0xe857cca5u, 0xaff7b675u, 0x92979fc5u, - 0xe915e8dbu, 0xd475c16bu, 0x93d5bbbbu, 0xaeb5920bu, 0x1c954e1bu, 0x21f567abu, 0x66551d7bu, 0x5b3534cbu, - 0xd965a31au, 0xe4058aaau, 0xa3a5f07au, 0x9ec5d9cau, 0x2ce505dau, 0x11852c6au, 0x562556bau, 0x6b457f0au, - 0x89f57f59u, 0xb49556e9u, 0xf3352c39u, 0xce550589u, 0x7c75d999u, 0x4115f029u, 0x06b58af9u, 0x3bd5a349u, - 0xb9853498u, 0x84e51d28u, 0xc34567f8u, 0xfe254e48u, 0x4c059258u, 0x7165bbe8u, 0x36c5c138u, 0x0ba5e888u, - 0x28d4c7dfu, 0x15b4ee6fu, 0x521494bfu, 0x6f74bd0fu, 0xdd54611fu, 0xe03448afu, 0xa794327fu, 0x9af41bcfu, - 0x18a48c1eu, 0x25c4a5aeu, 0x6264df7eu, 0x5f04f6ceu, 0xed242adeu, 0xd044036eu, 0x97e479beu, 0xaa84500eu, - 0x4834505du, 0x755479edu, 0x32f4033du, 0x0f942a8du, 0xbdb4f69du, 0x80d4df2du, 0xc774a5fdu, 0xfa148c4du, - 0x78441b9cu, 0x4524322cu, 0x028448fcu, 0x3fe4614cu, 0x8dc4bd5cu, 0xb0a494ecu, 0xf704ee3cu, 0xca64c78cu -}; - -static const unsigned lodepng_crc32_table5[256] = { - 0x00000000u, 0xcb5cd3a5u, 0x4dc8a10bu, 0x869472aeu, 0x9b914216u, 0x50cd91b3u, 0xd659e31du, 0x1d0530b8u, - 0xec53826du, 0x270f51c8u, 0xa19b2366u, 0x6ac7f0c3u, 0x77c2c07bu, 0xbc9e13deu, 0x3a0a6170u, 0xf156b2d5u, - 0x03d6029bu, 0xc88ad13eu, 0x4e1ea390u, 0x85427035u, 0x9847408du, 0x531b9328u, 0xd58fe186u, 0x1ed33223u, - 0xef8580f6u, 0x24d95353u, 0xa24d21fdu, 0x6911f258u, 0x7414c2e0u, 0xbf481145u, 0x39dc63ebu, 0xf280b04eu, - 0x07ac0536u, 0xccf0d693u, 0x4a64a43du, 0x81387798u, 0x9c3d4720u, 0x57619485u, 0xd1f5e62bu, 0x1aa9358eu, - 0xebff875bu, 0x20a354feu, 0xa6372650u, 0x6d6bf5f5u, 0x706ec54du, 0xbb3216e8u, 0x3da66446u, 0xf6fab7e3u, - 0x047a07adu, 0xcf26d408u, 0x49b2a6a6u, 0x82ee7503u, 0x9feb45bbu, 0x54b7961eu, 0xd223e4b0u, 0x197f3715u, - 0xe82985c0u, 0x23755665u, 0xa5e124cbu, 0x6ebdf76eu, 0x73b8c7d6u, 0xb8e41473u, 0x3e7066ddu, 0xf52cb578u, - 0x0f580a6cu, 0xc404d9c9u, 0x4290ab67u, 0x89cc78c2u, 0x94c9487au, 0x5f959bdfu, 0xd901e971u, 0x125d3ad4u, - 0xe30b8801u, 0x28575ba4u, 0xaec3290au, 0x659ffaafu, 0x789aca17u, 0xb3c619b2u, 0x35526b1cu, 0xfe0eb8b9u, - 0x0c8e08f7u, 0xc7d2db52u, 0x4146a9fcu, 0x8a1a7a59u, 0x971f4ae1u, 0x5c439944u, 0xdad7ebeau, 0x118b384fu, - 0xe0dd8a9au, 0x2b81593fu, 0xad152b91u, 0x6649f834u, 0x7b4cc88cu, 0xb0101b29u, 0x36846987u, 0xfdd8ba22u, - 0x08f40f5au, 0xc3a8dcffu, 0x453cae51u, 0x8e607df4u, 0x93654d4cu, 0x58399ee9u, 0xdeadec47u, 0x15f13fe2u, - 0xe4a78d37u, 0x2ffb5e92u, 0xa96f2c3cu, 0x6233ff99u, 0x7f36cf21u, 0xb46a1c84u, 0x32fe6e2au, 0xf9a2bd8fu, - 0x0b220dc1u, 0xc07ede64u, 0x46eaaccau, 0x8db67f6fu, 0x90b34fd7u, 0x5bef9c72u, 0xdd7beedcu, 0x16273d79u, - 0xe7718facu, 0x2c2d5c09u, 0xaab92ea7u, 0x61e5fd02u, 0x7ce0cdbau, 0xb7bc1e1fu, 0x31286cb1u, 0xfa74bf14u, - 0x1eb014d8u, 0xd5ecc77du, 0x5378b5d3u, 0x98246676u, 0x852156ceu, 0x4e7d856bu, 0xc8e9f7c5u, 0x03b52460u, - 0xf2e396b5u, 0x39bf4510u, 0xbf2b37beu, 0x7477e41bu, 0x6972d4a3u, 0xa22e0706u, 0x24ba75a8u, 0xefe6a60du, - 0x1d661643u, 0xd63ac5e6u, 0x50aeb748u, 0x9bf264edu, 0x86f75455u, 0x4dab87f0u, 0xcb3ff55eu, 0x006326fbu, - 0xf135942eu, 0x3a69478bu, 0xbcfd3525u, 0x77a1e680u, 0x6aa4d638u, 0xa1f8059du, 0x276c7733u, 0xec30a496u, - 0x191c11eeu, 0xd240c24bu, 0x54d4b0e5u, 0x9f886340u, 0x828d53f8u, 0x49d1805du, 0xcf45f2f3u, 0x04192156u, - 0xf54f9383u, 0x3e134026u, 0xb8873288u, 0x73dbe12du, 0x6eded195u, 0xa5820230u, 0x2316709eu, 0xe84aa33bu, - 0x1aca1375u, 0xd196c0d0u, 0x5702b27eu, 0x9c5e61dbu, 0x815b5163u, 0x4a0782c6u, 0xcc93f068u, 0x07cf23cdu, - 0xf6999118u, 0x3dc542bdu, 0xbb513013u, 0x700de3b6u, 0x6d08d30eu, 0xa65400abu, 0x20c07205u, 0xeb9ca1a0u, - 0x11e81eb4u, 0xdab4cd11u, 0x5c20bfbfu, 0x977c6c1au, 0x8a795ca2u, 0x41258f07u, 0xc7b1fda9u, 0x0ced2e0cu, - 0xfdbb9cd9u, 0x36e74f7cu, 0xb0733dd2u, 0x7b2fee77u, 0x662adecfu, 0xad760d6au, 0x2be27fc4u, 0xe0beac61u, - 0x123e1c2fu, 0xd962cf8au, 0x5ff6bd24u, 0x94aa6e81u, 0x89af5e39u, 0x42f38d9cu, 0xc467ff32u, 0x0f3b2c97u, - 0xfe6d9e42u, 0x35314de7u, 0xb3a53f49u, 0x78f9ececu, 0x65fcdc54u, 0xaea00ff1u, 0x28347d5fu, 0xe368aefau, - 0x16441b82u, 0xdd18c827u, 0x5b8cba89u, 0x90d0692cu, 0x8dd55994u, 0x46898a31u, 0xc01df89fu, 0x0b412b3au, - 0xfa1799efu, 0x314b4a4au, 0xb7df38e4u, 0x7c83eb41u, 0x6186dbf9u, 0xaada085cu, 0x2c4e7af2u, 0xe712a957u, - 0x15921919u, 0xdececabcu, 0x585ab812u, 0x93066bb7u, 0x8e035b0fu, 0x455f88aau, 0xc3cbfa04u, 0x089729a1u, - 0xf9c19b74u, 0x329d48d1u, 0xb4093a7fu, 0x7f55e9dau, 0x6250d962u, 0xa90c0ac7u, 0x2f987869u, 0xe4c4abccu -}; - -static const unsigned lodepng_crc32_table6[256] = { - 0x00000000u, 0xa6770bb4u, 0x979f1129u, 0x31e81a9du, 0xf44f2413u, 0x52382fa7u, 0x63d0353au, 0xc5a73e8eu, - 0x33ef4e67u, 0x959845d3u, 0xa4705f4eu, 0x020754fau, 0xc7a06a74u, 0x61d761c0u, 0x503f7b5du, 0xf64870e9u, - 0x67de9cceu, 0xc1a9977au, 0xf0418de7u, 0x56368653u, 0x9391b8ddu, 0x35e6b369u, 0x040ea9f4u, 0xa279a240u, - 0x5431d2a9u, 0xf246d91du, 0xc3aec380u, 0x65d9c834u, 0xa07ef6bau, 0x0609fd0eu, 0x37e1e793u, 0x9196ec27u, - 0xcfbd399cu, 0x69ca3228u, 0x582228b5u, 0xfe552301u, 0x3bf21d8fu, 0x9d85163bu, 0xac6d0ca6u, 0x0a1a0712u, - 0xfc5277fbu, 0x5a257c4fu, 0x6bcd66d2u, 0xcdba6d66u, 0x081d53e8u, 0xae6a585cu, 0x9f8242c1u, 0x39f54975u, - 0xa863a552u, 0x0e14aee6u, 0x3ffcb47bu, 0x998bbfcfu, 0x5c2c8141u, 0xfa5b8af5u, 0xcbb39068u, 0x6dc49bdcu, - 0x9b8ceb35u, 0x3dfbe081u, 0x0c13fa1cu, 0xaa64f1a8u, 0x6fc3cf26u, 0xc9b4c492u, 0xf85cde0fu, 0x5e2bd5bbu, - 0x440b7579u, 0xe27c7ecdu, 0xd3946450u, 0x75e36fe4u, 0xb044516au, 0x16335adeu, 0x27db4043u, 0x81ac4bf7u, - 0x77e43b1eu, 0xd19330aau, 0xe07b2a37u, 0x460c2183u, 0x83ab1f0du, 0x25dc14b9u, 0x14340e24u, 0xb2430590u, - 0x23d5e9b7u, 0x85a2e203u, 0xb44af89eu, 0x123df32au, 0xd79acda4u, 0x71edc610u, 0x4005dc8du, 0xe672d739u, - 0x103aa7d0u, 0xb64dac64u, 0x87a5b6f9u, 0x21d2bd4du, 0xe47583c3u, 0x42028877u, 0x73ea92eau, 0xd59d995eu, - 0x8bb64ce5u, 0x2dc14751u, 0x1c295dccu, 0xba5e5678u, 0x7ff968f6u, 0xd98e6342u, 0xe86679dfu, 0x4e11726bu, - 0xb8590282u, 0x1e2e0936u, 0x2fc613abu, 0x89b1181fu, 0x4c162691u, 0xea612d25u, 0xdb8937b8u, 0x7dfe3c0cu, - 0xec68d02bu, 0x4a1fdb9fu, 0x7bf7c102u, 0xdd80cab6u, 0x1827f438u, 0xbe50ff8cu, 0x8fb8e511u, 0x29cfeea5u, - 0xdf879e4cu, 0x79f095f8u, 0x48188f65u, 0xee6f84d1u, 0x2bc8ba5fu, 0x8dbfb1ebu, 0xbc57ab76u, 0x1a20a0c2u, - 0x8816eaf2u, 0x2e61e146u, 0x1f89fbdbu, 0xb9fef06fu, 0x7c59cee1u, 0xda2ec555u, 0xebc6dfc8u, 0x4db1d47cu, - 0xbbf9a495u, 0x1d8eaf21u, 0x2c66b5bcu, 0x8a11be08u, 0x4fb68086u, 0xe9c18b32u, 0xd82991afu, 0x7e5e9a1bu, - 0xefc8763cu, 0x49bf7d88u, 0x78576715u, 0xde206ca1u, 0x1b87522fu, 0xbdf0599bu, 0x8c184306u, 0x2a6f48b2u, - 0xdc27385bu, 0x7a5033efu, 0x4bb82972u, 0xedcf22c6u, 0x28681c48u, 0x8e1f17fcu, 0xbff70d61u, 0x198006d5u, - 0x47abd36eu, 0xe1dcd8dau, 0xd034c247u, 0x7643c9f3u, 0xb3e4f77du, 0x1593fcc9u, 0x247be654u, 0x820cede0u, - 0x74449d09u, 0xd23396bdu, 0xe3db8c20u, 0x45ac8794u, 0x800bb91au, 0x267cb2aeu, 0x1794a833u, 0xb1e3a387u, - 0x20754fa0u, 0x86024414u, 0xb7ea5e89u, 0x119d553du, 0xd43a6bb3u, 0x724d6007u, 0x43a57a9au, 0xe5d2712eu, - 0x139a01c7u, 0xb5ed0a73u, 0x840510eeu, 0x22721b5au, 0xe7d525d4u, 0x41a22e60u, 0x704a34fdu, 0xd63d3f49u, - 0xcc1d9f8bu, 0x6a6a943fu, 0x5b828ea2u, 0xfdf58516u, 0x3852bb98u, 0x9e25b02cu, 0xafcdaab1u, 0x09baa105u, - 0xfff2d1ecu, 0x5985da58u, 0x686dc0c5u, 0xce1acb71u, 0x0bbdf5ffu, 0xadcafe4bu, 0x9c22e4d6u, 0x3a55ef62u, - 0xabc30345u, 0x0db408f1u, 0x3c5c126cu, 0x9a2b19d8u, 0x5f8c2756u, 0xf9fb2ce2u, 0xc813367fu, 0x6e643dcbu, - 0x982c4d22u, 0x3e5b4696u, 0x0fb35c0bu, 0xa9c457bfu, 0x6c636931u, 0xca146285u, 0xfbfc7818u, 0x5d8b73acu, - 0x03a0a617u, 0xa5d7ada3u, 0x943fb73eu, 0x3248bc8au, 0xf7ef8204u, 0x519889b0u, 0x6070932du, 0xc6079899u, - 0x304fe870u, 0x9638e3c4u, 0xa7d0f959u, 0x01a7f2edu, 0xc400cc63u, 0x6277c7d7u, 0x539fdd4au, 0xf5e8d6feu, - 0x647e3ad9u, 0xc209316du, 0xf3e12bf0u, 0x55962044u, 0x90311ecau, 0x3646157eu, 0x07ae0fe3u, 0xa1d90457u, - 0x579174beu, 0xf1e67f0au, 0xc00e6597u, 0x66796e23u, 0xa3de50adu, 0x05a95b19u, 0x34414184u, 0x92364a30u -}; - -static const unsigned lodepng_crc32_table7[256] = { - 0x00000000u, 0xccaa009eu, 0x4225077du, 0x8e8f07e3u, 0x844a0efau, 0x48e00e64u, 0xc66f0987u, 0x0ac50919u, - 0xd3e51bb5u, 0x1f4f1b2bu, 0x91c01cc8u, 0x5d6a1c56u, 0x57af154fu, 0x9b0515d1u, 0x158a1232u, 0xd92012acu, - 0x7cbb312bu, 0xb01131b5u, 0x3e9e3656u, 0xf23436c8u, 0xf8f13fd1u, 0x345b3f4fu, 0xbad438acu, 0x767e3832u, - 0xaf5e2a9eu, 0x63f42a00u, 0xed7b2de3u, 0x21d12d7du, 0x2b142464u, 0xe7be24fau, 0x69312319u, 0xa59b2387u, - 0xf9766256u, 0x35dc62c8u, 0xbb53652bu, 0x77f965b5u, 0x7d3c6cacu, 0xb1966c32u, 0x3f196bd1u, 0xf3b36b4fu, - 0x2a9379e3u, 0xe639797du, 0x68b67e9eu, 0xa41c7e00u, 0xaed97719u, 0x62737787u, 0xecfc7064u, 0x205670fau, - 0x85cd537du, 0x496753e3u, 0xc7e85400u, 0x0b42549eu, 0x01875d87u, 0xcd2d5d19u, 0x43a25afau, 0x8f085a64u, - 0x562848c8u, 0x9a824856u, 0x140d4fb5u, 0xd8a74f2bu, 0xd2624632u, 0x1ec846acu, 0x9047414fu, 0x5ced41d1u, - 0x299dc2edu, 0xe537c273u, 0x6bb8c590u, 0xa712c50eu, 0xadd7cc17u, 0x617dcc89u, 0xeff2cb6au, 0x2358cbf4u, - 0xfa78d958u, 0x36d2d9c6u, 0xb85dde25u, 0x74f7debbu, 0x7e32d7a2u, 0xb298d73cu, 0x3c17d0dfu, 0xf0bdd041u, - 0x5526f3c6u, 0x998cf358u, 0x1703f4bbu, 0xdba9f425u, 0xd16cfd3cu, 0x1dc6fda2u, 0x9349fa41u, 0x5fe3fadfu, - 0x86c3e873u, 0x4a69e8edu, 0xc4e6ef0eu, 0x084cef90u, 0x0289e689u, 0xce23e617u, 0x40ace1f4u, 0x8c06e16au, - 0xd0eba0bbu, 0x1c41a025u, 0x92cea7c6u, 0x5e64a758u, 0x54a1ae41u, 0x980baedfu, 0x1684a93cu, 0xda2ea9a2u, - 0x030ebb0eu, 0xcfa4bb90u, 0x412bbc73u, 0x8d81bcedu, 0x8744b5f4u, 0x4beeb56au, 0xc561b289u, 0x09cbb217u, - 0xac509190u, 0x60fa910eu, 0xee7596edu, 0x22df9673u, 0x281a9f6au, 0xe4b09ff4u, 0x6a3f9817u, 0xa6959889u, - 0x7fb58a25u, 0xb31f8abbu, 0x3d908d58u, 0xf13a8dc6u, 0xfbff84dfu, 0x37558441u, 0xb9da83a2u, 0x7570833cu, - 0x533b85dau, 0x9f918544u, 0x111e82a7u, 0xddb48239u, 0xd7718b20u, 0x1bdb8bbeu, 0x95548c5du, 0x59fe8cc3u, - 0x80de9e6fu, 0x4c749ef1u, 0xc2fb9912u, 0x0e51998cu, 0x04949095u, 0xc83e900bu, 0x46b197e8u, 0x8a1b9776u, - 0x2f80b4f1u, 0xe32ab46fu, 0x6da5b38cu, 0xa10fb312u, 0xabcaba0bu, 0x6760ba95u, 0xe9efbd76u, 0x2545bde8u, - 0xfc65af44u, 0x30cfafdau, 0xbe40a839u, 0x72eaa8a7u, 0x782fa1beu, 0xb485a120u, 0x3a0aa6c3u, 0xf6a0a65du, - 0xaa4de78cu, 0x66e7e712u, 0xe868e0f1u, 0x24c2e06fu, 0x2e07e976u, 0xe2ade9e8u, 0x6c22ee0bu, 0xa088ee95u, - 0x79a8fc39u, 0xb502fca7u, 0x3b8dfb44u, 0xf727fbdau, 0xfde2f2c3u, 0x3148f25du, 0xbfc7f5beu, 0x736df520u, - 0xd6f6d6a7u, 0x1a5cd639u, 0x94d3d1dau, 0x5879d144u, 0x52bcd85du, 0x9e16d8c3u, 0x1099df20u, 0xdc33dfbeu, - 0x0513cd12u, 0xc9b9cd8cu, 0x4736ca6fu, 0x8b9ccaf1u, 0x8159c3e8u, 0x4df3c376u, 0xc37cc495u, 0x0fd6c40bu, - 0x7aa64737u, 0xb60c47a9u, 0x3883404au, 0xf42940d4u, 0xfeec49cdu, 0x32464953u, 0xbcc94eb0u, 0x70634e2eu, - 0xa9435c82u, 0x65e95c1cu, 0xeb665bffu, 0x27cc5b61u, 0x2d095278u, 0xe1a352e6u, 0x6f2c5505u, 0xa386559bu, - 0x061d761cu, 0xcab77682u, 0x44387161u, 0x889271ffu, 0x825778e6u, 0x4efd7878u, 0xc0727f9bu, 0x0cd87f05u, - 0xd5f86da9u, 0x19526d37u, 0x97dd6ad4u, 0x5b776a4au, 0x51b26353u, 0x9d1863cdu, 0x1397642eu, 0xdf3d64b0u, - 0x83d02561u, 0x4f7a25ffu, 0xc1f5221cu, 0x0d5f2282u, 0x079a2b9bu, 0xcb302b05u, 0x45bf2ce6u, 0x89152c78u, - 0x50353ed4u, 0x9c9f3e4au, 0x121039a9u, 0xdeba3937u, 0xd47f302eu, 0x18d530b0u, 0x965a3753u, 0x5af037cdu, - 0xff6b144au, 0x33c114d4u, 0xbd4e1337u, 0x71e413a9u, 0x7b211ab0u, 0xb78b1a2eu, 0x39041dcdu, 0xf5ae1d53u, - 0x2c8e0fffu, 0xe0240f61u, 0x6eab0882u, 0xa201081cu, 0xa8c40105u, 0x646e019bu, 0xeae10678u, 0x264b06e6u -}; - -/* Computes the cyclic redundancy check as used by PNG chunks*/ -unsigned lodepng_crc32(const unsigned char* data, size_t length) { - /*Using the Slicing by Eight algorithm*/ - unsigned r = 0xffffffffu; - while(length >= 8) { - r = lodepng_crc32_table7[(data[0] ^ (r & 0xffu))] ^ - lodepng_crc32_table6[(data[1] ^ ((r >> 8) & 0xffu))] ^ - lodepng_crc32_table5[(data[2] ^ ((r >> 16) & 0xffu))] ^ - lodepng_crc32_table4[(data[3] ^ ((r >> 24) & 0xffu))] ^ - lodepng_crc32_table3[data[4]] ^ - lodepng_crc32_table2[data[5]] ^ - lodepng_crc32_table1[data[6]] ^ - lodepng_crc32_table0[data[7]]; - data += 8; - length -= 8; - } - while(length--) { - r = lodepng_crc32_table0[(r ^ *data++) & 0xffu] ^ (r >> 8); - } - return r ^ 0xffffffffu; -} -#else /* LODEPNG_COMPILE_CRC */ -/*in this case, the function is only declared here, and must be defined externally -so that it will be linked in. - -Example implementation that uses a much smaller lookup table for memory constrained cases: - -unsigned lodepng_crc32(const unsigned char* data, size_t length) { - unsigned r = 0xffffffffu; - static const unsigned table[16] = { - 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, - 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c - }; - while(length--) { - r = table[(r ^ *data) & 0xf] ^ (r >> 4); - r = table[(r ^ (*data >> 4)) & 0xf] ^ (r >> 4); - data++; - } - return r ^ 0xffffffffu; -} -*/ -unsigned lodepng_crc32(const unsigned char* data, size_t length); -#endif /* LODEPNG_COMPILE_CRC */ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Reading and writing PNG color channel bits / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/* The color channel bits of less-than-8-bit pixels are read with the MSB of bytes first, -so LodePNGBitWriter and LodePNGBitReader can't be used for those. */ - -static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) { - unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); - ++(*bitpointer); - return result; -} - -/* TODO: make this faster */ -static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) { - unsigned result = 0; - size_t i; - for(i = 0 ; i < nbits; ++i) { - result <<= 1u; - result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream); - } - return result; -} - -static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) { - /*the current bit in bitstream may be 0 or 1 for this to work*/ - if(bit == 0) bitstream[(*bitpointer) >> 3u] &= (unsigned char)(~(1u << (7u - ((*bitpointer) & 7u)))); - else bitstream[(*bitpointer) >> 3u] |= (1u << (7u - ((*bitpointer) & 7u))); - ++(*bitpointer); -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG chunks / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -unsigned lodepng_chunk_length(const unsigned char* chunk) { - return lodepng_read32bitInt(chunk); -} - -void lodepng_chunk_type(char type[5], const unsigned char* chunk) { - unsigned i; - for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; - type[4] = 0; /*null termination char*/ -} - -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) { - if(lodepng_strlen(type) != 4) return 0; - return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); -} - -unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) { - return((chunk[4] & 32) != 0); -} - -unsigned char lodepng_chunk_private(const unsigned char* chunk) { - return((chunk[6] & 32) != 0); -} - -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) { - return((chunk[7] & 32) != 0); -} - -unsigned char* lodepng_chunk_data(unsigned char* chunk) { - return &chunk[8]; -} - -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) { - return &chunk[8]; -} - -unsigned lodepng_chunk_check_crc(const unsigned char* chunk) { - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); - /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ - unsigned checksum = lodepng_crc32(&chunk[4], length + 4); - if(CRC != checksum) return 1; - else return 0; -} - -void lodepng_chunk_generate_crc(unsigned char* chunk) { - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_crc32(&chunk[4], length + 4); - lodepng_set32bitInt(chunk + 8 + length, CRC); -} - -unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end) { - size_t available_size = (size_t)(end - chunk); - if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/ - if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 - && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { - /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ - return chunk + 8; - } else { - size_t total_chunk_length; - if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; - if(total_chunk_length > available_size) return end; /*outside of range*/ - return chunk + total_chunk_length; - } -} - -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end) { - size_t available_size = (size_t)(end - chunk); - if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/ - if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 - && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { - /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ - return chunk + 8; - } else { - size_t total_chunk_length; - if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; - if(total_chunk_length > available_size) return end; /*outside of range*/ - return chunk + total_chunk_length; - } -} - -unsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]) { - for(;;) { - if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ - if(lodepng_chunk_type_equals(chunk, type)) return chunk; - chunk = lodepng_chunk_next(chunk, end); - } -} - -const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]) { - for(;;) { - if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ - if(lodepng_chunk_type_equals(chunk, type)) return chunk; - chunk = lodepng_chunk_next_const(chunk, end); - } -} - -unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk) { - unsigned i; - size_t total_chunk_length, new_length; - unsigned char *chunk_start, *new_buffer; - - if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return 77; - if(lodepng_addofl(*outsize, total_chunk_length, &new_length)) return 77; - - new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); - if(!new_buffer) return 83; /*alloc fail*/ - (*out) = new_buffer; - (*outsize) = new_length; - chunk_start = &(*out)[new_length - total_chunk_length]; - - for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; - - return 0; -} - -/*Sets length and name and allocates the space for data and crc but does not -set data or crc yet. Returns the start of the chunk in chunk. The start of -the data is at chunk + 8. To finalize chunk, add the data, then use -lodepng_chunk_generate_crc */ -static unsigned lodepng_chunk_init(unsigned char** chunk, - ucvector* out, - unsigned length, const char* type) { - size_t new_length = out->size; - if(lodepng_addofl(new_length, length, &new_length)) return 77; - if(lodepng_addofl(new_length, 12, &new_length)) return 77; - if(!ucvector_resize(out, new_length)) return 83; /*alloc fail*/ - *chunk = out->data + new_length - length - 12u; - - /*1: length*/ - lodepng_set32bitInt(*chunk, length); - - /*2: chunk name (4 letters)*/ - lodepng_memcpy(*chunk + 4, type, 4); - - return 0; -} - -/* like lodepng_chunk_create but with custom allocsize */ -static unsigned lodepng_chunk_createv(ucvector* out, - unsigned length, const char* type, const unsigned char* data) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, length, type)); - - /*3: the data*/ - lodepng_memcpy(chunk + 8, data, length); - - /*4: CRC (of the chunkname characters and the data)*/ - lodepng_chunk_generate_crc(chunk); - - return 0; -} - -unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, - unsigned length, const char* type, const unsigned char* data) { - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_chunk_createv(&v, length, type, data); - *out = v.data; - *outsize = v.size; - return error; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Color types, channels, bits / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*checks if the colortype is valid and the bitdepth bd is allowed for this colortype. -Return value is a LodePNG error code.*/ -static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) { - switch(colortype) { - case LCT_GREY: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; - case LCT_RGB: if(!( bd == 8 || bd == 16)) return 37; break; - case LCT_PALETTE: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; - case LCT_GREY_ALPHA: if(!( bd == 8 || bd == 16)) return 37; break; - case LCT_RGBA: if(!( bd == 8 || bd == 16)) return 37; break; - case LCT_MAX_OCTET_VALUE: return 31; /* invalid color type */ - default: return 31; /* invalid color type */ - } - return 0; /*allowed color type / bits combination*/ -} - -static unsigned getNumColorChannels(LodePNGColorType colortype) { - switch(colortype) { - case LCT_GREY: return 1; - case LCT_RGB: return 3; - case LCT_PALETTE: return 1; - case LCT_GREY_ALPHA: return 2; - case LCT_RGBA: return 4; - case LCT_MAX_OCTET_VALUE: return 0; /* invalid color type */ - default: return 0; /*invalid color type*/ - } -} - -static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) { - /*bits per pixel is amount of channels * bits per channel*/ - return getNumColorChannels(colortype) * bitdepth; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -void lodepng_color_mode_init(LodePNGColorMode* info) { - info->key_defined = 0; - info->key_r = info->key_g = info->key_b = 0; - info->colortype = LCT_RGBA; - info->bitdepth = 8; - info->palette = 0; - info->palettesize = 0; -} - -/*allocates palette memory if needed, and initializes all colors to black*/ -static void lodepng_color_mode_alloc_palette(LodePNGColorMode* info) { - size_t i; - /*if the palette is already allocated, it will have size 1024 so no reallocation needed in that case*/ - /*the palette must have room for up to 256 colors with 4 bytes each.*/ - if(!info->palette) info->palette = (unsigned char*)lodepng_malloc(1024); - if(!info->palette) return; /*alloc fail*/ - for(i = 0; i != 256; ++i) { - /*Initialize all unused colors with black, the value used for invalid palette indices. - This is an error according to the PNG spec, but common PNG decoders make it black instead. - That makes color conversion slightly faster due to no error handling needed.*/ - info->palette[i * 4 + 0] = 0; - info->palette[i * 4 + 1] = 0; - info->palette[i * 4 + 2] = 0; - info->palette[i * 4 + 3] = 255; - } -} - -void lodepng_color_mode_cleanup(LodePNGColorMode* info) { - lodepng_palette_clear(info); -} - -unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) { - lodepng_color_mode_cleanup(dest); - lodepng_memcpy(dest, source, sizeof(LodePNGColorMode)); - if(source->palette) { - dest->palette = (unsigned char*)lodepng_malloc(1024); - if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ - lodepng_memcpy(dest->palette, source->palette, source->palettesize * 4); - } - return 0; -} - -LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth) { - LodePNGColorMode result; - lodepng_color_mode_init(&result); - result.colortype = colortype; - result.bitdepth = bitdepth; - return result; -} - -static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) { - size_t i; - if(a->colortype != b->colortype) return 0; - if(a->bitdepth != b->bitdepth) return 0; - if(a->key_defined != b->key_defined) return 0; - if(a->key_defined) { - if(a->key_r != b->key_r) return 0; - if(a->key_g != b->key_g) return 0; - if(a->key_b != b->key_b) return 0; - } - if(a->palettesize != b->palettesize) return 0; - for(i = 0; i != a->palettesize * 4; ++i) { - if(a->palette[i] != b->palette[i]) return 0; - } - return 1; -} - -void lodepng_palette_clear(LodePNGColorMode* info) { - if(info->palette) lodepng_free(info->palette); - info->palette = 0; - info->palettesize = 0; -} - -unsigned lodepng_palette_add(LodePNGColorMode* info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - if(!info->palette) /*allocate palette if empty*/ { - lodepng_color_mode_alloc_palette(info); - if(!info->palette) return 83; /*alloc fail*/ - } - if(info->palettesize >= 256) { - return 108; /*too many palette values*/ - } - info->palette[4 * info->palettesize + 0] = r; - info->palette[4 * info->palettesize + 1] = g; - info->palette[4 * info->palettesize + 2] = b; - info->palette[4 * info->palettesize + 3] = a; - ++info->palettesize; - return 0; -} - -/*calculate bits per pixel out of colortype and bitdepth*/ -unsigned lodepng_get_bpp(const LodePNGColorMode* info) { - return lodepng_get_bpp_lct(info->colortype, info->bitdepth); -} - -unsigned lodepng_get_channels(const LodePNGColorMode* info) { - return getNumColorChannels(info->colortype); -} - -unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) { - return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; -} - -unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) { - return (info->colortype & 4) != 0; /*4 or 6*/ -} - -unsigned lodepng_is_palette_type(const LodePNGColorMode* info) { - return info->colortype == LCT_PALETTE; -} - -unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) { - size_t i; - for(i = 0; i != info->palettesize; ++i) { - if(info->palette[i * 4 + 3] < 255) return 1; - } - return 0; -} - -unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) { - return info->key_defined - || lodepng_is_alpha_type(info) - || lodepng_has_palette_alpha(info); -} - -static size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { - size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth); - size_t n = (size_t)w * (size_t)h; - return ((n / 8u) * bpp) + ((n & 7u) * bpp + 7u) / 8u; -} - -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) { - return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth); -} - - -#ifdef LODEPNG_COMPILE_PNG - -/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer, -and in addition has one extra byte per line: the filter byte. So this gives a larger -result than lodepng_get_raw_size. Set h to 1 to get the size of 1 row including filter byte. */ -static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, unsigned bpp) { - /* + 1 for the filter byte, and possibly plus padding bits per line. */ - /* Ignoring casts, the expression is equal to (w * bpp + 7) / 8 + 1, but avoids overflow of w * bpp */ - size_t line = ((size_t)(w / 8u) * bpp) + 1u + ((w & 7u) * bpp + 7u) / 8u; - return (size_t)h * line; -} - -#ifdef LODEPNG_COMPILE_DECODER -/*Safely checks whether size_t overflow can be caused due to amount of pixels. -This check is overcautious rather than precise. If this check indicates no overflow, -you can safely compute in a size_t (but not an unsigned): --(size_t)w * (size_t)h * 8 --amount of bytes in IDAT (including filter, padding and Adam7 bytes) --amount of bytes in raw color model -Returns 1 if overflow possible, 0 if not. -*/ -static int lodepng_pixel_overflow(unsigned w, unsigned h, - const LodePNGColorMode* pngcolor, const LodePNGColorMode* rawcolor) { - size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor)); - size_t numpixels, total; - size_t line; /* bytes per line in worst case */ - - if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1; - if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */ - - /* Bytes per scanline with the expression "(w / 8u) * bpp) + ((w & 7u) * bpp + 7u) / 8u" */ - if(lodepng_mulofl((size_t)(w / 8u), bpp, &line)) return 1; - if(lodepng_addofl(line, ((w & 7u) * bpp + 7u) / 8u, &line)) return 1; - - if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */ - if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */ - - return 0; /* no overflow */ -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static void LodePNGUnknownChunks_init(LodePNGInfo* info) { - unsigned i; - for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; - for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; -} - -static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) { - unsigned i; - for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); -} - -static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) { - unsigned i; - - LodePNGUnknownChunks_cleanup(dest); - - for(i = 0; i != 3; ++i) { - size_t j; - dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; - dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); - if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ - for(j = 0; j < src->unknown_chunks_size[i]; ++j) { - dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; - } - } - - return 0; -} - -/******************************************************************************/ - -static void LodePNGText_init(LodePNGInfo* info) { - info->text_num = 0; - info->text_keys = NULL; - info->text_strings = NULL; -} - -static void LodePNGText_cleanup(LodePNGInfo* info) { - size_t i; - for(i = 0; i != info->text_num; ++i) { - string_cleanup(&info->text_keys[i]); - string_cleanup(&info->text_strings[i]); - } - lodepng_free(info->text_keys); - lodepng_free(info->text_strings); -} - -static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) { - size_t i = 0; - dest->text_keys = NULL; - dest->text_strings = NULL; - dest->text_num = 0; - for(i = 0; i != source->text_num; ++i) { - CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); - } - return 0; -} - -static unsigned lodepng_add_text_sized(LodePNGInfo* info, const char* key, const char* str, size_t size) { - char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); - char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); - - if(new_keys) info->text_keys = new_keys; - if(new_strings) info->text_strings = new_strings; - - if(!new_keys || !new_strings) return 83; /*alloc fail*/ - - ++info->text_num; - info->text_keys[info->text_num - 1] = alloc_string(key); - info->text_strings[info->text_num - 1] = alloc_string_sized(str, size); - if(!info->text_keys[info->text_num - 1] || !info->text_strings[info->text_num - 1]) return 83; /*alloc fail*/ - - return 0; -} - -unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) { - return lodepng_add_text_sized(info, key, str, lodepng_strlen(str)); -} - -void lodepng_clear_text(LodePNGInfo* info) { - LodePNGText_cleanup(info); -} - -/******************************************************************************/ - -static void LodePNGIText_init(LodePNGInfo* info) { - info->itext_num = 0; - info->itext_keys = NULL; - info->itext_langtags = NULL; - info->itext_transkeys = NULL; - info->itext_strings = NULL; -} - -static void LodePNGIText_cleanup(LodePNGInfo* info) { - size_t i; - for(i = 0; i != info->itext_num; ++i) { - string_cleanup(&info->itext_keys[i]); - string_cleanup(&info->itext_langtags[i]); - string_cleanup(&info->itext_transkeys[i]); - string_cleanup(&info->itext_strings[i]); - } - lodepng_free(info->itext_keys); - lodepng_free(info->itext_langtags); - lodepng_free(info->itext_transkeys); - lodepng_free(info->itext_strings); -} - -static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) { - size_t i = 0; - dest->itext_keys = NULL; - dest->itext_langtags = NULL; - dest->itext_transkeys = NULL; - dest->itext_strings = NULL; - dest->itext_num = 0; - for(i = 0; i != source->itext_num; ++i) { - CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], - source->itext_transkeys[i], source->itext_strings[i])); - } - return 0; -} - -void lodepng_clear_itext(LodePNGInfo* info) { - LodePNGIText_cleanup(info); -} - -static unsigned lodepng_add_itext_sized(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str, size_t size) { - char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); - char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); - char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); - char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); - - if(new_keys) info->itext_keys = new_keys; - if(new_langtags) info->itext_langtags = new_langtags; - if(new_transkeys) info->itext_transkeys = new_transkeys; - if(new_strings) info->itext_strings = new_strings; - - if(!new_keys || !new_langtags || !new_transkeys || !new_strings) return 83; /*alloc fail*/ - - ++info->itext_num; - - info->itext_keys[info->itext_num - 1] = alloc_string(key); - info->itext_langtags[info->itext_num - 1] = alloc_string(langtag); - info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey); - info->itext_strings[info->itext_num - 1] = alloc_string_sized(str, size); - - return 0; -} - -unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str) { - return lodepng_add_itext_sized(info, key, langtag, transkey, str, lodepng_strlen(str)); -} - -/* same as set but does not delete */ -static unsigned lodepng_assign_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) { - if(profile_size == 0) return 100; /*invalid ICC profile size*/ - - info->iccp_name = alloc_string(name); - info->iccp_profile = (unsigned char*)lodepng_malloc(profile_size); - - if(!info->iccp_name || !info->iccp_profile) return 83; /*alloc fail*/ - - lodepng_memcpy(info->iccp_profile, profile, profile_size); - info->iccp_profile_size = profile_size; - - return 0; /*ok*/ -} - -unsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) { - if(info->iccp_name) lodepng_clear_icc(info); - info->iccp_defined = 1; - - return lodepng_assign_icc(info, name, profile, profile_size); -} - -void lodepng_clear_icc(LodePNGInfo* info) { - string_cleanup(&info->iccp_name); - lodepng_free(info->iccp_profile); - info->iccp_profile = NULL; - info->iccp_profile_size = 0; - info->iccp_defined = 0; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -void lodepng_info_init(LodePNGInfo* info) { - lodepng_color_mode_init(&info->color); - info->interlace_method = 0; - info->compression_method = 0; - info->filter_method = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - info->background_defined = 0; - info->background_r = info->background_g = info->background_b = 0; - - LodePNGText_init(info); - LodePNGIText_init(info); - - info->time_defined = 0; - info->phys_defined = 0; - - info->gama_defined = 0; - info->chrm_defined = 0; - info->srgb_defined = 0; - info->iccp_defined = 0; - info->iccp_name = NULL; - info->iccp_profile = NULL; - - info->sbit_defined = 0; - info->sbit_r = info->sbit_g = info->sbit_b = info->sbit_a = 0; - - LodePNGUnknownChunks_init(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -void lodepng_info_cleanup(LodePNGInfo* info) { - lodepng_color_mode_cleanup(&info->color); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - LodePNGText_cleanup(info); - LodePNGIText_cleanup(info); - - lodepng_clear_icc(info); - - LodePNGUnknownChunks_cleanup(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) { - lodepng_info_cleanup(dest); - lodepng_memcpy(dest, source, sizeof(LodePNGInfo)); - lodepng_color_mode_init(&dest->color); - CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); - CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); - if(source->iccp_defined) { - CERROR_TRY_RETURN(lodepng_assign_icc(dest, source->iccp_name, source->iccp_profile, source->iccp_profile_size)); - } - - LodePNGUnknownChunks_init(dest); - CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - return 0; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ -static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) { - unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ - /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ - unsigned p = index & m; - in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ - in = in << (bits * (m - p)); - if(p == 0) out[index * bits / 8u] = in; - else out[index * bits / 8u] |= in; -} - -typedef struct ColorTree ColorTree; - -/* -One node of a color tree -This is the data structure used to count the number of unique colors and to get a palette -index for a color. It's like an octree, but because the alpha channel is used too, each -node has 16 instead of 8 children. -*/ -struct ColorTree { - ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/ - int index; /*the payload. Only has a meaningful value if this is in the last level*/ -}; - -static void color_tree_init(ColorTree* tree) { - lodepng_memset(tree->children, 0, 16 * sizeof(*tree->children)); - tree->index = -1; -} - -static void color_tree_cleanup(ColorTree* tree) { - int i; - for(i = 0; i != 16; ++i) { - if(tree->children[i]) { - color_tree_cleanup(tree->children[i]); - lodepng_free(tree->children[i]); - } - } -} - -/*returns -1 if color not present, its index otherwise*/ -static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - int bit = 0; - for(bit = 0; bit < 8; ++bit) { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) return -1; - else tree = tree->children[i]; - } - return tree ? tree->index : -1; -} - -#ifdef LODEPNG_COMPILE_ENCODER -static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - return color_tree_get(tree, r, g, b, a) >= 0; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*color is not allowed to already exist. -Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist") -Returns error code, or 0 if ok*/ -static unsigned color_tree_add(ColorTree* tree, - unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) { - int bit; - for(bit = 0; bit < 8; ++bit) { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) { - tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree)); - if(!tree->children[i]) return 83; /*alloc fail*/ - color_tree_init(tree->children[i]); - } - tree = tree->children[i]; - } - tree->index = (int)index; - return 0; -} - -/*put a pixel, given its RGBA color, into image of any color type*/ -static unsigned rgba8ToPixel(unsigned char* out, size_t i, - const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - if(mode->colortype == LCT_GREY) { - unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ - if(mode->bitdepth == 8) out[i] = gray; - else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = gray; - else { - /*take the most significant bits of gray*/ - gray = ((unsigned)gray >> (8u - mode->bitdepth)) & ((1u << mode->bitdepth) - 1u); - addColorBits(out, i, mode->bitdepth, gray); - } - } else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - out[i * 3 + 0] = r; - out[i * 3 + 1] = g; - out[i * 3 + 2] = b; - } else { - out[i * 6 + 0] = out[i * 6 + 1] = r; - out[i * 6 + 2] = out[i * 6 + 3] = g; - out[i * 6 + 4] = out[i * 6 + 5] = b; - } - } else if(mode->colortype == LCT_PALETTE) { - int index = color_tree_get(tree, r, g, b, a); - if(index < 0) return 82; /*color not in palette*/ - if(mode->bitdepth == 8) out[i] = index; - else addColorBits(out, i, mode->bitdepth, (unsigned)index); - } else if(mode->colortype == LCT_GREY_ALPHA) { - unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ - if(mode->bitdepth == 8) { - out[i * 2 + 0] = gray; - out[i * 2 + 1] = a; - } else if(mode->bitdepth == 16) { - out[i * 4 + 0] = out[i * 4 + 1] = gray; - out[i * 4 + 2] = out[i * 4 + 3] = a; - } - } else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - out[i * 4 + 0] = r; - out[i * 4 + 1] = g; - out[i * 4 + 2] = b; - out[i * 4 + 3] = a; - } else { - out[i * 8 + 0] = out[i * 8 + 1] = r; - out[i * 8 + 2] = out[i * 8 + 3] = g; - out[i * 8 + 4] = out[i * 8 + 5] = b; - out[i * 8 + 6] = out[i * 8 + 7] = a; - } - } - - return 0; /*no error*/ -} - -/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ -static void rgba16ToPixel(unsigned char* out, size_t i, - const LodePNGColorMode* mode, - unsigned short r, unsigned short g, unsigned short b, unsigned short a) { - if(mode->colortype == LCT_GREY) { - unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ - out[i * 2 + 0] = (gray >> 8) & 255; - out[i * 2 + 1] = gray & 255; - } else if(mode->colortype == LCT_RGB) { - out[i * 6 + 0] = (r >> 8) & 255; - out[i * 6 + 1] = r & 255; - out[i * 6 + 2] = (g >> 8) & 255; - out[i * 6 + 3] = g & 255; - out[i * 6 + 4] = (b >> 8) & 255; - out[i * 6 + 5] = b & 255; - } else if(mode->colortype == LCT_GREY_ALPHA) { - unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ - out[i * 4 + 0] = (gray >> 8) & 255; - out[i * 4 + 1] = gray & 255; - out[i * 4 + 2] = (a >> 8) & 255; - out[i * 4 + 3] = a & 255; - } else if(mode->colortype == LCT_RGBA) { - out[i * 8 + 0] = (r >> 8) & 255; - out[i * 8 + 1] = r & 255; - out[i * 8 + 2] = (g >> 8) & 255; - out[i * 8 + 3] = g & 255; - out[i * 8 + 4] = (b >> 8) & 255; - out[i * 8 + 5] = b & 255; - out[i * 8 + 6] = (a >> 8) & 255; - out[i * 8 + 7] = a & 255; - } -} - -/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ -static void getPixelColorRGBA8(unsigned char* r, unsigned char* g, - unsigned char* b, unsigned char* a, - const unsigned char* in, size_t i, - const LodePNGColorMode* mode) { - if(mode->colortype == LCT_GREY) { - if(mode->bitdepth == 8) { - *r = *g = *b = in[i]; - if(mode->key_defined && *r == mode->key_r) *a = 0; - else *a = 255; - } else if(mode->bitdepth == 16) { - *r = *g = *b = in[i * 2 + 0]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 255; - } else { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = i * mode->bitdepth; - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - *r = *g = *b = (value * 255) / highest; - if(mode->key_defined && value == mode->key_r) *a = 0; - else *a = 255; - } - } else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; - if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; - else *a = 255; - } else { - *r = in[i * 6 + 0]; - *g = in[i * 6 + 2]; - *b = in[i * 6 + 4]; - if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 255; - } - } else if(mode->colortype == LCT_PALETTE) { - unsigned index; - if(mode->bitdepth == 8) index = in[i]; - else { - size_t j = i * mode->bitdepth; - index = readBitsFromReversedStream(&j, in, mode->bitdepth); - } - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - *r = mode->palette[index * 4 + 0]; - *g = mode->palette[index * 4 + 1]; - *b = mode->palette[index * 4 + 2]; - *a = mode->palette[index * 4 + 3]; - } else if(mode->colortype == LCT_GREY_ALPHA) { - if(mode->bitdepth == 8) { - *r = *g = *b = in[i * 2 + 0]; - *a = in[i * 2 + 1]; - } else { - *r = *g = *b = in[i * 4 + 0]; - *a = in[i * 4 + 2]; - } - } else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - *r = in[i * 4 + 0]; - *g = in[i * 4 + 1]; - *b = in[i * 4 + 2]; - *a = in[i * 4 + 3]; - } else { - *r = in[i * 8 + 0]; - *g = in[i * 8 + 2]; - *b = in[i * 8 + 4]; - *a = in[i * 8 + 6]; - } - } -} - -/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color -mode test cases, optimized to convert the colors much faster, when converting -to the common case of RGBA with 8 bit per channel. buffer must be RGBA with -enough memory.*/ -static void getPixelColorsRGBA8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels, - const unsigned char* LODEPNG_RESTRICT in, - const LodePNGColorMode* mode) { - unsigned num_channels = 4; - size_t i; - if(mode->colortype == LCT_GREY) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i]; - buffer[3] = 255; - } - if(mode->key_defined) { - buffer -= numpixels * num_channels; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - if(buffer[0] == mode->key_r) buffer[3] = 0; - } - } - } else if(mode->bitdepth == 16) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2]; - buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; - } - } else { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; - buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; - } - } - } else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - lodepng_memcpy(buffer, &in[i * 3], 3); - buffer[3] = 255; - } - if(mode->key_defined) { - buffer -= numpixels * num_channels; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - if(buffer[0] == mode->key_r && buffer[1]== mode->key_g && buffer[2] == mode->key_b) buffer[3] = 0; - } - } - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 6 + 0]; - buffer[1] = in[i * 6 + 2]; - buffer[2] = in[i * 6 + 4]; - buffer[3] = mode->key_defined - && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; - } - } - } else if(mode->colortype == LCT_PALETTE) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = in[i]; - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 4); - } - } else { - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 4); - } - } - } else if(mode->colortype == LCT_GREY_ALPHA) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; - buffer[3] = in[i * 2 + 1]; - } - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; - buffer[3] = in[i * 4 + 2]; - } - } - } else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - lodepng_memcpy(buffer, in, numpixels * 4); - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 8 + 0]; - buffer[1] = in[i * 8 + 2]; - buffer[2] = in[i * 8 + 4]; - buffer[3] = in[i * 8 + 6]; - } - } - } -} - -/*Similar to getPixelColorsRGBA8, but with 3-channel RGB output.*/ -static void getPixelColorsRGB8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels, - const unsigned char* LODEPNG_RESTRICT in, - const LodePNGColorMode* mode) { - const unsigned num_channels = 3; - size_t i; - if(mode->colortype == LCT_GREY) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i]; - } - } else if(mode->bitdepth == 16) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2]; - } - } else { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; - } - } - } else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - lodepng_memcpy(buffer, in, numpixels * 3); - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 6 + 0]; - buffer[1] = in[i * 6 + 2]; - buffer[2] = in[i * 6 + 4]; - } - } - } else if(mode->colortype == LCT_PALETTE) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = in[i]; - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 3); - } - } else { - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 3); - } - } - } else if(mode->colortype == LCT_GREY_ALPHA) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; - } - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; - } - } - } else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - lodepng_memcpy(buffer, &in[i * 4], 3); - } - } else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 8 + 0]; - buffer[1] = in[i * 8 + 2]; - buffer[2] = in[i * 8 + 4]; - } - } - } -} - -/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with -given color type, but the given color type must be 16-bit itself.*/ -static void getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, - const unsigned char* in, size_t i, const LodePNGColorMode* mode) { - if(mode->colortype == LCT_GREY) { - *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 65535; - } else if(mode->colortype == LCT_RGB) { - *r = 256u * in[i * 6 + 0] + in[i * 6 + 1]; - *g = 256u * in[i * 6 + 2] + in[i * 6 + 3]; - *b = 256u * in[i * 6 + 4] + in[i * 6 + 5]; - if(mode->key_defined - && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 65535; - } else if(mode->colortype == LCT_GREY_ALPHA) { - *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1]; - *a = 256u * in[i * 4 + 2] + in[i * 4 + 3]; - } else if(mode->colortype == LCT_RGBA) { - *r = 256u * in[i * 8 + 0] + in[i * 8 + 1]; - *g = 256u * in[i * 8 + 2] + in[i * 8 + 3]; - *b = 256u * in[i * 8 + 4] + in[i * 8 + 5]; - *a = 256u * in[i * 8 + 6] + in[i * 8 + 7]; - } -} - -unsigned lodepng_convert(unsigned char* out, const unsigned char* in, - const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, - unsigned w, unsigned h) { - size_t i; - ColorTree tree; - size_t numpixels = (size_t)w * (size_t)h; - unsigned error = 0; - - if(mode_in->colortype == LCT_PALETTE && !mode_in->palette) { - return 107; /* error: must provide palette if input mode is palette */ - } - - if(lodepng_color_mode_equal(mode_out, mode_in)) { - size_t numbytes = lodepng_get_raw_size(w, h, mode_in); - lodepng_memcpy(out, in, numbytes); - return 0; - } - - if(mode_out->colortype == LCT_PALETTE) { - size_t palettesize = mode_out->palettesize; - const unsigned char* palette = mode_out->palette; - size_t palsize = (size_t)1u << mode_out->bitdepth; - /*if the user specified output palette but did not give the values, assume - they want the values of the input color type (assuming that one is palette). - Note that we never create a new palette ourselves.*/ - if(palettesize == 0) { - palettesize = mode_in->palettesize; - palette = mode_in->palette; - /*if the input was also palette with same bitdepth, then the color types are also - equal, so copy literally. This to preserve the exact indices that were in the PNG - even in case there are duplicate colors in the palette.*/ - if(mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) { - size_t numbytes = lodepng_get_raw_size(w, h, mode_in); - lodepng_memcpy(out, in, numbytes); - return 0; - } - } - if(palettesize < palsize) palsize = palettesize; - color_tree_init(&tree); - for(i = 0; i != palsize; ++i) { - const unsigned char* p = &palette[i * 4]; - error = color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i); - if(error) break; - } - } - - if(!error) { - if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) { - for(i = 0; i != numpixels; ++i) { - unsigned short r = 0, g = 0, b = 0, a = 0; - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - rgba16ToPixel(out, i, mode_out, r, g, b, a); - } - } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) { - getPixelColorsRGBA8(out, numpixels, in, mode_in); - } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) { - getPixelColorsRGB8(out, numpixels, in, mode_in); - } else { - unsigned char r = 0, g = 0, b = 0, a = 0; - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); - error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); - if(error) break; - } - } - } - - if(mode_out->colortype == LCT_PALETTE) { - color_tree_cleanup(&tree); - } - - return error; -} - - -/* Converts a single rgb color without alpha from one type to another, color bits truncated to -their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow -function, do not use to process all pixels of an image. Alpha channel not supported on purpose: -this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the -specification it looks like bKGD should ignore the alpha values of the palette since it can use -any palette index but doesn't have an alpha channel. Idem with ignoring color key. */ -unsigned lodepng_convert_rgb( - unsigned* r_out, unsigned* g_out, unsigned* b_out, - unsigned r_in, unsigned g_in, unsigned b_in, - const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in) { - unsigned r = 0, g = 0, b = 0; - unsigned mul = 65535 / ((1u << mode_in->bitdepth) - 1u); /*65535, 21845, 4369, 257, 1*/ - unsigned shift = 16 - mode_out->bitdepth; - - if(mode_in->colortype == LCT_GREY || mode_in->colortype == LCT_GREY_ALPHA) { - r = g = b = r_in * mul; - } else if(mode_in->colortype == LCT_RGB || mode_in->colortype == LCT_RGBA) { - r = r_in * mul; - g = g_in * mul; - b = b_in * mul; - } else if(mode_in->colortype == LCT_PALETTE) { - if(r_in >= mode_in->palettesize) return 82; - r = mode_in->palette[r_in * 4 + 0] * 257u; - g = mode_in->palette[r_in * 4 + 1] * 257u; - b = mode_in->palette[r_in * 4 + 2] * 257u; - } else { - return 31; - } - - /* now convert to output format */ - if(mode_out->colortype == LCT_GREY || mode_out->colortype == LCT_GREY_ALPHA) { - *r_out = r >> shift ; - } else if(mode_out->colortype == LCT_RGB || mode_out->colortype == LCT_RGBA) { - *r_out = r >> shift ; - *g_out = g >> shift ; - *b_out = b >> shift ; - } else if(mode_out->colortype == LCT_PALETTE) { - unsigned i; - /* a 16-bit color cannot be in the palette */ - if((r >> 8) != (r & 255) || (g >> 8) != (g & 255) || (b >> 8) != (b & 255)) return 82; - for(i = 0; i < mode_out->palettesize; i++) { - unsigned j = i * 4; - if((r >> 8) == mode_out->palette[j + 0] && (g >> 8) == mode_out->palette[j + 1] && - (b >> 8) == mode_out->palette[j + 2]) { - *r_out = i; - return 0; - } - } - return 82; - } else { - return 31; - } - - return 0; -} - -#ifdef LODEPNG_COMPILE_ENCODER - -void lodepng_color_stats_init(LodePNGColorStats* stats) { - /*stats*/ - stats->colored = 0; - stats->key = 0; - stats->key_r = stats->key_g = stats->key_b = 0; - stats->alpha = 0; - stats->numcolors = 0; - stats->bits = 1; - stats->numpixels = 0; - /*settings*/ - stats->allow_palette = 1; - stats->allow_greyscale = 1; -} - -/*function used for debug purposes with C++*/ -/*void printColorStats(LodePNGColorStats* p) { - std::cout << "colored: " << (int)p->colored << ", "; - std::cout << "key: " << (int)p->key << ", "; - std::cout << "key_r: " << (int)p->key_r << ", "; - std::cout << "key_g: " << (int)p->key_g << ", "; - std::cout << "key_b: " << (int)p->key_b << ", "; - std::cout << "alpha: " << (int)p->alpha << ", "; - std::cout << "numcolors: " << (int)p->numcolors << ", "; - std::cout << "bits: " << (int)p->bits << std::endl; -}*/ - -/*Returns how many bits needed to represent given value (max 8 bit)*/ -static unsigned getValueRequiredBits(unsigned char value) { - if(value == 0 || value == 255) return 1; - /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ - if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; - return 8; -} - -/*stats must already have been inited. */ -unsigned lodepng_compute_color_stats(LodePNGColorStats* stats, - const unsigned char* in, unsigned w, unsigned h, - const LodePNGColorMode* mode_in) { - size_t i; - ColorTree tree; - size_t numpixels = (size_t)w * (size_t)h; - unsigned error = 0; - - /* mark things as done already if it would be impossible to have a more expensive case */ - unsigned colored_done = lodepng_is_greyscale_type(mode_in) ? 1 : 0; - unsigned alpha_done = lodepng_can_have_alpha(mode_in) ? 0 : 1; - unsigned numcolors_done = 0; - unsigned bpp = lodepng_get_bpp(mode_in); - unsigned bits_done = (stats->bits == 1 && bpp == 1) ? 1 : 0; - unsigned sixteen = 0; /* whether the input image is 16 bit */ - unsigned maxnumcolors = 257; - if(bpp <= 8) maxnumcolors = LODEPNG_MIN(257, stats->numcolors + (1u << bpp)); - - stats->numpixels += numpixels; - - /*if palette not allowed, no need to compute numcolors*/ - if(!stats->allow_palette) numcolors_done = 1; - - color_tree_init(&tree); - - /*If the stats was already filled in from previous data, fill its palette in tree - and mark things as done already if we know they are the most expensive case already*/ - if(stats->alpha) alpha_done = 1; - if(stats->colored) colored_done = 1; - if(stats->bits == 16) numcolors_done = 1; - if(stats->bits >= bpp) bits_done = 1; - if(stats->numcolors >= maxnumcolors) numcolors_done = 1; - - if(!numcolors_done) { - for(i = 0; i < stats->numcolors; i++) { - const unsigned char* color = &stats->palette[i * 4]; - error = color_tree_add(&tree, color[0], color[1], color[2], color[3], i); - if(error) goto cleanup; - } - } - - /*Check if the 16-bit input is truly 16-bit*/ - if(mode_in->bitdepth == 16 && !sixteen) { - unsigned short r = 0, g = 0, b = 0, a = 0; - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || - (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) /*first and second byte differ*/ { - stats->bits = 16; - sixteen = 1; - bits_done = 1; - numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ - break; - } - } - } - - if(sixteen) { - unsigned short r = 0, g = 0, b = 0, a = 0; - - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - - if(!colored_done && (r != g || r != b)) { - stats->colored = 1; - colored_done = 1; - } - - if(!alpha_done) { - unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); - if(a != 65535 && (a != 0 || (stats->key && !matchkey))) { - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - } else if(a == 0 && !stats->alpha && !stats->key) { - stats->key = 1; - stats->key_r = r; - stats->key_g = g; - stats->key_b = b; - } else if(a == 65535 && stats->key && matchkey) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - } - } - if(alpha_done && numcolors_done && colored_done && bits_done) break; - } - - if(stats->key && !stats->alpha) { - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - } - } - } - } else /* < 16-bit */ { - unsigned char r = 0, g = 0, b = 0, a = 0; - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); - - if(!bits_done && stats->bits < 8) { - /*only r is checked, < 8 bits is only relevant for grayscale*/ - unsigned bits = getValueRequiredBits(r); - if(bits > stats->bits) stats->bits = bits; - } - bits_done = (stats->bits >= bpp); - - if(!colored_done && (r != g || r != b)) { - stats->colored = 1; - colored_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ - } - - if(!alpha_done) { - unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); - if(a != 255 && (a != 0 || (stats->key && !matchkey))) { - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } else if(a == 0 && !stats->alpha && !stats->key) { - stats->key = 1; - stats->key_r = r; - stats->key_g = g; - stats->key_b = b; - } else if(a == 255 && stats->key && matchkey) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - } - - if(!numcolors_done) { - if(!color_tree_has(&tree, r, g, b, a)) { - error = color_tree_add(&tree, r, g, b, a, stats->numcolors); - if(error) goto cleanup; - if(stats->numcolors < 256) { - unsigned char* p = stats->palette; - unsigned n = stats->numcolors; - p[n * 4 + 0] = r; - p[n * 4 + 1] = g; - p[n * 4 + 2] = b; - p[n * 4 + 3] = a; - } - ++stats->numcolors; - numcolors_done = stats->numcolors >= maxnumcolors; - } - } - - if(alpha_done && numcolors_done && colored_done && bits_done) break; - } - - if(stats->key && !stats->alpha) { - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); - if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - } - } - - /*make the stats's key always 16-bit for consistency - repeat each byte twice*/ - stats->key_r += (stats->key_r << 8); - stats->key_g += (stats->key_g << 8); - stats->key_b += (stats->key_b << 8); - } - -cleanup: - color_tree_cleanup(&tree); - return error; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*Adds a single color to the color stats. The stats must already have been inited. The color must be given as 16-bit -(with 2 bytes repeating for 8-bit and 65535 for opaque alpha channel). This function is expensive, do not call it for -all pixels of an image but only for a few additional values. */ -static unsigned lodepng_color_stats_add(LodePNGColorStats* stats, - unsigned r, unsigned g, unsigned b, unsigned a) { - unsigned error = 0; - unsigned char image[8]; - LodePNGColorMode mode; - lodepng_color_mode_init(&mode); - image[0] = r >> 8; image[1] = r; image[2] = g >> 8; image[3] = g; - image[4] = b >> 8; image[5] = b; image[6] = a >> 8; image[7] = a; - mode.bitdepth = 16; - mode.colortype = LCT_RGBA; - error = lodepng_compute_color_stats(stats, image, 1, 1, &mode); - lodepng_color_mode_cleanup(&mode); - return error; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*Computes a minimal PNG color model that can contain all colors as indicated by the stats. -The stats should be computed with lodepng_compute_color_stats. -mode_in is raw color profile of the image the stats were computed on, to copy palette order from when relevant. -Minimal PNG color model means the color type and bit depth that gives smallest amount of bits in the output image, -e.g. gray if only grayscale pixels, palette if less than 256 colors, color key if only single transparent color, ... -This is used if auto_convert is enabled (it is by default). -*/ -static unsigned auto_choose_color(LodePNGColorMode* mode_out, - const LodePNGColorMode* mode_in, - const LodePNGColorStats* stats) { - unsigned error = 0; - unsigned palettebits; - size_t i, n; - size_t numpixels = stats->numpixels; - unsigned palette_ok, gray_ok; - - unsigned alpha = stats->alpha; - unsigned key = stats->key; - unsigned bits = stats->bits; - - mode_out->key_defined = 0; - - if(key && numpixels <= 16) { - alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ - key = 0; - if(bits < 8) bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - - gray_ok = !stats->colored; - if(!stats->allow_greyscale) gray_ok = 0; - if(!gray_ok && bits < 8) bits = 8; - - n = stats->numcolors; - palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); - palette_ok = n <= 256 && bits <= 8 && n != 0; /*n==0 means likely numcolors wasn't computed*/ - if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ - if(gray_ok && !alpha && bits <= palettebits) palette_ok = 0; /*gray is less overhead*/ - if(!stats->allow_palette) palette_ok = 0; - - if(palette_ok) { - const unsigned char* p = stats->palette; - lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ - for(i = 0; i != stats->numcolors; ++i) { - error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); - if(error) break; - } - - mode_out->colortype = LCT_PALETTE; - mode_out->bitdepth = palettebits; - - if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize - && mode_in->bitdepth == mode_out->bitdepth) { - /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ - lodepng_color_mode_cleanup(mode_out); /*clears palette, keeps the above set colortype and bitdepth fields as-is*/ - lodepng_color_mode_copy(mode_out, mode_in); - } - } else /*8-bit or 16-bit per channel*/ { - mode_out->bitdepth = bits; - mode_out->colortype = alpha ? (gray_ok ? LCT_GREY_ALPHA : LCT_RGBA) - : (gray_ok ? LCT_GREY : LCT_RGB); - if(key) { - unsigned mask = (1u << mode_out->bitdepth) - 1u; /*stats always uses 16-bit, mask converts it*/ - mode_out->key_r = stats->key_r & mask; - mode_out->key_g = stats->key_g & mask; - mode_out->key_b = stats->key_b & mask; - mode_out->key_defined = 1; - } - } - - return error; -} - -#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ - -/*Paeth predictor, used by PNG filter type 4*/ -static unsigned char paethPredictor(unsigned char a, unsigned char b, unsigned char c) { - /* the subtractions of unsigned char cast it to a signed type. - With gcc, short is faster than int, with clang int is as fast (as of april 2023)*/ - short pa = (b - c) < 0 ? -(b - c) : (b - c); - short pb = (a - c) < 0 ? -(a - c) : (a - c); - /* writing it out like this compiles to something faster than introducing a temp variable*/ - short pc = (a + b - c - c) < 0 ? -(a + b - c - c) : (a + b - c - c); - /* return input value associated with smallest of pa, pb, pc (with certain priority if equal) */ - if(pb < pa) { a = b; pa = pb; } - return (pc < pa) ? c : a; -} - -/*shared values used by multiple Adam7 related functions*/ - -static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ -static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ -static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ -static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ - -/* -Outputs various dimensions and positions in the image related to the Adam7 reduced images. -passw: output containing the width of the 7 passes -passh: output containing the height of the 7 passes -filter_passstart: output containing the index of the start and end of each - reduced image with filter bytes -padded_passstart output containing the index of the start and end of each - reduced image when without filter bytes but with padded scanlines -passstart: output containing the index of the start and end of each reduced - image without padding between scanlines, but still padding between the images -w, h: width and height of non-interlaced image -bpp: bits per pixel -"padded" is only relevant if bpp is less than 8 and a scanline or image does not - end at a full byte -*/ -static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], - size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) { - /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ - unsigned i; - - /*calculate width and height in pixels of each pass*/ - for(i = 0; i != 7; ++i) { - passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; - passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; - if(passw[i] == 0) passh[i] = 0; - if(passh[i] == 0) passw[i] = 0; - } - - filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; - for(i = 0; i != 7; ++i) { - /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ - filter_passstart[i + 1] = filter_passstart[i] - + ((passw[i] && passh[i]) ? passh[i] * (1u + (passw[i] * bpp + 7u) / 8u) : 0); - /*bits padded if needed to fill full byte at end of each scanline*/ - padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7u) / 8u); - /*only padded at end of reduced image*/ - passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7u) / 8u; - } -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Decoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*read the information from the header and store it in the LodePNGInfo. return value is error*/ -unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, - const unsigned char* in, size_t insize) { - unsigned width, height; - LodePNGInfo* info = &state->info_png; - if(insize == 0 || in == 0) { - CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ - } - if(insize < 33) { - CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ - } - - /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ - /* TODO: remove this. One should use a new LodePNGState for new sessions */ - lodepng_info_cleanup(info); - lodepng_info_init(info); - - if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 - || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) { - CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ - } - if(lodepng_chunk_length(in + 8) != 13) { - CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/ - } - if(!lodepng_chunk_type_equals(in + 8, "IHDR")) { - CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ - } - - /*read the values given in the header*/ - width = lodepng_read32bitInt(&in[16]); - height = lodepng_read32bitInt(&in[20]); - /*TODO: remove the undocumented feature that allows to give null pointers to width or height*/ - if(w) *w = width; - if(h) *h = height; - info->color.bitdepth = in[24]; - info->color.colortype = (LodePNGColorType)in[25]; - info->compression_method = in[26]; - info->filter_method = in[27]; - info->interlace_method = in[28]; - - /*errors returned only after the parsing so other values are still output*/ - - /*error: invalid image size*/ - if(width == 0 || height == 0) CERROR_RETURN_ERROR(state->error, 93); - /*error: invalid colortype or bitdepth combination*/ - state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); - if(state->error) return state->error; - /*error: only compression method 0 is allowed in the specification*/ - if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); - /*error: only filter method 0 is allowed in the specification*/ - if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); - /*error: only interlace methods 0 and 1 exist in the specification*/ - if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); - - if(!state->decoder.ignore_crc) { - unsigned CRC = lodepng_read32bitInt(&in[29]); - unsigned checksum = lodepng_crc32(&in[12], 17); - if(CRC != checksum) { - CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ - } - } - - return state->error; -} - -static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, - size_t bytewidth, unsigned char filterType, size_t length) { - /* - For PNG filter method 0 - unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, - the filter works byte per byte (bytewidth = 1) - precon is the previous unfiltered scanline, recon the result, scanline the current one - the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead - recon and scanline MAY be the same memory address! precon must be disjoint. - */ - - size_t i; - switch(filterType) { - case 0: - for(i = 0; i != length; ++i) recon[i] = scanline[i]; - break; - case 1: { - size_t j = 0; - for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; - for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + recon[j]; - break; - } - case 2: - if(precon) { - for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; - } else { - for(i = 0; i != length; ++i) recon[i] = scanline[i]; - } - break; - case 3: - if(precon) { - size_t j = 0; - for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u); - /* Unroll independent paths of this predictor. A 6x and 8x version is also possible but that adds - too much code. Whether this speeds up anything depends on compiler and settings. */ - if(bytewidth >= 4) { - for(; i + 3 < length; i += 4, j += 4) { - unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2], s3 = scanline[i + 3]; - unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2], r3 = recon[j + 3]; - unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2], p3 = precon[i + 3]; - recon[i + 0] = s0 + ((r0 + p0) >> 1u); - recon[i + 1] = s1 + ((r1 + p1) >> 1u); - recon[i + 2] = s2 + ((r2 + p2) >> 1u); - recon[i + 3] = s3 + ((r3 + p3) >> 1u); - } - } else if(bytewidth >= 3) { - for(; i + 2 < length; i += 3, j += 3) { - unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2]; - unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2]; - unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2]; - recon[i + 0] = s0 + ((r0 + p0) >> 1u); - recon[i + 1] = s1 + ((r1 + p1) >> 1u); - recon[i + 2] = s2 + ((r2 + p2) >> 1u); - } - } else if(bytewidth >= 2) { - for(; i + 1 < length; i += 2, j += 2) { - unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1]; - unsigned char r0 = recon[j + 0], r1 = recon[j + 1]; - unsigned char p0 = precon[i + 0], p1 = precon[i + 1]; - recon[i + 0] = s0 + ((r0 + p0) >> 1u); - recon[i + 1] = s1 + ((r1 + p1) >> 1u); - } - } - for(; i != length; ++i, ++j) recon[i] = scanline[i] + ((recon[j] + precon[i]) >> 1u); - } else { - size_t j = 0; - for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; - for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + (recon[j] >> 1u); - } - break; - case 4: - if(precon) { - /* Unroll independent paths of this predictor. Whether this speeds up - anything depends on compiler and settings. */ - if(bytewidth == 8) { - unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0; - unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0; - unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0; - unsigned char a6, b6 = 0, c6, d6 = 0, a7, b7 = 0, c7, d7 = 0; - for(i = 0; i + 7 < length; i += 8) { - c0 = b0; c1 = b1; c2 = b2; c3 = b3; - c4 = b4; c5 = b5; c6 = b6; c7 = b7; - b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2]; b3 = precon[i + 3]; - b4 = precon[i + 4]; b5 = precon[i + 5]; b6 = precon[i + 6]; b7 = precon[i + 7]; - a0 = d0; a1 = d1; a2 = d2; a3 = d3; - a4 = d4; a5 = d5; a6 = d6; a7 = d7; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); - d3 = scanline[i + 3] + paethPredictor(a3, b3, c3); - d4 = scanline[i + 4] + paethPredictor(a4, b4, c4); - d5 = scanline[i + 5] + paethPredictor(a5, b5, c5); - d6 = scanline[i + 6] + paethPredictor(a6, b6, c6); - d7 = scanline[i + 7] + paethPredictor(a7, b7, c7); - recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2; recon[i + 3] = d3; - recon[i + 4] = d4; recon[i + 5] = d5; recon[i + 6] = d6; recon[i + 7] = d7; - } - } else if(bytewidth == 6) { - unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0; - unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0; - unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0; - for(i = 0; i + 5 < length; i += 6) { - c0 = b0; c1 = b1; c2 = b2; - c3 = b3; c4 = b4; c5 = b5; - b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2]; - b3 = precon[i + 3]; b4 = precon[i + 4]; b5 = precon[i + 5]; - a0 = d0; a1 = d1; a2 = d2; - a3 = d3; a4 = d4; a5 = d5; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); - d3 = scanline[i + 3] + paethPredictor(a3, b3, c3); - d4 = scanline[i + 4] + paethPredictor(a4, b4, c4); - d5 = scanline[i + 5] + paethPredictor(a5, b5, c5); - recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2; - recon[i + 3] = d3; recon[i + 4] = d4; recon[i + 5] = d5; - } - } else if(bytewidth == 4) { - unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0; - unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0; - for(i = 0; i + 3 < length; i += 4) { - c0 = b0; c1 = b1; c2 = b2; c3 = b3; - b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2]; b3 = precon[i + 3]; - a0 = d0; a1 = d1; a2 = d2; a3 = d3; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); - d3 = scanline[i + 3] + paethPredictor(a3, b3, c3); - recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2; recon[i + 3] = d3; - } - } else if(bytewidth == 3) { - unsigned char a0, b0 = 0, c0, d0 = 0; - unsigned char a1, b1 = 0, c1, d1 = 0; - unsigned char a2, b2 = 0, c2, d2 = 0; - for(i = 0; i + 2 < length; i += 3) { - c0 = b0; c1 = b1; c2 = b2; - b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2]; - a0 = d0; a1 = d1; a2 = d2; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); - recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2; - } - } else if(bytewidth == 2) { - unsigned char a0, b0 = 0, c0, d0 = 0; - unsigned char a1, b1 = 0, c1, d1 = 0; - for(i = 0; i + 1 < length; i += 2) { - c0 = b0; c1 = b1; - b0 = precon[i + 0]; - b1 = precon[i + 1]; - a0 = d0; a1 = d1; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - recon[i + 0] = d0; - recon[i + 1] = d1; - } - } else if(bytewidth == 1) { - unsigned char a, b = 0, c, d = 0; - for(i = 0; i != length; ++i) { - c = b; - b = precon[i]; - a = d; - d = scanline[i] + paethPredictor(a, b, c); - recon[i] = d; - } - } else { - /* Normally not a possible case, but this would handle it correctly */ - for(i = 0; i != bytewidth; ++i) { - recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ - } - } - /* finish any remaining bytes */ - for(; i != length; ++i) { - recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); - } - } else { - size_t j = 0; - for(i = 0; i != bytewidth; ++i) { - recon[i] = scanline[i]; - } - for(i = bytewidth; i != length; ++i, ++j) { - /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ - recon[i] = (scanline[i] + recon[j]); - } - } - break; - default: return 36; /*error: invalid filter type given*/ - } - return 0; -} - -static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { - /* - For PNG filter method 0 - this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) - out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline - w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel - in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) - */ - - unsigned y; - unsigned char* prevline = 0; - - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7u) / 8u; - /*the width of a scanline in bytes, not including the filter type*/ - size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; - - for(y = 0; y < h; ++y) { - size_t outindex = linebytes * y; - size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - unsigned char filterType = in[inindex]; - - CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); - - prevline = &out[outindex]; - } - - return 0; -} - -/* -in: Adam7 interlaced image, with no padding bits between scanlines, but between - reduced images so that each reduced image starts at a byte. -out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h -bpp: bits per pixel -out has the following size in bits: w * h * bpp. -in is possibly bigger due to padding bits between reduced images. -out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation -(because that's likely a little bit faster) -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - size_t bytewidth = bpp / 8u; - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; - size_t pixeloutstart = ((ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * (size_t)w - + ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bytewidth; - for(b = 0; b < bytewidth; ++b) { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - obp = (ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bpp; - for(b = 0; b < bpp; ++b) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - } - } - } -} - -static void removePaddingBits(unsigned char* out, const unsigned char* in, - size_t olinebits, size_t ilinebits, unsigned h) { - /* - After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need - to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers - for the Adam7 code, the color convert code and the output to the user. - in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must - have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits - also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 - only useful if (ilinebits - olinebits) is a value in the range 1..7 - */ - unsigned y; - size_t diff = ilinebits - olinebits; - size_t ibp = 0, obp = 0; /*input and output bit pointers*/ - for(y = 0; y < h; ++y) { - size_t x; - for(x = 0; x < olinebits; ++x) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - ibp += diff; - } -} - -/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from -the IDAT chunks (with filter index bytes and possible padding bits) -return value is error*/ -static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, - unsigned w, unsigned h, const LodePNGInfo* info_png) { - /* - This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. - Steps: - *) if no Adam7: 1) unfilter 2) remove padding bits (= possible extra bits per scanline if bpp < 8) - *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace - NOTE: the in buffer will be overwritten with intermediate data! - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - if(bpp == 0) return 31; /*error: invalid colortype*/ - - if(info_png->interlace_method == 0) { - if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { - CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); - removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h); - } - /*we can immediately filter into the out buffer, no other steps needed*/ - else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); - } else /*interlace_method is 1 (Adam7)*/ { - unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - for(i = 0; i != 7; ++i) { - CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); - /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, - move bytes instead of bits or move not at all*/ - if(bpp < 8) { - /*remove padding bits in scanlines; after this there still may be padding - bits between the different reduced images: each reduced image still starts nicely at a byte*/ - removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, - ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]); - } - } - - Adam7_deinterlace(out, in, w, h, bpp); - } - - return 0; -} - -static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) { - unsigned pos = 0, i; - color->palettesize = chunkLength / 3u; - if(color->palettesize == 0 || color->palettesize > 256) return 38; /*error: palette too small or big*/ - lodepng_color_mode_alloc_palette(color); - if(!color->palette && color->palettesize) { - color->palettesize = 0; - return 83; /*alloc fail*/ - } - - for(i = 0; i != color->palettesize; ++i) { - color->palette[4 * i + 0] = data[pos++]; /*R*/ - color->palette[4 * i + 1] = data[pos++]; /*G*/ - color->palette[4 * i + 2] = data[pos++]; /*B*/ - color->palette[4 * i + 3] = 255; /*alpha*/ - } - - return 0; /* OK */ -} - -static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) { - unsigned i; - if(color->colortype == LCT_PALETTE) { - /*error: more alpha values given than there are palette entries*/ - if(chunkLength > color->palettesize) return 39; - - for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; - } else if(color->colortype == LCT_GREY) { - /*error: this chunk must be 2 bytes for grayscale image*/ - if(chunkLength != 2) return 30; - - color->key_defined = 1; - color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; - } else if(color->colortype == LCT_RGB) { - /*error: this chunk must be 6 bytes for RGB image*/ - if(chunkLength != 6) return 41; - - color->key_defined = 1; - color->key_r = 256u * data[0] + data[1]; - color->key_g = 256u * data[2] + data[3]; - color->key_b = 256u * data[4] + data[5]; - } - else return 42; /*error: tRNS chunk not allowed for other color models*/ - - return 0; /* OK */ -} - - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*background color chunk (bKGD)*/ -static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(info->color.colortype == LCT_PALETTE) { - /*error: this chunk must be 1 byte for indexed color image*/ - if(chunkLength != 1) return 43; - - /*error: invalid palette index, or maybe this chunk appeared before PLTE*/ - if(data[0] >= info->color.palettesize) return 103; - - info->background_defined = 1; - info->background_r = info->background_g = info->background_b = data[0]; - } else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { - /*error: this chunk must be 2 bytes for grayscale image*/ - if(chunkLength != 2) return 44; - - /*the values are truncated to bitdepth in the PNG file*/ - info->background_defined = 1; - info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; - } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { - /*error: this chunk must be 6 bytes for grayscale image*/ - if(chunkLength != 6) return 45; - - /*the values are truncated to bitdepth in the PNG file*/ - info->background_defined = 1; - info->background_r = 256u * data[0] + data[1]; - info->background_g = 256u * data[2] + data[3]; - info->background_b = 256u * data[4] + data[5]; - } - - return 0; /* OK */ -} - -/*text chunk (tEXt)*/ -static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - unsigned error = 0; - char *key = 0, *str = 0; - - while(!error) /*not really a while loop, only used to break on error*/ { - unsigned length, string2_begin; - - length = 0; - while(length < chunkLength && data[length] != 0) ++length; - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(key, data, length); - key[length] = 0; - - string2_begin = length + 1; /*skip keyword null terminator*/ - - length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin); - str = (char*)lodepng_malloc(length + 1); - if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(str, data + string2_begin, length); - str[length] = 0; - - error = lodepng_add_text(info, key, str); - - break; - } - - lodepng_free(key); - lodepng_free(str); - - return error; -} - -/*compressed text chunk (zTXt)*/ -static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder, - const unsigned char* data, size_t chunkLength) { - unsigned error = 0; - - /*copy the object to change parameters in it*/ - LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; - - unsigned length, string2_begin; - char *key = 0; - unsigned char* str = 0; - size_t size = 0; - - while(!error) /*not really a while loop, only used to break on error*/ { - for(length = 0; length < chunkLength && data[length] != 0; ++length) ; - if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(key, data, length); - key[length] = 0; - - if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - string2_begin = length + 2; - if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - - length = (unsigned)chunkLength - string2_begin; - zlibsettings.max_output_size = decoder->max_text_size; - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&str, &size, 0, &data[string2_begin], - length, &zlibsettings); - /*error: compressed text larger than decoder->max_text_size*/ - if(error && size > zlibsettings.max_output_size) error = 112; - if(error) break; - error = lodepng_add_text_sized(info, key, (char*)str, size); - break; - } - - lodepng_free(key); - lodepng_free(str); - - return error; -} - -/*international text chunk (iTXt)*/ -static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder, - const unsigned char* data, size_t chunkLength) { - unsigned error = 0; - unsigned i; - - /*copy the object to change parameters in it*/ - LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; - - unsigned length, begin, compressed; - char *key = 0, *langtag = 0, *transkey = 0; - - while(!error) /*not really a while loop, only used to break on error*/ { - /*Quick check if the chunk length isn't too small. Even without check - it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ - if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ - - /*read the key*/ - for(length = 0; length < chunkLength && data[length] != 0; ++length) ; - if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(key, data, length); - key[length] = 0; - - /*read the compression method*/ - compressed = data[length + 1]; - if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty for the next 3 texts*/ - - /*read the langtag*/ - begin = length + 3; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; - - langtag = (char*)lodepng_malloc(length + 1); - if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(langtag, data + begin, length); - langtag[length] = 0; - - /*read the transkey*/ - begin += length + 1; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; - - transkey = (char*)lodepng_malloc(length + 1); - if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(transkey, data + begin, length); - transkey[length] = 0; - - /*read the actual text*/ - begin += length + 1; - - length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin; - - if(compressed) { - unsigned char* str = 0; - size_t size = 0; - zlibsettings.max_output_size = decoder->max_text_size; - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&str, &size, 0, &data[begin], - length, &zlibsettings); - /*error: compressed text larger than decoder->max_text_size*/ - if(error && size > zlibsettings.max_output_size) error = 112; - if(!error) error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)str, size); - lodepng_free(str); - } else { - error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)(data + begin), length); - } - - break; - } - - lodepng_free(key); - lodepng_free(langtag); - lodepng_free(transkey); - - return error; -} - -static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ - - info->time_defined = 1; - info->time.year = 256u * data[0] + data[1]; - info->time.month = data[2]; - info->time.day = data[3]; - info->time.hour = data[4]; - info->time.minute = data[5]; - info->time.second = data[6]; - - return 0; /* OK */ -} - -static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ - - info->phys_defined = 1; - info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; - info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; - info->phys_unit = data[8]; - - return 0; /* OK */ -} - -static unsigned readChunk_gAMA(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/ - - info->gama_defined = 1; - info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; - - return 0; /* OK */ -} - -static unsigned readChunk_cHRM(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/ - - info->chrm_defined = 1; - info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3]; - info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7]; - info->chrm_red_x = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11]; - info->chrm_red_y = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15]; - info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19]; - info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23]; - info->chrm_blue_x = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27]; - info->chrm_blue_y = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31]; - - return 0; /* OK */ -} - -static unsigned readChunk_sRGB(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/ - - info->srgb_defined = 1; - info->srgb_intent = data[0]; - - return 0; /* OK */ -} - -static unsigned readChunk_iCCP(LodePNGInfo* info, const LodePNGDecoderSettings* decoder, - const unsigned char* data, size_t chunkLength) { - unsigned error = 0; - unsigned i; - size_t size = 0; - /*copy the object to change parameters in it*/ - LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; - - unsigned length, string2_begin; - - info->iccp_defined = 1; - if(info->iccp_name) lodepng_clear_icc(info); - - for(length = 0; length < chunkLength && data[length] != 0; ++length) ; - if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/ - if(length < 1 || length > 79) return 89; /*keyword too short or long*/ - - info->iccp_name = (char*)lodepng_malloc(length + 1); - if(!info->iccp_name) return 83; /*alloc fail*/ - - info->iccp_name[length] = 0; - for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i]; - - if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/ - - string2_begin = length + 2; - if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/ - - length = (unsigned)chunkLength - string2_begin; - zlibsettings.max_output_size = decoder->max_icc_size; - error = zlib_decompress(&info->iccp_profile, &size, 0, - &data[string2_begin], - length, &zlibsettings); - /*error: ICC profile larger than decoder->max_icc_size*/ - if(error && size > zlibsettings.max_output_size) error = 113; - info->iccp_profile_size = size; - if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/ - return error; -} - -/*significant bits chunk (sBIT)*/ -static unsigned readChunk_sBIT(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { - unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth; - if(info->color.colortype == LCT_GREY) { - /*error: this chunk must be 1 bytes for grayscale image*/ - if(chunkLength != 1) return 114; - if(data[0] == 0 || data[0] > bitdepth) return 115; - info->sbit_defined = 1; - info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/ - } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) { - /*error: this chunk must be 3 bytes for RGB and palette image*/ - if(chunkLength != 3) return 114; - if(data[0] == 0 || data[1] == 0 || data[2] == 0) return 115; - if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth) return 115; - info->sbit_defined = 1; - info->sbit_r = data[0]; - info->sbit_g = data[1]; - info->sbit_b = data[2]; - } else if(info->color.colortype == LCT_GREY_ALPHA) { - /*error: this chunk must be 2 byte for grayscale with alpha image*/ - if(chunkLength != 2) return 114; - if(data[0] == 0 || data[1] == 0) return 115; - if(data[0] > bitdepth || data[1] > bitdepth) return 115; - info->sbit_defined = 1; - info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/ - info->sbit_a = data[1]; - } else if(info->color.colortype == LCT_RGBA) { - /*error: this chunk must be 4 bytes for grayscale image*/ - if(chunkLength != 4) return 114; - if(data[0] == 0 || data[1] == 0 || data[2] == 0 || data[3] == 0) return 115; - if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth || data[3] > bitdepth) return 115; - info->sbit_defined = 1; - info->sbit_r = data[0]; - info->sbit_g = data[1]; - info->sbit_b = data[2]; - info->sbit_a = data[3]; - } - - return 0; /* OK */ -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, - const unsigned char* in, size_t insize) { - const unsigned char* chunk = in + pos; - unsigned chunkLength; - const unsigned char* data; - unsigned unhandled = 0; - unsigned error = 0; - - if(pos + 4 > insize) return 30; - chunkLength = lodepng_chunk_length(chunk); - if(chunkLength > 2147483647) return 63; - data = lodepng_chunk_data_const(chunk); - if(chunkLength + 12 > insize - pos) return 30; - - if(lodepng_chunk_type_equals(chunk, "PLTE")) { - error = readChunk_PLTE(&state->info_png.color, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "tRNS")) { - error = readChunk_tRNS(&state->info_png.color, data, chunkLength); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - } else if(lodepng_chunk_type_equals(chunk, "bKGD")) { - error = readChunk_bKGD(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "tEXt")) { - error = readChunk_tEXt(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "zTXt")) { - error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "iTXt")) { - error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "tIME")) { - error = readChunk_tIME(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "pHYs")) { - error = readChunk_pHYs(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "gAMA")) { - error = readChunk_gAMA(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "cHRM")) { - error = readChunk_cHRM(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "sRGB")) { - error = readChunk_sRGB(&state->info_png, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { - error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); - } else if(lodepng_chunk_type_equals(chunk, "sBIT")) { - error = readChunk_sBIT(&state->info_png, data, chunkLength); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } else { - /* unhandled chunk is ok (is not an error) */ - unhandled = 1; - } - - if(!error && !unhandled && !state->decoder.ignore_crc) { - if(lodepng_chunk_check_crc(chunk)) return 57; /*invalid CRC*/ - } - - return error; -} - -/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ -static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize) { - unsigned char IEND = 0; - const unsigned char* chunk; /*points to beginning of next chunk*/ - unsigned char* idat; /*the data from idat chunks, zlib compressed*/ - size_t idatsize = 0; - unsigned char* scanlines = 0; - size_t scanlines_size = 0, expected_size = 0; - size_t outsize = 0; - - /*for unknown chunk order*/ - unsigned unknown = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - - - /* safe output values in case error happens */ - *out = 0; - *w = *h = 0; - - state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ - if(state->error) return; - - if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) { - CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/ - } - - /*the input filesize is a safe upper bound for the sum of idat chunks size*/ - idat = (unsigned char*)lodepng_malloc(insize); - if(!idat) CERROR_RETURN(state->error, 83); /*alloc fail*/ - - chunk = &in[33]; /*first byte of the first chunk after the header*/ - - /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. - IDAT data is put at the start of the in buffer*/ - while(!IEND && !state->error) { - unsigned chunkLength; - const unsigned char* data; /*the data in the chunk*/ - size_t pos = (size_t)(chunk - in); - - /*error: next chunk out of bounds of the in buffer*/ - if(chunk < in || pos + 12 > insize) { - if(state->decoder.ignore_end) break; /*other errors may still happen though*/ - CERROR_BREAK(state->error, 30); - } - - /*length of the data of the chunk, excluding the 12 bytes for length, chunk type and CRC*/ - chunkLength = lodepng_chunk_length(chunk); - /*error: chunk length larger than the max PNG chunk size*/ - if(chunkLength > 2147483647) { - if(state->decoder.ignore_end) break; /*other errors may still happen though*/ - CERROR_BREAK(state->error, 63); - } - - if(pos + (size_t)chunkLength + 12 > insize || pos + (size_t)chunkLength + 12 < pos) { - CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk (or int overflow)*/ - } - - data = lodepng_chunk_data_const(chunk); - - unknown = 0; - - /*IDAT chunk, containing compressed image data*/ - if(lodepng_chunk_type_equals(chunk, "IDAT")) { - size_t newsize; - if(lodepng_addofl(idatsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95); - if(newsize > insize) CERROR_BREAK(state->error, 95); - lodepng_memcpy(idat + idatsize, data, chunkLength); - idatsize += chunkLength; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 3; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } else if(lodepng_chunk_type_equals(chunk, "IEND")) { - /*IEND chunk*/ - IEND = 1; - } else if(lodepng_chunk_type_equals(chunk, "PLTE")) { - /*palette chunk (PLTE)*/ - state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 2; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } else if(lodepng_chunk_type_equals(chunk, "tRNS")) { - /*palette transparency chunk (tRNS). Even though this one is an ancillary chunk , it is still compiled - in without 'LODEPNG_COMPILE_ANCILLARY_CHUNKS' because it contains essential color information that - affects the alpha channel of pixels. */ - state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*background color chunk (bKGD)*/ - } else if(lodepng_chunk_type_equals(chunk, "bKGD")) { - state->error = readChunk_bKGD(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "tEXt")) { - /*text chunk (tEXt)*/ - if(state->decoder.read_text_chunks) { - state->error = readChunk_tEXt(&state->info_png, data, chunkLength); - if(state->error) break; - } - } else if(lodepng_chunk_type_equals(chunk, "zTXt")) { - /*compressed text chunk (zTXt)*/ - if(state->decoder.read_text_chunks) { - state->error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); - if(state->error) break; - } - } else if(lodepng_chunk_type_equals(chunk, "iTXt")) { - /*international text chunk (iTXt)*/ - if(state->decoder.read_text_chunks) { - state->error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); - if(state->error) break; - } - } else if(lodepng_chunk_type_equals(chunk, "tIME")) { - state->error = readChunk_tIME(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "pHYs")) { - state->error = readChunk_pHYs(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "gAMA")) { - state->error = readChunk_gAMA(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "cHRM")) { - state->error = readChunk_cHRM(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "sRGB")) { - state->error = readChunk_sRGB(&state->info_png, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { - state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); - if(state->error) break; - } else if(lodepng_chunk_type_equals(chunk, "sBIT")) { - state->error = readChunk_sBIT(&state->info_png, data, chunkLength); - if(state->error) break; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } else /*it's not an implemented chunk type, so ignore it: skip over the data*/ { - /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ - if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) { - CERROR_BREAK(state->error, 69); - } - - unknown = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(state->decoder.remember_unknown_chunks) { - state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], - &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - - if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ { - if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ - } - - if(!IEND) chunk = lodepng_chunk_next_const(chunk, in + insize); - } - - if(!state->error && state->info_png.color.colortype == LCT_PALETTE && !state->info_png.color.palette) { - state->error = 106; /* error: PNG file must have PLTE chunk if color type is palette */ - } - - if(!state->error) { - /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. - If the decompressed size does not match the prediction, the image must be corrupt.*/ - if(state->info_png.interlace_method == 0) { - size_t bpp = lodepng_get_bpp(&state->info_png.color); - expected_size = lodepng_get_raw_size_idat(*w, *h, bpp); - } else { - size_t bpp = lodepng_get_bpp(&state->info_png.color); - /*Adam-7 interlaced: expected size is the sum of the 7 sub-images sizes*/ - expected_size = 0; - expected_size += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, bpp); - if(*w > 4) expected_size += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, bpp); - expected_size += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, bpp); - if(*w > 2) expected_size += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, bpp); - expected_size += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, bpp); - if(*w > 1) expected_size += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, bpp); - expected_size += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, bpp); - } - - state->error = zlib_decompress(&scanlines, &scanlines_size, expected_size, idat, idatsize, &state->decoder.zlibsettings); - } - if(!state->error && scanlines_size != expected_size) state->error = 91; /*decompressed size doesn't match prediction*/ - lodepng_free(idat); - - if(!state->error) { - outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color); - *out = (unsigned char*)lodepng_malloc(outsize); - if(!*out) state->error = 83; /*alloc fail*/ - } - if(!state->error) { - lodepng_memset(*out, 0, outsize); - state->error = postProcessScanlines(*out, scanlines, *w, *h, &state->info_png); - } - lodepng_free(scanlines); -} - -unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize) { - *out = 0; - decodeGeneric(out, w, h, state, in, insize); - if(state->error) return state->error; - if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) { - /*same color type, no copying or converting of data needed*/ - /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype - the raw image has to the end user*/ - if(!state->decoder.color_convert) { - state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); - if(state->error) return state->error; - } - } else { /*color conversion needed*/ - unsigned char* data = *out; - size_t outsize; - - /*TODO: check if this works according to the statement in the documentation: "The converter can convert - from grayscale input color type, to 8-bit grayscale or grayscale with alpha"*/ - if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) - && !(state->info_raw.bitdepth == 8)) { - return 56; /*unsupported color mode conversion*/ - } - - outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); - *out = (unsigned char*)lodepng_malloc(outsize); - if(!(*out)) { - state->error = 83; /*alloc fail*/ - } - else state->error = lodepng_convert(*out, data, &state->info_raw, - &state->info_png.color, *w, *h); - lodepng_free(data); - } - return state->error; -} - -unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) { - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*disable reading things that this function doesn't output*/ - state.decoder.read_text_chunks = 0; - state.decoder.remember_unknown_chunks = 0; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - error = lodepng_decode(out, w, h, &state, in, insize); - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) { - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); -} - -unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) { - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, - LodePNGColorType colortype, unsigned bitdepth) { - unsigned char* buffer = 0; - size_t buffersize; - unsigned error; - /* safe output values in case error happens */ - *out = 0; - *w = *h = 0; - error = lodepng_load_file(&buffer, &buffersize, filename); - if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) { - return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); -} - -unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) { - return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) { - settings->color_convert = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->read_text_chunks = 1; - settings->remember_unknown_chunks = 0; - settings->max_text_size = 16777216; - settings->max_icc_size = 16777216; /* 16MB is much more than enough for any reasonable ICC profile */ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - settings->ignore_crc = 0; - settings->ignore_critical = 0; - settings->ignore_end = 0; - lodepng_decompress_settings_init(&settings->zlibsettings); -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) - -void lodepng_state_init(LodePNGState* state) { -#ifdef LODEPNG_COMPILE_DECODER - lodepng_decoder_settings_init(&state->decoder); -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - lodepng_encoder_settings_init(&state->encoder); -#endif /*LODEPNG_COMPILE_ENCODER*/ - lodepng_color_mode_init(&state->info_raw); - lodepng_info_init(&state->info_png); - state->error = 1; -} - -void lodepng_state_cleanup(LodePNGState* state) { - lodepng_color_mode_cleanup(&state->info_raw); - lodepng_info_cleanup(&state->info_png); -} - -void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) { - lodepng_state_cleanup(dest); - *dest = *source; - lodepng_color_mode_init(&dest->info_raw); - lodepng_info_init(&dest->info_png); - dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; - dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; -} - -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Encoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - - -static unsigned writeSignature(ucvector* out) { - size_t pos = out->size; - const unsigned char signature[] = {137, 80, 78, 71, 13, 10, 26, 10}; - /*8 bytes PNG signature, aka the magic bytes*/ - if(!ucvector_resize(out, out->size + 8)) return 83; /*alloc fail*/ - lodepng_memcpy(out->data + pos, signature, 8); - return 0; -} - -static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) { - unsigned char *chunk, *data; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 13, "IHDR")); - data = chunk + 8; - - lodepng_set32bitInt(data + 0, w); /*width*/ - lodepng_set32bitInt(data + 4, h); /*height*/ - data[8] = (unsigned char)bitdepth; /*bit depth*/ - data[9] = (unsigned char)colortype; /*color type*/ - data[10] = 0; /*compression method*/ - data[11] = 0; /*filter method*/ - data[12] = interlace_method; /*interlace method*/ - - lodepng_chunk_generate_crc(chunk); - return 0; -} - -/* only adds the chunk if needed (there is a key or palette with alpha) */ -static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) { - unsigned char* chunk; - size_t i, j = 8; - - if(info->palettesize == 0 || info->palettesize > 256) { - return 68; /*invalid palette size, it is only allowed to be 1-256*/ - } - - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE")); - - for(i = 0; i != info->palettesize; ++i) { - /*add all channels except alpha channel*/ - chunk[j++] = info->palette[i * 4 + 0]; - chunk[j++] = info->palette[i * 4 + 1]; - chunk[j++] = info->palette[i * 4 + 2]; - } - - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) { - unsigned char* chunk = 0; - - if(info->colortype == LCT_PALETTE) { - size_t i, amount = info->palettesize; - /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ - for(i = info->palettesize; i != 0; --i) { - if(info->palette[4 * (i - 1) + 3] != 255) break; - --amount; - } - if(amount) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, amount, "tRNS")); - /*add the alpha channel values from the palette*/ - for(i = 0; i != amount; ++i) chunk[8 + i] = info->palette[4 * i + 3]; - } - } else if(info->colortype == LCT_GREY) { - if(info->key_defined) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "tRNS")); - chunk[8] = (unsigned char)(info->key_r >> 8); - chunk[9] = (unsigned char)(info->key_r & 255); - } - } else if(info->colortype == LCT_RGB) { - if(info->key_defined) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "tRNS")); - chunk[8] = (unsigned char)(info->key_r >> 8); - chunk[9] = (unsigned char)(info->key_r & 255); - chunk[10] = (unsigned char)(info->key_g >> 8); - chunk[11] = (unsigned char)(info->key_g & 255); - chunk[12] = (unsigned char)(info->key_b >> 8); - chunk[13] = (unsigned char)(info->key_b & 255); - } - } - - if(chunk) lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, - LodePNGCompressSettings* zlibsettings) { - unsigned error = 0; - unsigned char* zlib = 0; - size_t zlibsize = 0; - - error = zlib_compress(&zlib, &zlibsize, data, datasize, zlibsettings); - if(!error) { - error = lodepng_chunk_createv(out, zlibsize, "IDAT", zlib); - } - lodepng_free(zlib); - return error; -} - -static unsigned addChunk_IEND(ucvector* out) { - return lodepng_chunk_createv(out, 0, "IEND", 0); -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) { - unsigned char* chunk = 0; - size_t keysize = lodepng_strlen(keyword), textsize = lodepng_strlen(textstring); - size_t size = keysize + 1 + textsize; - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, size, "tEXt")); - lodepng_memcpy(chunk + 8, keyword, keysize); - chunk[8 + keysize] = 0; /*null termination char*/ - lodepng_memcpy(chunk + 9 + keysize, textstring, textsize); - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, - LodePNGCompressSettings* zlibsettings) { - unsigned error = 0; - unsigned char* chunk = 0; - unsigned char* compressed = 0; - size_t compressedsize = 0; - size_t textsize = lodepng_strlen(textstring); - size_t keysize = lodepng_strlen(keyword); - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - - error = zlib_compress(&compressed, &compressedsize, - (const unsigned char*)textstring, textsize, zlibsettings); - if(!error) { - size_t size = keysize + 2 + compressedsize; - error = lodepng_chunk_init(&chunk, out, size, "zTXt"); - } - if(!error) { - lodepng_memcpy(chunk + 8, keyword, keysize); - chunk[8 + keysize] = 0; /*null termination char*/ - chunk[9 + keysize] = 0; /*compression method: 0*/ - lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); - lodepng_chunk_generate_crc(chunk); - } - - lodepng_free(compressed); - return error; -} - -static unsigned addChunk_iTXt(ucvector* out, unsigned compress, const char* keyword, const char* langtag, - const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) { - unsigned error = 0; - unsigned char* chunk = 0; - unsigned char* compressed = 0; - size_t compressedsize = 0; - size_t textsize = lodepng_strlen(textstring); - size_t keysize = lodepng_strlen(keyword), langsize = lodepng_strlen(langtag), transsize = lodepng_strlen(transkey); - - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - - if(compress) { - error = zlib_compress(&compressed, &compressedsize, - (const unsigned char*)textstring, textsize, zlibsettings); - } - if(!error) { - size_t size = keysize + 3 + langsize + 1 + transsize + 1 + (compress ? compressedsize : textsize); - error = lodepng_chunk_init(&chunk, out, size, "iTXt"); - } - if(!error) { - size_t pos = 8; - lodepng_memcpy(chunk + pos, keyword, keysize); - pos += keysize; - chunk[pos++] = 0; /*null termination char*/ - chunk[pos++] = (compress ? 1 : 0); /*compression flag*/ - chunk[pos++] = 0; /*compression method: 0*/ - lodepng_memcpy(chunk + pos, langtag, langsize); - pos += langsize; - chunk[pos++] = 0; /*null termination char*/ - lodepng_memcpy(chunk + pos, transkey, transsize); - pos += transsize; - chunk[pos++] = 0; /*null termination char*/ - if(compress) { - lodepng_memcpy(chunk + pos, compressed, compressedsize); - } else { - lodepng_memcpy(chunk + pos, textstring, textsize); - } - lodepng_chunk_generate_crc(chunk); - } - - lodepng_free(compressed); - return error; -} - -static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) { - unsigned char* chunk = 0; - if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "bKGD")); - chunk[8] = (unsigned char)(info->background_r >> 8); - chunk[9] = (unsigned char)(info->background_r & 255); - } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "bKGD")); - chunk[8] = (unsigned char)(info->background_r >> 8); - chunk[9] = (unsigned char)(info->background_r & 255); - chunk[10] = (unsigned char)(info->background_g >> 8); - chunk[11] = (unsigned char)(info->background_g & 255); - chunk[12] = (unsigned char)(info->background_b >> 8); - chunk[13] = (unsigned char)(info->background_b & 255); - } else if(info->color.colortype == LCT_PALETTE) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "bKGD")); - chunk[8] = (unsigned char)(info->background_r & 255); /*palette index*/ - } - if(chunk) lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 7, "tIME")); - chunk[8] = (unsigned char)(time->year >> 8); - chunk[9] = (unsigned char)(time->year & 255); - chunk[10] = (unsigned char)time->month; - chunk[11] = (unsigned char)time->day; - chunk[12] = (unsigned char)time->hour; - chunk[13] = (unsigned char)time->minute; - chunk[14] = (unsigned char)time->second; - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 9, "pHYs")); - lodepng_set32bitInt(chunk + 8, info->phys_x); - lodepng_set32bitInt(chunk + 12, info->phys_y); - chunk[16] = info->phys_unit; - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_gAMA(ucvector* out, const LodePNGInfo* info) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "gAMA")); - lodepng_set32bitInt(chunk + 8, info->gama_gamma); - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_cHRM(ucvector* out, const LodePNGInfo* info) { - unsigned char* chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 32, "cHRM")); - lodepng_set32bitInt(chunk + 8, info->chrm_white_x); - lodepng_set32bitInt(chunk + 12, info->chrm_white_y); - lodepng_set32bitInt(chunk + 16, info->chrm_red_x); - lodepng_set32bitInt(chunk + 20, info->chrm_red_y); - lodepng_set32bitInt(chunk + 24, info->chrm_green_x); - lodepng_set32bitInt(chunk + 28, info->chrm_green_y); - lodepng_set32bitInt(chunk + 32, info->chrm_blue_x); - lodepng_set32bitInt(chunk + 36, info->chrm_blue_y); - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_sRGB(ucvector* out, const LodePNGInfo* info) { - unsigned char data = info->srgb_intent; - return lodepng_chunk_createv(out, 1, "sRGB", &data); -} - -static unsigned addChunk_iCCP(ucvector* out, const LodePNGInfo* info, LodePNGCompressSettings* zlibsettings) { - unsigned error = 0; - unsigned char* chunk = 0; - unsigned char* compressed = 0; - size_t compressedsize = 0; - size_t keysize = lodepng_strlen(info->iccp_name); - - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - error = zlib_compress(&compressed, &compressedsize, - info->iccp_profile, info->iccp_profile_size, zlibsettings); - if(!error) { - size_t size = keysize + 2 + compressedsize; - error = lodepng_chunk_init(&chunk, out, size, "iCCP"); - } - if(!error) { - lodepng_memcpy(chunk + 8, info->iccp_name, keysize); - chunk[8 + keysize] = 0; /*null termination char*/ - chunk[9 + keysize] = 0; /*compression method: 0*/ - lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); - lodepng_chunk_generate_crc(chunk); - } - - lodepng_free(compressed); - return error; -} - -static unsigned addChunk_sBIT(ucvector* out, const LodePNGInfo* info) { - unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth; - unsigned char* chunk = 0; - if(info->color.colortype == LCT_GREY) { - if(info->sbit_r == 0 || info->sbit_r > bitdepth) return 115; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "sBIT")); - chunk[8] = info->sbit_r; - } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) { - if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0) return 115; - if(info->sbit_r > bitdepth || info->sbit_g > bitdepth || info->sbit_b > bitdepth) return 115; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 3, "sBIT")); - chunk[8] = info->sbit_r; - chunk[9] = info->sbit_g; - chunk[10] = info->sbit_b; - } else if(info->color.colortype == LCT_GREY_ALPHA) { - if(info->sbit_r == 0 || info->sbit_a == 0) return 115; - if(info->sbit_r > bitdepth || info->sbit_a > bitdepth) return 115; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "sBIT")); - chunk[8] = info->sbit_r; - chunk[9] = info->sbit_a; - } else if(info->color.colortype == LCT_RGBA) { - if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0 || info->sbit_a == 0 || - info->sbit_r > bitdepth || info->sbit_g > bitdepth || - info->sbit_b > bitdepth || info->sbit_a > bitdepth) { - return 115; - } - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "sBIT")); - chunk[8] = info->sbit_r; - chunk[9] = info->sbit_g; - chunk[10] = info->sbit_b; - chunk[11] = info->sbit_a; - } - if(chunk) lodepng_chunk_generate_crc(chunk); - return 0; -} - -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, - size_t length, size_t bytewidth, unsigned char filterType) { - size_t i; - switch(filterType) { - case 0: /*None*/ - for(i = 0; i != length; ++i) out[i] = scanline[i]; - break; - case 1: /*Sub*/ - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; - for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; - break; - case 2: /*Up*/ - if(prevline) { - for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; - } else { - for(i = 0; i != length; ++i) out[i] = scanline[i]; - } - break; - case 3: /*Average*/ - if(prevline) { - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1); - for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1); - } else { - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; - for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1); - } - break; - case 4: /*Paeth*/ - if(prevline) { - /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ - for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); - for(i = bytewidth; i < length; ++i) { - out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); - } - } else { - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; - /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ - for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); - } - break; - default: return; /*invalid filter type given*/ - } -} - -/* integer binary logarithm, max return value is 31 */ -static size_t ilog2(size_t i) { - size_t result = 0; - if(i >= 65536) { result += 16; i >>= 16; } - if(i >= 256) { result += 8; i >>= 8; } - if(i >= 16) { result += 4; i >>= 4; } - if(i >= 4) { result += 2; i >>= 2; } - if(i >= 2) { result += 1; /*i >>= 1;*/ } - return result; -} - -/* integer approximation for i * log2(i), helper function for LFS_ENTROPY */ -static size_t ilog2i(size_t i) { - size_t l; - if(i == 0) return 0; - l = ilog2(i); - /* approximate i*log2(i): l is integer logarithm, ((i - (1u << l)) << 1u) - linearly approximates the missing fractional part multiplied by i */ - return i * l + ((i - (1u << l)) << 1u); -} - -static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, - const LodePNGColorMode* color, const LodePNGEncoderSettings* settings) { - /* - For PNG filter method 0 - out must be a buffer with as size: h + (w * h * bpp + 7u) / 8u, because there are - the scanlines with 1 extra byte per scanline - */ - - unsigned bpp = lodepng_get_bpp(color); - /*the width of a scanline in bytes, not including the filter type*/ - size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; - - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7u) / 8u; - const unsigned char* prevline = 0; - unsigned x, y; - unsigned error = 0; - LodePNGFilterStrategy strategy = settings->filter_strategy; - - /* - There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: - * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. - use fixed filtering, with the filter None). - * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is - not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply - all five filters and select the filter that produces the smallest sum of absolute values per row. - This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. - - If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, - but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum - heuristic is used. - */ - if(settings->filter_palette_zero && - (color->colortype == LCT_PALETTE || color->bitdepth < 8)) strategy = LFS_ZERO; - - if(bpp == 0) return 31; /*error: invalid color type*/ - - if(strategy >= LFS_ZERO && strategy <= LFS_FOUR) { - unsigned char type = (unsigned char)strategy; - for(y = 0; y != h; ++y) { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - out[outindex] = type; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); - prevline = &in[inindex]; - } - } else if(strategy == LFS_MINSUM) { - /*adaptive filtering*/ - unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned char type, bestType = 0; - - for(type = 0; type != 5; ++type) { - attempt[type] = (unsigned char*)lodepng_malloc(linebytes); - if(!attempt[type]) error = 83; /*alloc fail*/ - } - - if(!error) { - for(y = 0; y != h; ++y) { - /*try the 5 filter types*/ - for(type = 0; type != 5; ++type) { - size_t sum = 0; - filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); - - /*calculate the sum of the result*/ - if(type == 0) { - for(x = 0; x != linebytes; ++x) sum += (unsigned char)(attempt[type][x]); - } else { - for(x = 0; x != linebytes; ++x) { - /*For differences, each byte should be treated as signed, values above 127 are negative - (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. - This means filtertype 0 is almost never chosen, but that is justified.*/ - unsigned char s = attempt[type][x]; - sum += s < 128 ? s : (255U - s); - } - } - - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum < smallest) { - bestType = type; - smallest = sum; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; - } - } - - for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); - } else if(strategy == LFS_ENTROPY) { - unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t bestSum = 0; - unsigned type, bestType = 0; - unsigned count[256]; - - for(type = 0; type != 5; ++type) { - attempt[type] = (unsigned char*)lodepng_malloc(linebytes); - if(!attempt[type]) error = 83; /*alloc fail*/ - } - - if(!error) { - for(y = 0; y != h; ++y) { - /*try the 5 filter types*/ - for(type = 0; type != 5; ++type) { - size_t sum = 0; - filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); - lodepng_memset(count, 0, 256 * sizeof(*count)); - for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]]; - ++count[type]; /*the filter type itself is part of the scanline*/ - for(x = 0; x != 256; ++x) { - sum += ilog2i(count[x]); - } - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum > bestSum) { - bestType = type; - bestSum = sum; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; - } - } - - for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); - } else if(strategy == LFS_PREDEFINED) { - for(y = 0; y != h; ++y) { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - unsigned char type = settings->predefined_filters[y]; - out[outindex] = type; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); - prevline = &in[inindex]; - } - } else if(strategy == LFS_BRUTE_FORCE) { - /*brute force filter chooser. - deflate the scanline after every filter attempt to see which one deflates best. - This is very slow and gives only slightly smaller, sometimes even larger, result*/ - size_t size[5]; - unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned type = 0, bestType = 0; - unsigned char* dummy; - LodePNGCompressSettings zlibsettings; - lodepng_memcpy(&zlibsettings, &settings->zlibsettings, sizeof(LodePNGCompressSettings)); - /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, - to simulate the true case where the tree is the same for the whole image. Sometimes it gives - better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare - cases better compression. It does make this a bit less slow, so it's worth doing this.*/ - zlibsettings.btype = 1; - /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG - images only, so disable it*/ - zlibsettings.custom_zlib = 0; - zlibsettings.custom_deflate = 0; - for(type = 0; type != 5; ++type) { - attempt[type] = (unsigned char*)lodepng_malloc(linebytes); - if(!attempt[type]) error = 83; /*alloc fail*/ - } - if(!error) { - for(y = 0; y != h; ++y) /*try the 5 filter types*/ { - for(type = 0; type != 5; ++type) { - unsigned testsize = (unsigned)linebytes; - /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ - - filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); - size[type] = 0; - dummy = 0; - zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings); - lodepng_free(dummy); - /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || size[type] < smallest) { - bestType = type; - smallest = size[type]; - } - } - prevline = &in[y * linebytes]; - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; - } - } - for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); - } - else return 88; /* unknown filter strategy */ - - return error; -} - -static void addPaddingBits(unsigned char* out, const unsigned char* in, - size_t olinebits, size_t ilinebits, unsigned h) { - /*The opposite of the removePaddingBits function - olinebits must be >= ilinebits*/ - unsigned y; - size_t diff = olinebits - ilinebits; - size_t obp = 0, ibp = 0; /*bit pointers*/ - for(y = 0; y != h; ++y) { - size_t x; - for(x = 0; x < ilinebits; ++x) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - /*obp += diff; --> no, fill in some value in the padding bits too, to avoid - "Use of uninitialised value of size ###" warning from valgrind*/ - for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); - } -} - -/* -in: non-interlaced image with size w*h -out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with - no padding bits between scanlines, but between reduced images so that each - reduced image starts at a byte. -bpp: bits per pixel -there are no padding bits, not between scanlines, not between reduced images -in has the following size in bits: w * h * bpp. -out is possibly bigger due to padding bits between reduced images -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - size_t bytewidth = bpp / 8u; - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; - size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; - for(b = 0; b < bytewidth; ++b) { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; - obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - for(b = 0; b < bpp; ++b) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - } - } - } -} - -/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. -return value is error**/ -static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, - unsigned w, unsigned h, - const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) { - /* - This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: - *) if no Adam7: 1) add padding bits (= possible extra bits per scanline if bpp < 8) 2) filter - *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - unsigned error = 0; - - if(info_png->interlace_method == 0) { - *outsize = h + (h * ((w * bpp + 7u) / 8u)); /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ - - if(!error) { - /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ - if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { - unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7u) / 8u)); - if(!padded) error = 83; /*alloc fail*/ - if(!error) { - addPaddingBits(padded, in, ((w * bpp + 7u) / 8u) * 8u, w * bpp, h); - error = filter(*out, padded, w, h, &info_png->color, settings); - } - lodepng_free(padded); - } else { - /*we can immediately filter into the out buffer, no other steps needed*/ - error = filter(*out, in, w, h, &info_png->color, settings); - } - } - } else /*interlace_method is 1 (Adam7)*/ { - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned char* adam7; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!(*out)) error = 83; /*alloc fail*/ - - adam7 = (unsigned char*)lodepng_malloc(passstart[7]); - if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ - - if(!error) { - unsigned i; - - Adam7_interlace(adam7, in, w, h, bpp); - for(i = 0; i != 7; ++i) { - if(bpp < 8) { - unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); - if(!padded) ERROR_BREAK(83); /*alloc fail*/ - addPaddingBits(padded, &adam7[passstart[i]], - ((passw[i] * bpp + 7u) / 8u) * 8u, passw[i] * bpp, passh[i]); - error = filter(&(*out)[filter_passstart[i]], padded, - passw[i], passh[i], &info_png->color, settings); - lodepng_free(padded); - } else { - error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], - passw[i], passh[i], &info_png->color, settings); - } - - if(error) break; - } - } - - lodepng_free(adam7); - } - - return error; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) { - unsigned char* inchunk = data; - while((size_t)(inchunk - data) < datasize) { - CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); - out->allocsize = out->size; /*fix the allocsize again*/ - inchunk = lodepng_chunk_next(inchunk, data + datasize); - } - return 0; -} - -static unsigned isGrayICCProfile(const unsigned char* profile, unsigned size) { - /* - It is a gray profile if bytes 16-19 are "GRAY", rgb profile if bytes 16-19 - are "RGB ". We do not perform any full parsing of the ICC profile here, other - than check those 4 bytes to grayscale profile. Other than that, validity of - the profile is not checked. This is needed only because the PNG specification - requires using a non-gray color model if there is an ICC profile with "RGB " - (sadly limiting compression opportunities if the input data is grayscale RGB - data), and requires using a gray color model if it is "GRAY". - */ - if(size < 20) return 0; - return profile[16] == 'G' && profile[17] == 'R' && profile[18] == 'A' && profile[19] == 'Y'; -} - -static unsigned isRGBICCProfile(const unsigned char* profile, unsigned size) { - /* See comment in isGrayICCProfile*/ - if(size < 20) return 0; - return profile[16] == 'R' && profile[17] == 'G' && profile[18] == 'B' && profile[19] == ' '; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -unsigned lodepng_encode(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGState* state) { - unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ - size_t datasize = 0; - ucvector outv = ucvector_init(NULL, 0); - LodePNGInfo info; - const LodePNGInfo* info_png = &state->info_png; - LodePNGColorMode auto_color; - - lodepng_info_init(&info); - lodepng_color_mode_init(&auto_color); - - /*provide some proper output values if error will happen*/ - *out = 0; - *outsize = 0; - state->error = 0; - - /*check input values validity*/ - if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette) - && (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) { - /*this error is returned even if auto_convert is enabled and thus encoder could - generate the palette by itself: while allowing this could be possible in theory, - it may complicate the code or edge cases, and always requiring to give a palette - when setting this color type is a simpler contract*/ - state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ - goto cleanup; - } - if(state->encoder.zlibsettings.btype > 2) { - state->error = 61; /*error: invalid btype*/ - goto cleanup; - } - if(info_png->interlace_method > 1) { - state->error = 71; /*error: invalid interlace mode*/ - goto cleanup; - } - state->error = checkColorValidity(info_png->color.colortype, info_png->color.bitdepth); - if(state->error) goto cleanup; /*error: invalid color type given*/ - state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); - if(state->error) goto cleanup; /*error: invalid color type given*/ - - /* color convert and compute scanline filter types */ - lodepng_info_copy(&info, &state->info_png); - if(state->encoder.auto_convert) { - LodePNGColorStats stats; - unsigned allow_convert = 1; - lodepng_color_stats_init(&stats); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->iccp_defined && - isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { - /*the PNG specification does not allow to use palette with a GRAY ICC profile, even - if the palette has only gray colors, so disallow it.*/ - stats.allow_palette = 0; - } - if(info_png->iccp_defined && - isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { - /*the PNG specification does not allow to use grayscale color with RGB ICC profile, so disallow gray.*/ - stats.allow_greyscale = 0; - } -#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - state->error = lodepng_compute_color_stats(&stats, image, w, h, &state->info_raw); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->background_defined) { - /*the background chunk's color must be taken into account as well*/ - unsigned r = 0, g = 0, b = 0; - LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16); - lodepng_convert_rgb(&r, &g, &b, - info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color); - state->error = lodepng_color_stats_add(&stats, r, g, b, 65535); - if(state->error) goto cleanup; - } -#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - state->error = auto_choose_color(&auto_color, &state->info_raw, &stats); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->sbit_defined) { - /*if sbit is defined, due to strict requirements of which sbit values can be present for which color modes, - auto_convert can't be done in many cases. However, do support a few cases here. - TODO: more conversions may be possible, and it may also be possible to get a more appropriate color type out of - auto_choose_color if knowledge about sbit is used beforehand - */ - unsigned sbit_max = LODEPNG_MAX(LODEPNG_MAX(LODEPNG_MAX(info_png->sbit_r, info_png->sbit_g), - info_png->sbit_b), info_png->sbit_a); - unsigned equal = (!info_png->sbit_g || info_png->sbit_g == info_png->sbit_r) - && (!info_png->sbit_b || info_png->sbit_b == info_png->sbit_r) - && (!info_png->sbit_a || info_png->sbit_a == info_png->sbit_r); - allow_convert = 0; - if(info.color.colortype == LCT_PALETTE && - auto_color.colortype == LCT_PALETTE) { - /* input and output are palette, and in this case it may happen that palette data is - expected to be copied from info_raw into the info_png */ - allow_convert = 1; - } - /*going from 8-bit RGB to palette (or 16-bit as long as sbit_max <= 8) is possible - since both are 8-bit RGB for sBIT's purposes*/ - if(info.color.colortype == LCT_RGB && - auto_color.colortype == LCT_PALETTE && sbit_max <= 8) { - allow_convert = 1; - } - /*going from 8-bit RGBA to palette is also ok but only if sbit_a is exactly 8*/ - if(info.color.colortype == LCT_RGBA && auto_color.colortype == LCT_PALETTE && - info_png->sbit_a == 8 && sbit_max <= 8) { - allow_convert = 1; - } - /*going from 16-bit RGB(A) to 8-bit RGB(A) is ok if all sbit values are <= 8*/ - if((info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA) && info.color.bitdepth == 16 && - auto_color.colortype == info.color.colortype && auto_color.bitdepth == 8 && - sbit_max <= 8) { - allow_convert = 1; - } - /*going to less channels is ok if all bit values are equal (all possible values in sbit, - as well as the chosen bitdepth of the result). Due to how auto_convert works, - we already know that auto_color.colortype has less than or equal amount of channels than - info.colortype. Palette is not used here. This conversion is not allowed if - info_png->sbit_r < auto_color.bitdepth, because specifically for alpha, non-presence of - an sbit value heavily implies that alpha's bit depth is equal to the PNG bit depth (rather - than the bit depths set in the r, g and b sbit values, by how the PNG specification describes - handling tRNS chunk case with sBIT), so be conservative here about ignoring user input.*/ - if(info.color.colortype != LCT_PALETTE && auto_color.colortype != LCT_PALETTE && - equal && info_png->sbit_r == auto_color.bitdepth) { - allow_convert = 1; - } - } -#endif - if(state->encoder.force_palette) { - if(info.color.colortype != LCT_GREY && info.color.colortype != LCT_GREY_ALPHA && - (auto_color.colortype == LCT_GREY || auto_color.colortype == LCT_GREY_ALPHA)) { - /*user speficially forced a PLTE palette, so cannot convert to grayscale types because - the PNG specification only allows writing a suggested palette in PLTE for truecolor types*/ - allow_convert = 0; - } - } - if(allow_convert) { - lodepng_color_mode_copy(&info.color, &auto_color); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*also convert the background chunk*/ - if(info_png->background_defined) { - if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b, - info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) { - state->error = 104; - goto cleanup; - } - } -#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - } - } -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->iccp_defined) { - unsigned gray_icc = isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); - unsigned rgb_icc = isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); - unsigned gray_png = info.color.colortype == LCT_GREY || info.color.colortype == LCT_GREY_ALPHA; - if(!gray_icc && !rgb_icc) { - state->error = 100; /* Disallowed profile color type for PNG */ - goto cleanup; - } - if(gray_icc != gray_png) { - /*Not allowed to use RGB/RGBA/palette with GRAY ICC profile or vice versa, - or in case of auto_convert, it wasn't possible to find appropriate model*/ - state->error = state->encoder.auto_convert ? 102 : 101; - goto cleanup; - } - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) { - unsigned char* converted; - size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7u) / 8u; - - converted = (unsigned char*)lodepng_malloc(size); - if(!converted && size) state->error = 83; /*alloc fail*/ - if(!state->error) { - state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); - } - if(!state->error) { - state->error = preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); - } - lodepng_free(converted); - if(state->error) goto cleanup; - } else { - state->error = preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); - if(state->error) goto cleanup; - } - - /* output all PNG chunks */ { -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - size_t i; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*write signature and chunks*/ - state->error = writeSignature(&outv); - if(state->error) goto cleanup; - /*IHDR*/ - state->error = addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*unknown chunks between IHDR and PLTE*/ - if(info.unknown_chunks_data[0]) { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); - if(state->error) goto cleanup; - } - /*color profile chunks must come before PLTE */ - if(info.iccp_defined) { - state->error = addChunk_iCCP(&outv, &info, &state->encoder.zlibsettings); - if(state->error) goto cleanup; - } - if(info.srgb_defined) { - state->error = addChunk_sRGB(&outv, &info); - if(state->error) goto cleanup; - } - if(info.gama_defined) { - state->error = addChunk_gAMA(&outv, &info); - if(state->error) goto cleanup; - } - if(info.chrm_defined) { - state->error = addChunk_cHRM(&outv, &info); - if(state->error) goto cleanup; - } - if(info_png->sbit_defined) { - state->error = addChunk_sBIT(&outv, &info); - if(state->error) goto cleanup; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*PLTE*/ - if(info.color.colortype == LCT_PALETTE) { - state->error = addChunk_PLTE(&outv, &info.color); - if(state->error) goto cleanup; - } - if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) { - /*force_palette means: write suggested palette for truecolor in PLTE chunk*/ - state->error = addChunk_PLTE(&outv, &info.color); - if(state->error) goto cleanup; - } - /*tRNS (this will only add if when necessary) */ - state->error = addChunk_tRNS(&outv, &info.color); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*bKGD (must come between PLTE and the IDAt chunks*/ - if(info.background_defined) { - state->error = addChunk_bKGD(&outv, &info); - if(state->error) goto cleanup; - } - /*pHYs (must come before the IDAT chunks)*/ - if(info.phys_defined) { - state->error = addChunk_pHYs(&outv, &info); - if(state->error) goto cleanup; - } - - /*unknown chunks between PLTE and IDAT*/ - if(info.unknown_chunks_data[1]) { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); - if(state->error) goto cleanup; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*IDAT (multiple IDAT chunks must be consecutive)*/ - state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*tIME*/ - if(info.time_defined) { - state->error = addChunk_tIME(&outv, &info.time); - if(state->error) goto cleanup; - } - /*tEXt and/or zTXt*/ - for(i = 0; i != info.text_num; ++i) { - if(lodepng_strlen(info.text_keys[i]) > 79) { - state->error = 66; /*text chunk too large*/ - goto cleanup; - } - if(lodepng_strlen(info.text_keys[i]) < 1) { - state->error = 67; /*text chunk too small*/ - goto cleanup; - } - if(state->encoder.text_compression) { - state->error = addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); - if(state->error) goto cleanup; - } else { - state->error = addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); - if(state->error) goto cleanup; - } - } - /*LodePNG version id in text chunk*/ - if(state->encoder.add_id) { - unsigned already_added_id_text = 0; - for(i = 0; i != info.text_num; ++i) { - const char* k = info.text_keys[i]; - /* Could use strcmp, but we're not calling or reimplementing this C library function for this use only */ - if(k[0] == 'L' && k[1] == 'o' && k[2] == 'd' && k[3] == 'e' && - k[4] == 'P' && k[5] == 'N' && k[6] == 'G' && k[7] == '\0') { - already_added_id_text = 1; - break; - } - } - if(already_added_id_text == 0) { - state->error = addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ - if(state->error) goto cleanup; - } - } - /*iTXt*/ - for(i = 0; i != info.itext_num; ++i) { - if(lodepng_strlen(info.itext_keys[i]) > 79) { - state->error = 66; /*text chunk too large*/ - goto cleanup; - } - if(lodepng_strlen(info.itext_keys[i]) < 1) { - state->error = 67; /*text chunk too small*/ - goto cleanup; - } - state->error = addChunk_iTXt( - &outv, state->encoder.text_compression, - info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], - &state->encoder.zlibsettings); - if(state->error) goto cleanup; - } - - /*unknown chunks between IDAT and IEND*/ - if(info.unknown_chunks_data[2]) { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); - if(state->error) goto cleanup; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - state->error = addChunk_IEND(&outv); - if(state->error) goto cleanup; - } - -cleanup: - lodepng_info_cleanup(&info); - lodepng_free(data); - lodepng_color_mode_cleanup(&auto_color); - - /*instead of cleaning the vector up, give it to the output*/ - *out = outv.data; - *outsize = outv.size; - - return state->error; -} - -unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, - unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - state.info_png.color.colortype = colortype; - state.info_png.color.bitdepth = bitdepth; - lodepng_encode(out, outsize, image, w, h, &state); - error = state.error; - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) { - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) { - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); - if(!error) error = lodepng_save_file(buffer, buffersize, filename); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) { - return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) { - return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) { - lodepng_compress_settings_init(&settings->zlibsettings); - settings->filter_palette_zero = 1; - settings->filter_strategy = LFS_MINSUM; - settings->auto_convert = 1; - settings->force_palette = 0; - settings->predefined_filters = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->add_id = 0; - settings->text_compression = 1; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT -/* -This returns the description of a numerical error code in English. This is also -the documentation of all the error codes. -*/ -const char* lodepng_error_text(unsigned code) { - switch(code) { - case 0: return "no error, everything went ok"; - case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ - case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ - case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ - case 13: return "problem while processing dynamic deflate block"; - case 14: return "problem while processing dynamic deflate block"; - case 15: return "problem while processing dynamic deflate block"; - /*this error could happen if there are only 0 or 1 symbols present in the huffman code:*/ - case 16: return "invalid code while processing dynamic deflate block"; - case 17: return "end of out buffer memory reached while inflating"; - case 18: return "invalid distance code while inflating"; - case 19: return "end of out buffer memory reached while inflating"; - case 20: return "invalid deflate block BTYPE encountered while decoding"; - case 21: return "NLEN is not ones complement of LEN in a deflate block"; - - /*end of out buffer memory reached while inflating: - This can happen if the inflated deflate data is longer than the amount of bytes required to fill up - all the pixels of the image, given the color depth and image dimensions. Something that doesn't - happen in a normal, well encoded, PNG image.*/ - case 22: return "end of out buffer memory reached while inflating"; - case 23: return "end of in buffer memory reached while inflating"; - case 24: return "invalid FCHECK in zlib header"; - case 25: return "invalid compression method in zlib header"; - case 26: return "FDICT encountered in zlib header while it's not used for PNG"; - case 27: return "PNG file is smaller than a PNG header"; - /*Checks the magic file header, the first 8 bytes of the PNG file*/ - case 28: return "incorrect PNG signature, it's no PNG or corrupted"; - case 29: return "first chunk is not the header chunk"; - case 30: return "chunk length too large, chunk broken off at end of file"; - case 31: return "illegal PNG color type or bpp"; - case 32: return "illegal PNG compression method"; - case 33: return "illegal PNG filter method"; - case 34: return "illegal PNG interlace method"; - case 35: return "chunk length of a chunk is too large or the chunk too small"; - case 36: return "illegal PNG filter type encountered"; - case 37: return "illegal bit depth for this color type given"; - case 38: return "the palette is too small or too big"; /*0, or more than 256 colors*/ - case 39: return "tRNS chunk before PLTE or has more entries than palette size"; - case 40: return "tRNS chunk has wrong size for grayscale image"; - case 41: return "tRNS chunk has wrong size for RGB image"; - case 42: return "tRNS chunk appeared while it was not allowed for this color type"; - case 43: return "bKGD chunk has wrong size for palette image"; - case 44: return "bKGD chunk has wrong size for grayscale image"; - case 45: return "bKGD chunk has wrong size for RGB image"; - case 48: return "empty input buffer given to decoder. Maybe caused by non-existing file?"; - case 49: return "jumped past memory while generating dynamic huffman tree"; - case 50: return "jumped past memory while generating dynamic huffman tree"; - case 51: return "jumped past memory while inflating huffman block"; - case 52: return "jumped past memory while inflating"; - case 53: return "size of zlib data too small"; - case 54: return "repeat symbol in tree while there was no value symbol yet"; - /*jumped past tree while generating huffman tree, this could be when the - tree will have more leaves than symbols after generating it out of the - given lengths. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ - case 55: return "jumped past tree while generating huffman tree"; - case 56: return "given output image colortype or bitdepth not supported for color conversion"; - case 57: return "invalid CRC encountered (checking CRC can be disabled)"; - case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; - case 59: return "requested color conversion not supported"; - case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; - case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; - /*LodePNG leaves the choice of RGB to grayscale conversion formula to the user.*/ - case 62: return "conversion from color to grayscale not supported"; - /*(2^31-1)*/ - case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; - /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ - case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; - case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; - case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; - case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; - case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; - case 71: return "invalid interlace mode given to encoder (must be 0 or 1)"; - case 72: return "while decoding, invalid compression method encountering in zTXt or iTXt chunk (it must be 0)"; - case 73: return "invalid tIME chunk size"; - case 74: return "invalid pHYs chunk size"; - /*length could be wrong, or data chopped off*/ - case 75: return "no null termination char found while decoding text chunk"; - case 76: return "iTXt chunk too short to contain required bytes"; - case 77: return "integer overflow in buffer size"; - case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ - case 79: return "failed to open file for writing"; - case 80: return "tried creating a tree of 0 symbols"; - case 81: return "lazy matching at pos 0 is impossible"; - case 82: return "color conversion to palette requested while a color isn't in palette, or index out of bounds"; - case 83: return "memory allocation failed"; - case 84: return "given image too small to contain all pixels to be encoded"; - case 86: return "impossible offset in lz77 encoding (internal bug)"; - case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; - case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; - case 89: return "text chunk keyword too short or long: must have size 1-79"; - /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ - case 90: return "windowsize must be a power of two"; - case 91: return "invalid decompressed idat size"; - case 92: return "integer overflow due to too many pixels"; - case 93: return "zero width or height is invalid"; - case 94: return "header chunk must have a size of 13 bytes"; - case 95: return "integer overflow with combined idat chunk size"; - case 96: return "invalid gAMA chunk size"; - case 97: return "invalid cHRM chunk size"; - case 98: return "invalid sRGB chunk size"; - case 99: return "invalid sRGB rendering intent"; - case 100: return "invalid ICC profile color type, the PNG specification only allows RGB or GRAY"; - case 101: return "PNG specification does not allow RGB ICC profile on gray color types and vice versa"; - case 102: return "not allowed to set grayscale ICC profile with colored pixels by PNG specification"; - case 103: return "invalid palette index in bKGD chunk. Maybe it came before PLTE chunk?"; - case 104: return "invalid bKGD color while encoding (e.g. palette index out of range)"; - case 105: return "integer overflow of bitsize"; - case 106: return "PNG file must have PLTE chunk if color type is palette"; - case 107: return "color convert from palette mode requested without setting the palette data in it"; - case 108: return "tried to add more than 256 values to a palette"; - /*this limit can be configured in LodePNGDecompressSettings*/ - case 109: return "tried to decompress zlib or deflate data larger than desired max_output_size"; - case 110: return "custom zlib or inflate decompression failed"; - case 111: return "custom zlib or deflate compression failed"; - /*max text size limit can be configured in LodePNGDecoderSettings. This error prevents - unreasonable memory consumption when decoding due to impossibly large text sizes.*/ - case 112: return "compressed text unreasonably large"; - /*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents - unreasonable memory consumption when decoding due to impossibly large ICC profile*/ - case 113: return "ICC profile unreasonably large"; - case 114: return "sBIT chunk has wrong size for the color type of the image"; - case 115: return "sBIT value out of range"; - } - return "unknown error code"; -} -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // C++ Wrapper // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng { - -#ifdef LODEPNG_COMPILE_DISK -unsigned load_file(std::vector& buffer, const std::string& filename) { - long size = lodepng_filesize(filename.c_str()); - if(size < 0) return 78; - buffer.resize((size_t)size); - return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str()); -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -unsigned save_file(const std::vector& buffer, const std::string& filename) { - return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str()); -} -#endif /* LODEPNG_COMPILE_DISK */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings& settings) { - unsigned char* buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings); - if(buffer) { - out.insert(out.end(), buffer, &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned decompress(std::vector& out, const std::vector& in, - const LodePNGDecompressSettings& settings) { - return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif /* LODEPNG_COMPILE_DECODER */ - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned compress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings& settings) { - unsigned char* buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); - if(buffer) { - out.insert(out.end(), buffer, &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned compress(std::vector& out, const std::vector& in, - const LodePNGCompressSettings& settings) { - return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif /* LODEPNG_COMPILE_ENCODER */ -#endif /* LODEPNG_COMPILE_ZLIB */ - - -#ifdef LODEPNG_COMPILE_PNG - -State::State() { - lodepng_state_init(this); -} - -State::State(const State& other) { - lodepng_state_init(this); - lodepng_state_copy(this, &other); -} - -State::~State() { - lodepng_state_cleanup(this); -} - -State& State::operator=(const State& other) { - lodepng_state_copy(this, &other); - return *this; -} - -#ifdef LODEPNG_COMPILE_DECODER - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) { - unsigned char* buffer = 0; - unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); - if(buffer && !error) { - State state; - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), buffer, &buffer[buffersize]); - } - lodepng_free(buffer); - return error; -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) { - return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const unsigned char* in, size_t insize) { - unsigned char* buffer = NULL; - unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); - if(buffer && !error) { - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), buffer, &buffer[buffersize]); - } - lodepng_free(buffer); - return error; -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const std::vector& in) { - return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, - LodePNGColorType colortype, unsigned bitdepth) { - std::vector buffer; - /* safe output values in case error happens */ - w = h = 0; - unsigned error = load_file(buffer, filename); - if(error) return error; - return decode(out, w, h, buffer, colortype, bitdepth); -} -#endif /* LODEPNG_COMPILE_DECODER */ -#endif /* LODEPNG_COMPILE_DISK */ - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); - if(buffer) { - out.insert(out.end(), buffer, &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} - -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - State& state) { - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); - if(buffer) { - out.insert(out.end(), buffer, &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - State& state) { - if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, state); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned encode(const std::string& filename, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - std::vector buffer; - unsigned error = encode(buffer, in, w, h, colortype, bitdepth); - if(!error) error = save_file(buffer, filename); - return error; -} - -unsigned encode(const std::string& filename, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) { - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_ENCODER */ -#endif /* LODEPNG_COMPILE_PNG */ -} /* namespace lodepng */ -#endif /*LODEPNG_COMPILE_CPP*/ diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/resources/lodepng.h --- a/semiconginev2/old/resources/lodepng.h Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2089 +0,0 @@ -/* -LodePNG version 20230410 - -Copyright (c) 2005-2023 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -#ifndef LODEPNG_H -#define LODEPNG_H - -#include /*for size_t*/ - -extern const char* LODEPNG_VERSION_STRING; - -/* -The following #defines are used to create code sections. They can be disabled -to disable code sections, which can give faster compile time and smaller binary. -The "NO_COMPILE" defines are designed to be used to pass as defines to the -compiler command to disable them without modifying this header, e.g. --DLODEPNG_NO_COMPILE_ZLIB for gcc or clang. -*/ -/*deflate & zlib. If disabled, you must specify alternative zlib functions in -the custom_zlib field of the compress and decompress settings*/ -#ifndef LODEPNG_NO_COMPILE_ZLIB -/*pass -DLODEPNG_NO_COMPILE_ZLIB to the compiler to disable this, or comment out LODEPNG_COMPILE_ZLIB below*/ -#define LODEPNG_COMPILE_ZLIB -#endif - -/*png encoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_PNG -/*pass -DLODEPNG_NO_COMPILE_PNG to the compiler to disable this, or comment out LODEPNG_COMPILE_PNG below*/ -#define LODEPNG_COMPILE_PNG -#endif - -/*deflate&zlib decoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_DECODER -/*pass -DLODEPNG_NO_COMPILE_DECODER to the compiler to disable this, or comment out LODEPNG_COMPILE_DECODER below*/ -#define LODEPNG_COMPILE_DECODER -#endif - -/*deflate&zlib encoder and png encoder*/ -#ifndef LODEPNG_NO_COMPILE_ENCODER -/*pass -DLODEPNG_NO_COMPILE_ENCODER to the compiler to disable this, or comment out LODEPNG_COMPILE_ENCODER below*/ -#define LODEPNG_COMPILE_ENCODER -#endif - -/*the optional built in harddisk file loading and saving functions*/ -#ifndef LODEPNG_NO_COMPILE_DISK -/*pass -DLODEPNG_NO_COMPILE_DISK to the compiler to disable this, or comment out LODEPNG_COMPILE_DISK below*/ -#define LODEPNG_COMPILE_DISK -#endif - -/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ -#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS -/*pass -DLODEPNG_NO_COMPILE_ANCILLARY_CHUNKS to the compiler to disable this, -or comment out LODEPNG_COMPILE_ANCILLARY_CHUNKS below*/ -#define LODEPNG_COMPILE_ANCILLARY_CHUNKS -#endif - -/*ability to convert error numerical codes to English text string*/ -#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT -/*pass -DLODEPNG_NO_COMPILE_ERROR_TEXT to the compiler to disable this, -or comment out LODEPNG_COMPILE_ERROR_TEXT below*/ -#define LODEPNG_COMPILE_ERROR_TEXT -#endif - -/*Compile the default allocators (C's free, malloc and realloc). If you disable this, -you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your -source files with custom allocators.*/ -#ifndef LODEPNG_NO_COMPILE_ALLOCATORS -/*pass -DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler to disable the built-in ones, -or comment out LODEPNG_COMPILE_ALLOCATORS below*/ -#define LODEPNG_COMPILE_ALLOCATORS -#endif - -/*Disable built-in CRC function, in that case a custom implementation of -lodepng_crc32 must be defined externally so that it can be linked in. -The default built-in CRC code comes with 8KB of lookup tables, so for memory constrained environment you may want it -disabled and provide a much smaller implementation externally as said above. You can find such an example implementation -in a comment in the lodepng.c(pp) file in the 'else' case of the searchable LODEPNG_COMPILE_CRC section.*/ -#ifndef LODEPNG_NO_COMPILE_CRC -/*pass -DLODEPNG_NO_COMPILE_CRC to the compiler to disable the built-in one, -or comment out LODEPNG_COMPILE_CRC below*/ -#define LODEPNG_COMPILE_CRC -#endif - -/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ -#ifdef __cplusplus -#ifndef LODEPNG_NO_COMPILE_CPP -/*pass -DLODEPNG_NO_COMPILE_CPP to the compiler to disable C++ (not needed if a C-only compiler), -or comment out LODEPNG_COMPILE_CPP below*/ -#define LODEPNG_COMPILE_CPP -#endif -#endif - -#ifdef LODEPNG_COMPILE_CPP -#include -#include -#endif /*LODEPNG_COMPILE_CPP*/ - -#ifdef LODEPNG_COMPILE_PNG -/*The PNG color types (also used for raw image).*/ -typedef enum LodePNGColorType { - LCT_GREY = 0, /*grayscale: 1,2,4,8,16 bit*/ - LCT_RGB = 2, /*RGB: 8,16 bit*/ - LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ - LCT_GREY_ALPHA = 4, /*grayscale with alpha: 8,16 bit*/ - LCT_RGBA = 6, /*RGB with alpha: 8,16 bit*/ - /*LCT_MAX_OCTET_VALUE lets the compiler allow this enum to represent any invalid - byte value from 0 to 255 that could be present in an invalid PNG file header. Do - not use, compare with or set the name LCT_MAX_OCTET_VALUE, instead either use - the valid color type names above, or numeric values like 1 or 7 when checking for - particular disallowed color type byte values, or cast to integer to print it.*/ - LCT_MAX_OCTET_VALUE = 255 -} LodePNGColorType; - -#ifdef LODEPNG_COMPILE_DECODER -/* -Converts PNG data in memory to raw pixel data. -out: Output parameter. Pointer to buffer that will contain the raw pixel data. - After decoding, its size is w * h * (bytes per pixel) bytes larger than - initially. Bytes per pixel depends on colortype and bitdepth. - Must be freed after usage with free(*out). - Note: for 16-bit per channel colors, uses big endian format like PNG does. -w: Output parameter. Pointer to width of pixel data. -h: Output parameter. Pointer to height of pixel data. -in: Memory buffer with the PNG file. -insize: size of the in buffer. -colortype: the desired color type for the raw output image. See explanation on PNG color types. -bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ -unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); - -/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ -unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); - -#ifdef LODEPNG_COMPILE_DISK -/* -Load PNG from disk, from file with given name. -Same as the other decode functions, but instead takes a filename as input. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory.*/ -unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory.*/ -unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename); - -/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory.*/ -unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_DECODER*/ - - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Converts raw pixel data into a PNG image in memory. The colortype and bitdepth - of the output PNG image cannot be chosen, they are automatically determined - by the colortype, bitdepth and content of the input pixel data. - Note: for 16-bit per channel colors, needs big endian format like PNG does. -out: Output parameter. Pointer to buffer that will contain the PNG image data. - Must be freed after usage with free(*out). -outsize: Output parameter. Pointer to the size in bytes of the out buffer. -image: The raw pixel data to encode. The size of this buffer should be - w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. -w: width of the raw pixel data in pixels. -h: height of the raw pixel data in pixels. -colortype: the color type of the raw input image. See explanation on PNG color types. -bitdepth: the bit depth of the raw input image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ -unsigned lodepng_encode32(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); - -/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ -unsigned lodepng_encode24(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); - -#ifdef LODEPNG_COMPILE_DISK -/* -Converts raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. - -NOTE: This overwrites existing files without warning! - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and encode in-memory.*/ -unsigned lodepng_encode_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and encode in-memory.*/ -unsigned lodepng_encode32_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); - -/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and encode in-memory.*/ -unsigned lodepng_encode24_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng { -#ifdef LODEPNG_COMPILE_DECODER -/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype -is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const unsigned char* in, size_t insize, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::vector& in, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts PNG file from disk to raw pixel data in memory. -Same as the other decode functions, but instead takes a filename as input. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory. -*/ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::string& filename, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_DECODER */ - -#ifdef LODEPNG_COMPILE_ENCODER -/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype -is that of the raw input data. The output PNG color type will be auto chosen.*/ -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts 32-bit RGBA raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. - -NOTE: This overwrites existing files without warning! - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory. -*/ -unsigned encode(const std::string& filename, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(const std::string& filename, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_ENCODER */ -} /* namespace lodepng */ -#endif /*LODEPNG_COMPILE_CPP*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT -/*Returns an English description of the numerical error code.*/ -const char* lodepng_error_text(unsigned code); -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Settings for zlib decompression*/ -typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; -struct LodePNGDecompressSettings { - /* Check LodePNGDecoderSettings for more ignorable errors such as ignore_crc */ - unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ - unsigned ignore_nlen; /*ignore complement of len checksum in uncompressed blocks*/ - - /*Maximum decompressed size, beyond this the decoder may (and is encouraged to) stop decoding, - return an error, output a data size > max_output_size and all the data up to that point. This is - not hard limit nor a guarantee, but can prevent excessive memory usage. This setting is - ignored by the PNG decoder, but is used by the deflate/zlib decoder and can be used by custom ones. - Set to 0 to impose no limit (the default).*/ - size_t max_output_size; - - /*use custom zlib decoder instead of built in one (default: null). - Should return 0 if success, any non-0 if error (numeric value not exposed).*/ - unsigned (*custom_zlib)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGDecompressSettings*); - /*use custom deflate decoder instead of built in one (default: null) - if custom_zlib is not null, custom_inflate is ignored (the zlib format uses deflate). - Should return 0 if success, any non-0 if error (numeric value not exposed).*/ - unsigned (*custom_inflate)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGDecompressSettings*); - - const void* custom_context; /*optional custom settings for custom functions*/ -}; - -extern const LodePNGDecompressSettings lodepng_default_decompress_settings; -void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Settings for zlib compression. Tweaking these settings tweaks the balance -between speed and compression ratio. -*/ -typedef struct LodePNGCompressSettings LodePNGCompressSettings; -struct LodePNGCompressSettings /*deflate = compress*/ { - /*LZ77 related settings*/ - unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ - unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ - unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ - unsigned minmatch; /*minimum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ - unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ - unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ - - /*use custom zlib encoder instead of built in one (default: null)*/ - unsigned (*custom_zlib)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGCompressSettings*); - /*use custom deflate encoder instead of built in one (default: null) - if custom_zlib is used, custom_deflate is ignored since only the built in - zlib function will call custom_deflate*/ - unsigned (*custom_deflate)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGCompressSettings*); - - const void* custom_context; /*optional custom settings for custom functions*/ -}; - -extern const LodePNGCompressSettings lodepng_default_compress_settings; -void lodepng_compress_settings_init(LodePNGCompressSettings* settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_PNG -/* -Color mode of an image. Contains all information required to decode the pixel -bits to RGBA colors. This information is the same as used in the PNG file -format, and is used both for PNG and raw image data in LodePNG. -*/ -typedef struct LodePNGColorMode { - /*header (IHDR)*/ - LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ - unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ - - /* - palette (PLTE and tRNS) - - Dynamically allocated with the colors of the palette, including alpha. - This field may not be allocated directly, use lodepng_color_mode_init first, - then lodepng_palette_add per color to correctly initialize it (to ensure size - of exactly 1024 bytes). - - The alpha channels must be set as well, set them to 255 for opaque images. - - When decoding, with the default settings you can ignore this palette, since - LodePNG already fills the palette colors in the pixels of the raw RGBA output, - but when decoding to the original PNG color mode it is needed to reconstruct - the colors. - - The palette is only supported for color type 3. - */ - unsigned char* palette; /*palette in RGBARGBA... order. Must be either 0, or when allocated must have 1024 bytes*/ - size_t palettesize; /*palette size in number of colors (amount of used bytes is 4 * palettesize)*/ - - /* - transparent color key (tRNS) - - This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. - For grayscale PNGs, r, g and b will all 3 be set to the same. - - When decoding, by default you can ignore this information, since LodePNG sets - pixels with this key to transparent already in the raw RGBA output. - - The color key is only supported for color types 0 and 2. - */ - unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ - unsigned key_r; /*red/grayscale component of color key*/ - unsigned key_g; /*green component of color key*/ - unsigned key_b; /*blue component of color key*/ -} LodePNGColorMode; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_color_mode_init(LodePNGColorMode* info); -void lodepng_color_mode_cleanup(LodePNGColorMode* info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); -/* Makes a temporary LodePNGColorMode that does not need cleanup (no palette) */ -LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth); - -void lodepng_palette_clear(LodePNGColorMode* info); -/*add 1 color to the palette*/ -unsigned lodepng_palette_add(LodePNGColorMode* info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a); - -/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ -unsigned lodepng_get_bpp(const LodePNGColorMode* info); -/*get the amount of color channels used, based on colortype in the struct. -If a palette is used, it counts as 1 channel.*/ -unsigned lodepng_get_channels(const LodePNGColorMode* info); -/*is it a grayscale type? (only colortype 0 or 4)*/ -unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); -/*has it got an alpha channel? (only colortype 2 or 6)*/ -unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); -/*has it got a palette? (only colortype 3)*/ -unsigned lodepng_is_palette_type(const LodePNGColorMode* info); -/*only returns true if there is a palette and there is a value in the palette with alpha < 255. -Loops through the palette to check this.*/ -unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); -/* -Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. -Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). -Returns false if the image can only have opaque pixels. -In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, -or if "key_defined" is true. -*/ -unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); -/*Returns the byte size of a raw image buffer with given width, height and color mode*/ -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*The information of a Time chunk in PNG.*/ -typedef struct LodePNGTime { - unsigned year; /*2 bytes used (0-65535)*/ - unsigned month; /*1-12*/ - unsigned day; /*1-31*/ - unsigned hour; /*0-23*/ - unsigned minute; /*0-59*/ - unsigned second; /*0-60 (to allow for leap seconds)*/ -} LodePNGTime; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*Information about the PNG image, except pixels, width and height.*/ -typedef struct LodePNGInfo { - /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ - unsigned compression_method;/*compression method of the original file. Always 0.*/ - unsigned filter_method; /*filter method of the original file*/ - unsigned interlace_method; /*interlace method of the original file: 0=none, 1=Adam7*/ - LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /* - Suggested background color chunk (bKGD) - - This uses the same color mode and bit depth as the PNG (except no alpha channel), - with values truncated to the bit depth in the unsigned integer. - - For grayscale and palette PNGs, the value is stored in background_r. The values - in background_g and background_b are then unused. The decoder will set them - equal to background_r, the encoder ignores them in this case. - - When decoding, you may get these in a different color mode than the one you requested - for the raw pixels: the colortype and bitdepth defined by info_png.color, that is the - ones defined in the header of the PNG image, are used. - - When encoding with auto_convert, you must use the color model defined in info_png.color for - these values. The encoder normally ignores info_png.color when auto_convert is on, but will - use it to interpret these values (and convert copies of them to its chosen color model). - - When encoding, avoid setting this to an expensive color, such as a non-gray value - when the image is gray, or the compression will be worse since it will be forced to - write the PNG with a more expensive color mode (when auto_convert is on). - - The decoder does not use this background color to edit the color of pixels. This is a - completely optional metadata feature. - */ - unsigned background_defined; /*is a suggested background color given?*/ - unsigned background_r; /*red/gray/palette component of suggested background color*/ - unsigned background_g; /*green component of suggested background color*/ - unsigned background_b; /*blue component of suggested background color*/ - - /* - Non-international text chunks (tEXt and zTXt) - - The char** arrays each contain num strings. The actual messages are in - text_strings, while text_keys are keywords that give a short description what - the actual text represents, e.g. Title, Author, Description, or anything else. - - All the string fields below including strings, keys, names and language tags are null terminated. - The PNG specification uses null characters for the keys, names and tags, and forbids null - characters to appear in the main text which is why we can use null termination everywhere here. - - A keyword is minimum 1 character and maximum 79 characters long (plus the - additional null terminator). It's discouraged to use a single line length - longer than 79 characters for texts. - - Don't allocate these text buffers yourself. Use the init/cleanup functions - correctly and use lodepng_add_text and lodepng_clear_text. - - Standard text chunk keywords and strings are encoded using Latin-1. - */ - size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ - char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ - char** text_strings; /*the actual text*/ - - /* - International text chunks (iTXt) - Similar to the non-international text chunks, but with additional strings - "langtags" and "transkeys", and the following text encodings are used: - keys: Latin-1, langtags: ASCII, transkeys and strings: UTF-8. - keys must be 1-79 characters (plus the additional null terminator), the other - strings are any length. - */ - size_t itext_num; /*the amount of international texts in this PNG*/ - char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ - char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ - char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ - char** itext_strings; /*the actual international text - UTF-8 string*/ - - /*time chunk (tIME)*/ - unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ - LodePNGTime time; - - /*phys chunk (pHYs)*/ - unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ - unsigned phys_x; /*pixels per unit in x direction*/ - unsigned phys_y; /*pixels per unit in y direction*/ - unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ - - /* - Color profile related chunks: gAMA, cHRM, sRGB, iCPP, sBIT - - LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color - profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please - use these values with a color management library. - - See the PNG, ICC and sRGB specifications for more information about the meaning of these values. - */ - - /* gAMA chunk: optional, overridden by sRGB or iCCP if those are present. */ - unsigned gama_defined; /* Whether a gAMA chunk is present (0 = not present, 1 = present). */ - unsigned gama_gamma; /* Gamma exponent times 100000 */ - - /* cHRM chunk: optional, overridden by sRGB or iCCP if those are present. */ - unsigned chrm_defined; /* Whether a cHRM chunk is present (0 = not present, 1 = present). */ - unsigned chrm_white_x; /* White Point x times 100000 */ - unsigned chrm_white_y; /* White Point y times 100000 */ - unsigned chrm_red_x; /* Red x times 100000 */ - unsigned chrm_red_y; /* Red y times 100000 */ - unsigned chrm_green_x; /* Green x times 100000 */ - unsigned chrm_green_y; /* Green y times 100000 */ - unsigned chrm_blue_x; /* Blue x times 100000 */ - unsigned chrm_blue_y; /* Blue y times 100000 */ - - /* - sRGB chunk: optional. May not appear at the same time as iCCP. - If gAMA is also present gAMA must contain value 45455. - If cHRM is also present cHRM must contain respectively 31270,32900,64000,33000,30000,60000,15000,6000. - */ - unsigned srgb_defined; /* Whether an sRGB chunk is present (0 = not present, 1 = present). */ - unsigned srgb_intent; /* Rendering intent: 0=perceptual, 1=rel. colorimetric, 2=saturation, 3=abs. colorimetric */ - - /* - iCCP chunk: optional. May not appear at the same time as sRGB. - - LodePNG does not parse or use the ICC profile (except its color space header field for an edge case), a - separate library to handle the ICC data (not included in LodePNG) format is needed to use it for color - management and conversions. - - For encoding, if iCCP is present, gAMA and cHRM are recommended to be added as well with values that match the ICC - profile as closely as possible, if you wish to do this you should provide the correct values for gAMA and cHRM and - enable their '_defined' flags since LodePNG will not automatically compute them from the ICC profile. - - For encoding, the ICC profile is required by the PNG specification to be an "RGB" profile for non-gray - PNG color types and a "GRAY" profile for gray PNG color types. If you disable auto_convert, you must ensure - the ICC profile type matches your requested color type, else the encoder gives an error. If auto_convert is - enabled (the default), and the ICC profile is not a good match for the pixel data, this will result in an encoder - error if the pixel data has non-gray pixels for a GRAY profile, or a silent less-optimal compression of the pixel - data if the pixels could be encoded as grayscale but the ICC profile is RGB. - - To avoid this do not set an ICC profile in the image unless there is a good reason for it, and when doing so - make sure you compute it carefully to avoid the above problems. - */ - unsigned iccp_defined; /* Whether an iCCP chunk is present (0 = not present, 1 = present). */ - char* iccp_name; /* Null terminated string with profile name, 1-79 bytes */ - /* - The ICC profile in iccp_profile_size bytes. - Don't allocate this buffer yourself. Use the init/cleanup functions - correctly and use lodepng_set_icc and lodepng_clear_icc. - */ - unsigned char* iccp_profile; - unsigned iccp_profile_size; /* The size of iccp_profile in bytes */ - - /* - sBIT chunk: significant bits. Optional metadata, only set this if needed. - - If defined, these values give the bit depth of the original data. Since PNG only stores 1, 2, 4, 8 or 16-bit - per channel data, the significant bits value can be used to indicate the original encoded data has another - sample depth, such as 10 or 12. - - Encoders using this value, when storing the pixel data, should use the most significant bits - of the data to store the original bits, and use a good sample depth scaling method such as - "left bit replication" to fill in the least significant bits, rather than fill zeroes. - - Decoders using this value, if able to work with data that's e.g. 10-bit or 12-bit, should right - shift the data to go back to the original bit depth, but decoders are also allowed to ignore - sbit and work e.g. with the 8-bit or 16-bit data from the PNG directly, since thanks - to the encoder contract, the values encoded in PNG are in valid range for the PNG bit depth. - - For grayscale images, sbit_g and sbit_b are not used, and for images that don't use color - type RGBA or grayscale+alpha, sbit_a is not used (it's not used even for palette images with - translucent palette values, or images with color key). The values that are used must be - greater than zero and smaller than or equal to the PNG bit depth. - - The color type from the header in the PNG image defines these used and unused fields: if - decoding with a color mode conversion, such as always decoding to RGBA, this metadata still - only uses the color type of the original PNG, and may e.g. lack the alpha channel info - if the PNG was RGB. When encoding with auto_convert (as well as without), also always the - color model defined in info_png.color determines this. - - NOTE: enabling sbit can hurt compression, because the encoder can then not always use - auto_convert to choose a more optimal color mode for the data, because the PNG format has - strict requirements for the allowed sbit values in combination with color modes. - For example, setting these fields to 10-bit will force the encoder to keep using a 16-bit per channel - color mode, even if the pixel data would in fact fit in a more efficient 8-bit mode. - */ - unsigned sbit_defined; /*is significant bits given? if not, the values below are unused*/ - unsigned sbit_r; /*red or gray component of significant bits*/ - unsigned sbit_g; /*green component of significant bits*/ - unsigned sbit_b; /*blue component of significant bits*/ - unsigned sbit_a; /*alpha component of significant bits*/ - - /* End of color profile related chunks */ - - - /* - unknown chunks: chunks not known by LodePNG, passed on byte for byte. - - There are 3 buffers, one for each position in the PNG where unknown chunks can appear. - Each buffer contains all unknown chunks for that position consecutively. - The 3 positions are: - 0: between IHDR and PLTE, 1: between PLTE and IDAT, 2: between IDAT and IEND. - - For encoding, do not store critical chunks or known chunks that are enabled with a "_defined" flag - above in here, since the encoder will blindly follow this and could then encode an invalid PNG file - (such as one with two IHDR chunks or the disallowed combination of sRGB with iCCP). But do use - this if you wish to store an ancillary chunk that is not supported by LodePNG (such as sPLT or hIST), - or any non-standard PNG chunk. - - Do not allocate or traverse this data yourself. Use the chunk traversing functions declared - later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. - */ - unsigned char* unknown_chunks_data[3]; - size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGInfo; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_info_init(LodePNGInfo* info); -void lodepng_info_cleanup(LodePNGInfo* info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ -void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ - -unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ -void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ - -/*replaces if exists*/ -unsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size); -void lodepng_clear_icc(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/* -Converts raw buffer from one color type to another color type, based on -LodePNGColorMode structs to describe the input and output color type. -See the reference manual at the end of this header file to see which color conversions are supported. -return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) -The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel -of the output color type (lodepng_get_bpp). -For < 8 bpp images, there should not be padding bits at the end of scanlines. -For 16-bit per channel colors, uses big endian format like PNG does. -Return value is LodePNG error code -*/ -unsigned lodepng_convert(unsigned char* out, const unsigned char* in, - const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, - unsigned w, unsigned h); - -#ifdef LODEPNG_COMPILE_DECODER -/* -Settings for the decoder. This contains settings for the PNG and the Zlib -decoder, but not the Info settings from the Info structs. -*/ -typedef struct LodePNGDecoderSettings { - LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ - - /* Check LodePNGDecompressSettings for more ignorable errors such as ignore_adler32 */ - unsigned ignore_crc; /*ignore CRC checksums*/ - unsigned ignore_critical; /*ignore unknown critical chunks*/ - unsigned ignore_end; /*ignore issues at end of file if possible (missing IEND chunk, too large chunk, ...)*/ - /* TODO: make a system involving warnings with levels and a strict mode instead. Other potentially recoverable - errors: srgb rendering intent value, size of content of ancillary chunks, more than 79 characters for some - strings, placement/combination rules for ancillary chunks, crc of unknown chunks, allowed characters - in string keys, etc... */ - - unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ - - /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ - unsigned remember_unknown_chunks; - - /* maximum size for decompressed text chunks. If a text chunk's text is larger than this, an error is returned, - unless reading text chunks is disabled or this limit is set higher or disabled. Set to 0 to allow any size. - By default it is a value that prevents unreasonably large strings from hogging memory. */ - size_t max_text_size; - - /* maximum size for compressed ICC chunks. If the ICC profile is larger than this, an error will be returned. Set to - 0 to allow any size. By default this is a value that prevents ICC profiles that would be much larger than any - legitimate profile could be to hog memory. */ - size_t max_icc_size; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGDecoderSettings; - -void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ -typedef enum LodePNGFilterStrategy { - /*every filter at zero*/ - LFS_ZERO = 0, - /*every filter at 1, 2, 3 or 4 (paeth), unlike LFS_ZERO not a good choice, but for testing*/ - LFS_ONE = 1, - LFS_TWO = 2, - LFS_THREE = 3, - LFS_FOUR = 4, - /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/ - LFS_MINSUM, - /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending - on the image, this is better or worse than minsum.*/ - LFS_ENTROPY, - /* - Brute-force-search PNG filters by compressing each filter for each scanline. - Experimental, very slow, and only rarely gives better compression than MINSUM. - */ - LFS_BRUTE_FORCE, - /*use predefined_filters buffer: you specify the filter type for each scanline*/ - LFS_PREDEFINED -} LodePNGFilterStrategy; - -/*Gives characteristics about the integer RGBA colors of the image (count, alpha channel usage, bit depth, ...), -which helps decide which color model to use for encoding. -Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms.*/ -typedef struct LodePNGColorStats { - unsigned colored; /*not grayscale*/ - unsigned key; /*image is not opaque and color key is possible instead of full alpha*/ - unsigned short key_r; /*key values, always as 16-bit, in 8-bit case the byte is duplicated, e.g. 65535 means 255*/ - unsigned short key_g; - unsigned short key_b; - unsigned alpha; /*image is not opaque and alpha channel or alpha palette required*/ - unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16 or allow_palette is disabled.*/ - unsigned char palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order, only valid when numcolors is valid*/ - unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for grayscale only. 16 if 16-bit per channel required.*/ - size_t numpixels; - - /*user settings for computing/using the stats*/ - unsigned allow_palette; /*default 1. if 0, disallow choosing palette colortype in auto_choose_color, and don't count numcolors*/ - unsigned allow_greyscale; /*default 1. if 0, choose RGB or RGBA even if the image only has gray colors*/ -} LodePNGColorStats; - -void lodepng_color_stats_init(LodePNGColorStats* stats); - -/*Get a LodePNGColorStats of the image. The stats must already have been inited. -Returns error code (e.g. alloc fail) or 0 if ok.*/ -unsigned lodepng_compute_color_stats(LodePNGColorStats* stats, - const unsigned char* image, unsigned w, unsigned h, - const LodePNGColorMode* mode_in); - -/*Settings for the encoder.*/ -typedef struct LodePNGEncoderSettings { - LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ - - unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ - - /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than - 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to - completely follow the official PNG heuristic, filter_palette_zero must be true and - filter_strategy must be LFS_MINSUM*/ - unsigned filter_palette_zero; - /*Which filter strategy to use when not using zeroes due to filter_palette_zero. - Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ - LodePNGFilterStrategy filter_strategy; - /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with - the same length as the amount of scanlines in the image, and each value must <= 5. You - have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero - must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ - const unsigned char* predefined_filters; - - /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). - If colortype is 3, PLTE is always created. If color type is explicitely set - to a grayscale type (1 or 4), this is not done and is ignored. If enabling this, - a palette must be present in the info_png. - NOTE: enabling this may worsen compression if auto_convert is used to choose - optimal color mode, because it cannot use grayscale color modes in this case*/ - unsigned force_palette; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*add LodePNG identifier and version as a text chunk, for debugging*/ - unsigned add_id; - /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ - unsigned text_compression; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGEncoderSettings; - -void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) -/*The settings, state and information for extended encoding and decoding.*/ -typedef struct LodePNGState { -#ifdef LODEPNG_COMPILE_DECODER - LodePNGDecoderSettings decoder; /*the decoding settings*/ -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - LodePNGEncoderSettings encoder; /*the encoding settings*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ - LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ - unsigned error; -} LodePNGState; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_state_init(LodePNGState* state); -void lodepng_state_cleanup(LodePNGState* state); -void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_DECODER -/* -Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and -getting much more information about the PNG image and color mode. -*/ -unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize); - -/* -Read the PNG header, but not the actual data. This returns only the information -that is in the IHDR chunk of the PNG, such as width, height and color type. The -information is placed in the info_png field of the LodePNGState. -*/ -unsigned lodepng_inspect(unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize); -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* -Reads one metadata chunk (other than IHDR, which is handled by lodepng_inspect) -of the PNG file and outputs what it read in the state. Returns error code on failure. -Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const -to find the desired chunk type, and if non null use lodepng_inspect_chunk (with -chunk_pointer - start_of_file as pos). -Supports most metadata chunks from the PNG standard (gAMA, bKGD, tEXt, ...). -Ignores unsupported, unknown, non-metadata or IHDR chunks (without error). -Requirements: &in[pos] must point to start of a chunk, must use regular -lodepng_inspect first since format of most other chunks depends on IHDR, and if -there is a PLTE chunk, that one must be inspected before tRNS or bKGD. -*/ -unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, - const unsigned char* in, size_t insize); - -#ifdef LODEPNG_COMPILE_ENCODER -/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ -unsigned lodepng_encode(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGState* state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/* -The lodepng_chunk functions are normally not needed, except to traverse the -unknown chunks stored in the LodePNGInfo struct, or add new ones to it. -It also allows traversing the chunks of an encoded PNG file yourself. - -The chunk pointer always points to the beginning of the chunk itself, that is -the first byte of the 4 length bytes. - -In the PNG file format, chunks have the following format: --4 bytes length: length of the data of the chunk in bytes (chunk itself is 12 bytes longer) --4 bytes chunk type (ASCII a-z,A-Z only, see below) --length bytes of data (may be 0 bytes if length was 0) --4 bytes of CRC, computed on chunk name + data - -The first chunk starts at the 8th byte of the PNG file, the entire rest of the file -exists out of concatenated chunks with the above format. - -PNG standard chunk ASCII naming conventions: --First byte: uppercase = critical, lowercase = ancillary --Second byte: uppercase = public, lowercase = private --Third byte: must be uppercase --Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy -*/ - -/* -Gets the length of the data of the chunk. Total chunk length has 12 bytes more. -There must be at least 4 bytes to read from. If the result value is too large, -it may be corrupt data. -*/ -unsigned lodepng_chunk_length(const unsigned char* chunk); - -/*puts the 4-byte type in null terminated string*/ -void lodepng_chunk_type(char type[5], const unsigned char* chunk); - -/*check if the type is the given type*/ -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); - -/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ -unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); - -/*0: public, 1: private (see PNG standard)*/ -unsigned char lodepng_chunk_private(const unsigned char* chunk); - -/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); - -/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ -unsigned char* lodepng_chunk_data(unsigned char* chunk); -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); - -/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ -unsigned lodepng_chunk_check_crc(const unsigned char* chunk); - -/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ -void lodepng_chunk_generate_crc(unsigned char* chunk); - -/* -Iterate to next chunks, allows iterating through all chunks of the PNG file. -Input must be at the beginning of a chunk (result of a previous lodepng_chunk_next call, -or the 8th byte of a PNG file which always has the first chunk), or alternatively may -point to the first byte of the PNG file (which is not a chunk but the magic header, the -function will then skip over it and return the first real chunk). -Will output pointer to the start of the next chunk, or at or beyond end of the file if there -is no more chunk after this or possibly if the chunk is corrupt. -Start this process at the 8th byte of the PNG file. -In a non-corrupt PNG file, the last chunk should have name "IEND". -*/ -unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end); -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end); - -/*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/ -unsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]); -const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]); - -/* -Appends chunk to the data in out. The given chunk should already have its chunk header. -The out variable and outsize are updated to reflect the new reallocated buffer. -Returns error code (0 if it went ok) -*/ -unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk); - -/* -Appends new chunk to out. The chunk to append is given by giving its length, type -and data separately. The type is a 4-letter string. -The out variable and outsize are updated to reflect the new reallocated buffer. -Returne error code (0 if it went ok) -*/ -unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length, - const char* type, const unsigned char* data); - - -/*Calculate CRC32 of buffer*/ -unsigned lodepng_crc32(const unsigned char* buf, size_t len); -#endif /*LODEPNG_COMPILE_PNG*/ - - -#ifdef LODEPNG_COMPILE_ZLIB -/* -This zlib part can be used independently to zlib compress and decompress a -buffer. It cannot be used to create gzip files however, and it only supports the -part of zlib that is required for PNG, it does not support dictionaries. -*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ -unsigned lodepng_inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings); - -/* -Decompresses Zlib data. Reallocates the out buffer and appends the data. The -data must be according to the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Compresses data with Zlib. Reallocates the out buffer and appends the data. -Zlib adds a small header and trailer around the deflate data. -The data is output in the format of the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings); - -/* -Find length-limited Huffman code for given frequencies. This function is in the -public interface only for tests, it's used internally by lodepng_deflate. -*/ -unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, - size_t numcodes, unsigned maxbitlen); - -/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ -unsigned lodepng_deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings); - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DISK -/* -Load a file from disk into buffer. The function allocates the out buffer, and -after usage you should free it. -out: output parameter, contains pointer to loaded buffer. -outsize: output parameter, size of the allocated out buffer -filename: the path to the file to load -return value: error code (0 means ok) - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory. -*/ -unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); - -/* -Save a file from buffer to disk. Warning, if it exists, this function overwrites -the file without warning! -buffer: the buffer to write -buffersize: size of the buffer to write -filename: the path to the file to save to -return value: error code (0 means ok) - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and encode in-memory -*/ -unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); -#endif /*LODEPNG_COMPILE_DISK*/ - -#ifdef LODEPNG_COMPILE_CPP -/* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */ -namespace lodepng { -#ifdef LODEPNG_COMPILE_PNG -class State : public LodePNGState { - public: - State(); - State(const State& other); - ~State(); - State& operator=(const State& other); -}; - -#ifdef LODEPNG_COMPILE_DECODER -/* Same as other lodepng::decode, but using a State for more settings and information. */ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const unsigned char* in, size_t insize); -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const std::vector& in); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* Same as other lodepng::encode, but using a State for more settings and information. */ -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - State& state); -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - State& state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DISK -/* -Load a file from disk into an std::vector. -return value: error code (0 means ok) - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory -*/ -unsigned load_file(std::vector& buffer, const std::string& filename); - -/* -Save the binary data in an std::vector to a file on disk. The file is overwritten -without warning. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and encode in-memory -*/ -unsigned save_file(const std::vector& buffer, const std::string& filename); -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_PNG */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -/* Zlib-decompress an unsigned char buffer */ -unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); - -/* Zlib-decompress an std::vector */ -unsigned decompress(std::vector& out, const std::vector& in, - const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); -#endif /* LODEPNG_COMPILE_DECODER */ - -#ifdef LODEPNG_COMPILE_ENCODER -/* Zlib-compress an unsigned char buffer */ -unsigned compress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings& settings = lodepng_default_compress_settings); - -/* Zlib-compress an std::vector */ -unsigned compress(std::vector& out, const std::vector& in, - const LodePNGCompressSettings& settings = lodepng_default_compress_settings); -#endif /* LODEPNG_COMPILE_ENCODER */ -#endif /* LODEPNG_COMPILE_ZLIB */ -} /* namespace lodepng */ -#endif /*LODEPNG_COMPILE_CPP*/ - -/* -TODO: -[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often -[.] check compatibility with various compilers - done but needs to be redone for every newer version -[X] converting color to 16-bit per channel types -[X] support color profile chunk types (but never let them touch RGB values by default) -[ ] support all public PNG chunk types (almost done except sPLT and hIST) -[ ] make sure encoder generates no chunks with size > (2^31)-1 -[ ] partial decoding (stream processing) -[X] let the "isFullyOpaque" function check color keys and transparent palettes too -[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" -[ ] allow treating some errors like warnings, when image is recoverable (e.g. 69, 57, 58) -[ ] make warnings like: oob palette, checksum fail, data after iend, wrong/unknown crit chunk, no null terminator in text, ... -[ ] error messages with line numbers (and version) -[ ] errors in state instead of as return code? -[ ] new errors/warnings like suspiciously big decompressed ztxt or iccp chunk -[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes -[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... -[ ] allow user to give data (void*) to custom allocator -[X] provide alternatives for C library functions not present on some platforms (memcpy, ...) -*/ - -#endif /*LODEPNG_H inclusion guard*/ - -/* -LodePNG Documentation ---------------------- - -0. table of contents --------------------- - - 1. about - 1.1. supported features - 1.2. features not supported - 2. C and C++ version - 3. security - 4. decoding - 5. encoding - 6. color conversions - 6.1. PNG color types - 6.2. color conversions - 6.3. padding bits - 6.4. A note about 16-bits per channel and endianness - 7. error values - 8. chunks and PNG editing - 9. compiler support - 10. examples - 10.1. decoder C++ example - 10.2. decoder C example - 11. state settings reference - 12. changes - 13. contact information - - -1. about --------- - -PNG is a file format to store raster images losslessly with good compression, -supporting different color types and alpha channel. - -LodePNG is a PNG codec according to the Portable Network Graphics (PNG) -Specification (Second Edition) - W3C Recommendation 10 November 2003. - -The specifications used are: - -*) Portable Network Graphics (PNG) Specification (Second Edition): - http://www.w3.org/TR/2003/REC-PNG-20031110 -*) RFC 1950 ZLIB Compressed Data Format version 3.3: - http://www.gzip.org/zlib/rfc-zlib.html -*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: - http://www.gzip.org/zlib/rfc-deflate.html - -The most recent version of LodePNG can currently be found at -http://lodev.org/lodepng/ - -LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds -extra functionality. - -LodePNG exists out of two files: --lodepng.h: the header file for both C and C++ --lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage - -If you want to start using LodePNG right away without reading this doc, get the -examples from the LodePNG website to see how to use it in code, or check the -smaller examples in chapter 13 here. - -LodePNG is simple but only supports the basic requirements. To achieve -simplicity, the following design choices were made: There are no dependencies -on any external library. There are functions to decode and encode a PNG with -a single function call, and extended versions of these functions taking a -LodePNGState struct allowing to specify or get more information. By default -the colors of the raw image are always RGB or RGBA, no matter what color type -the PNG file uses. To read and write files, there are simple functions to -convert the files to/from buffers in memory. - -This all makes LodePNG suitable for loading textures in games, demos and small -programs, ... It's less suitable for full fledged image editors, loading PNGs -over network (it requires all the image data to be available before decoding can -begin), life-critical systems, ... - -1.1. supported features ------------------------ - -The following features are supported by the decoder: - -*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, - or the same color type as the PNG -*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image -*) Adam7 interlace and deinterlace for any color type -*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk -*) support for alpha channels, including RGBA color model, translucent palettes and color keying -*) zlib decompression (inflate) -*) zlib compression (deflate) -*) CRC32 and ADLER32 checksums -*) colorimetric color profile conversions: currently experimentally available in lodepng_util.cpp only, - plus alternatively ability to pass on chroma/gamma/ICC profile information to other color management system. -*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. -*) the following chunks are supported by both encoder and decoder: - IHDR: header information - PLTE: color palette - IDAT: pixel data - IEND: the final chunk - tRNS: transparency for palettized images - tEXt: textual information - zTXt: compressed textual information - iTXt: international textual information - bKGD: suggested background color - pHYs: physical dimensions - tIME: modification time - cHRM: RGB chromaticities - gAMA: RGB gamma correction - iCCP: ICC color profile - sRGB: rendering intent - sBIT: significant bits - -1.2. features not supported ---------------------------- - -The following features are not (yet) supported: - -*) some features needed to make a conformant PNG-Editor might be still missing. -*) partial loading/stream processing. All data must be available and is processed in one call. -*) The hIST and sPLT public chunks are not (yet) supported but treated as unknown chunks - - -2. C and C++ version --------------------- - -The C version uses buffers allocated with alloc that you need to free() -yourself. You need to use init and cleanup functions for each struct whenever -using a struct from the C version to avoid exploits and memory leaks. - -The C++ version has extra functions with std::vectors in the interface and the -lodepng::State class which is a LodePNGState with constructor and destructor. - -These files work without modification for both C and C++ compilers because all -the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers -ignore it, and the C code is made to compile both with strict ISO C90 and C++. - -To use the C++ version, you need to rename the source file to lodepng.cpp -(instead of lodepng.c), and compile it with a C++ compiler. - -To use the C version, you need to rename the source file to lodepng.c (instead -of lodepng.cpp), and compile it with a C compiler. - - -3. Security ------------ - -Even if carefully designed, it's always possible that LodePNG contains possible -exploits. If you discover one, please let me know, and it will be fixed. - -When using LodePNG, care has to be taken with the C version of LodePNG, as well -as the C-style structs when working with C++. The following conventions are used -for all C-style structs: - --if a struct has a corresponding init function, always call the init function when making a new one --if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks --if a struct has a corresponding copy function, use the copy function instead of "=". - The destination must also be inited already. - - -4. Decoding ------------ - -Decoding converts a PNG compressed image to a raw pixel buffer. - -Most documentation on using the decoder is at its declarations in the header -above. For C, simple decoding can be done with functions such as -lodepng_decode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_decode. For C++, all decoding can be done with the -various lodepng::decode functions, and lodepng::State can be used for advanced -features. - -When using the LodePNGState, it uses the following fields for decoding: -*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here -*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get -*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use - -LodePNGInfo info_png --------------------- - -After decoding, this contains extra information of the PNG image, except the actual -pixels, width and height because these are already gotten directly from the decoder -functions. - -It contains for example the original color type of the PNG image, text comments, -suggested background color, etc... More details about the LodePNGInfo struct are -at its declaration documentation. - -LodePNGColorMode info_raw -------------------------- - -When decoding, here you can specify which color type you want -the resulting raw image to be. If this is different from the colortype of the -PNG, then the decoder will automatically convert the result. This conversion -always works, except if you want it to convert a color PNG to grayscale or to -a palette with missing colors. - -By default, 32-bit color is used for the result. - -LodePNGDecoderSettings decoder ------------------------------- - -The settings can be used to ignore the errors created by invalid CRC and Adler32 -chunks, and to disable the decoding of tEXt chunks. - -There's also a setting color_convert, true by default. If false, no conversion -is done, the resulting data will be as it was in the PNG (after decompression) -and you'll have to puzzle the colors of the pixels together yourself using the -color type information in the LodePNGInfo. - - -5. Encoding ------------ - -Encoding converts a raw pixel buffer to a PNG compressed image. - -Most documentation on using the encoder is at its declarations in the header -above. For C, simple encoding can be done with functions such as -lodepng_encode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_encode. For C++, all encoding can be done with the -various lodepng::encode functions, and lodepng::State can be used for advanced -features. - -Like the decoder, the encoder can also give errors. However it gives less errors -since the encoder input is trusted, the decoder input (a PNG image that could -be forged by anyone) is not trusted. - -When using the LodePNGState, it uses the following fields for encoding: -*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. -*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has -*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use - -LodePNGInfo info_png --------------------- - -When encoding, you use this the opposite way as when decoding: for encoding, -you fill in the values you want the PNG to have before encoding. By default it's -not needed to specify a color type for the PNG since it's automatically chosen, -but it's possible to choose it yourself given the right settings. - -The encoder will not always exactly match the LodePNGInfo struct you give, -it tries as close as possible. Some things are ignored by the encoder. The -encoder uses, for example, the following settings from it when applicable: -colortype and bitdepth, text chunks, time chunk, the color key, the palette, the -background color, the interlace method, unknown chunks, ... - -When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. -If the palette contains any colors for which the alpha channel is not 255 (so -there are translucent colors in the palette), it'll add a tRNS chunk. - -LodePNGColorMode info_raw -------------------------- - -You specify the color type of the raw image that you give to the input here, -including a possible transparent color key and palette you happen to be using in -your raw image data. - -By default, 32-bit color is assumed, meaning your input has to be in RGBA -format with 4 bytes (unsigned chars) per pixel. - -LodePNGEncoderSettings encoder ------------------------------- - -The following settings are supported (some are in sub-structs): -*) auto_convert: when this option is enabled, the encoder will -automatically choose the smallest possible color mode (including color key) that -can encode the colors of all pixels without information loss. -*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, - 2 = dynamic huffman tree (best compression). Should be 2 for proper - compression. -*) use_lz77: whether or not to use LZ77 for compressed block types. Should be - true for proper compression. -*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value - 2048 by default, but can be set to 32768 for better, but slow, compression. -*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE - chunk if force_palette is true. This can used as suggested palette to convert - to by viewers that don't support more than 256 colors (if those still exist) -*) add_id: add text chunk "Encoder: LodePNG " to the image. -*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. - zTXt chunks use zlib compression on the text. This gives a smaller result on - large texts but a larger result on small texts (such as a single program name). - It's all tEXt or all zTXt though, there's no separate setting per text yet. - - -6. color conversions --------------------- - -An important thing to note about LodePNG, is that the color type of the PNG, and -the color type of the raw image, are completely independent. By default, when -you decode a PNG, you get the result as a raw image in the color type you want, -no matter whether the PNG was encoded with a palette, grayscale or RGBA color. -And if you encode an image, by default LodePNG will automatically choose the PNG -color type that gives good compression based on the values of colors and amount -of colors in the image. It can be configured to let you control it instead as -well, though. - -To be able to do this, LodePNG does conversions from one color mode to another. -It can convert from almost any color type to any other color type, except the -following conversions: RGB to grayscale is not supported, and converting to a -palette when the palette doesn't have a required color is not supported. This is -not supported on purpose: this is information loss which requires a color -reduction algorithm that is beyond the scope of a PNG encoder (yes, RGB to gray -is easy, but there are multiple ways if you want to give some channels more -weight). - -By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB -color, no matter what color type the PNG has. And by default when encoding, -LodePNG automatically picks the best color model for the output PNG, and expects -the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control -the color format of the images yourself, you can skip this chapter. - -6.1. PNG color types --------------------- - -A PNG image can have many color types, ranging from 1-bit color to 64-bit color, -as well as palettized color modes. After the zlib decompression and unfiltering -in the PNG image is done, the raw pixel data will have that color type and thus -a certain amount of bits per pixel. If you want the output raw image after -decoding to have another color type, a conversion is done by LodePNG. - -The PNG specification gives the following color types: - -0: grayscale, bit depths 1, 2, 4, 8, 16 -2: RGB, bit depths 8 and 16 -3: palette, bit depths 1, 2, 4 and 8 -4: grayscale with alpha, bit depths 8 and 16 -6: RGBA, bit depths 8 and 16 - -Bit depth is the amount of bits per pixel per color channel. So the total amount -of bits per pixel is: amount of channels * bitdepth. - -6.2. color conversions ----------------------- - -As explained in the sections about the encoder and decoder, you can specify -color types and bit depths in info_png and info_raw to change the default -behaviour. - -If, when decoding, you want the raw image to be something else than the default, -you need to set the color type and bit depth you want in the LodePNGColorMode, -or the parameters colortype and bitdepth of the simple decoding function. - -If, when encoding, you use another color type than the default in the raw input -image, you need to specify its color type and bit depth in the LodePNGColorMode -of the raw image, or use the parameters colortype and bitdepth of the simple -encoding function. - -If, when encoding, you don't want LodePNG to choose the output PNG color type -but control it yourself, you need to set auto_convert in the encoder settings -to false, and specify the color type you want in the LodePNGInfo of the -encoder (including palette: it can generate a palette if auto_convert is true, -otherwise not). - -If the input and output color type differ (whether user chosen or auto chosen), -LodePNG will do a color conversion, which follows the rules below, and may -sometimes result in an error. - -To avoid some confusion: --the decoder converts from PNG to raw image --the encoder converts from raw image to PNG --the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image --the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG --when encoding, the color type in LodePNGInfo is ignored if auto_convert - is enabled, it is automatically generated instead --when decoding, the color type in LodePNGInfo is set by the decoder to that of the original - PNG image, but it can be ignored since the raw image has the color type you requested instead --if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion - between the color types is done if the color types are supported. If it is not - supported, an error is returned. If the types are the same, no conversion is done. --even though some conversions aren't supported, LodePNG supports loading PNGs from any - colortype and saving PNGs to any colortype, sometimes it just requires preparing - the raw image correctly before encoding. --both encoder and decoder use the same color converter. - -The function lodepng_convert does the color conversion. It is available in the -interface but normally isn't needed since the encoder and decoder already call -it. - -Non supported color conversions: --color to grayscale when non-gray pixels are present: no error is thrown, but -the result will look ugly because only the red channel is taken (it assumes all -three channels are the same in this case so ignores green and blue). The reason -no error is given is to allow converting from three-channel grayscale images to -one-channel even if there are numerical imprecisions. --anything to palette when the palette does not have an exact match for a from-color -in it: in this case an error is thrown - -Supported color conversions: --anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA --any gray or gray+alpha, to gray or gray+alpha --anything to a palette, as long as the palette has the requested colors in it --removing alpha channel --higher to smaller bitdepth, and vice versa - -If you want no color conversion to be done (e.g. for speed or control): --In the encoder, you can make it save a PNG with any color type by giving the -raw color mode and LodePNGInfo the same color mode, and setting auto_convert to -false. --In the decoder, you can make it store the pixel data in the same color type -as the PNG has, by setting the color_convert setting to false. Settings in -info_raw are then ignored. - -6.3. padding bits ------------------ - -In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines -have a bit amount that isn't a multiple of 8, then padding bits are used so that each -scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. -The raw input image you give to the encoder, and the raw output image you get from the decoder -will NOT have these padding bits, e.g. in the case of a 1-bit image with a width -of 7 pixels, the first pixel of the second scanline will the 8th bit of the first byte, -not the first bit of a new byte. - -6.4. A note about 16-bits per channel and endianness ----------------------------------------------------- - -LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like -for any other color format. The 16-bit values are stored in big endian (most -significant byte first) in these arrays. This is the opposite order of the -little endian used by x86 CPU's. - -LodePNG always uses big endian because the PNG file format does so internally. -Conversions to other formats than PNG uses internally are not supported by -LodePNG on purpose, there are myriads of formats, including endianness of 16-bit -colors, the order in which you store R, G, B and A, and so on. Supporting and -converting to/from all that is outside the scope of LodePNG. - -This may mean that, depending on your use case, you may want to convert the big -endian output of LodePNG to little endian with a for loop. This is certainly not -always needed, many applications and libraries support big endian 16-bit colors -anyway, but it means you cannot simply cast the unsigned char* buffer to an -unsigned short* buffer on x86 CPUs. - - -7. error values ---------------- - -All functions in LodePNG that return an error code, return 0 if everything went -OK, or a non-zero code if there was an error. - -The meaning of the LodePNG error values can be retrieved with the function -lodepng_error_text: given the numerical error code, it returns a description -of the error in English as a string. - -Check the implementation of lodepng_error_text to see the meaning of each code. - -It is not recommended to use the numerical values to programmatically make -different decisions based on error types as the numbers are not guaranteed to -stay backwards compatible. They are for human consumption only. Programmatically -only 0 or non-0 matter. - - -8. chunks and PNG editing -------------------------- - -If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG -editor that should follow the rules about handling of unknown chunks, or if your -program is able to read other types of chunks than the ones handled by LodePNG, -then that's possible with the chunk functions of LodePNG. - -A PNG chunk has the following layout: - -4 bytes length -4 bytes type name -length bytes data -4 bytes CRC - -8.1. iterating through chunks ------------------------------ - -If you have a buffer containing the PNG image data, then the first chunk (the -IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the -signature of the PNG and are not part of a chunk. But if you start at byte 8 -then you have a chunk, and can check the following things of it. - -NOTE: none of these functions check for memory buffer boundaries. To avoid -exploits, always make sure the buffer contains all the data of the chunks. -When using lodepng_chunk_next, make sure the returned value is within the -allocated memory. - -unsigned lodepng_chunk_length(const unsigned char* chunk): - -Get the length of the chunk's data. The total chunk length is this length + 12. - -void lodepng_chunk_type(char type[5], const unsigned char* chunk): -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): - -Get the type of the chunk or compare if it's a certain type - -unsigned char lodepng_chunk_critical(const unsigned char* chunk): -unsigned char lodepng_chunk_private(const unsigned char* chunk): -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): - -Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). -Check if the chunk is private (public chunks are part of the standard, private ones not). -Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical -chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your -program doesn't handle that type of unknown chunk. - -unsigned char* lodepng_chunk_data(unsigned char* chunk): -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): - -Get a pointer to the start of the data of the chunk. - -unsigned lodepng_chunk_check_crc(const unsigned char* chunk): -void lodepng_chunk_generate_crc(unsigned char* chunk): - -Check if the crc is correct or generate a correct one. - -unsigned char* lodepng_chunk_next(unsigned char* chunk): -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): - -Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these -functions do no boundary checking of the allocated data whatsoever, so make sure there is enough -data available in the buffer to be able to go to the next chunk. - -unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk): -unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length, - const char* type, const unsigned char* data): - -These functions are used to create new chunks that are appended to the data in *out that has -length *outsize. The append function appends an existing chunk to the new data. The create -function creates a new chunk with the given parameters and appends it. Type is the 4-letter -name of the chunk. - -8.2. chunks in info_png ------------------------ - -The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 -buffers (each with size) to contain 3 types of unknown chunks: -the ones that come before the PLTE chunk, the ones that come between the PLTE -and the IDAT chunks, and the ones that come after the IDAT chunks. -It's necessary to make the distinction between these 3 cases because the PNG -standard forces to keep the ordering of unknown chunks compared to the critical -chunks, but does not force any other ordering rules. - -info_png.unknown_chunks_data[0] is the chunks before PLTE -info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT -info_png.unknown_chunks_data[2] is the chunks after IDAT - -The chunks in these 3 buffers can be iterated through and read by using the same -way described in the previous subchapter. - -When using the decoder to decode a PNG, you can make it store all unknown chunks -if you set the option settings.remember_unknown_chunks to 1. By default, this -option is off (0). - -The encoder will always encode unknown chunks that are stored in the info_png. -If you need it to add a particular chunk that isn't known by LodePNG, you can -use lodepng_chunk_append or lodepng_chunk_create to the chunk data in -info_png.unknown_chunks_data[x]. - -Chunks that are known by LodePNG should not be added in that way. E.g. to make -LodePNG add a bKGD chunk, set background_defined to true and add the correct -parameters there instead. - - -9. compiler support -------------------- - -No libraries other than the current standard C library are needed to compile -LodePNG. For the C++ version, only the standard C++ library is needed on top. -Add the files lodepng.c(pp) and lodepng.h to your project, include -lodepng.h where needed, and your program can read/write PNG files. - -It is compatible with C90 and up, and C++03 and up. - -If performance is important, use optimization when compiling! For both the -encoder and decoder, this makes a large difference. - -Make sure that LodePNG is compiled with the same compiler of the same version -and with the same settings as the rest of the program, or the interfaces with -std::vectors and std::strings in C++ can be incompatible. - -CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. - -*) gcc and g++ - -LodePNG is developed in gcc so this compiler is natively supported. It gives no -warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ -version 4.7.1 on Linux, 32-bit and 64-bit. - -*) Clang - -Fully supported and warning-free. - -*) Mingw - -The Mingw compiler (a port of gcc for Windows) should be fully supported by -LodePNG. - -*) Visual Studio and Visual C++ Express Edition - -LodePNG should be warning-free with warning level W4. Two warnings were disabled -with pragmas though: warning 4244 about implicit conversions, and warning 4996 -where it wants to use a non-standard function fopen_s instead of the standard C -fopen. - -Visual Studio may want "stdafx.h" files to be included in each source file and -give an error "unexpected end of file while looking for precompiled header". -This is not standard C++ and will not be added to the stock LodePNG. You can -disable it for lodepng.cpp only by right clicking it, Properties, C/C++, -Precompiled Headers, and set it to Not Using Precompiled Headers there. - -NOTE: Modern versions of VS should be fully supported, but old versions, e.g. -VS6, are not guaranteed to work. - -*) Compilers on Macintosh - -LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for -C and C++. - -*) Other Compilers - -If you encounter problems on any compilers, feel free to let me know and I may -try to fix it if the compiler is modern and standards compliant. - - -10. examples ------------- - -This decoder example shows the most basic usage of LodePNG. More complex -examples can be found on the LodePNG website. - -NOTE: these examples do not support wide-character filenames, you can use an -external method to handle such files and encode or decode in-memory - -10.1. decoder C++ example -------------------------- - -#include "lodepng.h" -#include - -int main(int argc, char *argv[]) { - const char* filename = argc > 1 ? argv[1] : "test.png"; - - //load and decode - std::vector image; - unsigned width, height; - unsigned error = lodepng::decode(image, width, height, filename); - - //if there's an error, display it - if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; - - //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... -} - -10.2. decoder C example ------------------------ - -#include "lodepng.h" - -int main(int argc, char *argv[]) { - unsigned error; - unsigned char* image; - size_t width, height; - const char* filename = argc > 1 ? argv[1] : "test.png"; - - error = lodepng_decode32_file(&image, &width, &height, filename); - - if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); - - / * use image here * / - - free(image); - return 0; -} - -11. state settings reference ----------------------------- - -A quick reference of some settings to set on the LodePNGState - -For decoding: - -state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums -state.decoder.zlibsettings.custom_...: use custom inflate function -state.decoder.ignore_crc: ignore CRC checksums -state.decoder.ignore_critical: ignore unknown critical chunks -state.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors -state.decoder.color_convert: convert internal PNG color to chosen one -state.decoder.read_text_chunks: whether to read in text metadata chunks -state.decoder.remember_unknown_chunks: whether to read in unknown chunks -state.info_raw.colortype: desired color type for decoded image -state.info_raw.bitdepth: desired bit depth for decoded image -state.info_raw....: more color settings, see struct LodePNGColorMode -state.info_png....: no settings for decoder but ouput, see struct LodePNGInfo - -For encoding: - -state.encoder.zlibsettings.btype: disable compression by setting it to 0 -state.encoder.zlibsettings.use_lz77: use LZ77 in compression -state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize -state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match -state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching -state.encoder.zlibsettings.lazymatching: try one more LZ77 matching -state.encoder.zlibsettings.custom_...: use custom deflate function -state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png -state.encoder.filter_palette_zero: PNG filter strategy for palette -state.encoder.filter_strategy: PNG filter strategy to encode with -state.encoder.force_palette: add palette even if not encoding to one -state.encoder.add_id: add LodePNG identifier and version as a text chunk -state.encoder.text_compression: use compressed text chunks for metadata -state.info_raw.colortype: color type of raw input image you provide -state.info_raw.bitdepth: bit depth of raw input image you provide -state.info_raw: more color settings, see struct LodePNGColorMode -state.info_png.color.colortype: desired color type if auto_convert is false -state.info_png.color.bitdepth: desired bit depth if auto_convert is false -state.info_png.color....: more color settings, see struct LodePNGColorMode -state.info_png....: more PNG related settings, see struct LodePNGInfo - - -12. changes ------------ - -The version number of LodePNG is the date of the change given in the format -yyyymmdd. - -Some changes aren't backwards compatible. Those are indicated with a (!) -symbol. - -Not all changes are listed here, the commit history in github lists more: -https://github.com/lvandeve/lodepng - -*) 10 apr 2023: faster CRC32 implementation, but with larger lookup table. -*) 13 jun 2022: added support for the sBIT chunk. -*) 09 jan 2022: minor decoder speed improvements. -*) 27 jun 2021: added warnings that file reading/writing functions don't support - wide-character filenames (support for this is not planned, opening files is - not the core part of PNG decoding/decoding and is platform dependent). -*) 17 okt 2020: prevent decoding too large text/icc chunks by default. -*) 06 mar 2020: simplified some of the dynamic memory allocations. -*) 12 jan 2020: (!) added 'end' argument to lodepng_chunk_next to allow correct - overflow checks. -*) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables. -*) 15 jun 2019: (!) auto_choose_color API changed (for bugfix: don't use palette - if gray ICC profile) and non-ICC LodePNGColorProfile renamed to - LodePNGColorStats. -*) 30 dec 2018: code style changes only: removed newlines before opening braces. -*) 10 sep 2018: added way to inspect metadata chunks without full decoding. -*) 19 aug 2018: (!) fixed color mode bKGD is encoded with and made it use - palette index in case of palette. -*) 10 aug 2018: (!) added support for gAMA, cHRM, sRGB and iCCP chunks. This - change is backwards compatible unless you relied on unknown_chunks for those. -*) 11 jun 2018: less restrictive check for pixel size integer overflow -*) 14 jan 2018: allow optionally ignoring a few more recoverable errors -*) 17 sep 2017: fix memory leak for some encoder input error cases -*) 27 nov 2016: grey+alpha auto color model detection bugfix -*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort). -*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within - the limits of pure C90). -*) 08 dec 2015: Made load_file function return error if file can't be opened. -*) 24 okt 2015: Bugfix with decoding to palette output. -*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding. -*) 24 aug 2014: Moved to github -*) 23 aug 2014: Reduced needless memory usage of decoder. -*) 28 jun 2014: Removed fix_png setting, always support palette OOB for - simplicity. Made ColorProfile public. -*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. -*) 22 dec 2013: Power of two windowsize required for optimization. -*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. -*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). -*) 11 mar 2013: (!) Bugfix with custom free. Changed from "my" to "lodepng_" - prefix for the custom allocators and made it possible with a new #define to - use custom ones in your project without needing to change lodepng's code. -*) 28 jan 2013: Bugfix with color key. -*) 27 okt 2012: Tweaks in text chunk keyword length error handling. -*) 8 okt 2012: (!) Added new filter strategy (entropy) and new auto color mode. - (no palette). Better deflate tree encoding. New compression tweak settings. - Faster color conversions while decoding. Some internal cleanups. -*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. -*) 1 sep 2012: (!) Removed #define's for giving custom (de)compression functions - and made it work with function pointers instead. -*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc - and free functions and toggle #defines from compiler flags. Small fixes. -*) 6 may 2012: (!) Made plugging in custom zlib/deflate functions more flexible. -*) 22 apr 2012: (!) Made interface more consistent, renaming a lot. Removed - redundant C++ codec classes. Reduced amount of structs. Everything changed, - but it is cleaner now imho and functionality remains the same. Also fixed - several bugs and shrunk the implementation code. Made new samples. -*) 6 nov 2011: (!) By default, the encoder now automatically chooses the best - PNG color model and bit depth, based on the amount and type of colors of the - raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. -*) 9 okt 2011: simpler hash chain implementation for the encoder. -*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. -*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. - A bug with the PNG filtertype heuristic was fixed, so that it chooses much - better ones (it's quite significant). A setting to do an experimental, slow, - brute force search for PNG filter types is added. -*) 17 aug 2011: (!) changed some C zlib related function names. -*) 16 aug 2011: made the code less wide (max 120 characters per line). -*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. -*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. -*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman - to optimize long sequences of zeros. -*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and - LodePNG_InfoColor_canHaveAlpha functions for convenience. -*) 7 nov 2010: added LodePNG_error_text function to get error code description. -*) 30 okt 2010: made decoding slightly faster -*) 26 okt 2010: (!) changed some C function and struct names (more consistent). - Reorganized the documentation and the declaration order in the header. -*) 08 aug 2010: only changed some comments and external samples. -*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. -*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. -*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could - read by ignoring the problem but windows apps couldn't. -*) 06 jun 2008: added more error checks for out of memory cases. -*) 26 apr 2008: added a few more checks here and there to ensure more safety. -*) 06 mar 2008: crash with encoding of strings fixed -*) 02 feb 2008: support for international text chunks added (iTXt) -*) 23 jan 2008: small cleanups, and #defines to divide code in sections -*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. -*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. -*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added - Also various fixes, such as in the deflate and the padding bits code. -*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved - filtering code of encoder. -*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A - C++ wrapper around this provides an interface almost identical to before. - Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code - are together in these files but it works both for C and C++ compilers. -*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks -*) 30 aug 2007: bug fixed which makes this Borland C++ compatible -*) 09 aug 2007: some VS2005 warnings removed again -*) 21 jul 2007: deflate code placed in new namespace separate from zlib code -*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images -*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing - invalid std::vector element [0] fixed, and level 3 and 4 warnings removed -*) 02 jun 2007: made the encoder add a tag with version by default -*) 27 may 2007: zlib and png code separated (but still in the same file), - simple encoder/decoder functions added for more simple usage cases -*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), - moved some examples from here to lodepng_examples.cpp -*) 12 may 2007: palette decoding bug fixed -*) 24 apr 2007: changed the license from BSD to the zlib license -*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. -*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding - palettized PNG images. Plus little interface change with palette and texts. -*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. - Fixed a bug where the end code of a block had length 0 in the Huffman tree. -*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented - and supported by the encoder, resulting in smaller PNGs at the output. -*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. -*) 24 jan 2007: gave encoder an error interface. Added color conversion from any - greyscale type to 8-bit greyscale with or without alpha. -*) 21 jan 2007: (!) Totally changed the interface. It allows more color types - to convert to and is more uniform. See the manual for how it works now. -*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: - encode/decode custom tEXt chunks, separate classes for zlib & deflate, and - at last made the decoder give errors for incorrect Adler32 or Crc. -*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. -*) 29 dec 2006: Added support for encoding images without alpha channel, and - cleaned out code as well as making certain parts faster. -*) 28 dec 2006: Added "Settings" to the encoder. -*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. - Removed some code duplication in the decoder. Fixed little bug in an example. -*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. - Fixed a bug of the decoder with 16-bit per color. -*) 15 okt 2006: Changed documentation structure -*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the - given image buffer, however for now it's not compressed. -*) 08 sep 2006: (!) Changed to interface with a Decoder class -*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different - way. Renamed decodePNG to decodePNGGeneric. -*) 29 jul 2006: (!) Changed the interface: image info is now returned as a - struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. -*) 28 jul 2006: Cleaned the code and added new error checks. - Corrected terminology "deflate" into "inflate". -*) 23 jun 2006: Added SDL example in the documentation in the header, this - example allows easy debugging by displaying the PNG and its transparency. -*) 22 jun 2006: (!) Changed way to obtain error value. Added - loadFile function for convenience. Made decodePNG32 faster. -*) 21 jun 2006: (!) Changed type of info vector to unsigned. - Changed position of palette in info vector. Fixed an important bug that - happened on PNGs with an uncompressed block. -*) 16 jun 2006: Internally changed unsigned into unsigned where - needed, and performed some optimizations. -*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them - in LodePNG namespace. Changed the order of the parameters. Rewrote the - documentation in the header. Renamed files to lodepng.cpp and lodepng.h -*) 22 apr 2006: Optimized and improved some code -*) 07 sep 2005: (!) Changed to std::vector interface -*) 12 aug 2005: Initial release (C++, decoder only) - - -13. contact information ------------------------ - -Feel free to contact me with suggestions, problems, comments, ... concerning -LodePNG. If you encounter a PNG image that doesn't work properly with this -decoder, feel free to send it and I'll use it to find and fix the problem. - -My email address is (puzzle the account and domain together with an @ symbol): -Domain: gmail dot com. -Account: lode dot vandevenne. - - -Copyright (c) 2005-2022 Lode Vandevenne -*/ diff -r e8b3dc80e48e -r 7e55fde39ca8 semiconginev2/old/resources/mesh.nim --- a/semiconginev2/old/resources/mesh.nim Mon Jul 22 15:53:32 2024 +0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,372 +0,0 @@ -import std/strutils -import std/json -import std/logging -import std/tables -import std/strformat -import std/streams - -import ../mesh -import ../material -import ../core - -import ./image - -type - glTFHeader = object - magic: uint32 - version: uint32 - length: uint32 - glTFData = object - structuredContent: JsonNode - binaryBufferData: seq[uint8] - -const - JSON_CHUNK = 0x4E4F534A - BINARY_CHUNK = 0x004E4942 - ACCESSOR_TYPE_MAP = { - 5120: Int8, - 5121: UInt8, - 5122: Int16, - 5123: UInt16, - 5125: UInt32, - 5126: Float32, - }.toTable - SAMPLER_FILTER_MODE_MAP = { - 9728: VK_FILTER_NEAREST, - 9729: VK_FILTER_LINEAR, - 9984: VK_FILTER_NEAREST, - 9985: VK_FILTER_LINEAR, - 9986: VK_FILTER_NEAREST, - 9987: VK_FILTER_LINEAR, - }.toTable - SAMPLER_WRAP_MODE_MAP = { - 33071: VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, - 33648: VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT, - 10497: VK_SAMPLER_ADDRESS_MODE_REPEAT - }.toTable - GLTF_MATERIAL_MAPPING = { - "color": "baseColorFactor", - "emissiveColor": "emissiveFactor", - "metallic": "metallicFactor", - "roughness", "roughnessFactor", - "baseTexture": "baseColorTexture", - "metallicRoughnessTexture": "metallicRoughnessTexture", - "normalTexture": "normalTexture", - "occlusionTexture": "occlusionTexture", - "emissiveTexture": "emissiveTexture", - }.toTable - -proc getGPUType(accessor: JsonNode, attribute: string): DataType = - # TODO: no full support for all datatypes that glTF may provide - # semicongine/core/gpu_data should maybe generated with macros to allow for all combinations - let componentType = ACCESSOR_TYPE_MAP[accessor["componentType"].getInt()] - let theType = accessor["type"].getStr() - case theType - of "SCALAR": - return componentType - of "VEC2": - case componentType - of UInt32: return Vec2U32 - of Float32: return Vec2F32 - else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") - of "VEC3": - case componentType - of UInt32: return Vec3U32 - of Float32: return Vec3F32 - else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") - of "VEC4": - case componentType - of UInt32: return Vec4U32 - of Float32: return Vec4F32 - else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") - of "MAT2": - case componentType - of Float32: return Vec4F32 - else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") - of "MAT3": - case componentType - of Float32: return Vec4F32 - else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") - of "MAT4": - case componentType - of Float32: return Vec4F32 - else: raise newException(Exception, &"Unsupported data type for attribute '{attribute}': {componentType} {theType}") - -proc getBufferViewData(bufferView: JsonNode, mainBuffer: seq[uint8], baseBufferOffset = 0): seq[uint8] = - assert bufferView["buffer"].getInt() == 0, "Currently no external buffers supported" - - result = newSeq[uint8](bufferView["byteLength"].getInt()) - let bufferOffset = bufferView["byteOffset"].getInt() + baseBufferOffset - var dstPointer = addr result[0] - - if bufferView.hasKey("byteStride"): - raise newException(Exception, "Unsupported feature: byteStride in buffer view") - copyMem(dstPointer, addr mainBuffer[bufferOffset], result.len) - -proc getAccessorData(root: JsonNode, accessor: JsonNode, mainBuffer: seq[uint8]): DataList = - result = InitDataList(thetype = accessor.getGPUType("??")) - result.SetLen(accessor["count"].getInt()) - - let bufferView = root["bufferViews"][accessor["bufferView"].getInt()] - assert bufferView["buffer"].getInt() == 0, "Currently no external buffers supported" - - if accessor.hasKey("sparse"): - raise newException(Exception, "Sparce accessors are currently not implemented") - - let accessorOffset = if accessor.hasKey("byteOffset"): accessor["byteOffset"].getInt() else: 0 - let length = bufferView["byteLength"].getInt() - let bufferOffset = bufferView["byteOffset"].getInt() + accessorOffset - var dstPointer = result.GetPointer() - - if bufferView.hasKey("byteStride"): - warn "Congratulations, you try to test a feature (loading buffer data with stride attributes) that we have no idea where it is used and how it can be tested (need a coresponding *.glb file)." - # we don't support stride, have to convert stuff here... does this even work? - for i in 0 ..< int(result.len): - copyMem(dstPointer, addr mainBuffer[bufferOffset + i * bufferView["byteStride"].getInt()], int(result.thetype.Size)) - dstPointer = cast[pointer](cast[uint](dstPointer) + result.thetype.Size) - else: - copyMem(dstPointer, addr mainBuffer[bufferOffset], length) - -proc loadImage(root: JsonNode, imageIndex: int, mainBuffer: seq[uint8]): Image[RGBAPixel] = - if root["images"][imageIndex].hasKey("uri"): - raise newException(Exception, "Unsupported feature: Load images from external files") - - let bufferView = root["bufferViews"][root["images"][imageIndex]["bufferView"].getInt()] - let imgData = newStringStream(cast[string](getBufferViewData(bufferView, mainBuffer))) - - let imageType = root["images"][imageIndex]["mimeType"].getStr() - case imageType - of "image/bmp": - result = ReadBMP(imgData) - of "image/png": - result = ReadPNG(imgData) - else: - raise newException(Exception, "Unsupported feature: Load image of type " & imageType) - -proc loadTexture(root: JsonNode, textureIndex: int, mainBuffer: seq[uint8]): Texture = - let textureNode = root["textures"][textureIndex] - result = Texture(isGrayscale: false) - result.colorImage = loadImage(root, textureNode["source"].getInt(), mainBuffer) - result.name = root["images"][textureNode["source"].getInt()]["name"].getStr() - if result.name == "": - result.name = &"Texture{textureIndex}" - - if textureNode.hasKey("sampler"): - let sampler = root["samplers"][textureNode["sampler"].getInt()] - if sampler.hasKey("magFilter"): - result.sampler.magnification = SAMPLER_FILTER_MODE_MAP[sampler["magFilter"].getInt()] - if sampler.hasKey("minFilter"): - result.sampler.minification = SAMPLER_FILTER_MODE_MAP[sampler["minFilter"].getInt()] - if sampler.hasKey("wrapS"): - result.sampler.wrapModeS = SAMPLER_WRAP_MODE_MAP[sampler["wrapS"].getInt()] - if sampler.hasKey("wrapT"): - result.sampler.wrapModeT = SAMPLER_WRAP_MODE_MAP[sampler["wrapS"].getInt()] - - -proc loadMaterial(root: JsonNode, materialNode: JsonNode, defaultMaterial: MaterialType, mainBuffer: seq[uint8]): MaterialData = - let pbr = materialNode["pbrMetallicRoughness"] - var attributes: Table[string, DataList] - - # color - if defaultMaterial.attributes.contains("color"): - attributes["color"] = InitDataList(thetype = Vec4F32) - if pbr.hasKey(GLTF_MATERIAL_MAPPING["color"]): - attributes["color"] = @[NewVec4f( - pbr[GLTF_MATERIAL_MAPPING["color"]][0].getFloat(), - pbr[GLTF_MATERIAL_MAPPING["color"]][1].getFloat(), - pbr[GLTF_MATERIAL_MAPPING["color"]][2].getFloat(), - pbr[GLTF_MATERIAL_MAPPING["color"]][3].getFloat(), - )] - else: - attributes["color"] = @[NewVec4f(1, 1, 1, 1)] - - # pbr material values - for factor in ["metallic", "roughness"]: - if defaultMaterial.attributes.contains(factor): - attributes[factor] = InitDataList(thetype = Float32) - if pbr.hasKey(GLTF_MATERIAL_MAPPING[factor]): - attributes[factor] = @[float32(pbr[GLTF_MATERIAL_MAPPING[factor]].getFloat())] - else: - attributes[factor] = @[0.5'f32] - - # pbr material textures - for texture in ["baseTexture", "metallicRoughnessTexture"]: - if defaultMaterial.attributes.contains(texture): - attributes[texture] = InitDataList(thetype = TextureType) - # attributes[texture & "Index"] = InitDataList(thetype=UInt8) - if pbr.hasKey(GLTF_MATERIAL_MAPPING[texture]): - attributes[texture] = @[loadTexture(root, pbr[GLTF_MATERIAL_MAPPING[texture]]["index"].getInt(), mainBuffer)] - else: - attributes[texture] = @[EMPTY_TEXTURE] - - # generic material textures - for texture in ["normalTexture", "occlusionTexture", "emissiveTexture"]: - if defaultMaterial.attributes.contains(texture): - attributes[texture] = InitDataList(thetype = TextureType) - # attributes[texture & "Index"] = InitDataList(thetype=UInt8) - if materialNode.hasKey(GLTF_MATERIAL_MAPPING[texture]): - attributes[texture] = @[loadTexture(root, materialNode[texture]["index"].getInt(), mainBuffer)] - else: - attributes[texture] = @[EMPTY_TEXTURE] - - # emissiv color - if defaultMaterial.attributes.contains("emissiveColor"): - attributes["emissiveColor"] = InitDataList(thetype = Vec3F32) - if materialNode.hasKey(GLTF_MATERIAL_MAPPING["emissiveColor"]): - attributes["emissiveColor"] = @[NewVec3f( - materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][0].getFloat(), - materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][1].getFloat(), - materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][2].getFloat(), - )] - else: - attributes["emissiveColor"] = @[NewVec3f(1'f32, 1'f32, 1'f32)] - - result = InitMaterialData(theType = defaultMaterial, name = materialNode["name"].getStr(), attributes = attributes) - -proc loadMesh(meshname: string, root: JsonNode, primitiveNode: JsonNode, materials: seq[MaterialData], mainBuffer: seq[uint8]): Mesh = - if primitiveNode.hasKey("mode") and primitiveNode["mode"].getInt() != 4: - raise newException(Exception, "Currently only TRIANGLE mode is supported for geometry mode") - - var indexType = None - let indexed = primitiveNode.hasKey("indices") - if indexed: - # TODO: Tiny indices - var indexCount = root["accessors"][primitiveNode["indices"].getInt()]["count"].getInt() - if indexCount < int(high(uint16)): - indexType = Small - else: - indexType = Big - - result = Mesh( - instanceTransforms: @[Unit4F32], - indexType: indexType, - name: meshname, - vertexCount: 0, - ) - - for attribute, accessor in primitiveNode["attributes"].pairs: - let data = root.getAccessorData(root["accessors"][accessor.getInt()], mainBuffer) - if result.vertexCount == 0: - result.vertexCount = data.len - assert data.len == result.vertexCount - result[].InitVertexAttribute(attribute.toLowerAscii, data) - - if primitiveNode.hasKey("material"): - let materialId = primitiveNode["material"].getInt() - result[].material = materials[materialId] - else: - result[].material = EMPTY_MATERIAL.InitMaterialData() - - if primitiveNode.hasKey("indices"): - assert result[].indexType != None - let data = root.getAccessorData(root["accessors"][primitiveNode["indices"].getInt()], mainBuffer) - var tri: seq[int] - case data.thetype - of UInt16: - for entry in data[uint16][]: - tri.add int(entry) - if tri.len == 3: - # FYI gltf uses counter-clockwise indexing - result[].AppendIndicesData(tri[0], tri[1], tri[2]) - tri.setLen(0) - of UInt32: - for entry in data[uint32][]: - tri.add int(entry) - if tri.len == 3: - # FYI gltf uses counter-clockwise indexing - result[].AppendIndicesData(tri[0], tri[1], tri[2]) - tri.setLen(0) - else: - raise newException(Exception, &"Unsupported index data type: {data.thetype}") - # TODO: getting from gltf to vulkan system is still messed up somehow, see other TODO - Transform[Vec3f](result[], "position", Scale(1, -1, 1)) - -proc loadNode(root: JsonNode, node: JsonNode, materials: seq[MaterialData], mainBuffer: var seq[uint8]): MeshTree = - result = MeshTree() - # mesh - if node.hasKey("mesh"): - let mesh = root["meshes"][node["mesh"].getInt()] - for primitive in mesh["primitives"]: - result.children.add MeshTree(mesh: loadMesh(mesh["name"].getStr(), root, primitive, materials, mainBuffer)) - - # transformation - if node.hasKey("matrix"): - var mat: Mat4 - for i in 0 ..< node["matrix"].len: - mat[i] = node["matrix"][i].getFloat() - result.transform = mat - else: - var (t, r, s) = (Unit4F32, Unit4F32, Unit4F32) - if node.hasKey("translation"): - t = Translate( - float32(node["translation"][0].getFloat()), - float32(node["translation"][1].getFloat()), - float32(node["translation"][2].getFloat()) - ) - if node.hasKey("rotation"): - t = Rotate( - float32(node["rotation"][3].getFloat()), - NewVec3f( - float32(node["rotation"][0].getFloat()), - float32(node["rotation"][1].getFloat()), - float32(node["rotation"][2].getFloat()) - ) - ) - if node.hasKey("scale"): - t = Scale( - float32(node["scale"][0].getFloat()), - float32(node["scale"][1].getFloat()), - float32(node["scale"][2].getFloat()) - ) - result.transform = t * r * s - result.transform = Scale(1, -1, 1) * result.transform - - # children - if node.hasKey("children"): - for childNode in node["children"]: - result.children.add loadNode(root, root["nodes"][childNode.getInt()], materials, mainBuffer) - -proc loadMeshTree(root: JsonNode, scenenode: JsonNode, materials: seq[MaterialData], mainBuffer: var seq[uint8]): MeshTree = - result = MeshTree() - for nodeId in scenenode["nodes"]: - result.children.add loadNode(root, root["nodes"][nodeId.getInt()], materials, mainBuffer) - # TODO: getting from gltf to vulkan system is still messed up somehow (i.e. not consistent for different files), see other TODO - # result.transform = Scale(1, -1, 1) - result.updateTransforms() - - -proc ReadglTF*(stream: Stream, defaultMaterial: MaterialType): seq[MeshTree] = - var - header: glTFHeader - data: glTFData - - for name, value in fieldPairs(header): - stream.read(value) - - assert header.magic == 0x46546C67 - assert header.version == 2 - - var chunkLength = stream.readUint32() - assert stream.readUint32() == JSON_CHUNK - data.structuredContent = parseJson(stream.readStr(int(chunkLength))) - - chunkLength = stream.readUint32() - assert stream.readUint32() == BINARY_CHUNK - data.binaryBufferData.setLen(chunkLength) - assert stream.readData(addr data.binaryBufferData[0], int(chunkLength)) == int(chunkLength) - - # check that the refered buffer is the same as the binary chunk - # external binary buffers are not supported - assert data.structuredContent["buffers"].len == 1 - assert not data.structuredContent["buffers"][0].hasKey("uri") - let bufferLenDiff = int(chunkLength) - data.structuredContent["buffers"][0]["byteLength"].getInt() - assert 0 <= bufferLenDiff and bufferLenDiff <= 3 # binary buffer may be aligned to 4 bytes - - debug "Loading mesh: ", data.structuredContent.pretty - - var materials: seq[MaterialData] - for materialnode in data.structuredContent["materials"]: - materials.add data.structuredContent.loadMaterial(materialnode, defaultMaterial, data.binaryBufferData) - - for scenedata in data.structuredContent["scenes"]: - result.add data.structuredContent.loadMeshTree(scenedata, materials, data.binaryBufferData)