Просмотр исходного кода

3rdparty: update bx, bimg and bgfx

Daniele Bartolini 6 лет назад
Родитель
Сommit
08e241a66f

+ 0 - 330
3rdparty/bgfx/scripts/bgfx-codegen.lua

@@ -1,330 +0,0 @@
--- Copyright 2019 云风 https://github.com/cloudwu . All rights reserved.
--- License (the same with bgfx) : https://github.com/bkaradzic/bgfx/blob/master/LICENSE
-
-local codegen = require "codegen"
-local idl = codegen.idl "bgfx.idl"
-
-local func_actions = {
-
-	c99              = "\n",
-	c99decl          = "\n",
-	cppdecl          = "\n",
-	interface_struct = "\n\t",
-	interface_import = ",\n\t\t\t",
-	c99_interface    = "\n",
-	cpp_interface    = "\n",
-	c99_functionid   = "\n\t",
-	cpp_functionid   = "\n\t\t",
-}
-
-local type_actions = {
-
-	cflags    = "\n",
-	enums     = "\n",
-	cenums    = "\n",
-	structs   = "\n",
-	cstructs  = "\n",
-	handles   = "\n",
-	chandles  = "\n",
-	funcptrs  = "\n",
-	cfuncptrs = "\n",
-}
-
-local function cfunc(f)
-	return function(func)
-		if not func.cpponly then
-			return f(func)
-		end
-	end
-end
-
-local funcgen = {}
-
-local functemp = {}
-
-functemp.interface_struct = "$CRET (*$CFUNCNAME)($CARGS);"
-functemp.interface_import = "bgfx_$CFUNCNAME"
-functemp.c99_interface = [[
-BGFX_C_API $CRET bgfx_$CFUNCNAME($CARGS)
-{
-	$CONVERSIONCTOC
-	$PRERETCTOCg_interface->$CFUNCNAME($CALLARGS);
-	$POSTRETCTOC
-}
-]]
-functemp.c99_functionid = "BGFX_FUNCTION_ID_$CFUNCNAMEUPPER,"
-functemp.cpp_functionid = "$CFUNCNAMECAML,"
-
-for action,temp in pairs(functemp) do
-	funcgen[action] = cfunc(function(func)
-		return codegen.apply_functemp(func, temp)
-	end)
-end
-
-funcgen.cpp_interface= cfunc(function(func)
-	if not func.cfunc and not func.conly then
-		return codegen.apply_functemp(func, [[
-$RET $CLASSNAME$FUNCNAME($CPPARGS)$CONST
-{
-	$CONVERSIONCTOCPP
-	$PRERETCPPTOCg_interface->$CFUNCNAME($CALLARGSCPPTOC);
-	$POSTRETCPPTOC
-}
-]])
-	end
-end)
-
-funcgen.c99 = cfunc(function(func)
-	local temp
-	if func.cfunc then
-		temp = "/* BGFX_C_API $CRET bgfx_$CFUNCNAME($CARGS) */\n"
-	else
-		temp = [[
-BGFX_C_API $CRET bgfx_$CFUNCNAME($CARGS)
-{
-	$CONVERSION
-	$PRERET$CPPFUNC($CALLARGSCTOCPP);
-	$POSTRET
-}
-]]
-	end
-	return codegen.apply_functemp(func, temp)
-end)
-
-local function cppdecl(func)
-	local doc = func.comments
-	if not doc and func.comment then
-		doc = { func.comment }
-	end
-	if doc then
-		local cname
-		if not func.cpponly then
-			if func.multicfunc then
-				cname = {}
-				for _, name in ipairs(func.multicfunc) do
-					cname[#cname+1] = "bgfx_" .. name
-				end
-			else
-				cname = "bgfx_" .. func.cname
-			end
-		end
-		doc = codegen.doxygen_type(doc, func, cname)
-	end
-	local funcdecl = codegen.apply_functemp(func, "$RET $FUNCNAME($ARGS)$CONST;\n")
-	if doc then
-		return doc .. "\n" .. funcdecl
-	else
-		return funcdecl
-	end
-end
-
-function funcgen.cppdecl(func)
-	-- Don't generate member functions here
-	if not func.class and not func.conly then
-		return cppdecl(func)
-	end
-end
-
-funcgen.c99decl = cfunc(function(func)
-	local doc = func.comments
-	if not doc and func.comment then
-		doc = { func.comment }
-	end
-	if doc then
-		doc = codegen.doxygen_ctype(doc, func)
-	end
-	local funcdecl = codegen.apply_functemp(func, "BGFX_C_API $CRET bgfx_$CFUNCNAME($CARGS);")
-	if doc then
-		return "\n" .. doc .. "\n" .. funcdecl
-	else
-		return funcdecl
-	end
-end)
-
-local typegen = {}
-
-local function add_doxygen(typedef, define, cstyle, cname)
-		local func = cstyle and codegen.doxygen_ctype or codegen.doxygen_type
-		local doc = func(typedef.comments, typedef, cname or typedef.cname)
-		if doc then
-			return doc .. "\n" .. define
-		else
-			return define
-		end
-end
-
-function typegen.enums(typedef)
-	if typedef.enum then
-		return add_doxygen(typedef, codegen.gen_enum_define(typedef), false, "bgfx_" .. typedef.cname)
-	end
-end
-
-function typegen.cenums(typedef)
-	if typedef.enum then
-		return add_doxygen(typedef, codegen.gen_enum_cdefine(typedef), true)
-	end
-end
-
-function typegen.cflags(typedef)
-	if typedef.flag then
-		return add_doxygen(typedef, codegen.gen_flag_cdefine(typedef), true)
-	end
-end
-
-function typegen.structs(typedef)
-	if typedef.struct and not typedef.namespace then
-		local methods = typedef.methods
-		if methods then
-			local m = {}
-			for _, func in ipairs(methods) do
-				m[#m+1] = cppdecl(func)
-			end
-			methods = m
-		end
-		return add_doxygen(typedef, codegen.gen_struct_define(typedef, methods))
-	end
-end
-
-function typegen.cstructs(typedef)
-	if typedef.struct then
-		return add_doxygen(typedef, codegen.gen_struct_cdefine(typedef), true)
-	end
-end
-
-function typegen.handles(typedef)
-	if typedef.handle then
-		return codegen.gen_handle(typedef)
-	end
-end
-
-function typegen.chandles(typedef)
-	if typedef.handle then
-		return codegen.gen_chandle(typedef)
-	end
-end
-
-function typegen.funcptrs(typedef)
-	if typedef.args then
-		return add_doxygen(typedef, codegen.gen_funcptr(typedef))
-	end
-end
-
-function typegen.cfuncptrs(typedef)
-	if typedef.args then
-		return add_doxygen(typedef, codegen.gen_cfuncptr(typedef), true)
-	end
-end
-
-local function codes()
-	local temp = {}
-	for k in pairs(func_actions) do
-		temp[k] = {}
-	end
-
-	for k in pairs(type_actions) do
-		temp[k] = {}
-	end
-
-	-- call actions with func
-	for _, f in ipairs(idl.funcs) do
-		for k in pairs(func_actions) do
-			local funcgen = funcgen[k]
-			if funcgen then
-				table.insert(temp[k], (funcgen(f)))
-			end
-		end
-	end
-
-	-- call actions with type
-
-	for _, typedef in ipairs(idl.types) do
-		for k in pairs(type_actions) do
-			local typegen = typegen[k]
-			if typegen then
-				table.insert(temp[k], (typegen(typedef)))
-			end
-		end
-	end
-
-	for k, indent in pairs(func_actions) do
-		temp[k] = table.concat(temp[k], indent)
-	end
-	for k, indent in pairs(type_actions) do
-		temp[k] = table.concat(temp[k], indent)
-	end
-
-	temp.version = string.format("#define BGFX_API_VERSION UINT32_C(%d)", idl._version or 0)
-
-	return temp
-end
-
-local codes_tbl = codes()
-
-local function add_path(filename)
-	local path
-	if type(paths) == "string" then
-		path = paths
-	else
-		path = assert(paths[filename])
-	end
-	return path .. "/" .. filename
-end
-
-local function change_indent(str, indent)
-	if indent == "\t" then
-		-- strip trailing space only
-		return (str:gsub("(.-)\n", function (line)
-			return line:gsub("([ \t]*)$","\n") end))
-	else
-		return (str:gsub("(.-)\n", function (line)
-			return line:gsub("^(\t*)(.-)[ \t]*$",
-				function (tabs, content)
-					return indent:rep(#tabs) .. content .. "\n"
-				end)
-		end))
-	end
-end
-
-local gen = {}
-
-function gen.apply(tempfile)
-	local f = assert(io.open(tempfile, "rb"))
-	local temp = f:read "a"
-	f:close()
-	codes_tbl.source = tempfile
-	return (temp:gsub("$([%l%d_]+)", codes_tbl))
-end
-
-function gen.format(codes, f)
-	return change_indent(codes, f.indent)
-end
-
-function gen.changed(codes, outputfile)
-	local out = io.open(outputfile, "rb")
-	if out then
-		local origin = out:read "a"
-		out:close()
-		return origin ~= codes
-	end
-	return true
-end
-
-function gen.write(codes, outputfile)
-	local out = assert(io.open(outputfile, "wb"))
-	out:write(codes)
-	out:close()
-end
-
-function gen.gen(tempfile, outputfile, indent)
-	print ("Generate", outputfile, "from", tempfile)
-	local codes = gen.apply(tempfile)
-	codes = change_indent(codes, indent)
-
-	if not gen.changed(codes, outputfile) then
-		print("No change")
-	end
-
-	gen.write(codes, outputfile)
-end
-
-return gen

+ 0 - 1808
3rdparty/bgfx/scripts/bgfx.doxygen

@@ -1,1808 +0,0 @@
-# Doxyfile 1.8.2
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a hash (#) is considered a comment and will be ignored.
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the
-# iconv built into libc) for the transcoding. See
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-DOXYFILE_ENCODING      = UTF-8
-
-# The PROJECT_NAME tag is a single word (or sequence of words) that should
-# identify the project. Note that if you do not use Doxywizard you need
-# to put quotes around the project name if it contains spaces.
-
-PROJECT_NAME           = "bgfx"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER         =
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer
-# a quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF          = "Cross-platform rendering library."
-
-# With the PROJECT_LOGO tag one can specify an logo or icon that is
-# included in the documentation. The maximum height of the logo should not
-# exceed 55 pixels and the maximum width should not exceed 200 pixels.
-# Doxygen will copy the logo to the output directory.
-
-PROJECT_LOGO           =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY       = .build/docs
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
-# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
-# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
-# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
-# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
-
-OUTPUT_LANGUAGE        = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES        = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip. Note that you specify absolute paths here, but also
-# relative paths, which will be relative from the directory where doxygen is
-# started.
-
-STRIP_FROM_PATH        =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful if your file system
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like regular Qt-style comments
-# (thus requiring an explicit @brief command for a brief description.)
-
-JAVADOC_AUTOBRIEF      = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
-# interpret the first line (until the first dot) of a Qt-style
-# comment as the brief description. If set to NO, the comments
-# will behave just like regular Qt-style comments (thus requiring
-# an explicit \brief command for a brief description.)
-
-QT_AUTOBRIEF           = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = YES
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
-INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 4
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                =
-
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding
-# "class=itcl::class" will allow you to use the command class in the
-# itcl::class meaning.
-
-TCL_SUBST              =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for
-# Java. For instance, namespaces will be presented as packages, qualified
-# scopes will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources only. Doxygen will then generate output that is more tailored for
-# Fortran.
-
-OPTIMIZE_FOR_FORTRAN   = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for
-# VHDL.
-
-OPTIMIZE_OUTPUT_VHDL   = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given
-# extension. Doxygen has a built-in mapping, but you can override or extend it
-# using this tag. The format is ext=language, where ext is a file extension,
-# and language is one of the parsers supported by doxygen: IDL, Java,
-# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C,
-# C++. For instance to make doxygen treat .inc files as Fortran files (default
-# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note
-# that for custom extensions you also need to set FILE_PATTERNS otherwise the
-# files are not read by doxygen.
-
-EXTENSION_MAPPING      =
-
-# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all
-# comments according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you
-# can mix doxygen, HTML, and XML commands with Markdown formatting.
-# Disable only in case of backward compatibilities issues.
-
-MARKDOWN_SUPPORT       = YES
-
-# When enabled doxygen tries to link words that correspond to documented classes,
-# or namespaces to their corresponding documentation. Such a link can be
-# prevented in individual cases by by putting a % sign in front of the word or
-# globally by setting AUTOLINK_SUPPORT to NO.
-
-AUTOLINK_SUPPORT       = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also makes the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT    = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-
-CPP_CLI_SUPPORT        = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
-# Doxygen will parse them like normal C++ but will assume all classes use public
-# instead of private inheritance when no explicit protection keyword is present.
-
-SIP_SUPPORT            = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate getter and setter methods for a property. Setting this option to YES (the default) will make doxygen replace the get and set methods by a property in the documentation. This will only work if the methods are indeed getting or setting a simple type. If this is not the case, or you want to show the methods anyway, you should set this option to NO.
-
-IDL_PROPERTY_SUPPORT   = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
-SUBGROUPING            = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
-# unions are shown inside the group in which they are included (e.g. using
-# @ingroup) instead of on a separate page (for HTML and Man pages) or
-# section (for LaTeX and RTF).
-
-INLINE_GROUPED_CLASSES = NO
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
-# unions with only public data fields will be shown inline in the documentation
-# of the scope in which they are defined (i.e. file, namespace, or group
-# documentation), provided this scope is documented. If set to NO (the default),
-# structs, classes, and unions are shown on a separate page (for HTML and Man
-# pages) or section (for LaTeX and RTF).
-
-INLINE_SIMPLE_STRUCTS  = YES
-
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
-# is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically
-# be useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-
-TYPEDEF_HIDES_STRUCT   = YES
-
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
-# determine which symbols to keep in memory and which to flush to disk.
-# When the cache is full, less often used symbols will be written to disk.
-# For small to medium size projects (<1000 input files) the default value is
-# probably good enough. For larger projects a too small cache size can cause
-# doxygen to be busy swapping symbols to and from disk most of the time
-# causing a significant performance penalty.
-# If the system has enough physical memory increasing the cache will improve the
-# performance by keeping more symbols in memory. Note that the value works on
-# a logarithmic scale so increasing the size by one will roughly double the
-# memory usage. The cache size is given by this formula:
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols.
-
-SYMBOL_CACHE_SIZE      = 0
-
-# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
-# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
-# their name and scope. Since this can be an expensive process and often the
-# same symbol appear multiple times in the code, doxygen keeps a cache of
-# pre-resolved symbols. If the cache is too small doxygen will become slower.
-# If the cache is too large, memory is wasted. The cache size is given by this
-# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols.
-
-LOOKUP_CACHE_SIZE      = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL            = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
-# scope will be included in the documentation.
-
-EXTRACT_PACKAGE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC         = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS  = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base
-# name of the file that contains the anonymous namespace. By default
-# anonymous namespaces are hidden.
-
-EXTRACT_ANON_NSPACES   = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES       = NO
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
-# will list include files with double quotes in the documentation
-# rather than with sharp brackets.
-
-FORCE_LOCAL_INCLUDES   = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
-SORT_BRIEF_DOCS        = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
-# will sort the (brief and detailed) documentation of class members so that
-# constructors and destructors are listed first. If set to NO (the default)
-# the constructors will appear in the respective orders defined by
-# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
-# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
-# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
-# hierarchy of group names into alphabetical order. If set to NO (the default)
-# the group names will appear in their defined order.
-
-SORT_GROUP_NAMES       = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME     = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
-# do proper type resolution of all parameters of a function it will reject a
-# match between the prototype and the implementation of a member function even
-# if there is only one candidate or it is obvious which candidate to choose
-# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
-# will still accept a match between prototype and implementation in such cases.
-
-STRICT_PROTO_MATCHING  = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
-GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS       =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or macro consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and macros in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES  = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-# This will remove the Files entry from the Quick Index and from the
-# Folder Tree View (if specified). The default is YES.
-
-SHOW_FILES             = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
-# Namespaces page.
-# This will remove the Namespaces entry from the Quick Index
-# and from the Folder Tree View (if specified). The default is YES.
-
-SHOW_NAMESPACES        = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option.
-# You can optionally specify a file name after the option, if omitted
-# DoxygenLayout.xml will be used as the name of the layout file.
-
-LAYOUT_FILE            =
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files
-# containing the references data. This must be a list of .bib files. The
-# .bib extension is automatically appended if omitted. Using this command
-# requires the bibtex tool to be installed. See also
-# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
-# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
-# feature you need bibtex and perl available in the search path.
-
-CITE_BIB_FILES         =
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET                  = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR      = YES
-
-# The WARN_NO_PARAMDOC option can be enabled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
-WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE           =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT                  = include/bgfx.h README.md
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
-# also the default input encoding. Doxygen uses libiconv (or the iconv built
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
-# the list of possible encodings.
-
-INPUT_ENCODING         = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
-# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
-# *.f90 *.f *.for *.vhd *.vhdl
-
-FILE_PATTERNS          =
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
-EXCLUDE                =
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-
-EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS        =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH           =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS       =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH             =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-# If FILTER_PATTERNS is specified, this tag will be
-# ignored.
-
-INPUT_FILTER           =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.
-# Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.
-# The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty or if
-# non of the patterns match the file name, INPUT_FILTER is applied.
-
-FILTER_PATTERNS        =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES    = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
-# and it is also possible to disable source filtering for a specific pattern
-# using *.ext= (so without naming a filter). This option only has effect when
-# FILTER_SOURCE_FILES is enabled.
-
-FILTER_SOURCE_PATTERNS =
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C, C++ and Fortran comments will always remain visible.
-
-STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES
-# then for each documented function all documented
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
-REFERENCES_RELATION    = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.
-# Otherwise they will link to the documentation.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
-USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS       = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          =
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header. Note that when using a custom header you are responsible
-#  for the proper inclusion of any scripts and style sheets that doxygen
-# needs, which is dependent on the configuration options used.
-# It is advised to generate a default header using "doxygen -w html
-# header.html footer.html stylesheet.css YourConfigFile" and then modify
-# that header. Note that the header is subject to change so you typically
-# have to redo this when upgrading to a newer version of doxygen or when
-# changing the value of configuration settings such as GENERATE_TREEVIEW!
-
-HTML_HEADER            =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER            =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If left blank doxygen will
-# generate a default style sheet. Note that it is recommended to use
-# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this
-# tag will in the future become obsolete.
-
-HTML_STYLESHEET        =
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional
-# user-defined cascading style sheet that is included after the standard
-# style sheets created by doxygen. Using this option one can overrule
-# certain style aspects. This is preferred over using HTML_STYLESHEET
-# since it does not replace the standard style sheet and is therefor more
-# robust against future updates. Doxygen will copy the style sheet file to
-# the output directory.
-
-HTML_EXTRA_STYLESHEET  =
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that
-# the files will be copied as-is; there are no commands or markers available.
-
-HTML_EXTRA_FILES       =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
-# Doxygen will adjust the colors in the style sheet and background images
-# according to this color. Hue is specified as an angle on a colorwheel,
-# see http://en.wikipedia.org/wiki/Hue for more information.
-# For instance the value 0 represents red, 60 is yellow, 120 is green,
-# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
-# The allowed range is 0 to 359.
-
-HTML_COLORSTYLE_HUE    = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
-# the colors in the HTML output. For a value of 0 the output will use
-# grayscales only. A value of 255 will produce the most vivid colors.
-
-HTML_COLORSTYLE_SAT    = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
-# the luminance component of the colors in the HTML output. Values below
-# 100 gradually make the output lighter, whereas values above 100 make
-# the output darker. The value divided by 100 is the actual gamma applied,
-# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
-# and 100 does not change the gamma.
-
-HTML_COLORSTYLE_GAMMA  = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting
-# this to NO can help when comparing the output of multiple runs.
-
-HTML_TIMESTAMP         = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-
-HTML_DYNAMIC_SECTIONS  = NO
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
-# entries shown in the various tree structured indices initially; the user
-# can expand and collapse entries dynamically later on. Doxygen will expand
-# the tree to such a level that at most the specified number of entries are
-# visible (unless a fully collapsed tree already exceeds this amount).
-# So setting the number of entries 1 will produce a full collapsed tree by
-# default. 0 is a special value representing an infinite number of entries
-# and will result in a full expanded tree by default.
-
-HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files
-# will be generated that can be used as input for Apple's Xcode 3
-# integrated development environment, introduced with OSX 10.5 (Leopard).
-# To create a documentation set, doxygen will generate a Makefile in the
-# HTML output directory. Running make will produce the docset in that
-# directory and running "make install" will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
-# it at startup.
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
-
-GENERATE_DOCSET        = NO
-
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
-# feed. A documentation feed provides an umbrella under which multiple
-# documentation sets from a single provider (such as a company or product suite)
-# can be grouped.
-
-DOCSET_FEEDNAME        = "Doxygen generated docs"
-
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
-# should uniquely identify the documentation set bundle. This should be a
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
-# will append .docset to the name.
-
-DOCSET_BUNDLE_ID       = org.doxygen.Project
-
-# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely
-# identify the documentation publisher. This should be a reverse domain-name
-# style string, e.g. com.mycompany.MyDocSet.documentation.
-
-DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
-
-# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
-
-DOCSET_PUBLISHER_NAME  = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE               =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file
-# content.
-
-CHM_INDEX_ENCODING     =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND             = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
-# that can be used as input for Qt's qhelpgenerator to generate a
-# Qt Compressed Help (.qch) of the generated HTML documentation.
-
-GENERATE_QHP           = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
-# be used to specify the file name of the resulting .qch file.
-# The path specified is relative to the HTML output folder.
-
-QCH_FILE               =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#namespace
-
-QHP_NAMESPACE          = org.doxygen.Project
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
-
-QHP_VIRTUAL_FOLDER     = doc
-
-# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
-# add. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
-
-QHP_CUST_FILTER_NAME   =
-
-# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see
-# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
-# Qt Help Project / Custom Filters</a>.
-
-QHP_CUST_FILTER_ATTRS  =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's
-# filter section matches.
-# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
-# Qt Help Project / Filter Attributes</a>.
-
-QHP_SECT_FILTER_ATTRS  =
-
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
-# be used to specify the location of Qt's qhelpgenerator.
-# If non-empty doxygen will try to run qhelpgenerator on the generated
-# .qhp file.
-
-QHG_LOCATION           =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
-#  will be generated, which together with the HTML files, form an Eclipse help
-# plugin. To install this plugin and make it available under the help contents
-# menu in Eclipse, the contents of the directory containing the HTML and XML
-# files needs to be copied into the plugins directory of eclipse. The name of
-# the directory within the plugins directory should be the same as
-# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
-# the help appears.
-
-GENERATE_ECLIPSEHELP   = NO
-
-# A unique identifier for the eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have
-# this name.
-
-ECLIPSE_DOC_ID         = org.doxygen.Project
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
-# at top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it. Since the tabs have the same information as the
-# navigation tree you can set this option to NO if you already set
-# GENERATE_TREEVIEW to YES.
-
-DISABLE_INDEX          = NO
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information.
-# If the tag value is set to YES, a side panel will be generated
-# containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
-# Windows users are probably better off using the HTML help feature.
-# Since the tree basically has the same information as the tab index you
-# could consider to set DISABLE_INDEX to NO when enabling this option.
-
-GENERATE_TREEVIEW      = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
-# (range [0,1..20]) that doxygen will group on one line in the generated HTML
-# documentation. Note that a value of 0 will completely suppress the enum
-# values from appearing in the overview section.
-
-ENUM_VALUES_PER_LINE   = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH         = 250
-
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
-# links to external symbols imported via tag files in a separate window.
-
-EXT_LINKS_IN_WINDOW    = NO
-
-# Use this tag to change the font size of Latex formulas included
-# as images in the HTML documentation. The default is 10. Note that
-# when you change the font size after a successful doxygen run you need
-# to manually remove any form_*.png images from the HTML output directory
-# to force them to be regenerated.
-
-FORMULA_FONTSIZE       = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are
-# not supported properly for IE 6.0, but are supported on all modern browsers.
-# Note that when changing this option you need to delete any form_*.png files
-# in the HTML output before the changes have effect.
-
-FORMULA_TRANSPARENT    = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
-# (see http://www.mathjax.org) which uses client side Javascript for the
-# rendering instead of using prerendered bitmaps. Use this if you do not
-# have LaTeX installed or if you want to formulas look prettier in the HTML
-# output. When enabled you may also need to install MathJax separately and
-# configure the path to it using the MATHJAX_RELPATH option.
-
-USE_MATHJAX            = NO
-
-# When MathJax is enabled you need to specify the location relative to the
-# HTML output directory using the MATHJAX_RELPATH option. The destination
-# directory should contain the MathJax.js script. For instance, if the mathjax
-# directory is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to
-# the MathJax Content Delivery Network so you can quickly see the result without
-# installing MathJax.
-# However, it is strongly recommended to install a local
-# copy of MathJax from http://www.mathjax.org before deployment.
-
-MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
-# names that should be enabled during MathJax rendering.
-
-MATHJAX_EXTENSIONS     =
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box
-# for the HTML output. The underlying search engine uses javascript
-# and DHTML and should work on any modern browser. Note that when using
-# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
-# (GENERATE_DOCSET) there is already a search function so this one should
-# typically be disabled. For large projects the javascript based search engine
-# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
-
-SEARCHENGINE           = YES
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a PHP enabled web server instead of at the web client
-# using Javascript. Doxygen will generate the search PHP script and index
-# file to put on the web server. The advantage of the server
-# based approach is that it scales better to large projects and allows
-# full text search. The disadvantages are that it is more difficult to setup
-# and does not have live searching capabilities.
-
-SERVER_BASED_SEARCH    = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX         = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-# Note that when enabling USE_PDFLATEX this option is only used for
-# generating bitmaps for formulas in the HTML output, but not in the
-# Makefile that is written to the output directory.
-
-LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
-MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX          = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE             = a4
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES         =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
-# the generated latex document. The footer should contain everything after
-# the last chapter. If it is left blank doxygen will generate a
-# standard footer. Notice: only use this tag if you know what you are doing!
-
-LATEX_FOOTER           =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE        = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
-LATEX_HIDE_INDICES     = NO
-
-# If LATEX_SOURCE_CODE is set to YES then doxygen will include
-# source code with syntax highlighting in the LaTeX output.
-# Note that which sources are shown also depends on other settings
-# such as SOURCE_BROWSER.
-
-LATEX_SOURCE_CODE      = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
-# http://en.wikipedia.org/wiki/BibTeX for more info.
-
-LATEX_BIB_STYLE        = plain
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS         = NO
-
-# Load style sheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS              = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
-GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA             =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD                =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING     = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF   = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
-GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.
-# This is useful
-# if you want to understand what is going on.
-# On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION        = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF     = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# pointed to by INCLUDE_PATH will be searched when a #include is found.
-
-SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH           =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS  =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED             =
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition that
-# overrules the definition found in the source code.
-
-EXPAND_AS_DEFINED      =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all references to function-like macros
-# that are alone on a line, have an all uppercase name, and do not end with a
-# semicolon, because these will confuse the parser if not removed.
-
-SKIP_FUNCTION_MACROS   = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. For each
-# tag file the location of the external documentation should be added. The
-# format of a tag file without this location is as follows:
-#
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-#
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths
-# or URLs. Note that each tag file must have a unique name (where the name does
-# NOT include the path). If a tag file is not located in the directory in which
-# doxygen is run, you must also specify the path to the tagfile here.
-
-TAGFILES               =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
-EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH              = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option also works with HAVE_DOT disabled, but it is recommended to
-# install and use dot, since it yields more powerful graphs.
-
-CLASS_DIAGRAMS         = YES
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH            =
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT               = NO
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
-# allowed to run in parallel. When set to 0 (the default) doxygen will
-# base this on the number of processors available in the system. You can set it
-# explicitly to a value larger than 0 to get control over the balance
-# between CPU load and processing speed.
-
-DOT_NUM_THREADS        = 0
-
-# By default doxygen will use the Helvetica font for all dot files that
-# doxygen generates. When you want a differently looking font you can specify
-# the font name using DOT_FONTNAME. You need to make sure dot is able to find
-# the font, which can be done by putting it in a standard location or by setting
-# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
-# directory containing the font.
-
-DOT_FONTNAME           = Helvetica
-
-# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
-# The default size is 10pt.
-
-DOT_FONTSIZE           = 10
-
-# By default doxygen will tell dot to use the Helvetica font.
-# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
-# set the path where dot can find it.
-
-DOT_FONTPATH           =
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
-UML_LOOK               = NO
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside
-# the class node. If there are many fields or methods and many nodes the
-# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
-# threshold limits the number of items for each type to make the size more
-# managable. Set this to 0 for no limit. Note that the threshold may be
-# exceeded by 50% before the limit is enforced.
-
-UML_LIMIT_NUM_FIELDS   = 10
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then
-# doxygen will generate a call dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable call graphs
-# for selected functions only using the \callgraph command.
-
-CALL_GRAPH             = NO
-
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
-# doxygen will generate a caller dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable caller
-# graphs for selected functions only using the \callergraph command.
-
-CALLER_GRAPH           = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will generate a graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH        = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are svg, png, jpg, or gif.
-# If left blank png will be used. If you choose svg you need to set
-# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
-# visible in IE 9+ (other browsers do not have this requirement).
-
-DOT_IMAGE_FORMAT       = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
-# Note that this requires a modern browser other than Internet Explorer.
-# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
-# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
-# visible. Older versions of IE do not have SVG support.
-
-INTERACTIVE_SVG        = NO
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS           =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the
-# \mscfile command).
-
-MSCFILE_DIRS           =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
-# nodes that will be shown in the graph. If the number of nodes in a graph
-# becomes larger than this value, doxygen will truncate the graph, which is
-# visualized by representing a node as a red box. Note that doxygen if the
-# number of direct children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-
-DOT_GRAPH_MAX_NODES    = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-
-MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not
-# seem to support this out of the box. Warning: Depending on the platform used,
-# enabling this option may lead to badly anti-aliased labels on the edges of
-# a graph (i.e. they become hard to read).
-
-DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
-DOT_CLEANUP            = YES

+ 0 - 3008
3rdparty/bgfx/scripts/bgfx.idl

@@ -1,3008 +0,0 @@
--- vim: syntax=lua
--- bgfx interface
-
-version(102)
-
-typedef "bool"
-typedef "char"
-typedef "float"
-typedef "int8_t"
-typedef "int32_t"
-typedef "int64_t"
-typedef "uint8_t"
-typedef "uint16_t"
-typedef "uint32_t"
-typedef "uint64_t"
-typedef "uintptr_t"
-typedef "va_list"
-typedef "void"
-
-typedef "ViewId"
-typedef "CallbackI"      { cname = "callback_interface" }
-typedef "bx::AllocatorI" { cname = "allocator_interface" }
-
---- Memory release callback.
-funcptr.ReleaseFn
-	"void"
-	.ptr        "void*" --- Pointer to allocated data.
-	.userData   "void*" --- User defined data if needed.
-
---- Color RGB/alpha/depth write. When it's not specified write will be disabled.
-flag.StateWrite { bits = 64 , base = 1 }
-	.R     --- Enable R write.
-	.G     --- Enable G write.
-	.B     --- Enable B write.
-	.A     --- Enable alpha write.
-	.Z ( 39 )	--- Enable depth write.
-	.Rgb { "R", "G", "B" }	--- Enable RGB write.
-	.Mask { "Rgb", "A", "Z" }	--- Write all channels mask.
-
---- Depth test state. When `BGFX_STATE_DEPTH_` is not specified depth test will be disabled.
-flag.StateDepthTest { bits = 64, shift = 4, range = 4, base = 1 , desc = "Depth test state" }
-	.Less		--- Enable depth test, less.
-	.Lequal		--- Enable depth test, less or equal.
-	.Equal		--- Enable depth test, equal.
-	.Gequal		--- Enable depth test, greater or equal.
-	.Greater	--- Enable depth test, greater.
-	.Notequal	--- Enable depth test, not equal.
-	.Never		--- Enable depth test, never.
-	.Always		--- Enable depth test, always.
-	()
-
---- Use BGFX_STATE_BLEND_FUNC(_src, _dst) or BGFX_STATE_BLEND_FUNC_SEPARATE(_srcRGB, _dstRGB, _srcA, _dstA)
---- helper macros.
-flag.StateBlend { bits = 64, shift = 12, range = 16, base = 1, desc = "Blend state" }
-	.Zero             --- 0, 0, 0, 0
-	.One              --- 1, 1, 1, 1
-	.SrcColor         --- Rs, Gs, Bs, As
-	.InvSrcColor      --- 1-Rs, 1-Gs, 1-Bs, 1-As
-	.SrcAlpha         --- As, As, As, As
-	.InvSrcAlpha      --- 1-As, 1-As, 1-As, 1-As
-	.DstAlpha         --- Ad, Ad, Ad, Ad
-	.InvDstAlpha      --- 1-Ad, 1-Ad, 1-Ad ,1-Ad
-	.DstColor         --- Rd, Gd, Bd, Ad
-	.InvDstColor      --- 1-Rd, 1-Gd, 1-Bd, 1-Ad
-	.SrcAlphaSat      --- f, f, f, 1; f = min(As, 1-Ad)
-	.Factor           --- Blend factor
-	.InvFactor        --- 1-Blend factor
-	()
-
---- Use BGFX_STATE_BLEND_EQUATION(_equation) or BGFX_STATE_BLEND_EQUATION_SEPARATE(_equationRGB, _equationA)
---- helper macros.
-flag.StateBlendEquation { bits = 64, shift = 28, range = 6, base = 0, desc = "Blend equation" }
-	.Add              --- Blend add: src + dst.
-	.Sub              --- Blend subtract: src - dst.
-	.Revsub           --- Blend reverse subtract: dst - src.
-	.Min              --- Blend min: min(src, dst).
-	.Max              --- Blend max: max(src, dst).
-	()
-
---- Cull state. When `BGFX_STATE_CULL_*` is not specified culling will be disabled.
-flag.StateCull { bits = 64, shift = 36, range = 2, base = 1, desc = "Culling mode" }
-	.Cw  --- Cull clockwise triangles.
-	.Ccw --- Cull counter-clockwise triangles.
-	()
-
---- Alpha reference value.
-flag.StateAlphaRef { bits = 64, shift = 40, range = 8, desc = "Alpha reference", "helper" }
-
-flag.StatePt { bits = 64, shift = 48, range = 3, base = 1, desc = "Primitive type" }
-	.Tristrip  --- Tristrip.
-	.Lines     --- Lines.
-	.Linestrip --- Line strip.
-	.Points    --- Points.
-	()
-
---- Point size value.
-flag.StatePointSize { bits = 64, shift = 52, range = 4, desc = "Point size", "helper" }
-
---- Enable MSAA write when writing into MSAA frame buffer.
---- This flag is ignored when not writing into MSAA frame buffer.
-flag.State { bits = 64 , range = 64 , desc = "State" }
-	.Msaa (57)                 --- Enable MSAA rasterization.
-	.Lineaa (58)               --- Enable line AA rasterization.
-	.ConservativeRaster (59)   --- Enable conservative rasterization.
-	.None (0)                  --- No state.
-	.FrontCcw(40)              --- Front counter-clockwise (default is clockwise).
-	.BlendIndependent(35)      --- Enable blend independent.
-	.BlendAlphaToCoverage (36) --- Enable alpha to coverage.
-	.Default { "WriteRgb", "WriteA", "WriteZ", "DepthTestLess", "CullCw", "Msaa" }
-	 --- Default state is write to RGB, alpha, and depth with depth test less enabled, with clockwise
-	 --- culling and MSAA (when writing into MSAA frame buffer, otherwise this flag is ignored).
-
---- Do not use!
-flag.StateReserved { bits = 64, shift = 61, range = 3 }
-
---- Set stencil ref value.
-flag.StencilFuncRef { bits = 32, shift = 0, range = 8, "helper" }
-
---- Set stencil rmask value.
-flag.StencilFuncRmask { bits = 32, shift = 8, range = 8, "helper" }
-
-flag.Stencil { bits = 32, const }
-	.None    (0x00000000)
-	.Mask    (0xffffffff)
-	.Default (0x00000000)
-
-flag.StencilTest { bits = 32, shift = 16, range = 4 , base = 1, desc = "Stencil test" }
-	.Less     --- Enable stencil test, less.
-	.Lequal   --- Enable stencil test, less or equal.
-	.Equal    --- Enable stencil test, equal.
-	.Gequal   --- Enable stencil test, greater or equal.
-	.Greater  --- Enable stencil test, greater.
-	.Notequal --- Enable stencil test, not equal.
-	.Never    --- Enable stencil test, never.
-	.Always   --- Enable stencil test, always.
-	()
-
-flag.StencilOpFailS { bits = 32, shift = 20, range = 4, base = 0, desc = "Stencil operation fail" }
-	.Zero    --- Zero.
-	.Keep    --- Keep.
-	.Replace --- Replace.
-	.Incr    --- Increment and wrap.
-	.Incrsat --- Increment and clamp.
-	.Decr    --- Decrement and wrap.
-	.Decrsat --- Decrement and clamp.
-	.Invert  --- Invert.
-	()
-
-flag.StencilOpFailZ { bits = 32, shift = 24, range = 4, base = 0, desc = "Stencil operation depth fail" }
-	.Zero    --- Zero.
-	.Keep    --- Keep.
-	.Replace --- Replace.
-	.Incr    --- Increment and wrap.
-	.Incrsat --- Increment and clamp.
-	.Decr    --- Decrement and wrap.
-	.Decrsat --- Decrement and clamp.
-	.Invert  --- Invert.
-	()
-
-flag.StencilOpPassZ { bits = 32, shift = 28, range = 4 , base = 0, desc = "Stencil operation depth pass" }
-	.Zero    --- Zero.
-	.Keep    --- Keep.
-	.Replace --- Replace.
-	.Incr    --- Increment and wrap.
-	.Incrsat --- Increment and clamp.
-	.Decr    --- Decrement and wrap.
-	.Decrsat --- Decrement and clamp.
-	.Invert  --- Invert.
-	()
-
-flag.Clear { bits = 16 }
-	.None                 --- No clear flags.
-	.Color                --- Clear color.
-	.Depth                --- Clear depth.
-	.Stencil              --- Clear stencil.
-	.DiscardColor_0       --- Discard frame buffer attachment 0.
-	.DiscardColor_1       --- Discard frame buffer attachment 1.
-	.DiscardColor_2       --- Discard frame buffer attachment 2.
-	.DiscardColor_3       --- Discard frame buffer attachment 3.
-	.DiscardColor_4       --- Discard frame buffer attachment 4.
-	.DiscardColor_5       --- Discard frame buffer attachment 5.
-	.DiscardColor_6       --- Discard frame buffer attachment 6.
-	.DiscardColor_7       --- Discard frame buffer attachment 7.
-	.DiscardDepth         --- Discard frame buffer depth attachment.
-	.DiscardStencil       --- Discard frame buffer stencil attachment.
-	.DiscardColorMask {
-		"DiscardColor_0",
-		"DiscardColor_1",
-		"DiscardColor_2",
-		"DiscardColor_3",
-		"DiscardColor_4",
-		"DiscardColor_5",
-		"DiscardColor_6",
-		"DiscardColor_7"
-	}
-	.DiscardMask {
-		"DiscardColorMask",
-		"DiscardDepth",
-		"DiscardStencil"
-	}
-
-flag.Debug { bits = 32 }
-	.None      --- No debug.
-	.Wireframe --- Enable wireframe for all primitives.
-	.Ifh       --- Enable infinitely fast hardware test. No draw calls will be submitted to driver.
-	           --- It's useful when profiling to quickly assess bottleneck between CPU and GPU.
-	.Stats     --- Enable statistics display.
-	.Text      --- Enable debug text display.
-	.Profiler  --- Enable profiler.
-	()
-
-flag.BufferComputeFormat { bits = 16, shift = 0, range = 4, base = 1 }
-	._8x1  --- 1 8-bit value
-	._8x2  --- 2 8-bit values
-	._8x4  --- 4 8-bit values
-	._16x1 --- 1 16-bit value
-	._16x2 --- 2 16-bit values
-	._16x4 --- 4 16-bit values
-	._32x1 --- 1 32-bit value
-	._32x2 --- 2 32-bit values
-	._32x4 --- 4 32-bit values
-	()
-
-flag.BufferComputeType { bits = 16, shift = 4, range = 2, base = 1 }
-	.Int   --- Type `int`.
-	.Uint  --- Type `uint`.
-	.Float --- Type `float`.
-	()
-
-flag.Buffer { bits = 16, base = 8 }
-	.None(0)
-	.ComputeRead    --- Buffer will be read by shader.
-	.ComputeWrite   --- Buffer will be used for writing.
-	.DrawIndirect   --- Buffer will be used for storing draw indirect commands.
-	.AllowResize    --- Allow dynamic index/vertex buffer resize during update.
-	.Index32        --- Index buffer contains 32-bit indices.
-	.ComputeReadWrite { "ComputeRead" , "ComputeWrite" }
-	()
-
-flag.Texture { bits = 64 }
-	.None         (0)
-	.MsaaSample   (36) --- Texture will be used for MSAA sampling.
-	.Rt           (37) --- Render target no MSAA.
-	.ComputeWrite (45) --- Texture will be used for compute write.
-	.Srgb         (46) --- Sample texture as sRGB.
-	.BlitDst      (47) --- Texture will be used as blit destination.
-	.ReadBack     (48) --- Texture will be used for read back from GPU.
-	()
-
-flag.TextureRtMsaa { bits = 64, shift = 36, range = 3 , base = 2 }
-	.X2  --- Render target MSAAx2 mode.
-	.X4  --- Render target MSAAx4 mode.
-	.X8  --- Render target MSAAx8 mode.
-	.X16 --- Render target MSAAx16 mode.
-	()
-
-flag.TextureRt { bits = 64, shift = 36, range = 4 }
-	.WriteOnly (9) --- Render target will be used for writing
-
---- Sampler flags.
-flag.SamplerU { bits = 32, shift = 0, range = 2, base = 1 }
-	.Mirror --- Wrap U mode: Mirror
-	.Clamp  --- Wrap U mode: Clamp
-	.Border --- Wrap U mode: Border
-	()
-
-flag.SamplerV { bits = 32, shift = 2, range = 2, base = 1 }
-	.Mirror --- Wrap V mode: Mirror
-	.Clamp  --- Wrap V mode: Clamp
-	.Border --- Wrap V mode: Border
-	()
-
-flag.SamplerW { bits = 32, shift = 4, range = 2, base = 1 }
-	.Mirror --- Wrap W mode: Mirror
-	.Clamp  --- Wrap W mode: Clamp
-	.Border --- Wrap W mode: Border
-	()
-
-flag.SamplerMin { bits = 32, shift = 6, range = 2, base = 1 }
-	.Point       --- Min sampling mode: Point
-	.Anisotropic --- Min sampling mode: Anisotropic
-	()
-
-flag.SamplerMag { bits = 32, shift = 8, range = 2, base = 1 }
-	.Point       --- Mag sampling mode: Point
-	.Anisotropic --- Mag sampling mode: Anisotropic
-	()
-
-flag.SamplerMip { bits = 32, shift = 10, range = 1, base = 1 }
-	.Point --- Mip sampling mode: Point
-	()
-
-flag.SamplerCompare { bits = 32 , shift = 16, range = 4, base = 1 }
-	.Less     --- Compare when sampling depth texture: less.
-	.Lequal   --- Compare when sampling depth texture: less or equal.
-	.Equal    --- Compare when sampling depth texture: equal.
-	.Gequal   --- Compare when sampling depth texture: greater or equal.
-	.Greater  --- Compare when sampling depth texture: greater.
-	.Notequal --- Compare when sampling depth texture: not equal.
-	.Never    --- Compare when sampling depth texture: never.
-	.Always   --- Compare when sampling depth texture: always.
-	()
-
-flag.SamplerBorderColor { bits = 32, shift = 24, range = 4, "helper" }
-flag.SamplerReserved { bits = 32, shift = 28, range = 4 }
-
-flag.Sampler { bits = 32 }
-	.None
-	.SampleStencil (21)  --- Sample stencil instead of depth.
-	.Point     { "MinPoint", "MagPoint", "MipPoint" }
-	.UvwMirror { "UMirror",  "VMirror",  "WMirror"  }
-	.UvwClamp  { "UClamp",   "VClamp",   "WClamp"   }
-	.UvwBorder { "UBorder",  "VBorder",  "WBorder"  }
-	.BitsMask  {
-		"UMask",
-		"VMask",
-		"WMask",
-		"MinMask",
-		"MagMask",
-		"MipMask",
-		"CompareMask"
-	}
-	()
-
-flag.ResetMsaa { bits = 32, shift = 4, range = 3, base = 1 }
-	.X2  --- Enable 2x MSAA.
-	.X4  --- Enable 4x MSAA.
-	.X8  --- Enable 8x MSAA.
-	.X16 --- Enable 16x MSAA.
-	()
-
-
-flag.Reset { bits = 32 }
-	.None             ( 0) --- No reset flags.
-	.Fullscreen       ( 1) --- Not supported yet.
-	.Vsync            ( 8) --- Enable V-Sync.
-	.Maxanisotropy    ( 9) --- Turn on/off max anisotropy.
-	.Capture          (10) --- Begin screen capture.
-	.FlushAfterRender (14) --- Flush rendering after submitting to GPU.
-	.FlipAfterRender  (15) --- This flag specifies where flip occurs. Default behavior is that flip occurs
-	                       --- before rendering new frame. This flag only has effect when `BGFX_CONFIG_MULTITHREADED=0`.
-	.SrgbBackbuffer   (16) --- Enable sRGB backbuffer.
-	.Hdr10            (17) --- Enable HDR10 rendering.
-	.Hidpi            (18) --- Enable HiDPI rendering.
-	.DepthClamp       (19) --- Enable depth clamp.
-	.Suspend          (20) --- Suspend rendering.
-	()
-
-flag.ResetFullscreen { bits = 32, shift = 0, range = 1, base = 1 }
-	()
-
-flag.ResetReserved { bits = 32, shift = 31, range = 1 , desc = "Internal" }
-
-flag.Caps { bits = 64, base = 1, name = "Caps" }
-	.AlphaToCoverage        --- Alpha to coverage is supported.
-	.BlendIndependent       --- Blend independent is supported.
-	.Compute                --- Compute shaders are supported.
-	.ConservativeRaster     --- Conservative rasterization is supported.
-	.DrawIndirect           --- Draw indirect is supported.
-	.FragmentDepth          --- Fragment depth is accessible in fragment shader.
-	.FragmentOrdering       --- Fragment ordering is available in fragment shader.
-	.FramebufferRw          --- Read/Write frame buffer attachments are supported.
-	.GraphicsDebugger       --- Graphics debugger is present.
-	.Reserved
-	.Hdr10                  --- HDR10 rendering is supported.
-	.Hidpi                  --- HiDPI rendering is supported.
-	.Index32                --- 32-bit indices are supported.
-	.Instancing             --- Instancing is supported.
-	.OcclusionQuery         --- Occlusion query is supported.
-	.RendererMultithreaded  --- Renderer is on separate thread.
-	.SwapChain              --- Multiple windows are supported.
-	.Texture_2dArray        --- 2D texture array is supported.
-	.Texture_3d             --- 3D textures are supported.
-	.TextureBlit            --- Texture blit is supported.
-	.TextureCompareReserved --- All texture compare modes are supported.
-	.TextureCompareLequal   --- Texture compare less equal mode is supported.
-	.TextureCubeArray       --- Cubemap texture array is supported.
-	.TextureDirectAccess    --- CPU direct access to GPU texture memory.
-	.TextureReadBack        --- Read-back texture is supported.
-	.VertexAttribHalf       --- Vertex attribute half-float is supported.
-	.VertexAttribUint10     --- Vertex attribute 10_10_10_2 is supported.
-	.VertexId               --- Rendering with VertexID only is supported.
-	.TextureCompareAll { "TextureCompareReserved", "TextureCompareLequal" } --- All texture compare modes are supported.
-	()
-
-flag.CapsFormat { bits = 16 }
-	.TextureNone             --- Texture format is not supported.
-	.Texture_2d              --- Texture format is supported.
-	.Texture_2dSrgb          --- Texture as sRGB format is supported.
-	.Texture_2dEmulated      --- Texture format is emulated.
-	.Texture_3d              --- Texture format is supported.
-	.Texture_3dSrgb          --- Texture as sRGB format is supported.
-	.Texture_3dEmulated      --- Texture format is emulated.
-	.TextureCube             --- Texture format is supported.
-	.TextureCubeSrgb         --- Texture as sRGB format is supported.
-	.TextureCubeEmulated     --- Texture format is emulated.
-	.TextureVertex           --- Texture format can be used from vertex shader.
-	.TextureImage            --- Texture format can be used as image from compute shader.
-	.TextureFramebuffer      --- Texture format can be used as frame buffer.
-	.TextureFramebufferMsaa  --- Texture format can be used as MSAA frame buffer.
-	.TextureMsaa             --- Texture can be sampled as MSAA.
-	.TextureMipAutogen       --- Texture format supports auto-generated mips.
-	()
-
-flag.Resolve { bits = 8 }
-	.None          --- No resolve flags.
-	.AutoGenMips   --- Auto-generate mip maps on resolve.
-	()
-
-flag.PciId { bits = 16 , const }
-	.None                (0x0000) --- Autoselect adapter.
-	.SoftwareRasterizer  (0x0001) --- Software rasterizer.
-	.Amd                 (0x1002) --- AMD adapter.
-	.Intel               (0x8086) --- Intel adapter.
-	.Nvidia              (0x10de) --- nVidia adapter.
-	()
-
-flag.CubeMap { bits = 8, const }
-	.PositiveX (0x00) --- Cubemap +x.
-	.NegativeX (0x01) --- Cubemap -x.
-	.PositiveY (0x02) --- Cubemap +y.
-	.NegativeY (0x03) --- Cubemap -y.
-	.PositiveZ (0x04) --- Cubemap +z.
-	.NegativeZ (0x05) --- Cubemap -z.
-	()
-
---- Fatal error enum.
-enum.Fatal { underscore, comment = "" }
-	.DebugCheck
-	.InvalidShader
-	.UnableToInitialize
-	.UnableToCreateTexture
-	.DeviceLost
-	()	-- end of enum
-
---- Renderer backend type enum.
-enum.RendererType { comment = "Renderer types:" }
-	.Noop       --- No rendering.
-	.Direct3D9  --- Direct3D 9.0
-	.Direct3D11 --- Direct3D 11.0
-	.Direct3D12 --- Direct3D 12.0
-	.Gnm        --- GNM
-	.Metal      --- Metal
-	.Nvn        --- NVN
-	.OpenGLES   --- OpenGL ES 2.0+
-	.OpenGL     --- OpenGL 2.1+
-	.Vulkan     --- Vulkan
-	()
-
---- Access mode enum.
-enum.Access { comment = "Access:" }
-	.Read      --- Read.
-	.Write     --- Write.
-	.ReadWrite --- Read and write.
-	()
-
---- Vertex attribute enum.
-enum.Attrib { comment = "Corresponds to vertex shader attribute." }
-	.Position  --- a_position
-	.Normal    --- a_normal
-	.Tangent   --- a_tangent
-	.Bitangent --- a_bitangent
-	.Color0    --- a_color0
-	.Color1    --- a_color1
-	.Color2    --- a_color2
-	.Color3    --- a_color3
-	.Indices   --- a_indices
-	.Weight    --- a_weight
-	.TexCoord0 --- a_texcoord0
-	.TexCoord1 --- a_texcoord1
-	.TexCoord2 --- a_texcoord2
-	.TexCoord3 --- a_texcoord3
-	.TexCoord4 --- a_texcoord4
-	.TexCoord5 --- a_texcoord5
-	.TexCoord6 --- a_texcoord6
-	.TexCoord7 --- a_texcoord7
-	()
-
---- Vertex attribute type enum.
-enum.AttribType { comment = "Attribute types:" }
-	.Uint8  --- Uint8
-	.Uint10 --- Uint10, availability depends on: `BGFX_CAPS_VERTEX_ATTRIB_UINT10`.
-	.Int16  --- Int16
-	.Half   --- Half, availability depends on: `BGFX_CAPS_VERTEX_ATTRIB_HALF`.
-	.Float  --- Float
-	()
-
---- Texture format enum.
----
---- Notation:
----
----       RGBA16S
----       ^   ^ ^
----       |   | +-- [ ]Unorm
----       |   |     [F]loat
----       |   |     [S]norm
----       |   |     [I]nt
----       |   |     [U]int
----       |   +---- Number of bits per component
----       +-------- Components
----
---- @attention Availability depends on Caps (see: formats).
-enum.TextureFormat { comment = "Texture formats:" }
-	.BC1                             --- DXT1 R5G6B5A1
-	.BC2                             --- DXT3 R5G6B5A4
-	.BC3                             --- DXT5 R5G6B5A8
-	.BC4                             --- LATC1/ATI1 R8
-	.BC5                             --- LATC2/ATI2 RG8
-	.BC6H                            --- BC6H RGB16F
-	.BC7                             --- BC7 RGB 4-7 bits per color channel, 0-8 bits alpha
-	.ETC1                            --- ETC1 RGB8
-	.ETC2                            --- ETC2 RGB8
-	.ETC2A                           --- ETC2 RGBA8
-	.ETC2A1                          --- ETC2 RGB8A1
-	.PTC12                           --- PVRTC1 RGB 2BPP
-	.PTC14                           --- PVRTC1 RGB 4BPP
-	.PTC12A                          --- PVRTC1 RGBA 2BPP
-	.PTC14A                          --- PVRTC1 RGBA 4BPP
-	.PTC22                           --- PVRTC2 RGBA 2BPP
-	.PTC24                           --- PVRTC2 RGBA 4BPP
-	.ATC                             --- ATC RGB 4BPP
-	.ATCE                            --- ATCE RGBA 8 BPP explicit alpha
-	.ATCI                            --- ATCI RGBA 8 BPP interpolated alpha
-	.ASTC4x4                         --- ASTC 4x4 8.0 BPP
-	.ASTC5x5                         --- ASTC 5x5 5.12 BPP
-	.ASTC6x6                         --- ASTC 6x6 3.56 BPP
-	.ASTC8x5                         --- ASTC 8x5 3.20 BPP
-	.ASTC8x6                         --- ASTC 8x6 2.67 BPP
-	.ASTC10x5                        --- ASTC 10x5 2.56 BPP
-	.Unknown                         --- Compressed formats above.
-	.R1
-	.A8
-	.R8
-	.R8I
-	.R8U
-	.R8S
-	.R16
-	.R16I
-	.R16U
-	.R16F
-	.R16S
-	.R32I
-	.R32U
-	.R32F
-	.RG8
-	.RG8I
-	.RG8U
-	.RG8S
-	.RG16
-	.RG16I
-	.RG16U
-	.RG16F
-	.RG16S
-	.RG32I
-	.RG32U
-	.RG32F
-	.RGB8
-	.RGB8I
-	.RGB8U
-	.RGB8S
-	.RGB9E5F
-	.BGRA8
-	.RGBA8
-	.RGBA8I
-	.RGBA8U
-	.RGBA8S
-	.RGBA16
-	.RGBA16I
-	.RGBA16U
-	.RGBA16F
-	.RGBA16S
-	.RGBA32I
-	.RGBA32U
-	.RGBA32F
-	.R5G6B5
-	.RGBA4
-	.RGB5A1
-	.RGB10A2
-	.RG11B10F
-	.UnknownDepth --- Depth formats below.
-	.D16
-	.D24
-	.D24S8
-	.D32
-	.D16F
-	.D24F
-	.D32F
-	.D0S8
-	()
-
---- Uniform type enum.
-enum.UniformType          { comment = "Uniform types:" }
-	.Sampler [[Sampler.]]
-	.End     [[Reserved, do not use.]]
-	.Vec4    [[4 floats vector.]]
-	.Mat3    [[3x3 matrix.]]
-	.Mat4    [[4x4 matrix.]]
-
---- Backbuffer ratio enum.
-enum.BackbufferRatio      { comment = "Backbuffer ratios:" }
-	.Equal     [[Equal to backbuffer.]]
-	.Half      [[One half size of backbuffer.]]
-	.Quarter   [[One quarter size of backbuffer.]]
-	.Eighth    [[One eighth size of backbuffer.]]
-	.Sixteenth [[One sixteenth size of backbuffer.]]
-	.Double    [[Double size of backbuffer.]]
-
---- Occlusion query result.
-enum.OcclusionQueryResult { comment = "Occlusion query results:" }
-	.Invisible [[Query failed test.]]
-	.Visible   [[Query passed test.]]
-	.NoResult  [[Query result is not available yet.]]
-
---- Primitive topology.
-enum.Topology { underscore, comment = "Primitive topology:" }
-	.TriList   [[Triangle list.]]
-	.TriStrip  [[Triangle strip.]]
-	.LineList  [[Line list.]]
-	.LineStrip [[Line strip.]]
-	.PointList [[Point list.]]
-
---- Topology conversion function.
-enum.TopologyConvert { underscore , comment = "Topology conversion functions:" }
-	.TriListFlipWinding  [[Flip winding order of triangle list.]]
-	.TriStripFlipWinding [[Flip winding order of trinagle strip.]]
-	.TriListToLineList   [[Convert triangle list to line list.]]
-	.TriStripToTriList   [[Convert triangle strip to triangle list.]]
-	.LineStripToLineList [[Convert line strip to line list.]]
-
---- Topology sort order.
-enum.TopologySort { underscore, comment = "Topology sort order:" , }
-	.DirectionFrontToBackMin
-	.DirectionFrontToBackAvg
-	.DirectionFrontToBackMax
-	.DirectionBackToFrontMin
-	.DirectionBackToFrontAvg
-	.DirectionBackToFrontMax
-	.DistanceFrontToBackMin
-	.DistanceFrontToBackAvg
-	.DistanceFrontToBackMax
-	.DistanceBackToFrontMin
-	.DistanceBackToFrontAvg
-	.DistanceBackToFrontMax
-	()
-
---- View mode sets draw call sort order.
-enum.ViewMode { underscore, comment = "View modes:" }
-	.Default         [[Default sort order.]]
-	.Sequential      [[Sort in the same order in which submit calls were called.]]
-	.DepthAscending   [[Sort draw call depth in ascending order.]]
-	.DepthDescending  [[Sort draw call depth in descending order.]]
-
---- Render frame enum.
-enum.RenderFrame { underscore, comment = "" }
-	.NoContext --- Renderer context is not created yet.
-	.Render    --- Renderer context is created and rendering.
-	.Timeout   --- Renderer context wait for main thread signal timed out without rendering.
-	.Exiting   --- Renderer context is getting destroyed.
-	()
-
---- GPU info.
-struct.GPU  { namespace = "Caps" }
-	.vendorId    "uint16_t"                --- Vendor PCI id. See `BGFX_PCI_ID_*`.
-	.deviceId    "uint16_t"                --- Device id.
-
---- Renderer capabilities limits.
-struct.Limits  { namespace = "Caps" }
-	.maxDrawCalls            "uint32_t"    --- Maximum number of draw calls.
-	.maxBlits                "uint32_t"    --- Maximum number of blit calls.
-	.maxTextureSize          "uint32_t"    --- Maximum texture size.
-	.maxTextureLayers        "uint32_t"    --- Maximum texture layers.
-	.maxViews                "uint32_t"    --- Maximum number of views.
-	.maxFrameBuffers         "uint32_t"    --- Maximum number of frame buffer handles.
-	.maxFBAttachments        "uint32_t"    --- Maximum number of frame buffer attachments.
-	.maxPrograms             "uint32_t"    --- Maximum number of program handles.
-	.maxShaders              "uint32_t"    --- Maximum number of shader handles.
-	.maxTextures             "uint32_t"    --- Maximum number of texture handles.
-	.maxTextureSamplers      "uint32_t"    --- Maximum number of texture samplers.
-	.maxComputeBindings      "uint32_t"    --- Maximum number of compute bindings.
-	.maxVertexLayouts        "uint32_t"    --- Maximum number of vertex format layouts.
-	.maxVertexStreams        "uint32_t"    --- Maximum number of vertex streams.
-	.maxIndexBuffers         "uint32_t"    --- Maximum number of index buffer handles.
-	.maxVertexBuffers        "uint32_t"    --- Maximum number of vertex buffer handles.
-	.maxDynamicIndexBuffers  "uint32_t"    --- Maximum number of dynamic index buffer handles.
-	.maxDynamicVertexBuffers "uint32_t"    --- Maximum number of dynamic vertex buffer handles.
-	.maxUniforms             "uint32_t"    --- Maximum number of uniform handles.
-	.maxOcclusionQueries     "uint32_t"    --- Maximum number of occlusion query handles.
-	.maxEncoders             "uint32_t"    --- Maximum number of encoder threads.
-	.transientVbSize         "uint32_t"    --- Maximum transient vertex buffer size.
-	.transientIbSize         "uint32_t"    --- Maximum transient index buffer size.
-
---- Renderer capabilities.
-struct.Caps
-	.rendererType "RendererType::Enum" --- Renderer backend type. See: `bgfx::RendererType`
-	.supported    "uint64_t"           --- Supported functionality.
-	                                   ---   @attention See BGFX_CAPS_* flags at https://bkaradzic.github.io/bgfx/bgfx.html#available-caps
-	.vendorId     "uint16_t"           --- Selected GPU vendor PCI id.
-	.deviceId     "uint16_t"           --- Selected GPU device id.
-	.homogeneousDepth "bool"           --- True when NDC depth is in [-1, 1] range, otherwise its [0, 1].
-	.originBottomLeft "bool"           --- True when NDC origin is at bottom left.
-	.numGPUs      "uint8_t"            --- Number of enumerated GPUs.
-	.gpu          "GPU[4]"             --- Enumerated GPUs.
-	.limits       "Limits"
-	.formats      "uint16_t[TextureFormat::Count]"
-		--- Supported texture format capabilities flags:
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_NONE` - Texture format is not supported.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_2D` - Texture format is supported.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_2D_SRGB` - Texture as sRGB format is supported.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_2D_EMULATED` - Texture format is emulated.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_3D` - Texture format is supported.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_3D_SRGB` - Texture as sRGB format is supported.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_3D_EMULATED` - Texture format is emulated.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_CUBE` - Texture format is supported.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_CUBE_SRGB` - Texture as sRGB format is supported.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_CUBE_EMULATED` - Texture format is emulated.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_VERTEX` - Texture format can be used from vertex shader.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_IMAGE` - Texture format can be used as image from compute
-		---     shader.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER` - Texture format can be used as frame
-		---     buffer.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA` - Texture format can be used as MSAA
-		---     frame buffer.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_MSAA` - Texture can be sampled as MSAA.
-		---   - `BGFX_CAPS_FORMAT_TEXTURE_MIP_AUTOGEN` - Texture format supports auto-generated
-		---     mips.
-
---- Internal data.
-struct.InternalData
-	.caps    "const Caps*" --- Renderer capabilities.
-	.context "void*"              --- GL context, or D3D device.
-
---- Platform data.
-struct.PlatformData { ctor }
-	.ndt          "void*" --- Native display type.
-	.nwh          "void*" --- Native window handle.
-	.context      "void*" --- GL context, or D3D device.
-	.backBuffer   "void*" --- GL backbuffer, or D3D render target view.
-	.backBufferDS "void*" --- Backbuffer depth/stencil.
-
---- Backbuffer resolution and reset parameters.
-struct.Resolution { ctor }
-	.format          "TextureFormat::Enum" --- Backbuffer format.
-	.width           "uint32_t"            --- Backbuffer width.
-	.height          "uint32_t"            --- Backbuffer height.
-	.reset           "uint32_t"            --- Reset parameters.
-	.numBackBuffers  "uint8_t"             --- Number of back buffers.
-	.maxFrameLatency "uint8_t"             --- Maximum frame latency.
-
-struct.Limits { namespace = "Init" }
-	.maxEncoders    "uint16_t"             --- Maximum number of encoder threads.
-	.transientVbSize "uint32_t"            --- Maximum transient vertex buffer size.
-	.transientIbSize "uint32_t"            --- Maximum transient index buffer size.
-
---- Initialization parameters used by `bgfx::init`.
-struct.Init { ctor }
-	.type            "RendererType::Enum"  --- Select rendering backend. When set to RendererType::Count
-	                                       --- a default rendering backend will be selected appropriate to the platform.
-	                                       --- See: `bgfx::RendererType`
-
-	.vendorId       "uint16_t"             --- Vendor PCI id. If set to `BGFX_PCI_ID_NONE` it will select the first
-	                                       --- device.
-	                                       ---   - `BGFX_PCI_ID_NONE` - Autoselect adapter.
-	                                       ---   - `BGFX_PCI_ID_SOFTWARE_RASTERIZER` - Software rasterizer.
-	                                       ---   - `BGFX_PCI_ID_AMD` - AMD adapter.
-	                                       ---   - `BGFX_PCI_ID_INTEL` - Intel adapter.
-	                                       ---   - `BGFX_PCI_ID_NVIDIA` - nVidia adapter.
-
-	.deviceId       "uint16_t"             --- Device id. If set to 0 it will select first device, or device with
-	                                       --- matching id.
-
-	.debug          "bool"                 --- Enable device for debuging.
-	.profile        "bool"                 --- Enable device for profiling.
-	.platformData   "PlatformData"         --- Platform data.
-	.resolution     "Resolution"           --- Backbuffer resolution and reset parameters. See: `bgfx::Resolution`.
-	.limits         "Limits"
-	.callback       "CallbackI*"           --- Provide application specific callback interface.
-	                                       --- See: `bgfx::CallbackI`
-
-	.allocator      "bx::AllocatorI*"      --- Custom allocator. When a custom allocator is not
-	                                       --- specified, bgfx uses the CRT allocator. Bgfx assumes
-	                                       --- custom allocator is thread safe.
-
---- Memory must be obtained by calling `bgfx::alloc`, `bgfx::copy`, or `bgfx::makeRef`.
----
---- @attention It is illegal to create this structure on stack and pass it to any bgfx API.
-struct.Memory
-	.data "uint8_t*" [[Pointer to data.]]
-	.size "uint32_t" [[Data size.]]
-
---- Transient index buffer.
-struct.TransientIndexBuffer
-	.data       "uint8_t*"          --- Pointer to data.
-	.size       "uint32_t"          --- Data size.
-	.startIndex "uint32_t"          --- First index.
-	.handle     "IndexBufferHandle" --- Index buffer handle.
-
---- Transient vertex buffer.
-struct.TransientVertexBuffer
-	.data         "uint8_t*"           --- Pointer to data.
-	.size         "uint32_t"           --- Data size.
-	.startVertex  "uint32_t"           --- First vertex.
-	.stride       "uint16_t"           --- Vertex stride.
-	.handle       "VertexBufferHandle" --- Vertex buffer handle.
-	.layoutHandle "VertexLayoutHandle" --- Vertex layout handle.
-
---- Instance data buffer info.
-struct.InstanceDataBuffer
-	.data   "uint8_t*"           --- Pointer to data.
-	.size   "uint32_t"           --- Data size.
-	.offset "uint32_t"           --- Offset in vertex buffer.
-	.num    "uint32_t"           --- Number of instances.
-	.stride "uint16_t"           --- Vertex buffer stride.
-	.handle "VertexBufferHandle" --- Vertex buffer object handle.
-
---- Texture info.
-struct.TextureInfo
-	.format       "TextureFormat::Enum" --- Texture format.
-	.storageSize  "uint32_t"            --- Total amount of bytes required to store texture.
-	.width        "uint16_t"            --- Texture width.
-	.height       "uint16_t"            --- Texture height.
-	.depth        "uint16_t"            --- Texture depth.
-	.numLayers    "uint16_t"            --- Number of layers in texture array.
-	.numMips      "uint8_t"             --- Number of MIP maps.
-	.bitsPerPixel "uint8_t"             --- Format bits per pixel.
-	.cubeMap      "bool"                --- Texture is cubemap.
-
---- Uniform info.
-struct.UniformInfo
-	.name "char[256]"         --- Uniform name.
-	.type "UniformType::Enum" --- Uniform type.
-	.num  "uint16_t"          --- Number of elements in array.
-
---- Frame buffer texture attachment info.
-struct.Attachment { shortname }
-	.access  "Access::Enum"  --- Attachement access. See `Access::Enum`.
-	.handle  "TextureHandle" --- Render target texture handle.
-	.mip     "uint16_t"      --- Mip level.
-	.layer   "uint16_t"      --- Cubemap side or depth layer/slice.
-	.resolve "uint8_t"       --- Resolve flags. See: `BGFX_RESOLVE_*`
-
---- Init attachment.
-func.Attachment.init
-	"void"
-	.handle "TextureHandle" --- Render target texture handle.
-	.access "Access::Enum"  --- Access. See `Access::Enum`.
-	 { default = "Access::Write" }
-	.layer "uint16_t"       --- Cubemap side or depth layer/slice.
-	 { default = 0 }
-	.mip "uint16_t"         --- Mip level.
-	 { default = 0 }
-	.resolve "uint8_t"      --- Resolve flags. See: `BGFX_RESOLVE_*`
-	 { default = "BGFX_RESOLVE_AUTO_GEN_MIPS" }
-
---- Transform data.
-struct.Transform
-	.data "float*"  --- Pointer to first 4x4 matrix.
-	.num "uint16_t" --- Number of matrices.
-
---- View stats.
-struct.ViewStats
-	.name           "char[256]" --- View name.
-	.view           "ViewId"    --- View id.
-	.cpuTimeBegin   "int64_t"   --- CPU (submit) begin time.
-	.cpuTimeEnd     "int64_t"   --- CPU (submit) end time.
-	.gpuTimeBegin   "int64_t"   --- GPU begin time.
-	.gpuTimeEnd     "int64_t"   --- GPU end time.
-
---- Encoder stats.
-struct.EncoderStats
-	.cpuTimeBegin "int64_t" --- Encoder thread CPU submit begin time.
-	.cpuTimeEnd   "int64_t" --- Encoder thread CPU submit end time.
-
---- Renderer statistics data.
----
---- @remarks All time values are high-resolution timestamps, while
---- time frequencies define timestamps-per-second for that hardware.
-struct.Stats
-	.cpuTimeFrame            "int64_t"       --- CPU time between two `bgfx::frame` calls.
-	.cpuTimeBegin            "int64_t"       --- Render thread CPU submit begin time.
-	.cpuTimeEnd              "int64_t"       --- Render thread CPU submit end time.
-	.cpuTimerFreq            "int64_t"       --- CPU timer frequency. Timestamps-per-second
-
-	.gpuTimeBegin            "int64_t"       --- GPU frame begin time.
-	.gpuTimeEnd              "int64_t"       --- GPU frame end time.
-	.gpuTimerFreq            "int64_t"       --- GPU timer frequency.
-
-	.waitRender              "int64_t"       --- Time spent waiting for render backend thread to finish issuing draw commands to underlying graphics API.
-	.waitSubmit              "int64_t"       --- Time spent waiting for submit thread to advance to next frame.
-
-	.numDraw                 "uint32_t"      --- Number of draw calls submitted.
-	.numCompute              "uint32_t"      --- Number of compute calls submitted.
-	.numBlit                 "uint32_t"      --- Number of blit calls submitted.
-	.maxGpuLatency           "uint32_t"      --- GPU driver latency.
-
-	.numDynamicIndexBuffers  "uint16_t"      --- Number of used dynamic index buffers.
-	.numDynamicVertexBuffers "uint16_t"      --- Number of used dynamic vertex buffers.
-	.numFrameBuffers         "uint16_t"      --- Number of used frame buffers.
-	.numIndexBuffers         "uint16_t"      --- Number of used index buffers.
-	.numOcclusionQueries     "uint16_t"      --- Number of used occlusion queries.
-	.numPrograms             "uint16_t"      --- Number of used programs.
-	.numShaders              "uint16_t"      --- Number of used shaders.
-	.numTextures             "uint16_t"      --- Number of used textures.
-	.numUniforms             "uint16_t"      --- Number of used uniforms.
-	.numVertexBuffers        "uint16_t"      --- Number of used vertex buffers.
-	.numVertexLayouts        "uint16_t"      --- Number of used vertex layouts.
-
-	.textureMemoryUsed       "int64_t"       --- Estimate of texture memory used.
-	.rtMemoryUsed            "int64_t"       --- Estimate of render target memory used.
-	.transientVbUsed         "int32_t"       --- Amount of transient vertex buffer used.
-	.transientIbUsed         "int32_t"       --- Amount of transient index buffer used.
-
-	.numPrims                "uint32_t[Topology::Count]" --- Number of primitives rendered.
-
-	.gpuMemoryMax            "int64_t"       --- Maximum available GPU memory for application.
-	.gpuMemoryUsed           "int64_t"       --- Amount of GPU memory used by the application.
-
-	.width                   "uint16_t"      --- Backbuffer width in pixels.
-	.height                  "uint16_t"      --- Backbuffer height in pixels.
-	.textWidth               "uint16_t"      --- Debug text width in characters.
-	.textHeight              "uint16_t"      --- Debug text height in characters.
-
-	.numViews                "uint16_t"      --- Number of view stats.
-	.viewStats               "ViewStats*"    --- Array of View stats.
-
-	.numEncoders             "uint8_t"       --- Number of encoders used during frame.
-	.encoderStats            "EncoderStats*" --- Array of encoder stats.
-
---- Vertex layout.
-struct.VertexLayout { ctor }
-	.hash       "uint32_t"                --- Hash.
-	.stride     "uint16_t"                --- Stride.
-	.offset     "uint16_t[Attrib::Count]" --- Attribute offsets.
-	.attributes "uint16_t[Attrib::Count]" --- Used attributes.
-
---- Encoders are used for submitting draw calls from multiple threads. Only one encoder
---- per thread should be used. Use `bgfx::begin()` to obtain an encoder for a thread.
-struct.Encoder {}
-
-handle "DynamicIndexBufferHandle"
-handle "DynamicVertexBufferHandle"
-handle "FrameBufferHandle"
-handle "IndexBufferHandle"
-handle "IndirectBufferHandle"
-handle "OcclusionQueryHandle"
-handle "ProgramHandle"
-handle "ShaderHandle"
-handle "TextureHandle"
-handle "UniformHandle"
-handle "VertexBufferHandle"
-handle "VertexLayoutHandle"
-
---- Start VertexLayout.
-func.VertexLayout.begin
-	"VertexLayout&"
-	.rendererType    "RendererType::Enum"
-	{ default = "RendererType::Noop" }
-
---- Add attribute to VertexLayout.
----
---- @remarks Must be called between begin/end.
----
-func.VertexLayout.add
-	"VertexLayout&"
-	.attrib          "Attrib::Enum"     --- Attribute semantics. See: `bgfx::Attrib`
-	.num             "uint8_t"          --- Number of elements 1, 2, 3 or 4.
-	.type            "AttribType::Enum" --- Element type.
-	.normalized      "bool"             --- When using fixed point AttribType (f.e. Uint8)
-	 { default = false }                --- value will be normalized for vertex shader usage. When normalized
-	                                    --- is set to true, AttribType::Uint8 value in range 0-255 will be
-	                                    --- in range 0.0-1.0 in vertex shader.
-	.asInt           "bool"             --- Packaging rule for vertexPack, vertexUnpack, and
-	 { default = false }                --- vertexConvert for AttribType::Uint8 and AttribType::Int16.
-	                                    --- Unpacking code must be implemented inside vertex shader.
-
---- Decode attribute.
-func.VertexLayout.decode { const }
-	"void"
-	.attrib     "Attrib::Enum"               --- Attribute semantics. See: `bgfx::Attrib`
-	.num        "uint8_t &"          { out } --- Number of elements.
-	.type       "AttribType::Enum &" { out } --- Element type.
-	.normalized "bool &"             { out } --- Attribute is normalized.
-	.asInt      "bool &"             { out } --- Attribute is packed as int.
-
---- Returns true if VertexLayout contains attribute.
-func.VertexLayout.has { const }
-	"bool"
-	.attrib "Attrib::Enum" --- Attribute semantics. See: `bgfx::Attrib`
-
---- Skip `_num` bytes in vertex stream.
-func.VertexLayout.skip
-	"VertexLayout&"
-	.num "uint8_t"
-
--- Notice: `end` is a keyword in lua.
---- End VertexLayout.
-func.VertexLayout["end"]
-	"void"
-
---- Returns relative attribute offset from the vertex.
-func.VertexLayout.getOffset { const , cpponly }
-	"uint16_t"
-	.attrib    "Attrib::Enum" --- Attribute semantics. See: `bgfx::Attrib`
-
---- Returns vertex stride.
-func.VertexLayout.getStride { const , cpponly }
-	"uint16_t"
-
---- Returns size of vertex buffer for number of vertices.
-func.VertexLayout.getSize { const, cpponly }
-	"uint32_t"
-	.num       "uint32_t"
-
---- Pack vertex attribute into vertex stream format.
-func.vertexPack
-	"void"
-	.input           "const float[4]"       --- Value to be packed into vertex stream.
-	.inputNormalized "bool"                 --- `true` if input value is already normalized.
-	.attr            "Attrib::Enum"         --- Attribute to pack.
-	.layout          "const VertexLayout &" --- Vertex stream layout.
-	.data            "void*"                --- Destination vertex stream where data will be packed.
-	.index           "uint32_t"             --- Vertex index that will be modified.
-	 { default = 0 }
-
---- Unpack vertex attribute from vertex stream format.
-func.vertexUnpack
-	"void"
-	.output "float[4]" { out }     --- Result of unpacking.
-	.attr   "Attrib::Enum"         --- Attribute to unpack.
-	.layout "const VertexLayout &" --- Vertex stream layout.
-	.data   "const void*"          --- Source vertex stream from where data will be unpacked.
-	.index  "uint32_t"             --- Vertex index that will be unpacked.
-	 { default = 0 }
-
---- Converts vertex stream data from one vertex stream format to another.
-func.vertexConvert
-	"void"
-	.dstLayout "const VertexLayout &" --- Destination vertex stream layout.
-	.dstData   "void*"                --- Destination vertex stream.
-	.srcLayout "const VertexLayout &" --- Source vertex stream layout.
-	.srcData   "const void*"          --- Source vertex stream data.
-	.num       "uint32_t"             --- Number of vertices to convert from source to destination.
-	 { default = 1 }
-
---- Weld vertices.
-func.weldVertices
-	"uint16_t"                     --- Number of unique vertices after vertex welding.
-	.output          "uint16_t*"    --- Welded vertices remapping table. The size of buffer
-	                               --- must be the same as number of vertices.
-	.layout			"const VertexLayout &"     --- Vertex stream layout.
-	.data            "const void*"            --- Vertex stream.
-	.num             "uint16_t"               --- Number of vertices in vertex stream.
-	.epsilon         "float"                  --- Error tolerance for vertex position comparison.
-	 { default = "0.001f" }
-
---- Convert index buffer for use with different primitive topologies.
-func.topologyConvert
-	"uint32_t"                          --- Number of output indices after conversion.
-	.conversion "TopologyConvert::Enum" --- Conversion type, see `TopologyConvert::Enum`.
-	.dst        "void*" { out }         --- Destination index buffer. If this argument is NULL
-	                                    --- function will return number of indices after conversion.
-	.dstSize    "uint32_t"              --- Destination index buffer in bytes. It must be
-	                                    --- large enough to contain output indices. If destination size is
-	                                    --- insufficient index buffer will be truncated.
-	.indices    "const void*"           --- Source indices.
-	.numIndices "uint32_t"              --- Number of input indices.
-	.index32    "bool"                  --- Set to `true` if input indices are 32-bit.
-
---- Sort indices.
-func.topologySortTriList
-	"void"
-	.sort       "TopologySort::Enum" --- Sort order, see `TopologySort::Enum`.
-	.dst        "void*" { out }      --- Destination index buffer.
-	.dstSize    "uint32_t"           --- Destination index buffer in bytes. It must be
-	                                 --- large enough to contain output indices. If destination size is
-	                                 --- insufficient index buffer will be truncated.
-	.dir        "const float[3]"     --- Direction (vector must be normalized).
-	.pos        "const float[3]"     --- Position.
-	.vertices   "const void*"        --- Pointer to first vertex represented as
-	                                 --- float x, y, z. Must contain at least number of vertices
-	                                 --- referencende by index buffer.
-	.stride     "uint32_t"           --- Vertex stride.
-	.indices    "const void*"        --- Source indices.
-	.numIndices "uint32_t"           --- Number of input indices.
-	.index32    "bool"               --- Set to `true` if input indices are 32-bit.
-
---- Returns supported backend API renderers.
-func.getSupportedRenderers
-	"uint8_t"                             --- Number of supported renderers.
-	.max  "uint8_t"                       --- Maximum number of elements in _enum array.
-	 { default = 0 }
-	.enum "RendererType::Enum*" { inout } --- Array where supported renderers will be written.
-	 { default = NULL }
-
---- Returns name of renderer.
-func.getRendererName
-	"const char*"              --- Name of renderer.
-	.type "RendererType::Enum" --- Renderer backend type. See: `bgfx::RendererType`
-
-func.initCtor { cfunc }
-	"void"
-	.init "Init*"
-
---- Initialize bgfx library.
-func.init { cfunc }
-	"bool"               --- `true` if initialization was successful.
-	.init "const Init &" --- Initialization parameters. See: `bgfx::Init` for more info.
-
---- Shutdown bgfx library.
-func.shutdown
-	"void"
-
---- Reset graphic settings and back-buffer size.
----
---- @attention This call doesn't actually change window size, it just
----   resizes back-buffer. Windowing code has to change window size.
----
-func.reset
-	"void"
-	.width  "uint32_t"               --- Back-buffer width.
-	.height "uint32_t"               --- Back-buffer height.
-	.flags  "uint32_t"               --- See: `BGFX_RESET_*` for more info.
-	 { default = "BGFX_RESET_NONE" } ---   - `BGFX_RESET_NONE` - No reset flags.
-	                                 ---   - `BGFX_RESET_FULLSCREEN` - Not supported yet.
-	                                 ---   - `BGFX_RESET_MSAA_X[2/4/8/16]` - Enable 2, 4, 8 or 16 x MSAA.
-	                                 ---   - `BGFX_RESET_VSYNC` - Enable V-Sync.
-	                                 ---   - `BGFX_RESET_MAXANISOTROPY` - Turn on/off max anisotropy.
-	                                 ---   - `BGFX_RESET_CAPTURE` - Begin screen capture.
-	                                 ---   - `BGFX_RESET_FLUSH_AFTER_RENDER` - Flush rendering after submitting to GPU.
-	                                 ---   - `BGFX_RESET_FLIP_AFTER_RENDER` - This flag  specifies where flip
-	                                 ---     occurs. Default behavior is that flip occurs before rendering new
-	                                 ---     frame. This flag only has effect when `BGFX_CONFIG_MULTITHREADED=0`.
-	                                 ---   - `BGFX_RESET_SRGB_BACKBUFFER` - Enable sRGB backbuffer.
-	.format "TextureFormat::Enum"    --- Texture format. See: `TextureFormat::Enum`.
-	 { default = "TextureFormat::Count" }
-
---- Advance to next frame. When using multithreaded renderer, this call
---- just swaps internal buffers, kicks render thread, and returns. In
---- singlethreaded renderer this call does frame rendering.
-func.frame
-	"uint32_t"      --- Current frame number. This might be used in conjunction with
-	                --- double/multi buffering data outside the library and passing it to
-	                --- library via `bgfx::makeRef` calls.
-	.capture "bool" --- Capture frame with graphics debugger.
-	 { default = false }
-
---- Returns current renderer backend API type.
----
---- @remarks
----   Library must be initialized.
----
-func.getRendererType
-	"RendererType::Enum" --- Renderer backend type. See: `bgfx::RendererType`
-
---- Returns renderer capabilities.
----
---- @remarks
----   Library must be initialized.
----
-func.getCaps
-	"const Caps*" --- Pointer to static `bgfx::Caps` structure.
-
---- Returns performance counters.
----
---- @attention Pointer returned is valid until `bgfx::frame` is called.
----
-func.getStats
-	"const Stats*" -- Performance counters.
-
---- Allocate buffer to pass to bgfx calls. Data will be freed inside bgfx.
-func.alloc
-	"const Memory*"  --- Allocated memory.
-	.size "uint32_t" --- Size to allocate.
-
---- Allocate buffer and copy data into it. Data will be freed inside bgfx.
-func.copy
-	"const Memory*"     --- Allocated memory.
-	.data "const void*" --- Pointer to data to be copied.
-	.size "uint32_t"    --- Size of data to be copied.
-
---- Make reference to data to pass to bgfx. Unlike `bgfx::alloc`, this call
---- doesn't allocate memory for data. It just copies the _data pointer. You
---- can pass `ReleaseFn` function pointer to release this memory after it's
---- consumed, otherwise you must make sure _data is available for at least 2
---- `bgfx::frame` calls. `ReleaseFn` function must be able to be called
---- from any thread.
----
---- @attention Data passed must be available for at least 2 `bgfx::frame` calls.
----
-func.makeRef { conly }
-	"const Memory*"     --- Referenced memory.
-	.data "const void*" --- Pointer to data.
-	.size "uint32_t"    --- Size of data.
-
---- Make reference to data to pass to bgfx. Unlike `bgfx::alloc`, this call
---- doesn't allocate memory for data. It just copies the _data pointer. You
---- can pass `ReleaseFn` function pointer to release this memory after it's
---- consumed, otherwise you must make sure _data is available for at least 2
---- `bgfx::frame` calls. `ReleaseFn` function must be able to be called
---- from any thread.
----
---- @attention Data passed must be available for at least 2 `bgfx::frame` calls.
----
-func.makeRef { cname = "make_ref_release" }
-	"const Memory*"          --- Referenced memory.
-	.data      "const void*" --- Pointer to data.
-	.size      "uint32_t"    --- Size of data.
-	.releaseFn "ReleaseFn"   --- Callback function to release memory after use.
-	 { default = NULL }
-	.userData  "void*"       --- User data to be passed to callback function.
-	 { default = NULL }
-
---- Set debug flags.
-func.setDebug
-	"void"
-	.debug "uint32_t" --- Available flags:
-	                  ---   - `BGFX_DEBUG_IFH` - Infinitely fast hardware. When this flag is set
-	                  ---     all rendering calls will be skipped. This is useful when profiling
-	                  ---     to quickly assess potential bottlenecks between CPU and GPU.
-	                  ---   - `BGFX_DEBUG_PROFILER` - Enable profiler.
-	                  ---   - `BGFX_DEBUG_STATS` - Display internal statistics.
-	                  ---   - `BGFX_DEBUG_TEXT` - Display debug text.
-	                  ---   - `BGFX_DEBUG_WIREFRAME` - Wireframe rendering. All rendering
-	                  ---     primitives will be rendered as lines.
-
---- Clear internal debug text buffer.
-func.dbgTextClear
-	"void"
-	.attr  "uint8_t" --- Background color.
-	 { default = 0 }
-	.small "bool"    --- Default 8x16 or 8x8 font.
-	 { default = false }
-
---- Print formatted data to internal debug text character-buffer (VGA-compatible text mode).
-func.dbgTextPrintf { vararg = "dbgTextPrintfVargs" }
-	"void"
-	.x      "uint16_t"    --- Position x from the left corner of the window.
-	.y      "uint16_t"    --- Position y from the top corner of the window.
-	.attr   "uint8_t"     --- Color palette. Where top 4-bits represent index of background, and bottom
-	                      --- 4-bits represent foreground color from standard VGA text palette (ANSI escape codes).
-	.format "const char*" --- `printf` style format.
-
---- Print formatted data from variable argument list to internal debug text character-buffer (VGA-compatible text mode).
-func.dbgTextPrintfVargs { cname = "dbg_text_vprintf" }
-	"void"
-	.x       "uint16_t"    --- Position x from the left corner of the window.
-	.y       "uint16_t"    --- Position y from the top corner of the window.
-	.attr    "uint8_t"     --- Color palette. Where top 4-bits represent index of background, and bottom
-                           --- 4-bits represent foreground color from standard VGA text palette (ANSI escape codes).
-	.format  "const char*" --- `printf` style format.
-	.argList "va_list"     --- Variable arguments list for format string.
-
---- Draw image into internal debug text buffer.
-func.dbgTextImage
-	"void"
-	.x       "uint16_t"    --- Position x from the left corner of the window.
-	.y       "uint16_t"    --- Position y from the top corner of the window.
-	.width   "uint16_t"    --- Image width.
-	.height  "uint16_t"    --- Image height.
-	.data    "const void*" --- Raw image data (character/attribute raw encoding).
-	.pitch   "uint16_t"    --- Image pitch in bytes.
-
---- Create static index buffer.
-func.createIndexBuffer
-	"IndexBufferHandle"
-	.mem   "const Memory*"            --- Index buffer data.
-	.flags "uint16_t"                 --- Buffer creation flags.
-	 { default = "BGFX_BUFFER_NONE" } ---   - `BGFX_BUFFER_NONE` - No flags.
-	                                  ---   - `BGFX_BUFFER_COMPUTE_READ` - Buffer will be read from by compute shader.
-	                                  ---   - `BGFX_BUFFER_COMPUTE_WRITE` - Buffer will be written into by compute shader. When buffer
-	                                  ---       is created with `BGFX_BUFFER_COMPUTE_WRITE` flag it cannot be updated from CPU.
-	                                  ---   - `BGFX_BUFFER_COMPUTE_READ_WRITE` - Buffer will be used for read/write by compute shader.
-	                                  ---   - `BGFX_BUFFER_ALLOW_RESIZE` - Buffer will resize on buffer update if a different amount of
-	                                  ---       data is passed. If this flag is not specified, and more data is passed on update, the buffer
-	                                  ---       will be trimmed to fit the existing buffer size. This flag has effect only on dynamic
-	                                  ---       buffers.
-	                                  ---   - `BGFX_BUFFER_INDEX32` - Buffer is using 32-bit indices. This flag has effect only on
-	                                  ---       index buffers.
-
---- Set static index buffer debug name.
-func.setName { cname = "set_index_buffer_name" }
-	"void"
-	.handle "IndexBufferHandle" --- Static index buffer handle.
-	.name   "const char*"       --- Static index buffer name.
-	.len    "int32_t"           --- Static index buffer name length (if length is INT32_MAX, it's expected
-	 { default = INT32_MAX }    --- that _name is zero terminated string.
-
---- Destroy static index buffer.
-func.destroy { cname = "destroy_index_buffer" }
-	"void"
-	.handle "IndexBufferHandle" --- Static index buffer handle.
-
---- Create vertex layout.
-func.createVertexLayout
-	"VertexLayoutHandle"
-	.layout  "const VertexLayout &" --- Vertex layout.
-
---- Destroy vertex layout.
-func.destroy { cname = "destroy_vertex_layout" }
-	"void"
-	.layoutHandle "VertexLayoutHandle" --- Vertex layout handle.
-
---- Create static vertex buffer.
-func.createVertexBuffer
-	"VertexBufferHandle"                --- Static vertex buffer handle.
-	.mem         "const Memory*"        --- Vertex buffer data.
-	.layout      "const VertexLayout &" --- Vertex layout.
-	.flags       "uint16_t"             --- Buffer creation flags.
-	 { default = "BGFX_BUFFER_NONE" }   ---  - `BGFX_BUFFER_NONE` - No flags.
-	                                    ---  - `BGFX_BUFFER_COMPUTE_READ` - Buffer will be read from by compute shader.
-	                                    ---  - `BGFX_BUFFER_COMPUTE_WRITE` - Buffer will be written into by compute shader. When buffer
-	                                    ---      is created with `BGFX_BUFFER_COMPUTE_WRITE` flag it cannot be updated from CPU.
-	                                    ---  - `BGFX_BUFFER_COMPUTE_READ_WRITE` - Buffer will be used for read/write by compute shader.
-	                                    ---  - `BGFX_BUFFER_ALLOW_RESIZE` - Buffer will resize on buffer update if a different amount of
-	                                    ---      data is passed. If this flag is not specified, and more data is passed on update, the buffer
-	                                    ---      will be trimmed to fit the existing buffer size. This flag has effect only on dynamic buffers.
-	                                    ---  - `BGFX_BUFFER_INDEX32` - Buffer is using 32-bit indices. This flag has effect only on index buffers.
-
---- Set static vertex buffer debug name.
-func.setName { cname = "set_vertex_buffer_name" }
-	"void"
-	.handle "VertexBufferHandle" --- Static vertex buffer handle.
-	.name   "const char*"        --- Static vertex buffer name.
-	.len    "int32_t"            --- Static vertex buffer name length (if length is INT32_MAX, it's expected
-	 { default = INT32_MAX }     --- that _name is zero terminated string.
-
---- Destroy static vertex buffer.
-func.destroy { cname = "destroy_vertex_buffer" }
-	"void"
-	.handle "VertexBufferHandle" --- Static vertex buffer handle.
-
---- Create empty dynamic index buffer.
-func.createDynamicIndexBuffer
-	"DynamicIndexBufferHandle"        --- Dynamic index buffer handle.
-	.num   "uint32_t"                 --- Number of indices.
-	.flags "uint16_t"                 --- Buffer creation flags.
-	 { default = "BGFX_BUFFER_NONE" } ---   - `BGFX_BUFFER_NONE` - No flags.
-	                                  ---   - `BGFX_BUFFER_COMPUTE_READ` - Buffer will be read from by compute shader.
-	                                  ---   - `BGFX_BUFFER_COMPUTE_WRITE` - Buffer will be written into by compute shader. When buffer
-	                                  ---       is created with `BGFX_BUFFER_COMPUTE_WRITE` flag it cannot be updated from CPU.
-	                                  ---   - `BGFX_BUFFER_COMPUTE_READ_WRITE` - Buffer will be used for read/write by compute shader.
-	                                  ---   - `BGFX_BUFFER_ALLOW_RESIZE` - Buffer will resize on buffer update if a different amount of
-	                                  ---       data is passed. If this flag is not specified, and more data is passed on update, the buffer
-	                                  ---       will be trimmed to fit the existing buffer size. This flag has effect only on dynamic
-	                                  ---       buffers.
-	                                  ---   - `BGFX_BUFFER_INDEX32` - Buffer is using 32-bit indices. This flag has effect only on
-	                                  ---       index buffers.
-
---- Create dynamic index buffer and initialized it.
-func.createDynamicIndexBuffer { cname = "create_dynamic_index_buffer_mem" }
-	"DynamicIndexBufferHandle"        --- Dynamic index buffer handle.
-	.mem   "const Memory*"            --- Index buffer data.
-	.flags "uint16_t"                 --- Buffer creation flags.
-	 { default = "BGFX_BUFFER_NONE" } ---   - `BGFX_BUFFER_NONE` - No flags.
-	                                  ---   - `BGFX_BUFFER_COMPUTE_READ` - Buffer will be read from by compute shader.
-	                                  ---   - `BGFX_BUFFER_COMPUTE_WRITE` - Buffer will be written into by compute shader. When buffer
-	                                  ---       is created with `BGFX_BUFFER_COMPUTE_WRITE` flag it cannot be updated from CPU.
-	                                  ---   - `BGFX_BUFFER_COMPUTE_READ_WRITE` - Buffer will be used for read/write by compute shader.
-	                                  ---   - `BGFX_BUFFER_ALLOW_RESIZE` - Buffer will resize on buffer update if a different amount of
-	                                  ---       data is passed. If this flag is not specified, and more data is passed on update, the buffer
-	                                  ---       will be trimmed to fit the existing buffer size. This flag has effect only on dynamic
-	                                  ---       buffers.
-	                                  ---   - `BGFX_BUFFER_INDEX32` - Buffer is using 32-bit indices. This flag has effect only on
-	                                  ---       index buffers.
-
---- Update dynamic index buffer.
-func.update { cname = "update_dynamic_index_buffer" }
-	"void"
-	.handle     "DynamicIndexBufferHandle" --- Dynamic index buffer handle.
-	.startIndex "uint32_t"                 --- Start index.
-	.mem        "const Memory*"            --- Index buffer data.
-
---- Destroy dynamic index buffer.
-func.destroy { cname = "destroy_dynamic_index_buffer" }
-	"void"
-	.handle "DynamicIndexBufferHandle" --- Dynamic index buffer handle.
-
---- Create empty dynamic vertex buffer.
-func.createDynamicVertexBuffer
-	"DynamicVertexBufferHandle"               --- Dynamic vertex buffer handle.
-	.num           "uint32_t"              --- Number of vertices.
-	.layout      "const VertexLayout&"   --- Vertex layout.
-	.flags         "uint16_t"              --- Buffer creation flags.
-	 { default = "BGFX_BUFFER_NONE" }     ---   - `BGFX_BUFFER_NONE` - No flags.
-	                                      ---   - `BGFX_BUFFER_COMPUTE_READ` - Buffer will be read from by compute shader.
-	                                      ---   - `BGFX_BUFFER_COMPUTE_WRITE` - Buffer will be written into by compute shader. When buffer
-	                                      ---       is created with `BGFX_BUFFER_COMPUTE_WRITE` flag it cannot be updated from CPU.
-	                                      ---   - `BGFX_BUFFER_COMPUTE_READ_WRITE` - Buffer will be used for read/write by compute shader.
-	                                      ---   - `BGFX_BUFFER_ALLOW_RESIZE` - Buffer will resize on buffer update if a different amount of
-	                                      ---       data is passed. If this flag is not specified, and more data is passed on update, the buffer
-	                                      ---       will be trimmed to fit the existing buffer size. This flag has effect only on dynamic
-	                                      ---       buffers.
-	                                      ---   - `BGFX_BUFFER_INDEX32` - Buffer is using 32-bit indices. This flag has effect only on
-	                                      ---       index buffers.
-
---- Create dynamic vertex buffer and initialize it.
-func.createDynamicVertexBuffer { cname = "create_dynamic_vertex_buffer_mem" }
-	"DynamicVertexBufferHandle"        --- Dynamic vertex buffer handle.
-	.mem         "const Memory*"       --- Vertex buffer data.
-	.layout      "const VertexLayout&" --- Vertex layout.
-	.flags       "uint16_t"            --- Buffer creation flags.
-	 { default = "BGFX_BUFFER_NONE" }  ---   - `BGFX_BUFFER_NONE` - No flags.
-	                                   ---   - `BGFX_BUFFER_COMPUTE_READ` - Buffer will be read from by compute shader.
-	                                   ---   - `BGFX_BUFFER_COMPUTE_WRITE` - Buffer will be written into by compute shader. When buffer
-	                                   ---       is created with `BGFX_BUFFER_COMPUTE_WRITE` flag it cannot be updated from CPU.
-	                                   ---   - `BGFX_BUFFER_COMPUTE_READ_WRITE` - Buffer will be used for read/write by compute shader.
-	                                   ---   - `BGFX_BUFFER_ALLOW_RESIZE` - Buffer will resize on buffer update if a different amount of
-	                                   ---       data is passed. If this flag is not specified, and more data is passed on update, the buffer
-	                                   ---       will be trimmed to fit the existing buffer size. This flag has effect only on dynamic
-	                                   ---       buffers.
-	                                   ---   - `BGFX_BUFFER_INDEX32` - Buffer is using 32-bit indices. This flag has effect only on
-	                                   ---       index buffers.
-
---- Update dynamic vertex buffer.
-func.update { cname = "update_dynamic_vertex_buffer" }
-	"void"
-	.handle      "DynamicVertexBufferHandle" --- Dynamic vertex buffer handle.
-	.startVertex "uint32_t"                  --- Start vertex.
-	.mem         "const Memory*"             --- Vertex buffer data.
-
---- Destroy dynamic vertex buffer.
-func.destroy { cname = "destroy_dynamic_vertex_buffer" }
-	"void"
-	.handle "DynamicVertexBufferHandle" --- Dynamic vertex buffer handle.
-
---- Returns number of requested or maximum available indices.
-func.getAvailTransientIndexBuffer
-	"uint32_t"      --- Number of requested or maximum available indices.
-	.num "uint32_t" --- Number of required indices.
-
---- Returns number of requested or maximum available vertices.
-func.getAvailTransientVertexBuffer
-	"uint32_t"                     --- Number of requested or maximum available vertices.
-	.num    "uint32_t"             --- Number of required vertices.
-	.layout "const VertexLayout &" --- Vertex layout.
-
---- Returns number of requested or maximum available instance buffer slots.
-func.getAvailInstanceDataBuffer
-	"uint32_t"         --- Number of requested or maximum available instance buffer slots.
-	.num    "uint32_t" --- Number of required instances.
-	.stride "uint16_t" --- Stride per instance.
-
---- Allocate transient index buffer.
----
---- @remarks
----   Only 16-bit index buffer is supported.
----
-func.allocTransientIndexBuffer
-	"void"
-	.tib "TransientIndexBuffer*" { out } --- TransientIndexBuffer structure is filled and is valid
-	                                     --- for the duration of frame, and it can be reused for multiple draw
-	                                     --- calls.
-	.num "uint32_t"                      --- Number of indices to allocate.
-
---- Allocate transient vertex buffer.
-func.allocTransientVertexBuffer
-	"void"
-	.tvb    "TransientVertexBuffer*" { out } --- TransientVertexBuffer structure is filled and is valid
-	                                         --- for the duration of frame, and it can be reused for multiple draw
-	                                         --- calls.
-	.num    "uint32_t"                       --- Number of vertices to allocate.
-	.layout "const VertexLayout &"           --- Vertex layout.
-
---- Check for required space and allocate transient vertex and index
---- buffers. If both space requirements are satisfied function returns
---- true.
----
---- @remarks
----   Only 16-bit index buffer is supported.
----
-func.allocTransientBuffers
-	"bool"
-	.tvb         "TransientVertexBuffer*" { out } --- TransientVertexBuffer structure is filled and is valid
-	                                              --- for the duration of frame, and it can be reused for multiple draw
-	                                              --- calls.
-	.layout      "const VertexLayout &"           --- Vertex layout.
-	.numVertices "uint32_t"                       --- Number of vertices to allocate.
-	.tib         "TransientIndexBuffer*" { out }  --- TransientIndexBuffer structure is filled and is valid
-	                                              --- for the duration of frame, and it can be reused for multiple draw
-	                                              --- calls.
-	.numIndices  "uint32_t"                       --- Number of indices to allocate.
-
---- Allocate instance data buffer.
-func.allocInstanceDataBuffer
-	"void"
-	.idb    "InstanceDataBuffer*" { out } --- InstanceDataBuffer structure is filled and is valid
-	                                      --- for duration of frame, and it can be reused for multiple draw
-	                                      --- calls.
-	.num    "uint32_t"                    --- Number of instances.
-	.stride "uint16_t"                    --- Instance stride. Must be multiple of 16.
-
---- Create draw indirect buffer.
-func.createIndirectBuffer
-	"IndirectBufferHandle" --- Indirect buffer handle.
-	.num "uint32_t"        --- Number of indirect calls.
-
---- Destroy draw indirect buffer.
-func.destroy { cname = "destroy_indirect_buffer" }
-	"void"
-	.handle "IndirectBufferHandle" --- Indirect buffer handle.
-
---- Create shader from memory buffer.
-func.createShader
-	"ShaderHandle"       --- Shader handle.
-	.mem "const Memory*" --- Shader binary.
-
---- Returns the number of uniforms and uniform handles used inside a shader.
----
---- @remarks
----   Only non-predefined uniforms are returned.
----
-func.getShaderUniforms
-	"uint16_t"                         --- Number of uniforms used by shader.
-	.handle   "ShaderHandle"           --- Shader handle.
-	.uniforms "UniformHandle*" { out } --- UniformHandle array where data will be stored.
-	 { default = NULL }
-	.max      "uint16_t"               --- Maximum capacity of array.
-	 { default = 0 }
-
---- Set shader debug name.
-func.setName { cname = "set_shader_name" }
-	"void"
-	.handle "ShaderHandle"   --- Shader handle.
-	.name   "const char*"    --- Shader name.
-	.len    "int32_t"        --- Shader name length (if length is INT32_MAX, it's expected
-	 { default = INT32_MAX } --- that _name is zero terminated string).
-
---- Destroy shader.
----
---- @remark Once a shader program is created with _handle,
----   it is safe to destroy that shader.
----
-func.destroy { cname = "destroy_shader" }
-	"void"
-	.handle "ShaderHandle" --- Shader handle.
-
---- Create program with vertex and fragment shaders.
-func.createProgram
-	"ProgramHandle"        --- Program handle if vertex shader output and fragment shader
-	                       --- input are matching, otherwise returns invalid program handle.
-	.vsh "ShaderHandle"    --- Vertex shader.
-	.fsh "ShaderHandle"    --- Fragment shader.
-	.destroyShaders "bool" --- If true, shaders will be destroyed when program is destroyed.
-	 { default = false }
-
---- Create program with compute shader.
-func.createProgram { cname = "create_compute_program" }
-	"ProgramHandle"        --- Program handle.
-	.csh "ShaderHandle"    --- Compute shader.
-	.destroyShaders "bool" --- If true, shaders will be destroyed when program is destroyed.
-	 { default = false }
-
---- Destroy program.
-func.destroy { cname = "destroy_program" }
-	"void"
-	.handle "ProgramHandle" --- Program handle.
-
---- Validate texture parameters.
-func.isTextureValid
-	"bool"                           --- True if texture can be successfully created.
-	.depth     "uint16_t"            --- Depth dimension of volume texture.
-	.cubeMap   "bool"                --- Indicates that texture contains cubemap.
-	.numLayers "uint16_t"            --- Number of layers in texture array.
-	.format    "TextureFormat::Enum" --- Texture format. See: `TextureFormat::Enum`.
-	.flags     "uint64_t"            --- Texture flags. See `BGFX_TEXTURE_*`.
-
---- Calculate amount of memory required for texture.
-func.calcTextureSize
-	"void"
-	.info      "TextureInfo &" { out } --- Resulting texture info structure. See: `TextureInfo`.
-	.width     "uint16_t"              --- Width.
-	.height    "uint16_t"              --- Height.
-	.depth     "uint16_t"              --- Depth dimension of volume texture.
-	.cubeMap   "bool"                  --- Indicates that texture contains cubemap.
-	.hasMips   "bool"                  --- Indicates that texture contains full mip-map chain.
-	.numLayers "uint16_t"              --- Number of layers in texture array.
-	.format    "TextureFormat::Enum"   --- Texture format. See: `TextureFormat::Enum`.
-
---- Create texture from memory buffer.
-func.createTexture
-	"TextureHandle"                            --- Texture handle.
-	.mem   "const Memory*"                     --- DDS, KTX or PVR texture binary data.
-	.flags "uint64_t"                          --- Texture creation (see `BGFX_TEXTURE_*`.), and sampler (see `BGFX_SAMPLER_*`)
-	 { "BGFX_TEXTURE_NONE|BGFX_SAMPLER_NONE" } --- flags. Default texture sampling mode is linear, and wrap mode is repeat.
-	                                           --- - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                                           ---   mode.
-	                                           --- - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                                           ---   sampling.
-	.skip  "uint8_t"                           --- Skip top level mips when parsing texture.
-	 { default = 0 }
-	.info  "TextureInfo*" { out }              --- When non-`NULL` is specified it returns parsed texture information.
-	 { default = NULL }
-
---- Create 2D texture.
-func.createTexture2D
-	"TextureHandle"                            --- Texture handle.
-	.width     "uint16_t"                      --- Width.
-	.height    "uint16_t"                      --- Height.
-	.hasMips   "bool"                          --- Indicates that texture contains full mip-map chain.
-	.numLayers "uint16_t"                      --- Number of layers in texture array. Must be 1 if caps
-	                                           --- `BGFX_CAPS_TEXTURE_2D_ARRAY` flag is not set.
-	.format    "TextureFormat::Enum"           --- Texture format. See: `TextureFormat::Enum`.
-	.flags     "uint64_t"                      --- Texture creation (see `BGFX_TEXTURE_*`.), and sampler (see `BGFX_SAMPLER_*`)
-	 { "BGFX_TEXTURE_NONE|BGFX_SAMPLER_NONE" } --- flags. Default texture sampling mode is linear, and wrap mode is repeat.
-	                                           --- - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                                           ---   mode.
-	                                           --- - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                                           ---   sampling.
-	.mem       "const Memory*"                 --- Texture data. If `_mem` is non-NULL, created texture will be immutable. If
-	 { default = NULL }                        --- `_mem` is NULL content of the texture is uninitialized. When `_numLayers` is more than
-	                                           --- 1, expected memory layout is texture and all mips together for each array element.
-
---- Create texture with size based on backbuffer ratio. Texture will maintain ratio
---- if back buffer resolution changes.
-func.createTexture2D { cname = "create_texture_2d_scaled" }
-	"TextureHandle"                            --- Texture handle.
-	.ratio     "BackbufferRatio::Enum"         --- Texture size in respect to back-buffer size. See: `BackbufferRatio::Enum`.
-	.hasMips   "bool"                          --- Indicates that texture contains full mip-map chain.
-	.numLayers "uint16_t"                      --- Number of layers in texture array. Must be 1 if caps
-	                                           --- `BGFX_CAPS_TEXTURE_2D_ARRAY` flag is not set.
-	.format    "TextureFormat::Enum"           --- Texture format. See: `TextureFormat::Enum`.
-	.flags     "uint64_t"                      --- Texture creation (see `BGFX_TEXTURE_*`.), and sampler (see `BGFX_SAMPLER_*`)
-	 { default = "BGFX_TEXTURE_NONE|BGFX_SAMPLER_NONE" }
-	                                           --- flags. Default texture sampling mode is linear, and wrap mode is repeat.
-	                                           --- - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                                           ---   mode.
-	                                           --- - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                                           ---   sampling.
-
---- Create 3D texture.
-func.createTexture3D
-	"TextureHandle"                            --- Texture handle.
-	.width     "uint16_t"                      --- Width.
-	.height    "uint16_t"                      --- Height.
-	.depth     "uint16_t"                      --- Depth.
-	.hasMips   "bool"                          --- Indicates that texture contains full mip-map chain.
-	.format    "TextureFormat::Enum"           --- Texture format. See: `TextureFormat::Enum`.
-	.flags     "uint64_t"                      --- Texture creation (see `BGFX_TEXTURE_*`.), and sampler (see `BGFX_SAMPLER_*`)
-	 { default = "BGFX_TEXTURE_NONE|BGFX_SAMPLER_NONE" }
-	                                           --- flags. Default texture sampling mode is linear, and wrap mode is repeat.
-	                                           --- - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                                           ---   mode.
-	                                           --- - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                                           ---   sampling.
-	.mem       "const Memory*"                 --- Texture data. If `_mem` is non-NULL, created texture will be immutable. If
-	 { default = NULL }                        --- `_mem` is NULL content of the texture is uninitialized. When `_numLayers` is more than
-	                                           --- 1, expected memory layout is texture and all mips together for each array element.
-
---- Create Cube texture.
-func.createTextureCube
-	"TextureHandle"                            --- Texture handle.
-	.size      "uint16_t"                      --- Cube side size.
-	.hasMips   "bool"                          --- Indicates that texture contains full mip-map chain.
-	.numLayers "uint16_t"                      --- Number of layers in texture array. Must be 1 if caps
-	                                           --- `BGFX_CAPS_TEXTURE_2D_ARRAY` flag is not set.
-	.format    "TextureFormat::Enum"           --- Texture format. See: `TextureFormat::Enum`.
-	.flags     "uint64_t"                      --- Texture creation (see `BGFX_TEXTURE_*`.), and sampler (see `BGFX_SAMPLER_*`)
-	 { default = "BGFX_TEXTURE_NONE|BGFX_SAMPLER_NONE" }
-	                                           --- flags. Default texture sampling mode is linear, and wrap mode is repeat.
-	                                           --- - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                                           ---   mode.
-	                                           --- - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                                           ---   sampling.
-	.mem       "const Memory*"                 --- Texture data. If `_mem` is non-NULL, created texture will be immutable. If
-	 { default = NULL }                        --- `_mem` is NULL content of the texture is uninitialized. When `_numLayers` is more than
-	                                           --- 1, expected memory layout is texture and all mips together for each array element.
-
---- Update 2D texture.
----
---- @attention It's valid to update only mutable texture. See `bgfx::createTexture2D` for more info.
----
-func.updateTexture2D
-	"void"
-	.handle "TextureHandle" --- Texture handle.
-	.layer  "uint16_t"      --- Layer in texture array.
-	.mip    "uint8_t"       --- Mip level.
-	.x      "uint16_t"      --- X offset in texture.
-	.y      "uint16_t"      --- Y offset in texture.
-	.width  "uint16_t"      --- Width of texture block.
-	.height "uint16_t"      --- Height of texture block.
-	.mem    "const Memory*" --- Texture update data.
-	.pitch  "uint16_t"      --- Pitch of input image (bytes). When _pitch is set to
-	                        --- UINT16_MAX, it will be calculated internally based on _width.
-	 { default = UINT16_MAX }
-
---- Update 3D texture.
----
---- @attention It's valid to update only mutable texture. See `bgfx::createTexture3D` for more info.
----
-func.updateTexture3D
-	"void"
-	.handle "TextureHandle" --- Texture handle.
-	.mip    "uint8_t"       --- Mip level.
-	.x      "uint16_t"      --- X offset in texture.
-	.y      "uint16_t"      --- Y offset in texture.
-	.z      "uint16_t"      --- Z offset in texture.
-	.width  "uint16_t"      --- Width of texture block.
-	.height "uint16_t"      --- Height of texture block.
-	.depth  "uint16_t"      --- Depth of texture block.
-	.mem    "const Memory*" --- Texture update data.
-
---- Update Cube texture.
----
---- @attention It's valid to update only mutable texture. See `bgfx::createTextureCube` for more info.
----
-func.updateTextureCube
-	"void"
-	.handle "TextureHandle" --- Texture handle.
-	.layer  "uint16_t"      --- Layer in texture array.
-	.side   "uint8_t"       --- Cubemap side `BGFX_CUBE_MAP_<POSITIVE or NEGATIVE>_<X, Y or Z>`,
-	                        ---   where 0 is +X, 1 is -X, 2 is +Y, 3 is -Y, 4 is +Z, and 5 is -Z.
-	                        ---
-	                        ---                  +----------+
-	                        ---                  |-z       2|
-	                        ---                  | ^  +y    |
-	                        ---                  | |        |    Unfolded cube:
-	                        ---                  | +---->+x |
-	                        ---       +----------+----------+----------+----------+
-	                        ---       |+y       1|+y       4|+y       0|+y       5|
-	                        ---       | ^  -x    | ^  +z    | ^  +x    | ^  -z    |
-	                        ---       | |        | |        | |        | |        |
-	                        ---       | +---->+z | +---->+x | +---->-z | +---->-x |
-	                        ---       +----------+----------+----------+----------+
-	                        ---                  |+z       3|
-	                        ---                  | ^  -y    |
-	                        ---                  | |        |
-	                        ---                  | +---->+x |
-	                        ---                  +----------+
-	.mip    "uint8_t"       --- Mip level.
-	.x      "uint16_t"      --- X offset in texture.
-	.y      "uint16_t"      --- Y offset in texture.
-	.width  "uint16_t"      --- Width of texture block.
-	.height "uint16_t"      --- Height of texture block.
-	.mem    "const Memory*" --- Texture update data.
-	.pitch  "uint16_t"      --- Pitch of input image (bytes). When _pitch is set to
-	                        --- UINT16_MAX, it will be calculated internally based on _width.
-	 { default = UINT16_MAX }
-
---- Read back texture content.
----
---- @attention Texture must be created with `BGFX_TEXTURE_READ_BACK` flag.
---- @attention Availability depends on: `BGFX_CAPS_TEXTURE_READ_BACK`.
----
-func.readTexture
-	"uint32_t"              --- Frame number when the result will be available. See: `bgfx::frame`.
-	.handle "TextureHandle" --- Texture handle.
-	.data   "void*"         --- Destination buffer.
-	.mip    "uint8_t"       --- Mip level.
-	 { default = 0 }
-
---- Set texture debug name.
-func.setName { cname = "set_texture_name" }
-	"void"
-	.handle "TextureHandle"  --- Texture handle.
-	.name   "const char*"    --- Texture name.
-	.len    "int32_t"        --- Texture name length (if length is INT32_MAX, it's expected
-	 { default = INT32_MAX } --- that _name is zero terminated string.
-
---- Returns texture direct access pointer.
----
---- @attention Availability depends on: `BGFX_CAPS_TEXTURE_DIRECT_ACCESS`. This feature
----   is available on GPUs that have unified memory architecture (UMA) support.
----
-func.getDirectAccessPtr
-	"void*"                 --- Pointer to texture memory. If returned pointer is `NULL` direct access
-	                        --- is not available for this texture. If pointer is `UINTPTR_MAX` sentinel value
-	                        --- it means texture is pending creation. Pointer returned can be cached and it
-	                        --- will be valid until texture is destroyed.
-	.handle "TextureHandle" --- Texture handle.
-
---- Destroy texture.
-func.destroy { cname = "destroy_texture" }
-	"void"
-	.handle "TextureHandle" --- Texture handle.
-
---- Create frame buffer (simple).
-func.createFrameBuffer
-	"FrameBufferHandle"                 --- Frame buffer handle.
-	.width        "uint16_t"            --- Texture width.
-	.height       "uint16_t"            --- Texture height.
-	.format       "TextureFormat::Enum" --- Texture format. See: `TextureFormat::Enum`.
-	.textureFlags "uint64_t"            --- Texture creation (see `BGFX_TEXTURE_*`.), and sampler (see `BGFX_SAMPLER_*`)
-	 { default = "BGFX_SAMPLER_U_CLAMP|BGFX_SAMPLER_V_CLAMP" }
-	                                    --- flags. Default texture sampling mode is linear, and wrap mode is repeat.
-	                                    --- - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                                    ---   mode.
-	                                    --- - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                                    ---   sampling.
-
---- Create frame buffer with size based on backbuffer ratio. Frame buffer will maintain ratio
---- if back buffer resolution changes.
-func.createFrameBuffer { cname = "create_frame_buffer_scaled" }
-	"FrameBufferHandle"                 --- Frame buffer handle.
-	.ratio  "BackbufferRatio::Enum"     --- Frame buffer size in respect to back-buffer size. See:
-	                                    --- `BackbufferRatio::Enum`.
-	.format "TextureFormat::Enum"       --- Texture format. See: `TextureFormat::Enum`.
-	.textureFlags "uint64_t"            --- Texture creation (see `BGFX_TEXTURE_*`.), and sampler (see `BGFX_SAMPLER_*`)
-	 { default = "BGFX_SAMPLER_U_CLAMP|BGFX_SAMPLER_V_CLAMP" }
-	                                    --- flags. Default texture sampling mode is linear, and wrap mode is repeat.
-	                                    --- - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                                    ---   mode.
-	                                    --- - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                                    ---   sampling.
-
---- Create MRT frame buffer from texture handles (simple).
-func.createFrameBuffer { cname = "create_frame_buffer_from_handles" }
-	"FrameBufferHandle"                    --- Frame buffer handle.
-	.num            "uint8_t"              --- Number of texture handles.
-	.handles        "const TextureHandle*" --- Texture attachments.
-	.destroyTexture "bool"                 --- If true, textures will be destroyed when
-	 { default = false }                   --- frame buffer is destroyed.
-
---- Create MRT frame buffer from texture handles with specific layer and
---- mip level.
-func.createFrameBuffer { cname = "create_frame_buffer_from_attachment" }
-	"FrameBufferHandle"                 --- Frame buffer handle.
-	.num            "uint8_t"           --- Number of attachements.
-	.attachment     "const Attachment*" --- Attachment texture info. See: `bgfx::Attachment`.
-	.destroyTexture "bool"              --- If true, textures will be destroyed when
-	 { default = false }                --- frame buffer is destroyed.
-
---- Create frame buffer for multiple window rendering.
----
---- @remarks
----   Frame buffer cannot be used for sampling.
----
---- @attention Availability depends on: `BGFX_CAPS_SWAP_CHAIN`.
----
-func.createFrameBuffer { cname = "create_frame_buffer_from_nwh" }
-	"FrameBufferHandle"                --- Frame buffer handle.
-	.nwh         "void*"               --- OS' target native window handle.
-	.width       "uint16_t"            --- Window back buffer width.
-	.height      "uint16_t"            --- Window back buffer height.
-	.format      "TextureFormat::Enum" --- Window back buffer color format.
-	 { default = "TextureFormat::Count" }
-	.depthFormat "TextureFormat::Enum" --- Window back buffer depth format.
-	 { default = "TextureFormat::Count" }
-
---- Set frame buffer debug name.
-func.setName { cname = "set_frame_buffer_name" }
-	"void"
-	.handle "FrameBufferHandle" --- Frame buffer handle.
-	.name   "const char*"       --- Frame buffer name.
-	.len    "int32_t"           --- Frame buffer name length (if length is INT32_MAX, it's expected
-	 { default = INT32_MAX }    --- that _name is zero terminated string.
-
---- Obtain texture handle of frame buffer attachment.
-func.getTexture
-	"TextureHandle"
-	.handle     "FrameBufferHandle" --- Frame buffer handle.
-	.attachment "uint8_t"
-	 { default = 0 }
-
---- Destroy frame buffer.
-func.destroy { cname = "destroy_frame_buffer" }
-	"void"
-	.handle "FrameBufferHandle" --- Frame buffer handle.
-
---- Create shader uniform parameter.
----
---- @remarks
----   1. Uniform names are unique. It's valid to call `bgfx::createUniform`
----      multiple times with the same uniform name. The library will always
----      return the same handle, but the handle reference count will be
----      incremented. This means that the same number of `bgfx::destroyUniform`
----      must be called to properly destroy the uniform.
----
----   2. Predefined uniforms (declared in `bgfx_shader.sh`):
----      - `u_viewRect vec4(x, y, width, height)` - view rectangle for current
----        view, in pixels.
----      - `u_viewTexel vec4(1.0/width, 1.0/height, undef, undef)` - inverse
----        width and height
----      - `u_view mat4` - view matrix
----      - `u_invView mat4` - inverted view matrix
----      - `u_proj mat4` - projection matrix
----      - `u_invProj mat4` - inverted projection matrix
----      - `u_viewProj mat4` - concatenated view projection matrix
----      - `u_invViewProj mat4` - concatenated inverted view projection matrix
----      - `u_model mat4[BGFX_CONFIG_MAX_BONES]` - array of model matrices.
----      - `u_modelView mat4` - concatenated model view matrix, only first
----        model matrix from array is used.
----      - `u_modelViewProj mat4` - concatenated model view projection matrix.
----      - `u_alphaRef float` - alpha reference value for alpha test.
----
-func.createUniform
-	"UniformHandle"           --- Handle to uniform object.
-	.name "const char*"       --- Uniform name in shader.
-	.type "UniformType::Enum" --- Type of uniform (See: `bgfx::UniformType`).
-	.num  "uint16_t"          --- Number of elements in array.
-	 { default = 1 }
-
---- Retrieve uniform info.
-func.getUniformInfo
-	"void"
-	.handle "UniformHandle"         --- Handle to uniform object.
-	.info   "UniformInfo &" { out } --- Uniform info.
-
---- Destroy shader uniform parameter.
-func.destroy { cname = "destroy_uniform" }
-	"void"
-	.handle "UniformHandle" --- Handle to uniform object.
-
---- Create occlusion query.
-func.createOcclusionQuery
-	"OcclusionQueryHandle" --- Handle to occlusion query object.
-
---- Retrieve occlusion query result from previous frame.
-func.getResult
-	"OcclusionQueryResult::Enum"   --- Occlusion query result.
-	.handle "OcclusionQueryHandle" --- Handle to occlusion query object.
-	.result "int32_t*" { out }     --- Number of pixels that passed test. This argument
-	                               --- can be `NULL` if result of occlusion query is not needed.
-	 { default = NULL }
-
---- Destroy occlusion query.
-func.destroy { cname = "destroy_occlusion_query" }
-	"void"
-	.handle "OcclusionQueryHandle" --- Handle to occlusion query object.
-
---- Set palette color value.
-func.setPaletteColor
-	"void"
-	.index "uint8_t"        --- Index into palette.
-	.rgba  "const float[4]" --- RGBA floating point values.
-
---- Set palette color value.
-func.setPaletteColor { cname = "set_palette_color_rgba8" }
-	"void"
-	.index "uint8_t"  --- Index into palette.
-	.rgba  "uint32_t" --- Packed 32-bit RGBA value.
-
---- Set view name.
----
---- @remarks
----   This is debug only feature.
----
----   In graphics debugger view name will appear as:
----
----       "nnnc <view name>"
----        ^  ^ ^
----        |  +--- compute (C)
----        +------ view id
----
-func.setViewName
-	"void"
-	.id   "ViewId"      --- View id.
-	.name "const char*" --- View name.
-
---- Set view rectangle. Draw primitive outside view will be clipped.
-func.setViewRect
-	"void"
-	.id     "ViewId"   --- View id.
-	.x      "uint16_t" --- Position x from the left corner of the window.
-	.y      "uint16_t" --- Position y from the top corner of the window.
-	.width  "uint16_t" --- Width of view port region.
-	.height "uint16_t" --- Height of view port region.
-
---- Set view rectangle. Draw primitive outside view will be clipped.
-func.setViewRect { cname = "set_view_rect_ratio" }
-	"void"
-	.id    "ViewId"                --- View id.
-	.x     "uint16_t"              --- Position x from the left corner of the window.
-	.y     "uint16_t"              --- Position y from the top corner of the window.
-	.ratio "BackbufferRatio::Enum" --- Width and height will be set in respect to back-buffer size.
-	                               --- See: `BackbufferRatio::Enum`.
-
---- Set view scissor. Draw primitive outside view will be clipped. When
---- _x, _y, _width and _height are set to 0, scissor will be disabled.
-func.setViewScissor
-	"void"
-	.id     "ViewId"   --- View id.
-	.x      "uint16_t" --- Position x from the left corner of the window.
-	 { default = 0 }
-	.y      "uint16_t" --- Position y from the top corner of the window.
-	 { default = 0 }
-	.width  "uint16_t" --- Width of view scissor region.
-	 { default = 0 }
-	.height "uint16_t" --- Height of view scissor region.
-	 { default = 0 }
-
---- Set view clear flags.
-func.setViewClear
-	"void"
-	.id      "ViewId"   --- View id.
-	.flags   "uint16_t" --- Clear flags. Use `BGFX_CLEAR_NONE` to remove any clear
-	                    --- operation. See: `BGFX_CLEAR_*`.
-	.rgba    "uint32_t" --- Color clear value.
-	 { default = "0x000000ff" }
-	.depth   "float"    --- Depth clear value.
-	 { default = "1.0f" }
-	.stencil "uint8_t"  --- Stencil clear value.
-	 { default = 0 }
-
---- Set view clear flags with different clear color for each
---- frame buffer texture. Must use `bgfx::setPaletteColor` to setup clear color
---- palette.
-func.setViewClear { cname = "set_view_clear_mrt" }
-	"void"
-	.id      "ViewId"   --- View id.
-	.flags   "uint16_t" --- Clear flags. Use `BGFX_CLEAR_NONE` to remove any clear
-	                    --- operation. See: `BGFX_CLEAR_*`.
-	.depth   "float"    --- Depth clear value.
-	.stencil "uint8_t"  --- Stencil clear value.
-	.c0      "uint8_t"  --- Palette index for frame buffer attachment 0.
-	 { default = UINT8_MAX }
-	.c1      "uint8_t"  --- Palette index for frame buffer attachment 1.
-	 { default = UINT8_MAX }
-	.c2      "uint8_t"  --- Palette index for frame buffer attachment 2.
-	 { default = UINT8_MAX }
-	.c3      "uint8_t"  --- Palette index for frame buffer attachment 3.
-	 { default = UINT8_MAX }
-	.c4      "uint8_t"  --- Palette index for frame buffer attachment 4.
-	 { default = UINT8_MAX }
-	.c5      "uint8_t"  --- Palette index for frame buffer attachment 5.
-	 { default = UINT8_MAX }
-	.c6      "uint8_t"  --- Palette index for frame buffer attachment 6.
-	 { default = UINT8_MAX }
-	.c7      "uint8_t"  --- Palette index for frame buffer attachment 7.
-	 { default = UINT8_MAX }
-
---- Set view sorting mode.
----
---- @remarks
----   View mode must be set prior calling `bgfx::submit` for the view.
----
-func.setViewMode
-	"void"
-	.id   "ViewId"         --- View id.
-	.mode "ViewMode::Enum" --- View sort mode. See `ViewMode::Enum`.
-	 { default = "ViewMode::Default" }
-
---- Set view frame buffer.
----
---- @remarks
----   Not persistent after `bgfx::reset` call.
----
-func.setViewFrameBuffer
-	"void"
-	.id     "ViewId"            --- View id.
-	.handle "FrameBufferHandle" --- Frame buffer handle. Passing `BGFX_INVALID_HANDLE` as
-	                            --- frame buffer handle will draw primitives from this view into
-	                            --- default back buffer.
-
---- Set view view and projection matrices, all draw primitives in this
---- view will use these matrices.
-func.setViewTransform
-	"void"
-	.id   "ViewId"      --- View id.
-	.view "const void*" --- View matrix.
-	.proj "const void*" --- Projection matrix.
-
---- Post submit view reordering.
-func.setViewOrder
-	"void"
-	.id    "ViewId"        --- First view id.
-	 { default = 0 }
-	.num   "uint16_t"      --- Number of views to remap.
-	 { default = UINT16_MAX }
-	.order "const ViewId*" --- View remap id table. Passing `NULL` will reset view ids
-	                       --- to default state.
-	 { default = NULL }
-
---- Begin submitting draw calls from thread.
-func.begin { cname = "encoder_begin" }
-	"Encoder*"        --- Encoder.
-	.forThread "bool" --- Explicitly request an encoder for a worker thread.
-
---- End submitting draw calls from thread.
-func["end"] { cname = "encoder_end" }
-	"void"
-	.encoder "Encoder*" --- Encoder.
-
---- Sets a debug marker. This allows you to group graphics calls together for easy browsing in
---- graphics debugging tools.
-func.Encoder.setMarker
-	"void"
-	.marker "const char*" --- Marker string.
-
---- Set render states for draw primitive.
----
---- @remarks
----   1. To setup more complex states use:
----      `BGFX_STATE_ALPHA_REF(_ref)`,
----      `BGFX_STATE_POINT_SIZE(_size)`,
----      `BGFX_STATE_BLEND_FUNC(_src, _dst)`,
----      `BGFX_STATE_BLEND_FUNC_SEPARATE(_srcRGB, _dstRGB, _srcA, _dstA)`,
----      `BGFX_STATE_BLEND_EQUATION(_equation)`,
----      `BGFX_STATE_BLEND_EQUATION_SEPARATE(_equationRGB, _equationA)`
----   2. `BGFX_STATE_BLEND_EQUATION_ADD` is set when no other blend
----      equation is specified.
----
-func.Encoder.setState
-	"void"
-	.state "uint64_t" --- State flags. Default state for primitive type is
-	                  ---   triangles. See: `BGFX_STATE_DEFAULT`.
-	                  ---   - `BGFX_STATE_DEPTH_TEST_*` - Depth test function.
-	                  ---   - `BGFX_STATE_BLEND_*` - See remark 1 about BGFX_STATE_BLEND_FUNC.
-	                  ---   - `BGFX_STATE_BLEND_EQUATION_*` - See remark 2.
-	                  ---   - `BGFX_STATE_CULL_*` - Backface culling mode.
-	                  ---   - `BGFX_STATE_WRITE_*` - Enable R, G, B, A or Z write.
-	                  ---   - `BGFX_STATE_MSAA` - Enable hardware multisample antialiasing.
-	                  ---   - `BGFX_STATE_PT_[TRISTRIP/LINES/POINTS]` - Primitive type.
-	.rgba  "uint32_t" --- Sets blend factor used by `BGFX_STATE_BLEND_FACTOR` and
-	                  ---   `BGFX_STATE_BLEND_INV_FACTOR` blend modes.
-	 { default = 0 }
-
---- Set condition for rendering.
-func.Encoder.setCondition
-	"void"
-	.handle  "OcclusionQueryHandle" --- Occlusion query handle.
-	.visible "bool"                 --- Render if occlusion query is visible.
-
---- Set stencil test state.
-func.Encoder.setStencil
-	"void"
-	.fstencil "uint32_t" --- Front stencil state.
-	.bstencil "uint32_t" --- Back stencil state. If back is set to `BGFX_STENCIL_NONE`
-	                     --- _fstencil is applied to both front and back facing primitives.
-	 { default = "BGFX_STENCIL_NONE" }
-
---- Set scissor for draw primitive.
----
---- @remark
----   To scissor for all primitives in view see `bgfx::setViewScissor`.
----
-func.Encoder.setScissor
-	"uint16_t"         --- Scissor cache index.
-	.x      "uint16_t" --- Position x from the left corner of the window.
-	.y      "uint16_t" --- Position y from the top corner of the window.
-	.width  "uint16_t" --- Width of view scissor region.
-	.height "uint16_t" --- Height of view scissor region.
-
---- Set scissor from cache for draw primitive.
----
---- @remark
----   To scissor for all primitives in view see `bgfx::setViewScissor`.
----
-func.Encoder.setScissor { cname = "set_scissor_cached" }
-	"void"
-	.cache "uint16_t" --- Index in scissor cache.
-	 { default = UINT16_MAX }
-
---- Set model matrix for draw primitive. If it is not called,
---- the model will be rendered with an identity model matrix.
-func.Encoder.setTransform
-	"uint32_t"         --- Index into matrix cache in case the same model matrix has
-	                   --- to be used for other draw primitive call.
-	.mtx "const void*" --- Pointer to first matrix in array.
-	.num "uint16_t"    --- Number of matrices in array.
-
----  Set model matrix from matrix cache for draw primitive.
-func.Encoder.setTransform { cname = "set_transform_cached" }
-	"void"
-	.cache "uint32_t" --- Index in matrix cache.
-	.num   "uint16_t" --- Number of matrices from cache.
-	 { default = 1 }
-
---- Reserve matrices in internal matrix cache.
----
---- @attention Pointer returned can be modifed until `bgfx::frame` is called.
----
-func.Encoder.allocTransform
-	"uint32_t"                      --- Index in matrix cache.
-	.transform "Transform*" { out } --- Pointer to `Transform` structure.
-	.num       "uint16_t"           --- Number of matrices.
-
---- Set shader uniform parameter for draw primitive.
-func.Encoder.setUniform
-	"void"
-	.handle "UniformHandle" --- Uniform.
-	.value  "const void*"   --- Pointer to uniform data.
-	.num    "uint16_t"      --- Number of elements. Passing `UINT16_MAX` will
-	                        --- use the _num passed on uniform creation.
-	 { default = 1 }
-
---- Set index buffer for draw primitive.
-func.Encoder.setIndexBuffer { cpponly }
-	"void"
-	.handle     "IndexBufferHandle" --- Index buffer.
-
---- Set index buffer for draw primitive.
-func.Encoder.setIndexBuffer
-	"void"
-	.handle     "IndexBufferHandle" --- Index buffer.
-	.firstIndex "uint32_t"          --- First index to render.
-	.numIndices "uint32_t"          --- Number of indices to render.
-
---- Set index buffer for draw primitive.
-func.Encoder.setIndexBuffer { cpponly }
-	"void"
-	.handle     "DynamicIndexBufferHandle" --- Dynamic index buffer.
-
---- Set index buffer for draw primitive.
-func.Encoder.setIndexBuffer { cname = "set_dynamic_index_buffer" }
-	"void"
-	.handle     "DynamicIndexBufferHandle" --- Dynamic index buffer.
-	.firstIndex "uint32_t"                 --- First index to render.
-	.numIndices "uint32_t"                 --- Number of indices to render.
-
---- Set index buffer for draw primitive.
-func.Encoder.setIndexBuffer { cpponly }
-	"void"
-	.tib        "const TransientIndexBuffer*" --- Transient index buffer.
-
---- Set index buffer for draw primitive.
-func.Encoder.setIndexBuffer { cname = "set_transient_index_buffer" }
-	"void"
-	.tib        "const TransientIndexBuffer*" --- Transient index buffer.
-	.firstIndex "uint32_t"                    --- First index to render.
-	.numIndices "uint32_t"                    --- Number of indices to render.
-
---- Set vertex buffer for draw primitive.
-func.Encoder.setVertexBuffer { cpponly }
-	"void"
-	.stream      "uint8_t"            --- Vertex stream.
-	.handle      "VertexBufferHandle" --- Vertex buffer.
-
---- Set vertex buffer for draw primitive.
-func.Encoder.setVertexBuffer
-	"void"
-	.stream       "uint8_t"            --- Vertex stream.
-	.handle       "VertexBufferHandle" --- Vertex buffer.
-	.startVertex  "uint32_t"           --- First vertex to render.
-	.numVertices  "uint32_t"           --- Number of vertices to render.
-	.layoutHandle "VertexLayoutHandle" --- Vertex layout for aliasing vertex buffer.
-	 { default = "BGFX_INVALID_HANDLE" }
-
---- Set vertex buffer for draw primitive.
-func.Encoder.setVertexBuffer { cpponly }
-	"void"
-	.stream      "uint8_t"                   --- Vertex stream.
-	.handle      "DynamicVertexBufferHandle" --- Dynamic vertex buffer.
-
---- Set vertex buffer for draw primitive.
-func.Encoder.setVertexBuffer { cname = "set_dynamic_vertex_buffer" }
-	"void"
-	.stream       "uint8_t"                   --- Vertex stream.
-	.handle       "DynamicVertexBufferHandle" --- Dynamic vertex buffer.
-	.startVertex  "uint32_t"                  --- First vertex to render.
-	.numVertices  "uint32_t"                  --- Number of vertices to render.
-	.layoutHandle "VertexLayoutHandle"        --- Vertex layout for aliasing vertex buffer.
-	 { default = "BGFX_INVALID_HANDLE" }
-
---- Set vertex buffer for draw primitive.
-func.Encoder.setVertexBuffer { cpponly }
-	"void"
-	.stream      "uint8_t"                      --- Vertex stream.
-	.tvb         "const TransientVertexBuffer*" --- Transient vertex buffer.
-
---- Set vertex buffer for draw primitive.
-func.Encoder.setVertexBuffer { cname = "set_transient_vertex_buffer" }
-	"void"
-	.stream       "uint8_t"                      --- Vertex stream.
-	.tvb          "const TransientVertexBuffer*" --- Transient vertex buffer.
-	.startVertex  "uint32_t"                     --- First vertex to render.
-	.numVertices  "uint32_t"                     --- Number of vertices to render.
-	.layoutHandle "VertexLayoutHandle"           --- Vertex layout for aliasing vertex buffer.
-	 { default = "BGFX_INVALID_HANDLE" }
-
---- Set number of vertices for auto generated vertices use in conjuction
---- with gl_VertexID.
----
---- @attention Availability depends on: `BGFX_CAPS_VERTEX_ID`.
----
-func.Encoder.setVertexCount
-	"void"
-	.numVertices "uint32_t" --- Number of vertices.
-
---- Set instance data buffer for draw primitive.
-func.Encoder.setInstanceDataBuffer { cpponly }
-	"void"
-	.idb   "const InstanceDataBuffer*" --- Transient instance data buffer.
-
---- Set instance data buffer for draw primitive.
-func.Encoder.setInstanceDataBuffer
-	"void"
-	.idb   "const InstanceDataBuffer*" --- Transient instance data buffer.
-	.start "uint32_t"                  --- First instance data.
-	.num   "uint32_t"                  --- Number of data instances.
-
---- Set instance data buffer for draw primitive.
-func.Encoder.setInstanceDataBuffer { cpponly }
-	"void"
-	.handle      "VertexBufferHandle" --- Vertex buffer.
-
---- Set instance data buffer for draw primitive.
-func.Encoder.setInstanceDataBuffer { cname = "set_instance_data_from_vertex_buffer" }
-	"void"
-	.handle      "VertexBufferHandle" --- Vertex buffer.
-	.startVertex "uint32_t"           --- First instance data.
-	.num         "uint32_t"           --- Number of data instances.
-
- --- Set instance data buffer for draw primitive.
-func.Encoder.setInstanceDataBuffer { cpponly }
-	"void"
-	.handle      "DynamicVertexBufferHandle" --- Dynamic vertex buffer.
-
---- Set instance data buffer for draw primitive.
-func.Encoder.setInstanceDataBuffer { cname = "set_instance_data_from_dynamic_vertex_buffer" }
-	"void"
-	.handle      "DynamicVertexBufferHandle" --- Dynamic vertex buffer.
-	.startVertex "uint32_t"                  --- First instance data.
-	.num         "uint32_t"                  --- Number of data instances.
-
---- Set number of instances for auto generated instances use in conjuction
---- with gl_InstanceID.
----
---- @attention Availability depends on: `BGFX_CAPS_VERTEX_ID`.
----
-func.Encoder.setInstanceCount
-	"void"
-	.numInstances "uint32_t" -- Number of instances.
-
---- Set texture stage for draw primitive.
-func.Encoder.setTexture
-	"void"
-	.stage   "uint8_t"        --- Texture unit.
-	.sampler "UniformHandle"  --- Program sampler.
-	.handle  "TextureHandle"  --- Texture handle.
-	.flags   "uint32_t"       --- Texture sampling mode. Default value UINT32_MAX uses
-	 { default = UINT32_MAX } ---   texture sampling settings from the texture.
-	                          ---   - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                          ---     mode.
-	                          ---   - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                          ---     sampling.
-
---- Submit an empty primitive for rendering. Uniforms and draw state
---- will be applied but no geometry will be submitted.
----
---- @remark
----   These empty draw calls will sort before ordinary draw calls.
----
-func.Encoder.touch
-	"void"
-	.id "ViewId" --- View id.
-
---- Submit primitive for rendering.
-func.Encoder.submit
-	"void"
-	.id            "ViewId"        --- View id.
-	.program       "ProgramHandle" --- Program.
-	.depth         "uint32_t"      --- Depth for sorting.
-	 { default = 0 }
-	.preserveState "bool"          --- Preserve internal draw state for next draw call submit.
-	 { default = false }
-
---- Submit primitive with occlusion query for rendering.
-func.Encoder.submit { cname = "submit_occlusion_query" }
-	"void"
-	.id             "ViewId"               --- View id.
-	.program        "ProgramHandle"        --- Program.
-	.occlusionQuery "OcclusionQueryHandle" --- Occlusion query.
-	.depth          "uint32_t"             --- Depth for sorting.
-	 { default = 0 }
-	.preserveState  "bool"                 --- Preserve internal draw state for next draw call submit.
-	 { default = false }
-
---- Submit primitive for rendering with index and instance data info from
---- indirect buffer.
-func.Encoder.submit { cname = "submit_indirect" }
-	"void"
-	.id             "ViewId"               --- View id.
-	.program        "ProgramHandle"        --- Program.
-	.indirectHandle "IndirectBufferHandle" --- Indirect buffer.
-	.start          "uint16_t"             --- First element in indirect buffer.
-	 { default = 0 }
-	.num            "uint16_t"             --- Number of dispatches.
-	 { default = 1 }
-	.depth          "uint32_t"             --- Depth for sorting.
-	 { default = 0 }
-	.preserveState  "bool"                 --- Preserve internal draw state for next draw call submit.
-	 { default = false }
-
---- Set compute index buffer.
-func.Encoder.setBuffer { cname = "set_compute_index_buffer" }
-	"void"
-	.stage  "uint8_t"           --- Compute stage.
-	.handle "IndexBufferHandle" --- Index buffer handle.
-	.access "Access::Enum"      --- Buffer access. See `Access::Enum`.
-
---- Set compute vertex buffer.
-func.Encoder.setBuffer { cname = "set_compute_vertex_buffer" }
-	"void"
-	.stage  "uint8_t"            --- Compute stage.
-	.handle "VertexBufferHandle" --- Vertex buffer handle.
-	.access "Access::Enum"       --- Buffer access. See `Access::Enum`.
-
---- Set compute dynamic index buffer.
-func.Encoder.setBuffer { cname = "set_compute_dynamic_index_buffer" }
-	"void"
-	.stage  "uint8_t"                  --- Compute stage.
-	.handle "DynamicIndexBufferHandle" --- Dynamic index buffer handle.
-	.access "Access::Enum"             --- Buffer access. See `Access::Enum`.
-
---- Set compute dynamic vertex buffer.
-func.Encoder.setBuffer { cname = "set_compute_dynamic_vertex_buffer" }
-	"void"
-	.stage  "uint8_t"                   --- Compute stage.
-	.handle "DynamicVertexBufferHandle" --- Dynamic vertex buffer handle.
-	.access "Access::Enum"              --- Buffer access. See `Access::Enum`.
-
---- Set compute indirect buffer.
-func.Encoder.setBuffer { cname = "set_compute_indirect_buffer" }
-	"void"
-	.stage  "uint8_t"              --- Compute stage.
-	.handle "IndirectBufferHandle" --- Indirect buffer handle.
-	.access "Access::Enum"         --- Buffer access. See `Access::Enum`.
-
---- Set compute image from texture.
-func.Encoder.setImage
-	"void"
-	.stage  "uint8_t"              --- Compute stage.
-	.handle "TextureHandle"        --- Texture handle.
-	.mip    "uint8_t"              --- Mip level.
-	.access "Access::Enum"         --- Image access. See `Access::Enum`.
-	.format "TextureFormat::Enum"  --- Texture format. See: `TextureFormat::Enum`.
-	 { default = "TextureFormat::Count" }
-
---- Dispatch compute.
-func.Encoder.dispatch
-	"void"
-	.id      "ViewId"        --- View id.
-	.program "ProgramHandle" --- Compute program.
-	.numX    "uint32_t"      --- Number of groups X.
-	 { deafult = 1 }
-	.numY    "uint32_t"      --- Number of groups Y.
-	 { deafult = 1 }
-	.numZ    "uint32_t"      --- Number of groups Z.
-	 { deafult = 1 }
-
---- Dispatch compute indirect.
-func.Encoder.dispatch { cname = "dispatch_indirect" }
-	"void"
-	.id             "ViewId"               --- View id.
-	.program        "ProgramHandle"        --- Compute program.
-	.indirectHandle "IndirectBufferHandle" --- Indirect buffer.
-	.start          "uint16_t"             --- First element in indirect buffer.
-	 { deafult = 0 }
-	.num            "uint16_t"             --- Number of dispatches.
-	 { deafult = 1 }
-
---- Discard all previously set state for draw or compute call.
-func.Encoder.discard
-	"void"
-
---- Blit 2D texture region between two 2D textures.
----
---- @attention Destination texture must be created with `BGFX_TEXTURE_BLIT_DST` flag.
---- @attention Availability depends on: `BGFX_CAPS_TEXTURE_BLIT`.
----
-func.Encoder.blit { cpponly }
-	"void"
-	.id     "ViewId"        --- View id.
-	.dst    "TextureHandle" --- Destination texture handle.
-	.dstX   "uint16_t"      --- Destination texture X position.
-	.dstY   "uint16_t"      --- Destination texture Y position.
-	.src    "TextureHandle" --- Source texture handle.
-	.srcX   "uint16_t"      --- Source texture X position.
-	 { default = 0 }
-	.srcY   "uint16_t"      --- Source texture Y position.
-	 { default = 0 }
-	.width  "uint16_t"      --- Width of region.
-	 { default = UINT16_MAX }
-	.height "uint16_t"      --- Height of region.
-	 { default = UINT16_MAX }
-
---- Blit 2D texture region between two 2D textures.
----
---- @attention Destination texture must be created with `BGFX_TEXTURE_BLIT_DST` flag.
---- @attention Availability depends on: `BGFX_CAPS_TEXTURE_BLIT`.
----
-func.Encoder.blit
-	"void"
-	.id     "ViewId"        --- View id.
-	.dst    "TextureHandle" --- Destination texture handle.
-	.dstMip "uint8_t"       --- Destination texture mip level.
-	.dstX   "uint16_t"      --- Destination texture X position.
-	.dstY   "uint16_t"      --- Destination texture Y position.
-	.dstZ   "uint16_t"      --- If texture is 2D this argument should be 0. If destination texture is cube
-	                        --- this argument represents destination texture cube face. For 3D texture this argument
-	                        --- represents destination texture Z position.
-	.src    "TextureHandle" --- Source texture handle.
-	.srcMip "uint8_t"       --- Source texture mip level.
-	 { default = 0 }
-	.srcX   "uint16_t"      --- Source texture X position.
-	 { default = 0 }
-	.srcY   "uint16_t"      --- Source texture Y position.
-	 { default = 0 }
-	.srcZ   "uint16_t"      --- If texture is 2D this argument should be 0. If source texture is cube
-	                        --- this argument represents source texture cube face. For 3D texture this argument
-	                        --- represents source texture Z position.
-	 { default = 0 }
-	.width  "uint16_t"      --- Width of region.
-	 { default = UINT16_MAX }
-	.height "uint16_t"      --- Height of region.
-	 { default = UINT16_MAX }
-	.depth  "uint16_t"      --- If texture is 3D this argument represents depth of region, otherwise it's
-	                        --- unused.
-	 { default = UINT16_MAX }
-
---- Request screen shot of window back buffer.
----
---- @remarks
----   `bgfx::CallbackI::screenShot` must be implemented.
---- @attention Frame buffer handle must be created with OS' target native window handle.
----
-func.requestScreenShot
-	"void"
-	.handle   "FrameBufferHandle" --- Frame buffer handle. If handle is `BGFX_INVALID_HANDLE` request will be
-	                              --- made for main window back buffer.
-	.filePath "const char*"       --- Will be passed to `bgfx::CallbackI::screenShot` callback.
-
---- Render frame.
----
---- @attention `bgfx::renderFrame` is blocking call. It waits for
----   `bgfx::frame` to be called from API thread to process frame.
----   If timeout value is passed call will timeout and return even
----   if `bgfx::frame` is not called.
----
---- @warning This call should be only used on platforms that don't
----   allow creating separate rendering thread. If it is called before
----   to bgfx::init, render thread won't be created by bgfx::init call.
----
-func.renderFrame
-	"RenderFrame::Enum" --- Current renderer context state. See: `bgfx::RenderFrame`.
-	.msecs "int32_t"    --- Timeout in milliseconds.
-	{ default = -1 }
-
---- Set platform data.
----
---- @warning Must be called before `bgfx::init`.
----
-func.setPlatformData
-	"void"
-	.data "const PlatformData &" --- Platform data.
-
---- Get internal data for interop.
----
---- @attention It's expected you understand some bgfx internals before you
----   use this call.
----
---- @warning Must be called only on render thread.
----
-func.getInternalData
-	"const InternalData*" --- Internal data.
-
---- Override internal texture with externally created texture. Previously
---- created internal texture will released.
----
---- @attention It's expected you understand some bgfx internals before you
----   use this call.
----
---- @warning Must be called only on render thread.
----
-func.overrideInternal { cname = "override_internal_texture_ptr" }
-	"uintptr_t"             --- Native API pointer to texture. If result is 0, texture is not created
-	                        --- yet from the main thread.
-	.handle "TextureHandle" --- Texture handle.
-	.ptr    "uintptr_t"     --- Native API pointer to texture.
-
---- Override internal texture by creating new texture. Previously created
---- internal texture will released.
----
---- @attention It's expected you understand some bgfx internals before you
----   use this call.
----
---- @returns Native API pointer to texture. If result is 0, texture is not created yet from the
----   main thread.
----
---- @warning Must be called only on render thread.
----
-func.overrideInternal { cname = "override_internal_texture" }
-	"uintptr_t"                    --- Native API pointer to texture. If result is 0, texture is not created
-	                               --- yet from the main thread.
-	.handle  "TextureHandle"       --- Texture handle.
-	.width   "uint16_t"            --- Width.
-	.height  "uint16_t"            --- Height.
-	.numMips "uint8_t"             --- Number of mip-maps.
-	.format  "TextureFormat::Enum" --- Texture format. See: `TextureFormat::Enum`.
-	.flags   "uint64_t"            --- Texture creation (see `BGFX_TEXTURE_*`.), and sampler (see `BGFX_SAMPLER_*`)
-	                               --- flags. Default texture sampling mode is linear, and wrap mode is repeat.
-	                               --- - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                               ---   mode.
-	                               --- - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                               ---   sampling.
-
--- Legacy API:
-
---- Sets a debug marker. This allows you to group graphics calls together for easy browsing in
---- graphics debugging tools.
-func.setMarker
-	"void"
-	.marker "const char*" --- Marker string.
-
---- Set render states for draw primitive.
----
---- @remarks
----   1. To setup more complex states use:
----      `BGFX_STATE_ALPHA_REF(_ref)`,
----      `BGFX_STATE_POINT_SIZE(_size)`,
----      `BGFX_STATE_BLEND_FUNC(_src, _dst)`,
----      `BGFX_STATE_BLEND_FUNC_SEPARATE(_srcRGB, _dstRGB, _srcA, _dstA)`,
----      `BGFX_STATE_BLEND_EQUATION(_equation)`,
----      `BGFX_STATE_BLEND_EQUATION_SEPARATE(_equationRGB, _equationA)`
----   2. `BGFX_STATE_BLEND_EQUATION_ADD` is set when no other blend
----      equation is specified.
----
-func.setState
-	"void"
-	.state "uint64_t" --- State flags. Default state for primitive type is
-	                  ---   triangles. See: `BGFX_STATE_DEFAULT`.
-	                  ---   - `BGFX_STATE_DEPTH_TEST_*` - Depth test function.
-	                  ---   - `BGFX_STATE_BLEND_*` - See remark 1 about BGFX_STATE_BLEND_FUNC.
-	                  ---   - `BGFX_STATE_BLEND_EQUATION_*` - See remark 2.
-	                  ---   - `BGFX_STATE_CULL_*` - Backface culling mode.
-	                  ---   - `BGFX_STATE_WRITE_*` - Enable R, G, B, A or Z write.
-	                  ---   - `BGFX_STATE_MSAA` - Enable hardware multisample antialiasing.
-	                  ---   - `BGFX_STATE_PT_[TRISTRIP/LINES/POINTS]` - Primitive type.
-	.rgba  "uint32_t" --- Sets blend factor used by `BGFX_STATE_BLEND_FACTOR` and
-	                  ---   `BGFX_STATE_BLEND_INV_FACTOR` blend modes.
-	 { default = 0 }
-
---- Set condition for rendering.
-func.setCondition
-	"void"
-	.handle  "OcclusionQueryHandle" --- Occlusion query handle.
-	.visible "bool"                 --- Render if occlusion query is visible.
-
---- Set stencil test state.
-func.setStencil
-	"void"
-	.fstencil "uint32_t" --- Front stencil state.
-	.bstencil "uint32_t" --- Back stencil state. If back is set to `BGFX_STENCIL_NONE`
-	                     --- _fstencil is applied to both front and back facing primitives.
-	 { default = "BGFX_STENCIL_NONE" }
-
---- Set scissor for draw primitive.
----
---- @remark
----   To scissor for all primitives in view see `bgfx::setViewScissor`.
----
-func.setScissor
-	"uint16_t"         --- Scissor cache index.
-	.x      "uint16_t" --- Position x from the left corner of the window.
-	.y      "uint16_t" --- Position y from the top corner of the window.
-	.width  "uint16_t" --- Width of view scissor region.
-	.height "uint16_t" --- Height of view scissor region.
-
---- Set scissor from cache for draw primitive.
----
---- @remark
----   To scissor for all primitives in view see `bgfx::setViewScissor`.
----
-func.setScissor { cname = "set_scissor_cached" }
-	"void"
-	.cache "uint16_t" --- Index in scissor cache.
-	 { default = UINT16_MAX }
-
---- Set model matrix for draw primitive. If it is not called,
---- the model will be rendered with an identity model matrix.
-func.setTransform
-	"uint32_t"         --- Index into matrix cache in case the same model matrix has
-	                   --- to be used for other draw primitive call.
-	.mtx "const void*" --- Pointer to first matrix in array.
-	.num "uint16_t"    --- Number of matrices in array.
-
----  Set model matrix from matrix cache for draw primitive.
-func.setTransform { cname = "set_transform_cached" }
-	"void"
-	.cache "uint32_t" --- Index in matrix cache.
-	.num   "uint16_t" --- Number of matrices from cache.
-	 { default = 1 }
-
---- Reserve matrices in internal matrix cache.
----
---- @attention Pointer returned can be modifed until `bgfx::frame` is called.
----
-func.allocTransform
-	"uint32_t"                      --- Index in matrix cache.
-	.transform "Transform*" { out } --- Pointer to `Transform` structure.
-	.num       "uint16_t"           --- Number of matrices.
-
---- Set shader uniform parameter for draw primitive.
-func.setUniform
-	"void"
-	.handle "UniformHandle" --- Uniform.
-	.value  "const void*"   --- Pointer to uniform data.
-	.num    "uint16_t"      --- Number of elements. Passing `UINT16_MAX` will
-	                        --- use the _num passed on uniform creation.
-	 { default = 1 }
-
---- Set index buffer for draw primitive.
-func.setIndexBuffer { cpponly }
-	"void"
-	.handle     "IndexBufferHandle" --- Index buffer.
-
---- Set index buffer for draw primitive.
-func.setIndexBuffer
-	"void"
-	.handle     "IndexBufferHandle" --- Index buffer.
-	.firstIndex "uint32_t"          --- First index to render.
-	.numIndices "uint32_t"          --- Number of indices to render.
-
---- Set index buffer for draw primitive.
-func.setIndexBuffer { cpponly }
-	"void"
-	.handle     "DynamicIndexBufferHandle" --- Dynamic index buffer.
-
---- Set index buffer for draw primitive.
-func.setIndexBuffer { cname = "set_dynamic_index_buffer" }
-	"void"
-	.handle     "DynamicIndexBufferHandle" --- Dynamic index buffer.
-	.firstIndex "uint32_t"                 --- First index to render.
-	.numIndices "uint32_t"                 --- Number of indices to render.
-
---- Set index buffer for draw primitive.
-func.setIndexBuffer { cpponly }
-	"void"
-	.tib        "const TransientIndexBuffer*" --- Transient index buffer.
-
---- Set index buffer for draw primitive.
-func.setIndexBuffer { cname = "set_transient_index_buffer" }
-	"void"
-	.tib        "const TransientIndexBuffer*" --- Transient index buffer.
-	.firstIndex "uint32_t"                    --- First index to render.
-	.numIndices "uint32_t"                    --- Number of indices to render.
-
---- Set vertex buffer for draw primitive.
-func.setVertexBuffer { cpponly }
-	"void"
-	.stream      "uint8_t"            --- Vertex stream.
-	.handle      "VertexBufferHandle" --- Vertex buffer.
-
---- Set vertex buffer for draw primitive.
-func.setVertexBuffer
-	"void"
-	.stream      "uint8_t"            --- Vertex stream.
-	.handle      "VertexBufferHandle" --- Vertex buffer.
-	.startVertex "uint32_t"           --- First vertex to render.
-	.numVertices "uint32_t"           --- Number of vertices to render.
-
---- Set vertex buffer for draw primitive.
-func.setVertexBuffer { cpponly }
-	"void"
-	.stream      "uint8_t"                   --- Vertex stream.
-	.handle      "DynamicVertexBufferHandle" --- Dynamic vertex buffer.
-
---- Set vertex buffer for draw primitive.
-func.setVertexBuffer { cname = "set_dynamic_vertex_buffer" }
-	"void"
-	.stream      "uint8_t"                   --- Vertex stream.
-	.handle      "DynamicVertexBufferHandle" --- Dynamic vertex buffer.
-	.startVertex "uint32_t"                  --- First vertex to render.
-	.numVertices "uint32_t"                  --- Number of vertices to render.
-
---- Set vertex buffer for draw primitive.
-func.setVertexBuffer { cpponly }
-	"void"
-	.stream      "uint8_t"                      --- Vertex stream.
-	.tvb         "const TransientVertexBuffer*" --- Transient vertex buffer.
-
---- Set vertex buffer for draw primitive.
-func.setVertexBuffer { cname = "set_transient_vertex_buffer" }
-	"void"
-	.stream      "uint8_t"                      --- Vertex stream.
-	.tvb         "const TransientVertexBuffer*" --- Transient vertex buffer.
-	.startVertex "uint32_t"                     --- First vertex to render.
-	.numVertices "uint32_t"                     --- Number of vertices to render.
-
---- Set number of vertices for auto generated vertices use in conjuction
---- with gl_VertexID.
----
---- @attention Availability depends on: `BGFX_CAPS_VERTEX_ID`.
----
-func.setVertexCount
-	"void"
-	.numVertices "uint32_t" --- Number of vertices.
-
---- Set instance data buffer for draw primitive.
-func.setInstanceDataBuffer { cpponly }
-	"void"
-	.idb   "const InstanceDataBuffer*" --- Transient instance data buffer.
-
---- Set instance data buffer for draw primitive.
-func.setInstanceDataBuffer
-	"void"
-	.idb   "const InstanceDataBuffer*" --- Transient instance data buffer.
-	.start "uint32_t"                  --- First instance data.
-	.num   "uint32_t"                  --- Number of data instances.
-
---- Set instance data buffer for draw primitive.
-func.setInstanceDataBuffer { cpponly }
-	"void"
-	.handle      "VertexBufferHandle" --- Vertex buffer.
-
---- Set instance data buffer for draw primitive.
-func.setInstanceDataBuffer { cname = "set_instance_data_from_vertex_buffer" }
-	"void"
-	.handle      "VertexBufferHandle" --- Vertex buffer.
-	.startVertex "uint32_t"           --- First instance data.
-	.num         "uint32_t"           --- Number of data instances.
-
- --- Set instance data buffer for draw primitive.
-func.setInstanceDataBuffer { cpponly }
-	"void"
-	.handle      "DynamicVertexBufferHandle" --- Dynamic vertex buffer.
-
---- Set instance data buffer for draw primitive.
-func.setInstanceDataBuffer { cname = "set_instance_data_from_dynamic_vertex_buffer" }
-	"void"
-	.handle      "DynamicVertexBufferHandle" --- Dynamic vertex buffer.
-	.startVertex "uint32_t"                  --- First instance data.
-	.num         "uint32_t"                  --- Number of data instances.
-
---- Set number of instances for auto generated instances use in conjuction
---- with gl_InstanceID.
----
---- @attention Availability depends on: `BGFX_CAPS_VERTEX_ID`.
----
-func.setInstanceCount
-	"void"
-	.numInstances "uint32_t" -- Number of instances.
-
---- Set texture stage for draw primitive.
-func.setTexture
-	"void"
-	.stage   "uint8_t"        --- Texture unit.
-	.sampler "UniformHandle"  --- Program sampler.
-	.handle  "TextureHandle"  --- Texture handle.
-	.flags   "uint32_t"       --- Texture sampling mode. Default value UINT32_MAX uses
-	 { default = UINT32_MAX } ---   texture sampling settings from the texture.
-	                          ---   - `BGFX_SAMPLER_[U/V/W]_[MIRROR/CLAMP]` - Mirror or clamp to edge wrap
-	                          ---     mode.
-	                          ---   - `BGFX_SAMPLER_[MIN/MAG/MIP]_[POINT/ANISOTROPIC]` - Point or anisotropic
-	                          ---     sampling.
-
---- Submit an empty primitive for rendering. Uniforms and draw state
---- will be applied but no geometry will be submitted.
----
---- @remark
----   These empty draw calls will sort before ordinary draw calls.
----
-func.touch
-	"void"
-	.id "ViewId" --- View id.
-
---- Submit primitive for rendering.
-func.submit
-	"void"
-	.id            "ViewId"        --- View id.
-	.program       "ProgramHandle" --- Program.
-	.depth         "uint32_t"      --- Depth for sorting.
-	{ default = 0 }
-	.preserveState "bool"          --- Preserve internal draw state for next draw call submit.
-	{ default = false }
-
---- Submit primitive with occlusion query for rendering.
-func.submit { cname = "submit_occlusion_query" }
-	"void"
-	.id             "ViewId"               --- View id.
-	.program        "ProgramHandle"        --- Program.
-	.occlusionQuery "OcclusionQueryHandle" --- Occlusion query.
-	.depth          "uint32_t"             --- Depth for sorting.
-	{ default = 0 }
-	.preserveState  "bool"                 --- Preserve internal draw state for next draw call submit.
-	{ default = false }
-
---- Submit primitive for rendering with index and instance data info from
---- indirect buffer.
-func.submit { cname = "submit_indirect" }
-	"void"
-	.id             "ViewId"               --- View id.
-	.program        "ProgramHandle"        --- Program.
-	.indirectHandle "IndirectBufferHandle" --- Indirect buffer.
-	.start          "uint16_t"             --- First element in indirect buffer.
-	{ default = 0 }
-	.num            "uint16_t"             --- Number of dispatches.
-	{ default = 1 }
-	.depth          "uint32_t"             --- Depth for sorting.
-	{ default = 0 }
-	.preserveState  "bool"                 --- Preserve internal draw state for next draw call submit.
-	{ default = false }
-
---- Set compute index buffer.
-func.setBuffer { cname = "set_compute_index_buffer" }
-	"void"
-	.stage  "uint8_t"           --- Compute stage.
-	.handle "IndexBufferHandle" --- Index buffer handle.
-	.access "Access::Enum"      --- Buffer access. See `Access::Enum`.
-
---- Set compute vertex buffer.
-func.setBuffer { cname = "set_compute_vertex_buffer" }
-	"void"
-	.stage  "uint8_t"            --- Compute stage.
-	.handle "VertexBufferHandle" --- Vertex buffer handle.
-	.access "Access::Enum"       --- Buffer access. See `Access::Enum`.
-
---- Set compute dynamic index buffer.
-func.setBuffer { cname = "set_compute_dynamic_index_buffer" }
-	"void"
-	.stage  "uint8_t"                  --- Compute stage.
-	.handle "DynamicIndexBufferHandle" --- Dynamic index buffer handle.
-	.access "Access::Enum"             --- Buffer access. See `Access::Enum`.
-
---- Set compute dynamic vertex buffer.
-func.setBuffer { cname = "set_compute_dynamic_vertex_buffer" }
-	"void"
-	.stage  "uint8_t"                   --- Compute stage.
-	.handle "DynamicVertexBufferHandle" --- Dynamic vertex buffer handle.
-	.access "Access::Enum"              --- Buffer access. See `Access::Enum`.
-
---- Set compute indirect buffer.
-func.setBuffer { cname = "set_compute_indirect_buffer" }
-	"void"
-	.stage  "uint8_t"              --- Compute stage.
-	.handle "IndirectBufferHandle" --- Indirect buffer handle.
-	.access "Access::Enum"         --- Buffer access. See `Access::Enum`.
-
---- Set compute image from texture.
-func.setImage
-	"void"
-	.stage  "uint8_t"              --- Compute stage.
-	.handle "TextureHandle"        --- Texture handle.
-	.mip    "uint8_t"              --- Mip level.
-	.access "Access::Enum"         --- Image access. See `Access::Enum`.
-	.format "TextureFormat::Enum"  --- Texture format. See: `TextureFormat::Enum`.
-	 { default = "TextureFormat::Count" }
-
---- Dispatch compute.
-func.dispatch
-	"void"
-	.id      "ViewId"        --- View id.
-	.program "ProgramHandle" --- Compute program.
-	.numX    "uint32_t"      --- Number of groups X.
-	 { deafult = 1 }
-	.numY    "uint32_t"      --- Number of groups Y.
-	 { deafult = 1 }
-	.numZ    "uint32_t"      --- Number of groups Z.
-	 { deafult = 1 }
-
---- Dispatch compute indirect.
-func.dispatch { cname = "dispatch_indirect" }
-	"void"
-	.id             "ViewId"               --- View id.
-	.program        "ProgramHandle"        --- Compute program.
-	.indirectHandle "IndirectBufferHandle" --- Indirect buffer.
-	.start          "uint16_t"             --- First element in indirect buffer.
-	 { deafult = 0 }
-	.num            "uint16_t"             --- Number of dispatches.
-	 { deafult = 1 }
-
---- Discard all previously set state for draw or compute call.
-func.discard
-	"void"
-
---- Blit 2D texture region between two 2D textures.
----
---- @attention Destination texture must be created with `BGFX_TEXTURE_BLIT_DST` flag.
---- @attention Availability depends on: `BGFX_CAPS_TEXTURE_BLIT`.
----
-func.blit { cpponly }
-	"void"
-	.id     "ViewId"        --- View id.
-	.dst    "TextureHandle" --- Destination texture handle.
-	.dstX   "uint16_t"      --- Destination texture X position.
-	.dstY   "uint16_t"      --- Destination texture Y position.
-	.src    "TextureHandle" --- Source texture handle.
-	.srcX   "uint16_t"      --- Source texture X position.
-	 { default = 0 }
-	.srcY   "uint16_t"      --- Source texture Y position.
-	 { default = 0 }
-	.width  "uint16_t"      --- Width of region.
-	 { default = UINT16_MAX }
-	.height "uint16_t"      --- Height of region.
-	 { default = UINT16_MAX }
-
---- Blit 2D texture region between two 2D textures.
----
---- @attention Destination texture must be created with `BGFX_TEXTURE_BLIT_DST` flag.
---- @attention Availability depends on: `BGFX_CAPS_TEXTURE_BLIT`.
----
-func.blit
-	"void"
-	.id     "ViewId"        --- View id.
-	.dst    "TextureHandle" --- Destination texture handle.
-	.dstMip "uint8_t"       --- Destination texture mip level.
-	.dstX   "uint16_t"      --- Destination texture X position.
-	.dstY   "uint16_t"      --- Destination texture Y position.
-	.dstZ   "uint16_t"      --- If texture is 2D this argument should be 0. If destination texture is cube
-	                        --- this argument represents destination texture cube face. For 3D texture this argument
-	                        --- represents destination texture Z position.
-	.src    "TextureHandle" --- Source texture handle.
-	.srcMip "uint8_t"       --- Source texture mip level.
-	 { default = 0 }
-	.srcX   "uint16_t"      --- Source texture X position.
-	 { default = 0 }
-	.srcY   "uint16_t"      --- Source texture Y position.
-	 { default = 0 }
-	.srcZ   "uint16_t"      --- If texture is 2D this argument should be 0. If source texture is cube
-	                        --- this argument represents source texture cube face. For 3D texture this argument
-	                        --- represents source texture Z position.
-	 { default = 0 }
-	.width  "uint16_t"      --- Width of region.
-	 { default = UINT16_MAX }
-	.height "uint16_t"      --- Height of region.
-	 { default = UINT16_MAX }
-	.depth  "uint16_t"      --- If texture is 3D this argument represents depth of region, otherwise it's
-	                        --- unused.
-	 { default = UINT16_MAX }

+ 0 - 426
3rdparty/bgfx/scripts/bindings-cs.lua

@@ -1,426 +0,0 @@
-local codegen = require "codegen"
-local idl = codegen.idl "bgfx.idl"
-
-local csharp_template = [[
-/*
- * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
- * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
- */
-
-/*
- *
- * AUTO GENERATED! DO NOT EDIT!
- *
- */
-
-using System;
-using System.Runtime.InteropServices;
-
-namespace Bgfx
-{
-public static partial class bgfx
-{
-	$types
-
-	$funcs
-
-#if !BGFX_CSHARP_CUSTOM_DLLNAME
-#if DEBUG
-	const string DllName = "bgfx_debug.dll";
-#else
-	const string DllName = "bgfx.dll";
-#endif
-#endif
-}
-}
-]]
-
-local function hasPrefix(str, prefix)
-	return prefix == "" or str:sub(1, #prefix) == prefix
-end
-
-local function hasSuffix(str, suffix)
-	return suffix == "" or str:sub(-#suffix) == suffix
-end
-
-local function convert_type_0(arg)
-
-	if hasPrefix(arg.ctype, "uint64_t") then
-		return arg.ctype:gsub("uint64_t", "ulong")
-	elseif hasPrefix(arg.ctype, "int64_t") then
-		return arg.ctype:gsub("int64_t", "long")
-	elseif hasPrefix(arg.ctype, "uint32_t") then
-		return arg.ctype:gsub("uint32_t", "uint")
-	elseif hasPrefix(arg.ctype, "int32_t") then
-		return arg.ctype:gsub("int32_t", "int")
-	elseif hasPrefix(arg.ctype, "uint16_t") then
-		return arg.ctype:gsub("uint16_t", "ushort")
-	elseif hasPrefix(arg.ctype, "bgfx_view_id_t") then
-		return arg.ctype:gsub("bgfx_view_id_t", "ushort")
-	elseif hasPrefix(arg.ctype, "uint8_t") then
-		return arg.ctype:gsub("uint8_t", "byte")
-	elseif hasPrefix(arg.ctype, "uintptr_t") then
-		return arg.ctype:gsub("uintptr_t", "UIntPtr")
-	elseif arg.ctype == "bgfx_caps_gpu_t" then
-	    return arg.ctype:gsub("bgfx_caps_gpu_t", "uint")
-	elseif arg.ctype == "const char*" then
-		return "[MarshalAs(UnmanagedType.LPStr)] string"
-	elseif hasPrefix(arg.ctype, "char") then
-		return arg.ctype:gsub("char", "byte")
-	elseif hasSuffix(arg.fulltype, "Handle") then
-		return arg.fulltype
-	elseif arg.ctype == "..." then
-		return "[MarshalAs(UnmanagedType.LPStr)] string args"
-	elseif arg.ctype == "va_list"
-		or arg.fulltype == "bx::AllocatorI*"
-		or arg.fulltype == "CallbackI*"
-		or arg.fulltype == "ReleaseFn" then
-		return "IntPtr"
-	elseif arg.fulltype == "const ViewId*" then
-		return "ushort*"
-	end
-
-	return arg.fulltype
-end
-
-local function convert_type(arg)
-	local ctype = convert_type_0(arg)
-	ctype = ctype:gsub("::Enum", "")
-	ctype = ctype:gsub("const ", "")
-	ctype = ctype:gsub(" &", "*")
-	ctype = ctype:gsub("&", "*")
-	return ctype
-end
-
-local function convert_struct_type(arg)
-	local ctype = convert_type(arg)
-	if hasPrefix(arg.ctype, "bool") then
-		ctype = ctype:gsub("bool", "byte")
-	end
-	return ctype
-end
-
-local function convert_ret_type(arg)
-	local ctype = convert_type(arg)
-	if hasPrefix(ctype, "[MarshalAs(UnmanagedType.LPStr)]") then
-		return "IntPtr"
-	end
-	return ctype
-end
-
-local converter = {}
-local yield = coroutine.yield
-local indent = ""
-
-local gen = {}
-
-function gen.gen()
-	local r = csharp_template:gsub("$(%l+)", function(what)
-		local tmp = {}
-		for _, object in ipairs(idl[what]) do
-			local co = coroutine.create(converter[what])
-			local any
-			while true do
-				local ok, v = coroutine.resume(co, object)
-				assert(ok, debug.traceback(co, v))
-				if not v then
-					break
-				end
-				table.insert(tmp, v)
-				any = true
-			end
-			if any and tmp[#tmp] ~= "" then
-				table.insert(tmp, "")
-			end
-		end
-		return table.concat(tmp, "\n\t")
-	end)
-	return r
-end
-
-local combined = { "State", "Stencil", "Buffer", "Texture", "Sampler", "Reset" }
-
-for _, v in ipairs(combined) do
-	combined[v] = {}
-end
-
-local lastCombinedFlag
-
-local function FlagBlock(typ)
-	local format = "0x%08x"
-	local enumType = " : uint"
-	if typ.bits == 64 then
-		format = "0x%016x"
-		enumType = " : ulong"
-	elseif typ.bits == 16 then
-		format = "0x%04x"
-		enumType = " : ushort"
-	end
-
-	yield("[Flags]")
-	yield("public enum " .. typ.name .. "Flags" .. enumType)
-	yield("{")
-
-	for idx, flag in ipairs(typ.flag) do
-
-		if flag.comment ~= nil then
-			if idx ~= 1 then
-				yield("")
-			end
-
-			yield("\t/// <summary>")
-			for _, comment in ipairs(flag.comment) do
-				yield("\t/// " .. comment)
-			end
-			yield("\t/// </summary>")
-		end
-
-		local flagName = flag.name:gsub("_", "")
-		yield("\t"
-			.. flagName
-			.. string.rep(" ", 22 - #(flagName))
-			.. " = "
-			.. string.format(flag.format or format, flag.value)
-			.. ","
-			)
-	end
-
-	if typ.shift then
-		yield("\t"
-			.. "Shift"
-			.. string.rep(" ", 22 - #("Shift"))
-			.. " = "
-			.. flag.shift
-			)
-	end
-
-	-- generate Mask
-	if typ.mask then
-		yield("\t"
-			.. "Mask"
-			.. string.rep(" ", 22 - #("Mask"))
-			.. " = "
-			.. string.format(format, flag.mask)
-			)
-	end
-
-	yield("}")
-end
-
-local function lastCombinedFlagBlock()
-	if lastCombinedFlag then
-		local typ = combined[lastCombinedFlag]
-		if typ then
-			FlagBlock(combined[lastCombinedFlag])
-			yield("")
-		end
-		lastCombinedFlag = nil
-	end
-end
-
-local enum = {}
-
-local function convert_array(member)
-	if string.find(member.array, "::") then
-		return string.format("[%d]", enum[member.array])
-	else
-		return member.array
-	end
-end
-
-local function convert_struct_member(member)
-	if member.array then
-		return "fixed " .. convert_struct_type(member) .. " " .. member.name .. convert_array(member)
-	else
-		return convert_struct_type(member) .. " " .. member.name
-	end
-end
-
-local namespace = ""
-
-function converter.types(typ)
-	if typ.handle then
-		lastCombinedFlagBlock()
-
-		yield("public struct " .. typ.name .. "{ public ushort idx; }")
-	elseif hasSuffix(typ.name, "::Enum") then
-		lastCombinedFlagBlock()
-
-		yield("public enum " .. typ.typename)
-		yield("{")
-		for idx, enum in ipairs(typ.enum) do
-
-			if enum.comment ~= nil then
-				if idx ~= 1 then
-					yield("")
-				end
-
-				yield("\t/// <summary>")
-				for _, comment in ipairs(enum.comment) do
-					yield("\t/// " .. comment)
-				end
-				yield("\t/// </summary>")
-			end
-
-			yield("\t" .. enum.name .. ",")
-		end
-		yield("");
-		yield("\tCount")
-		yield("}")
-
-		enum["[" .. typ.typename .. "::Count]"] = #typ.enum
-
-	elseif typ.bits ~= nil then
-		local prefix, name = typ.name:match "(%u%l+)(.*)"
-		if prefix ~= lastCombinedFlag then
-			lastCombinedFlagBlock()
-			lastCombinedFlag = prefix
-		end
-		local combinedFlag = combined[prefix]
-		if combinedFlag then
-			combinedFlag.bits = typ.bits
-			combinedFlag.name = prefix
-			local flags = combinedFlag.flag or {}
-			combinedFlag.flag = flags
-			local lookup = combinedFlag.lookup or {}
-			combinedFlag.lookup = lookup
-			for _, flag in ipairs(typ.flag) do
-				local flagName = name .. flag.name:gsub("_", "")
-				local value = flag.value
-				if value == nil then
-					-- It's a combined flag
-					value = 0
-					for _, v in ipairs(flag) do
-						value = value | assert(lookup[name .. v], v .. " is not defined for " .. flagName)
-					end
-				end
-				lookup[flagName] = value
-				table.insert(flags, {
-					name = flagName,
-					value = value,
-					comment = flag.comment,
-				})
-			end
-
-			if typ.shift then
-				table.insert(flags, {
-					name = name .. "Shift",
-					value = typ.shift,
-					format = "%d",
-					comment = typ.comment,
-				})
-			end
-
-			if typ.mask then
-				-- generate Mask
-				table.insert(flags, {
-					name = name .. "Mask",
-					value = typ.mask,
-					comment = typ.comment,
-				})
-				lookup[name .. "Mask"] = typ.mask
-			end
-		else
-			FlagBlock(typ)
-		end
-	elseif typ.struct ~= nil then
-
-		local skip = false
-
-		if typ.namespace ~= nil then
-			if namespace ~= typ.namespace then
-				yield("public unsafe struct " .. typ.namespace)
-				yield("{")
-				namespace = typ.namespace
-				indent = "\t"
-			end
-		elseif namespace ~= "" then
-			indent = ""
-			namespace = ""
-			skip = true
-		end
-
-		if not skip then
-			yield(indent .. "public unsafe struct " .. typ.name)
-			yield(indent .. "{")
-		end
-
-		for _, member in ipairs(typ.struct) do
-			yield(
-				indent .. "\tpublic " .. convert_struct_member(member) .. ";"
-				)
-		end
-
-		yield(indent .. "}")
-	end
-end
-
-function converter.funcs(func)
-
-	if func.cpponly then
-		return
-	end
-
-	if func.comments ~= nil then
-		yield("/// <summary>")
-		for _, line in ipairs(func.comments) do
-			yield("/// " .. line)
-		end
-		yield("/// </summary>")
-		yield("///")
-
-		local hasParams = false
-
-		for _, arg in ipairs(func.args) do
-			if arg.comment ~= nil then
-				local comment = table.concat(arg.comment, " ")
-
-				yield("/// <param name=\""
-					.. arg.name
-					.. "\">"
-					.. comment
-					.. "</param>"
-					)
-
-				hasParams = true
-			end
-		end
-
-		if hasParams then
-			yield("///")
-		end
-	end
-
-	yield("[DllImport(DllName, EntryPoint=\"bgfx_" .. func.cname .. "\", CallingConvention = CallingConvention.Cdecl)]")
-
-	if func.ret.cpptype == "bool" then
-		yield("[return: MarshalAs(UnmanagedType.I1)]")
-	end
-
-	local args = {}
-	if func.this ~= nil then
-		args[1] = func.this_type.type .. "* _this"
-	end
-	for _, arg in ipairs(func.args) do
-		table.insert(args, convert_type(arg) .. " " .. arg.name)
-	end
-	yield("public static extern unsafe " .. convert_ret_type(func.ret) .. " " .. func.cname
-		.. "(" .. table.concat(args, ", ") .. ");")
-end
-
--- printtable("idl types", idl.types)
--- printtable("idl funcs", idl.funcs)
-
-function gen.write(codes, outputfile)
-	local out = assert(io.open(outputfile, "wb"))
-	out:write(codes)
-	out:close()
-	print("Generating: " .. outputfile)
-end
-
-if (...) == nil then
-	-- run `lua bindings-cs.lua` in command line
-	print(gen.gen())
-end
-
-return gen

+ 0 - 414
3rdparty/bgfx/scripts/bindings-d.lua

@@ -1,414 +0,0 @@
-local codegen = require "codegen"
-local idl = codegen.idl "bgfx.idl"
-
-local d_types_template = [[
-/*
- *
- * AUTO GENERATED! DO NOT EDIT!
- *
- */
-
-module bindbc.bgfx.types;
-
-public import core.stdc.stdarg : va_list;
-
-extern(C) @nogc nothrow:
-
-$version
-
-alias bgfx_view_id_t = ushort;
-
-$types
-]]
-
-local d_funcs_template = [[
-/*
- *
- * AUTO GENERATED! DO NOT EDIT!
- *
- */
-
-module bindbc.bgfx.funcs;
-
-private import bindbc.bgfx.types;
-
-extern(C) @nogc nothrow:
-
-version(BindBgfx_Static)
-{
-	$funcs_static
-}
-else
-{
-	__gshared
-	{
-		$funcs_dynamic
-	}
-}
-]]
-
-local function hasPrefix(str, prefix)
-	return prefix == "" or str:sub(1, #prefix) == prefix
-end
-
-local function hasSuffix(str, suffix)
-	return suffix == "" or str:sub(-#suffix) == suffix
-end
-
-local function to_underscorecase(name)
-	local tmp = {}
-	for v in name:gmatch "[_%u][%l%d]*" do
-		if v:byte() == 95 then	-- '_'
-			v = v:sub(2)	-- remove _
-		end
-		tmp[#tmp+1] = v
-	end
-	return table.concat(tmp, "_")
-end
-
-local function convert_array(member)
-	if string.find(member.array, "::") then
-		local name = "bgfx_" .. to_underscorecase(string.gsub(member.array, "::.*", "")):lower() .. "_t"
-		return "[" .. name .. ".BGFX_" .. to_underscorecase(member.array):upper() .. "]"
-	else
-		return member.array
-	end
-end
-
-local function convert_type(arg)
-	local ctype = arg.ctype:gsub("%s%*", "*")
-	if arg.fulltype == "bx::AllocatorI*" or arg.fulltype == "CallbackI*" or arg.fulltype == "ReleaseFn" then
-		ctype = "void*"
-	elseif hasPrefix(ctype, "uint64_t") then
-		ctype = ctype:gsub("uint64_t", "ulong")
-	elseif hasPrefix(ctype, "int64_t") then
-		ctype = ctype:gsub("int64_t", "long")
-	elseif hasPrefix(ctype, "uint32_t") then
-		ctype = ctype:gsub("uint32_t", "uint")
-	elseif hasPrefix(ctype, "int32_t") then
-		ctype = ctype:gsub("int32_t", "int")
-	elseif hasPrefix(ctype, "uint16_t") then
-		ctype = ctype:gsub("uint16_t", "ushort")
-	elseif hasPrefix(ctype, "uint8_t") then
-		ctype = ctype:gsub("uint8_t", "byte")
-	elseif hasPrefix(ctype, "uintptr_t") then
-		ctype = ctype:gsub("uintptr_t", "ulong")
-	elseif hasPrefix(ctype, "const ") and hasSuffix(ctype, "*") then
-		ctype = "const(" .. string.sub(ctype:gsub("const ", "", 1), 1, -2) .. ")*"
-	end
-
-	if arg.array ~= nil then
-		ctype = ctype .. convert_array(arg)
-	end
-
-	return ctype
-end
-
-local function convert_struct_type(arg)
-	return convert_type(arg)
-end
-
-local function convert_ret_type(arg)
-	return convert_type(arg)
-end
-
-local function convert_name(arg)
-	if arg == "debug" then
-		return arg .. "_"
-	end
-	return arg
-end
-
-local function convert_struct_member(member)
-	return convert_struct_type(member) .. " " .. convert_name(member.name)
-end
-
-local function gen_version()
-	return "enum uint BGFX_API_VERSION = " .. (idl._version or 0) .. ";"
-end
-
-local converter = {}
-local yield = coroutine.yield
-local gen = {}
-
-function gen.gen(template)
-	local indent = ""
-	local idx = 1;
-	local r = template:gsub("$([a-zA-Z_]+)", function(what)
-		local tmp = {}
-
-		local ind_end = template:find("$"..what, idx, true)
-		local ind_start = ind_end
-		for j = 1, ind_end-1 do
-			local i = 1+ind_end-1-j
-			local c = string.sub(template, i, i)
-			if c ~= ' ' and c ~= '\t' then
-				ind_start = i
-				break
-			end
-		end
-
-		indent = string.sub(template, ind_start+1, ind_end-1)
-
-		local what_idl = what:gsub("funcs_dynamic", "funcs"):gsub("funcs_static", "funcs")
-
-		if (what == "version") then
-			return gen_version()
-		end
-
-		for _, object in ipairs(idl[what_idl]) do
-			local co = coroutine.create(converter[what])
-			local any
-			while true do
-				local ok, v = coroutine.resume(co, object)
-				assert(ok, debug.traceback(co, v))
-				if not v then
-					break
-				end
-				table.insert(tmp, v)
-				any = true
-			end
-			if any and tmp[#tmp] ~= "" then
-				table.insert(tmp, "")
-			end
-		end
-		return table.concat(tmp, "\n" .. indent)
-	end)
-	return r
-end
-
-function gen.gen_types()
-	return gen.gen(d_types_template)
-end
-
-function gen.gen_funcs()
-	return gen.gen(d_funcs_template)
-end
-
-function converter.types(typ)
-	if typ.comments ~= nil then
-		if #typ.comments == 1 then
-			yield("/// " .. typ.comments[1])
-		else
-			yield("/**")
-			for _, comment in ipairs(typ.comments) do
-				yield(" * " .. comment)
-			end
-			yield(" */")
-		end
-	end
-
-	if typ.handle then
-		yield("struct " .. typ.cname .. " { ushort idx; }")
-	elseif typ.enum then
-		local prefix = "BGFX_" .. to_underscorecase(string.gsub(typ.name, "::Enum", "")):upper()
-		yield("enum " .. typ.cname)
-		yield("{")
-		for idx, enum in ipairs(typ.enum) do
-			local comments = ""
-			if enum.comment ~= nil then
-				if #enum.comment == 1 then
-					comments = " /// " .. enum.comment[1];
-				else
-					yield("\t/**")
-					for _, comment in ipairs(enum.comment) do
-						yield("\t * " .. comment)
-					end
-					yield("\t */")
-				end
-			end
-
-			local enumname
-			if enum.underscore then
-				enumname = to_underscorecase(enum.name):upper()
-			else
-				enumname = enum.name:upper()
-			end
-
-			yield("\t" .. prefix .. "_" .. enumname .. "," .. comments)
-		end
-		yield("");
-		--yield("\t" .. prefix .. "_COUNT = " .. #typ.enum)
-		yield("\t" .. prefix .. "_COUNT")
-		yield("}")
-
-	elseif typ.bits ~= nil then
-		local prefix = "BGFX_" .. to_underscorecase(typ.name):upper()
-		local enumType = "uint"
-		format = "%u"
-		if typ.bits == 64 then
-			format = "0x%016x"
-			enumType = "ulong"
-		elseif typ.bits == 32 then
-			format = "0x%08x"
-			enumType = "uint"
-		elseif typ.bits == 16 then
-			format = "0x%04x"
-			enumType = "ushort"
-		elseif typ.bits == 8 then
-			format = "0x%02x"
-			enumType = "ubyte"
-		end
-
-		for idx, flag in ipairs(typ.flag) do
-			local value = flag.value
-			if value ~= nil then
-				value = string.format(flag.format or format, value)
-			else
-				for _, name in ipairs(flag) do
-					local fixedname = prefix .. "_" .. to_underscorecase(name):upper()
-					if value ~= nil then
-						value = value .. " | " .. fixedname
-					else
-						value = fixedname
-					end
-				end
-			end
-			local comments = ""
-			if flag.comment ~= nil then
-				if #flag.comment == 1 then
-					comments = " /// " .. flag.comment[1]
-				else
-					yield("/**")
-					for _, comment in ipairs(flag.comment) do
-						yield(" * " .. comment)
-					end
-					yield(" */")
-				end
-			end
-			yield("enum " .. enumType .. " " .. prefix .. "_" .. to_underscorecase(flag.name):upper() .. " = " .. value .. ";" .. comments)
-		end
-
-		if typ.shift then
-			local name = prefix .. "_SHIFT"
-			local value = typ.shift
-			local comments = ""
-			if typ.desc then
-				comments = string.format(" /// %s bit shift", typ.desc)
-			end
-			yield("enum " .. enumType .. " " .. name .. " = " .. value .. ";" .. comments)
-		end
-		if typ.range then
-			local name = prefix .. "_MASK"
-			local value = string.format(format, typ.mask)
-			local comments = ""
-			if typ.desc then
-				comments = string.format(" /// %s bit mask", typ.desc)
-			end
-			yield("enum " .. enumType .. " " .. name .. " = " .. value .. ";" .. comments)
-		end
-
-		if typ.helper then
-			yield(string.format(
-				"%s %s (%s v) { return (v << %s) & %s; }",
-				enumType,
-				prefix,
-				enumType,
-				(prefix .. "_SHIFT"),
-				(prefix .. "_MASK")))
-		end
-	elseif typ.struct ~= nil then
-		yield("struct " .. typ.cname)
-		yield("{")
-
-		for _, member in ipairs(typ.struct) do
-			local comments = ""
-			if member.comment ~= nil then
-				if #member.comment == 1 then
-					comments = " /// " .. member.comment[1]
-				else
-					yield("\n\t/**")
-					for _, comment in ipairs(member.comment) do
-						yield("\t * " .. comment)
-					end
-					yield("\t */")
-				end
-			end
-			yield("\t" .. convert_struct_member(member) .. ";" .. comments)
-		end
-
-		yield("}")
-	end
-end
-
-function converter.funcs_static(func)
-	return converter.funcs(func, true)
-end
-
-function converter.funcs_dynamic(func)
-	return converter.funcs(func, false)
-end
-
-function converter.funcs(func, static)
-	if func.cpponly then
-		return
-	end
-
-	if func.comments ~= nil then
-		yield("/**")
-		for _, line in ipairs(func.comments) do
-			local line = line:gsub("@remarks", "Remarks:")
-			line = line:gsub("@remark", "Remarks:")
-			line = line:gsub("@(%l)(%l+)", function(a, b) return a:upper()..b..":" end)
-			yield(" * " .. line)
-		end
-
-		local hasParamsComments = false
-		for _, arg in ipairs(func.args) do
-			if arg.comment ~= nil then
-				hasParamsComments = true
-				break
-			end
-		end
-
-		if hasParamsComments then
-			yield(" * Params:")
-		end
-
-		for _, arg in ipairs(func.args) do
-			if arg.comment ~= nil then
-				yield(" * " .. convert_name(arg.name) .. " = " .. arg.comment[1])
-				for i, comment in ipairs(arg.comment) do
-					if (i > 1) then
-						yield(" * " .. comment)
-					end
-				end
-			end
-		end
-
-		yield(" */")
-	end
-
-	local args = {}
-	if func.this ~= nil then
-		args[1] = convert_type(func.this_type) .. " _this"
-	end
-	for _, arg in ipairs(func.args) do
-		table.insert(args, convert_type(arg) .. " " .. convert_name(arg.name))
-	end
-
-	if static then
-		yield(convert_ret_type(func.ret) .. " bgfx_" .. func.cname .. "(" .. table.concat(args, ", ") .. ");")
-	else
-		yield("alias da_bgfx_" .. func.cname .. " = " .. convert_ret_type(func.ret) .. " function(" .. table.concat(args, ", ") .. ");")
-		yield("da_bgfx_" .. func.cname .. " bgfx_" .. func.cname .. ";")
-	end
-end
-
--- printtable("idl types", idl.types)
--- printtable("idl funcs", idl.funcs)
-
-function gen.write(codes, outputfile)
-	local out = assert(io.open(outputfile, "wb"))
-	out:write(codes)
-	out:close()
-	print("Generating: " .. outputfile)
-end
-
-if (...) == nil then
-	-- run `lua bindings-d.lua` in command line
-	print(gen.gen_types())
-	print(gen.gen_funcs())
-end
-
-return gen

+ 0 - 55
3rdparty/bgfx/scripts/build.ninja

@@ -1,55 +0,0 @@
-builddir  = ../.build
-
-rule geometryc_pack_normal
-    command = geometryc -f $in -o $out --packnormal 1
-    description = Converting geometry $in...
-
-rule geometryc_pack_normal_compressed
-    command = geometryc -f $in -o $out --packnormal 1 -c
-    description = Converting geometry $in...
-
-rule geometryc_pack_normal_barycentric
-    command = geometryc -f $in -o $out --packnormal 1 --barycentric
-    description = Converting geometry $in...
-
-rule texturec_bc1
-    command = texturec -f $in -o $out -t bc1 -m
-
-rule texturec_bc2
-    command = texturec -f $in -o $out -t bc2 -m
-
-rule texturec_bc3
-    command = texturec -f $in -o $out -t bc3 -m
-
-rule texturec_bc4
-    command = texturec -f $in -o $out -t bc4 -m
-
-rule texturec_bc5
-    command = texturec -f $in -o $out -t bc5 -m
-
-rule texturec_bc7
-    command = texturec -f $in -o $out -t bc7 -m
-
-rule texturec_etc1
-    command = texturec -f $in -o $out -t etc1 -m
-
-rule texturec_etc2
-    command = texturec -f $in -o $out -t etc2 -m
-
-rule texturec_diffuse
-    command = texturec -f $in -o $out -t bc2 -m
-
-rule texturec_normal
-    command = texturec -f $in -o $out -t bc5 -m -n
-
-rule texturec_height
-    command = texturec -f $in -o $out -t r8
-
-rule texturec_equirect
-    command = texturec -f $in -o $out --max 512 -t rgba16f --equirect
-
-pwd = ../examples/assets/meshes
-subninja ../examples/assets/meshes/meshes.ninja
-
-pwd = ../examples/assets/textures
-subninja ../examples/assets/textures/textures.ninja

+ 0 - 994
3rdparty/bgfx/scripts/codegen.lua

@@ -1,994 +0,0 @@
--- Copyright 2019 云风 https://github.com/cloudwu . All rights reserved.
--- License (the same with bgfx) : https://github.com/bkaradzic/bgfx/blob/master/LICENSE
-
-local codegen = {}
-
-local NAMEALIGN = 20
-
-local function namealign(name, align)
-	align = align or NAMEALIGN
-	return string.rep(" ", align - #name)
-end
-
-local function camelcase_to_underscorecase(name)
-	local tmp = {}
-	for v in name:gmatch "[%u%d]+%l*" do
-		tmp[#tmp+1] = v:lower()
-	end
-	return table.concat(tmp, "_")
-end
-
-local function to_underscorecase(name)
-	local tmp = {}
-	for v in name:gmatch "[_%u][%l%d]*" do
-		if v:byte() == 95 then	-- '_'
-			v = v:sub(2)	-- remove _
-		end
-		tmp[#tmp+1] = v
-	end
-	return table.concat(tmp, "_")
-end
-
-local function underscorecase_to_camelcase(name)
-	local tmp = {}
-	for v in name:gmatch "[^_]+" do
-		tmp[#tmp+1] = v:sub(1,1):upper() .. v:sub(2)
-	end
-	return table.concat(tmp)
-end
-
-local function convert_funcname(name)
-	name = name:gsub("^%l", string.upper)	-- Change to upper CamlCase
-	return camelcase_to_underscorecase(name)
-end
-
-local function convert_arg(all_types, arg, namespace)
-	local fulltype, array = arg.fulltype:match "(.-)%s*(%[%s*[%d%a_:]*%s*%])"
-	if array then
-		arg.fulltype = fulltype
-		arg.array = array
-		local enum, value = array:match "%[%s*([%a%d]+)::([%a%d]+)%]"
-		if enum then
-			local typedef = all_types[ enum .. "::Enum" ]
-			if typedef == nil then
-				error ("Unknown Enum " .. enum)
-			end
-			arg.carray = "[BGFX_" .. camelcase_to_underscorecase(enum):upper() .. "_" .. value:upper() .. "]"
-		end
-	end
-	local t, postfix = arg.fulltype:match "(%a[%a%d_:]*)%s*([*&]+)%s*$"
-	if t then
-		arg.type = t
-		if postfix == "&" then
-			arg.ref = true
-		end
-	else
-		local prefix, t = arg.fulltype:match "^%s*(%a+)%s+(%S+)"
-		if prefix then
-			arg.type = t
-		else
-			arg.type = arg.fulltype
-		end
-	end
-	local ctype
-	local substruct = namespace.substruct
-	if substruct then
-		ctype = substruct[arg.type]
-	end
-	if not ctype then
-		ctype = all_types[arg.type]
-	end
-	if not ctype then
-		error ("Undefined type " .. arg.fulltype .. " in " .. namespace.name)
-	end
-	arg.ctype = arg.fulltype:gsub(arg.type, ctype.cname):gsub("&", "*")
-	if ctype.cname ~= arg.type then
-		arg.cpptype = arg.fulltype:gsub(arg.type, "bgfx::"..arg.type)
-	else
-		arg.cpptype = arg.fulltype
-	end
-	if arg.ref then
-		arg.ptype = arg.cpptype:gsub("&", "*")
-	end
-end
-
-local function alternative_name(name)
-	if name:sub(1,1) == "_" then
-		return name:sub(2)
-	else
-		return name .. "_"
-	end
-end
-
-local function gen_arg_conversion(all_types, arg)
-	if arg.ctype == arg.fulltype then
-		-- do not need conversion
-		return
-	end
-	local ctype = all_types[arg.type]
-	if ctype.handle and arg.type == arg.fulltype then
-		local aname = alternative_name(arg.name)
-		arg.aname = aname .. ".cpp"
-		arg.aname_cpp2c = aname .. ".c"
-		arg.conversion = string.format(
-			"union { %s c; bgfx::%s cpp; } %s = { %s };" ,
-			ctype.cname, arg.type, aname, arg.name)
-		arg.conversion_back = string.format(
-			"union { bgfx::%s cpp; %s c; } %s = { %s };" ,
-			arg.type, ctype.cname, aname, arg.name)
-	elseif arg.ref then
-		if ctype.cname == arg.type then
-			arg.aname = "*" .. arg.name
-			arg.aname_cpp2c = "&" .. arg.name
-		elseif arg.out and ctype.enum then
-			local aname = alternative_name(arg.name)
-			local cpptype = arg.cpptype:match "(.-)%s*&"	-- remove &
-			local c99type = arg.ctype:match "(.-)%s*%*"	-- remove *
-			arg.aname = aname
-			arg.aname_cpp2c = "&" .. aname
-			arg.conversion = string.format("%s %s;", cpptype, aname)
-			arg.conversion_back = string.format("%s %s;", c99type, aname);
-			arg.out_conversion = string.format("*%s = (%s)%s;", arg.name, ctype.cname, aname)
-			arg.out_conversion_back = string.format("%s = (%s)%s;", arg.name, c99type, aname)
-		else
-			arg.aname = alternative_name(arg.name)
-			arg.aname_cpp2c = string.format("(%s)&%s" , arg.ctype , arg.name)
-			arg.conversion = string.format(
-				"%s %s = *(%s)%s;",
-				arg.cpptype, arg.aname, arg.ptype, arg.name)
-		end
-	else
-		local cpptype = arg.cpptype
-		local ctype = arg.ctype
-		if arg.array then
-			cpptype = cpptype .. "*"
-			ctype = ctype .. "*"
-		end
-		arg.aname = string.format(
-			"(%s)%s",
-			cpptype, arg.name)
-		arg.aname_cpp2c = string.format(
-			"(%s)%s",
-			ctype, arg.name)
-	end
-end
-
-local function gen_ret_conversion(all_types, func)
-	local postfix = { func.vararg and "va_end(argList);" }
-	local postfix_cpp2c = { postfix[1] }
-	func.ret_postfix = postfix
-	func.ret_postfix_cpp2c = postfix_cpp2c
-
-	for _, arg in ipairs(func.args) do
-		if arg.out_conversion then
-			postfix[#postfix+1] = arg.out_conversion
-			postfix_cpp2c[#postfix_cpp2c+1] = arg.out_conversion_back
-		end
-	end
-
-	local ctype = all_types[func.ret.type]
-	if ctype.handle then
-		func.ret_conversion = string.format(
-			"union { %s c; bgfx::%s cpp; } handle_ret;" ,
-			ctype.cname, ctype.name)
-		func.ret_conversion_cpp2c = string.format(
-			"union { bgfx::%s cpp; %s c; } handle_ret;" ,
-			ctype.name, ctype.cname)
-		func.ret_prefix = "handle_ret.cpp = "
-		func.ret_prefix_cpp2c = "handle_ret.c = "
-		postfix[#postfix+1] = "return handle_ret.c;"
-		postfix_cpp2c[#postfix_cpp2c+1] = "return handle_ret.cpp;"
-	elseif func.ret.fulltype ~= "void" then
-		local ctype_conversion = ""
-		local conversion_back = ""
-		if ctype.name ~= ctype.cname then
-			if func.ret.ref then
-				ctype_conversion =  "(" ..  func.ret.ctype .. ")&"
-				conversion_back = "*(" ..  func.ret.ptype .. ")"
-			else
-				ctype_conversion = "(" ..  func.ret.ctype .. ")"
-				conversion_back = "(" ..  func.ret.cpptype .. ")"
-			end
-		end
-		if #postfix > 0 then
-			func.ret_prefix = string.format("%s retValue = %s", func.ret.ctype , ctype_conversion)
-			func.ret_prefix_cpp2c = string.format("%s retValue = %s", func.ret.cpptype , conversion_back)
-			local ret = "return retValue;"
-			postfix[#postfix+1] = ret
-			postfix_cpp2c[#postfix_cpp2c+1] = ret
-		else
-			func.ret_prefix = string.format("return %s", ctype_conversion)
-			func.ret_prefix_cpp2c = string.format("return %s", conversion_back)
-		end
-	end
-end
-
-local function convert_vararg(v)
-	if v.vararg then
-		local args = v.args
-		local vararg = {
-			name = "",
-			fulltype = "...",
-			type = "...",
-			ctype = "...",
-			aname = "argList",
-			conversion = string.format(
-				"va_list argList;\n\tva_start(argList, %s);",
-				args[#args].name),
-		}
-		args[#args + 1] = vararg
-		v.alter_name = v.vararg
-	end
-end
-
-local function calc_flag_values(flag)
-	local shift = flag.shift
-	local base = flag.base or 0
-	local cap = 1 << (flag.range or 0)
-
-	if flag.range then
-		if flag.range == 64 then
-			flag.mask = 0xffffffffffffffff
-		else
-			flag.mask = ((1 << flag.range) - 1) << shift
-		end
-	end
-
-	local values = {}
-	for index, item in ipairs(flag.flag) do
-		local value = item.value
-		if flag.const then
-			-- use value directly
-		elseif shift then
-			if value then
-				if value > 0 then
-					value = value - 1
-				end
-			else
-				value = index + base - 1
-			end
-			if value >= cap then
-				error (string.format("Out of range for %s.%s (%d/%d)", flag.name, item.name, value, cap))
-			end
-			value = value << shift
-		elseif #item == 0 then
-			if value then
-				if value > 0 then
-					value = 1 << (value - 1)
-				end
-			else
-				local s = index + base - 2
-				if s >= 0 then
-					value = 1 << s
-				else
-					value = 0
-				end
-			end
-		end
-		if not value then
-			-- It's a combine flags
-			value = 0
-			for _, name in ipairs(item) do
-				local v = values[name]
-				if v then
-					value = value | v
-				else
-					-- todo : it's a undefined flag
-					value = nil
-					break
-				end
-			end
-		end
-		item.value = value
-		values[item.name] = value
-	end
-end
-
-function codegen.nameconversion(all_types, all_funcs)
-	for _,v in ipairs(all_types) do
-		local name = v.name
-		local cname = v.cname
-		if cname == nil then
-			if name:match "^%u" then
-				cname = camelcase_to_underscorecase(name)
-			elseif not v.flag then
-				v.cname = name
-			end
-		end
-		if cname and not v.flag then
-			if v.namespace then
-				cname = camelcase_to_underscorecase(v.namespace) .. "_" .. cname
-			end
-			v.cname = "bgfx_".. cname .. "_t"
-		end
-		if v.enum then
-			v.typename = v.name
-			v.name = v.name .. "::Enum"
-		end
-		if v.flag then
-			calc_flag_values(v)
-		end
-	end
-
-	-- make index
-	for _,v in ipairs(all_types) do
-		if not v.namespace then
-			if all_types[v.name] then
-				error ("Duplicate type " .. v.name)
-			elseif not v.flag then
-				all_types[v.name] = v
-			end
-		end
-	end
-
-	-- make sub struct index
-	for _,v in ipairs(all_types) do
-		if v.namespace then
-			local super = all_types[v.namespace]
-			if not super then
-				error ("Define " .. v.namespace .. " first")
-			end
-			local substruct = super.substruct
-			if not substruct then
-				substruct = {}
-				super.substruct = substruct
-			end
-			if substruct[v.name] then
-				error ( "Duplicate sub struct " .. v.name .. " in " .. v.namespace)
-			end
-			v.parent_class = super
-			substruct[#substruct+1] = v
-			substruct[v.name] = v
-		end
-	end
-
-	for _,v in ipairs(all_types) do
-		if v.struct then
-			for _, item in ipairs(v.struct) do
-				convert_arg(all_types, item, v)
-			end
-		elseif v.args then
-			-- funcptr
-			for _, arg in ipairs(v.args) do
-				convert_arg(all_types, arg, v)
-			end
-			convert_vararg(v)
-			convert_arg(all_types, v.ret, v)
-		end
-	end
-
-	local funcs = {}
-	local funcs_conly = {}
-	local funcs_alter = {}
-
-	for _,v in ipairs(all_funcs) do
-		if v.cname == nil then
-			v.cname = convert_funcname(v.name)
-		end
-		if v.class then
-			v.cname = convert_funcname(v.class) .. "_" .. v.cname
-			local classtype = all_types[v.class]
-			if classtype then
-				local methods = classtype.methods
-				if not methods then
-					methods = {}
-					classtype.methods = methods
-				end
-				methods[#methods+1] = v
-			end
-		elseif not v.conly then
-			funcs[v.name] = v
-		end
-
-		if v.conly then
-			table.insert(funcs_conly, v)
-		end
-
-		for _, arg in ipairs(v.args) do
-			convert_arg(all_types, arg, v)
-			gen_arg_conversion(all_types, arg)
-		end
-		convert_vararg(v)
-		if v.alter_name then
-			funcs_alter[#funcs_alter+1] = v
-		end
-		convert_arg(all_types, v.ret, v)
-		gen_ret_conversion(all_types, v)
-		local namespace = v.class
-		if namespace then
-			local classname = namespace
-			if v.const then
-				classname = "const " .. classname
-			end
-			local classtype = { fulltype = classname .. "*" }
-			convert_arg(all_types, classtype, v)
-			v.this = classtype.ctype
-			v.this_type = classtype
-			v.this_conversion = string.format( "%s This = (%s)_this;", classtype.cpptype, classtype.cpptype)
-			v.this_to_c = string.format("(%s)this", classtype.ctype)
-		end
-	end
-
-	for _, v in ipairs(funcs_conly) do
-		local func = funcs[v.name]
-		if func then
-			func.multicfunc = func.multicfunc or { func.cname }
-			table.insert(func.multicfunc, v.cname)
-		end
-	end
-
-	for _, v in ipairs(funcs_alter) do
-		local func = funcs[v.alter_name]
-		v.alter_cname = func.cname
-	end
-end
-
-local function lines(tbl)
-	if not tbl or #tbl == 0 then
-		return "//EMPTYLINE"
-	else
-		return table.concat(tbl, "\n\t")
-	end
-end
-
-local function remove_emptylines(txt)
-	return (txt:gsub("\t//EMPTYLINE\n", ""))
-end
-
-local function codetemp(func)
-	local conversion = {}
-	local conversion_c2cpp = {}
-	local args = {}
-	local cargs = {}
-	local callargs_conversion = {}
-	local callargs_conversion_back = {}
-	local callargs = {}
-	local cppfunc
-	local classname
-
-	if func.class then
-		-- It's a member function
-		cargs[1] = func.this  .. " _this"
-		conversion[1] = func.this_conversion
-		cppfunc = "This->" .. func.name
-		callargs[1] = "_this"
-		callargs_conversion_back[1] = func.this_to_c
-		classname = func.class .. "::"
-	else
-		cppfunc = "bgfx::" .. tostring(func.alter_name or func.name)
-		classname = ""
-	end
-	for _, arg in ipairs(func.args) do
-		conversion[#conversion+1] = arg.conversion
-		conversion_c2cpp[#conversion_c2cpp+1] = arg.conversion_back
-		local cname = arg.ctype .. " " .. arg.name
-		if arg.array then
-			cname = cname .. (arg.carray or arg.array)
-		end
-		local name = arg.fulltype .. " " .. arg.name
-		if arg.array then
-			name = name .. arg.array
-		end
-		if arg.default ~= nil then
-			name = name .. " = " .. tostring(arg.default)
-		end
-		cargs[#cargs+1] = cname
-		args[#args+1] = name
-		callargs_conversion[#callargs_conversion+1] = arg.aname or arg.name
-		callargs_conversion_back[#callargs_conversion_back+1] = arg.aname_cpp2c or arg.name
-		callargs[#callargs+1] = arg.name
-	end
-	conversion[#conversion+1] = func.ret_conversion
-	conversion_c2cpp[#conversion_c2cpp+1] = func.ret_conversion_cpp2c
-
-	local ARGS
-	local args_n = #args
-	if args_n == 0 then
-		ARGS = ""
-	elseif args_n == 1 then
-		ARGS = args[1]
-	else
-		ARGS = "\n\t  " .. table.concat(args, "\n\t, ") .. "\n\t"
-	end
-
-	local preret_c2c
-	local postret_c2c = {}
-	local conversion_c2c = {}
-	local callfunc_c2c
-
-	if func.vararg then
-		postret_c2c[1] = "va_end(argList);"
-		local vararg = func.args[#func.args]
-		callargs[#callargs] = vararg.aname
-		callargs_conversion_back[#callargs_conversion_back] = vararg.aname
-		conversion_c2c[1] = vararg.conversion
-		conversion_c2cpp[1] = vararg.conversion
-
-		if func.ret.fulltype == "void" then
-			preret_c2c = ""
-		else
-			preret_c2c = func.ret.ctype .. " retValue = "
-			postret_c2c[#postret_c2c+1] = "return retValue;"
-		end
-		callfunc_c2c = func.alter_cname or func.cname
-	else
-		if func.ret.fulltype == "void" then
-			preret_c2c = ""
-		else
-			preret_c2c = "return "
-		end
-		callfunc_c2c = func.cname
-	end
-
-	outCargs = table.concat(cargs, ", ")
-	if outCargs == "" then
-		outCargs = "void"
-	end
-
-	return {
-		RET = func.ret.fulltype,
-		CRET = func.ret.ctype,
-		CFUNCNAME = func.cname,
-		CFUNCNAMEUPPER = func.cname:upper(),
-		CFUNCNAMECAML = underscorecase_to_camelcase(func.cname),
-		FUNCNAME = func.name,
-		CARGS = outCargs,
-		CPPARGS = table.concat(args, ", "),
-		ARGS = ARGS,
-		CONVERSION = lines(conversion),
-		CONVERSIONCTOC = lines(conversion_c2c),
-		CONVERSIONCTOCPP = lines(conversion_c2cpp),
-		PRERET = func.ret_prefix or "",
-		PRERETCPPTOC = func.ret_prefix_cpp2c or "",
-		CPPFUNC = cppfunc,
-		CALLFUNCCTOC = callfunc_c2c,
-		CALLARGSCTOCPP = table.concat(callargs_conversion, ", "),
-		CALLARGSCPPTOC = table.concat(callargs_conversion_back, ", "),
-		CALLARGS = table.concat(callargs, ", "),
-		POSTRET = lines(func.ret_postfix),
-		POSTRETCPPTOC = lines(func.ret_postfix_cpp2c),
-		PRERETCTOC = preret_c2c,
-		POSTRETCTOC = lines(postret_c2c),
-		CLASSNAME = classname,
-		CONST = func.const and " const" or "",
-	}
-end
-
-local function apply_template(func, temp)
-	func.codetemp = func.codetemp or codetemp(func)
-	return (temp:gsub("$(%u+)", func.codetemp))
-end
-
-function codegen.apply_functemp(func, temp)
-		return remove_emptylines(apply_template(func, temp))
-end
-
-function codegen.gen_funcptr(funcptr)
-	return apply_template(funcptr, "typedef $RET (*$FUNCNAME)($ARGS);")
-end
-
-function codegen.gen_cfuncptr(funcptr)
-	return apply_template(funcptr, "typedef $CRET (*$CFUNCNAME)($CARGS);")
-end
-
-local function doxygen_funcret(r, func, prefix)
-	if not func or func.ret.fulltype == "void" or func.ret.comment == nil then
-		return
-	end
-	r[#r+1] = prefix
-	r[#r+1] = string.format("%s @returns %s", prefix, func.ret.comment[1])
-	for i = 2,#func.ret.comment do
-		r[#r+1] = string.format("%s  %s", prefix, func.ret.comment[i])
-	end
-	return r
-end
-
-local function doxygen_func(r, func, prefix)
-	if not func or not func.args or #func.args == 0 then
-		return
-	end
-	r[#r+1] = prefix
-	for _, arg in ipairs(func.args) do
-		local inout
-		if arg.out then
-			inout = "out"
-		elseif arg.inout then
-			inout = "inout"
-		else
-			inout = "in"
-		end
-		local comment = string.format("%s @param[%s] %s", prefix, inout, arg.name)
-		if arg.comment then
-			r[#r+1] = comment .. " " .. arg.comment[1]
-			for i = 2,#arg.comment do
-				r[#r+1] = string.format("%s  %s", prefix, arg.comment[i])
-			end
-		else
-			r[#r+1] = comment
-		end
-	end
-	doxygen_funcret(r, func, prefix)
-	return r
-end
-
-function codegen.doxygen_type(doxygen, func, cname)
-	if doxygen == nil then
-		return
-	end
-	local result = {}
-	for _, line in ipairs(doxygen) do
-		result[#result+1] = "/// " .. line
-	end
-	doxygen_func(result, func, "///")
-	if cname then
-		result[#result+1] = "///"
-		if type(cname) == "string" then
-			result[#result+1] = string.format("/// @attention C99 equivalent is `%s`.", cname)
-		else
-			local names = {}
-			for _, v in ipairs(cname) do
-				names[#names+1] = "`" .. v .. "`"
-			end
-			result[#result+1] = string.format("/// @attention C99 equivalent are %s.", table.concat(names, ","))
-		end
-	end
-	result[#result+1] = "///"
-	return table.concat(result, "\n")
-end
-
-function codegen.doxygen_ctype(doxygen, func)
-	if doxygen == nil then
-		return
-	end
-	local result = {
-		"/**",
-	}
-	for _, line in ipairs(doxygen) do
-		result[#result+1] = " * " .. line
-	end
-	doxygen_func(result, func, " *")
-	result[#result+1] = " *"
-	result[#result+1] = " */"
-	return table.concat(result, "\n")
-end
-
-local enum_temp = [[
-struct $NAME
-{
-	$COMMENT
-	enum Enum
-	{
-		$ITEMS
-
-		Count
-	};
-};
-]]
-
-function codegen.gen_enum_define(enum)
-	assert(type(enum.enum) == "table", "Not an enum")
-	local items = {}
-	for _, item in ipairs(enum.enum) do
-		local text
-		if not item.comment then
-			text = item.name .. ","
-		else
-			local comment = table.concat(item.comment, " ")
-			text = string.format("%s,%s //!< %s",
-				item.name, namealign(item.name), comment)
-		end
-		items[#items+1] = text
-	end
-	local comment = ""
-	if enum.comment then
-		comment = "/// " .. enum.comment
-	end
-	local temp = {
-		NAME = enum.typename,
-		COMMENT = comment,
-		ITEMS = table.concat(items, "\n\t\t"),
-	}
-	return (enum_temp:gsub("$(%u+)", temp))
-end
-
-local cenum_temp = [[
-typedef enum $NAME
-{
-	$ITEMS
-
-	$COUNT
-
-} $NAME_t;
-]]
-function codegen.gen_enum_cdefine(enum)
-	assert(type(enum.enum) == "table", "Not an enum")
-	local cname = enum.cname:match "(.-)_t$"
-	local uname = cname:upper()
-	local items = {}
-	for index , item in ipairs(enum.enum) do
-		local comment = ""
-		if item.comment then
-			comment = table.concat(item.comment, " ")
-		end
-		local ename = item.cname
-		if not ename then
-			if enum.underscore then
-				ename = camelcase_to_underscorecase(item.name)
-			else
-				ename = item.name
-			end
-			ename = ename:upper()
-		end
-		local name = uname .. "_" .. ename
-		items[#items+1] = string.format("%s,%s /** (%2d) %s%s */",
-			name,
-			namealign(name, 40),
-			index - 1,
-			comment,
-			namealign(comment, 30))
-	end
-
-	local temp = {
-		NAME = cname,
-		COUNT = uname .. "_COUNT",
-		ITEMS = table.concat(items, "\n\t"),
-	}
-
-	return (cenum_temp:gsub("$(%u+)", temp))
-end
-
-local function flag_format(flag)
-	if not flag.format then
-		flag.format = "%0" .. (flag.bits // 4) .. "x"
-	end
-end
-
-function codegen.gen_flag_cdefine(flag)
-	assert(type(flag.flag) == "table", "Not a flag")
-	flag_format(flag)
-	local cname = "BGFX_" .. (flag.cname or to_underscorecase(flag.name):upper())
-	local s = {}
-	local shift = flag.shift
-	for index, item in ipairs(flag.flag) do
-		local name
-		if item.cname then
-			name = cname .. "_" .. item.cname
-		else
-			name = cname .. "_" .. to_underscorecase(item.name):upper()
-		end
-		local value = item.value
-
-		-- combine flags
-		if #item > 0 then
-			if item.comment then
-				for _, c in ipairs(item.comment) do
-					s[#s+1] = "/// " .. c
-				end
-			end
-			local sets = { "" }
-			for _, v in ipairs(item) do
-				sets[#sets+1] = cname .. "_" .. to_underscorecase(v):upper()
-			end
-			s[#s+1] = string.format("#define %s (0%s \\\n\t)\n", name, table.concat(sets, " \\\n\t| "))
-		else
-			local comment = ""
-			if item.comment then
-				if #item.comment > 1 then
-					for _, c in ipairs(item.comment) do
-						s[#s+1] = "/// " .. c
-					end
-				else
-					comment = " //!< " .. item.comment[1]
-				end
-			end
-			value = string.format(flag.format, value)
-			local code = string.format("#define %s %sUINT%d_C(0x%s)%s",
-				name, namealign(name, 35), flag.bits, value, comment)
-			s[#s+1] = code
-		end
-	end
-
-	local mask
-	if flag.mask then
-		mask = string.format(flag.format, flag.mask)
-		mask = string.format("UINT%d_C(0x%s)", flag.bits, mask)
-	end
-
-	if shift then
-		local name = cname .. "_SHIFT"
-		local comment = flag.desc or ""
-		local shift_align = tostring(shift)
-		shift_align = shift_align .. namealign(shift_align, #mask)
-		local comment = ""
-		if flag.desc then
-			comment = string.format(" //!< %s bit shift", flag.desc)
-		end
-		local code = string.format("#define %s %s%s%s", name, namealign(name, 35), shift_align, comment)
-		s[#s+1] = code
-	end
-	if flag.range then
-		local name = cname .. "_MASK"
-		local comment = ""
-		if flag.desc then
-			comment = string.format(" //!< %s bit mask", flag.desc)
-		end
-		local code = string.format("#define %s %s%s%s", name, namealign(name, 35), mask, comment)
-		s[#s+1] = code
-	end
-
-	if flag.helper then
-		s[#s+1] = string.format(
-			"#define %s(v) ( ( (uint%d_t)(v)<<%s )&%s)",
-			cname,
-			flag.bits,
-			(cname .. "_SHIFT"),
-			(cname .. "_MASK"))
-	end
-
-	s[#s+1] = ""
-
-	return table.concat(s, "\n")
-end
-
-local function text_with_comments(items, item, cstyle, is_classmember)
-	local name = item.name
-	if item.array then
-		if cstyle then
-			name = name .. (item.carray or item.array)
-		else
-			name = name .. item.array
-		end
-	end
-	local typename
-	if cstyle then
-		typename = item.ctype
-	else
-		typename = item.fulltype
-	end
-	if is_classmember then
-		name = "m_" .. name
-	end
-	local text = string.format("%s%s %s;", typename, namealign(typename), name)
-	if item.comment then
-		if #item.comment > 1 then
-			table.insert(items, "")
-			if cstyle then
-				table.insert(items, "/**")
-				for _, c in ipairs(item.comment) do
-					table.insert(items, " * " .. c)
-				end
-				table.insert(items, " */")
-			else
-				for _, c in ipairs(item.comment) do
-					table.insert(items, "/// " .. c)
-				end
-			end
-		else
-			text = string.format(
-				cstyle and "%s %s/** %s%s */" or "%s %s//!< %s",
-				text, namealign(text, 40),  item.comment[1], namealign(item.comment[1], 40))
-		end
-	end
-	items[#items+1] = text
-end
-
-local struct_temp = [[
-struct $NAME
-{
-	$METHODS
-	$SUBSTRUCTS
-	$ITEMS
-};
-]]
-
-function codegen.gen_struct_define(struct, methods)
-	assert(type(struct.struct) == "table", "Not a struct")
-	local items = {}
-	for _, item in ipairs(struct.struct) do
-		text_with_comments(items, item, false, methods ~= nil and not struct.shortname)
-	end
-	local ctor = {}
-	if struct.ctor then
-		ctor[1] = struct.name .. "();"
-		ctor[2] = ""
-	end
-	if methods then
-		for _, m in ipairs(methods) do
-			if m:sub(-1) ~= "\n" then
-				m = m .. "\n"
-			end
-			for line in m:gmatch "(.-)\n" do
-				ctor[#ctor+1] = line
-			end
-			ctor[#ctor+1] = ""
-		end
-	end
-	local subs = {}
-	if struct.substruct then
-		for _, v in ipairs(struct.substruct) do
-			local s = codegen.gen_struct_define(v)
-			s = s:gsub("\n", "\n\t")
-			subs[#subs+1] = s
-		end
-	end
-
-	local temp = {
-		NAME = struct.name,
-		SUBSTRUCTS = lines(subs),
-		ITEMS = table.concat(items, "\n\t"),
-		METHODS = lines(ctor),
-	}
-	return remove_emptylines(struct_temp:gsub("$(%u+)", temp))
-end
-
-local cstruct_temp = [[
-typedef struct $NAME_s
-{
-	$ITEMS
-
-} $NAME_t;
-]]
-local cstruct_empty_temp = [[
-struct $NAME_s;
-typedef struct $NAME_s $NAME_t;
-]]
-function codegen.gen_struct_cdefine(struct)
-	assert(type(struct.struct) == "table", "Not a struct")
-	local cname = struct.cname:match "(.-)_t$"
-	local items = {}
-	for _, item in ipairs(struct.struct) do
-		text_with_comments(items, item, true)
-	end
-	local temp = {
-		NAME = cname,
-		ITEMS = table.concat(items, "\n\t"),
-	}
-	local codetemp = #struct.struct == 0 and cstruct_empty_temp or cstruct_temp
-	return (codetemp:gsub("$(%u+)", temp))
-end
-
-local chandle_temp = [[
-typedef struct $NAME_s { uint16_t idx; } $NAME_t;
-]]
-function codegen.gen_chandle(handle)
-	assert(handle.handle, "Not a handle")
-	return (chandle_temp:gsub("$(%u+)", { NAME = handle.cname:match "(.-)_t$" }))
-end
-
-local handle_temp = [[
-struct $NAME { uint16_t idx; };
-inline bool isValid($NAME _handle) { return bgfx::kInvalidHandle != _handle.idx; }
-]]
-function codegen.gen_handle(handle)
-	assert(handle.handle, "Not a handle")
-	return (handle_temp:gsub("$(%u+)", { NAME = handle.name }))
-end
-
-local idl = require "idl"
-local doxygen = require "doxygen"
-local conversion
-local idlfile = {}
-
-function codegen.load(filename)
-	assert(conversion == nil, "Don't call codegen.load() after codegen.idl()")
-	assert(idlfile[filename] == nil, "Duplicate load " .. filename)
-	local source = doxygen.load(filename)
-
-	local f = assert(load(source, filename , "t", idl))
-	f()
-	idlfile[filename] = true
-end
-
-function codegen.idl(filename)
-	if conversion == nil then
-		if filename and not idlfile[filename] then
-			codegen.load(filename)
-		end
-		assert(next(idlfile), "call codegen.load() first")
-		conversion = true
-		codegen.nameconversion(idl.types, idl.funcs)
-	end
-	return idl
-end
-
-return codegen

+ 0 - 19
3rdparty/bgfx/scripts/doxygen.lua

@@ -1,19 +0,0 @@
-local doxygen = {}
-
-function doxygen.load(filename)
-	local lines = {}
-	for line in io.lines(filename) do
-		local code, comment = line:match "(.-)%-%-%-[ \t](.*)"
-		if code then
-			if code == "" then
-				line = string.format("comment [[%s]]", comment)
-			else
-				line = string.format("%s [[%s]]", code, comment)
-			end
-		end
-		lines[#lines+1] = line
-	end
-	return table.concat(lines, "\n")
-end
-
-return doxygen

+ 0 - 247
3rdparty/bgfx/scripts/idl.lua

@@ -1,247 +0,0 @@
--- Copyright 2019 云风 https://github.com/cloudwu . All rights reserved.
--- License (the same with bgfx) : https://github.com/bkaradzic/bgfx/blob/master/LICENSE
-
-local idl = {}
-
-local comments = {}
-
-function idl.comment(c)
-	comments[#comments+1] = c
-end
-
-local all_types = {}
-
-local function copy_attribs(to, from)
-	if type(from) == "table" then
-		for k, v in pairs(from) do
-			if type(k) == "number" then
-				to[v] = true
-			end
-			to[k] = v
-		end
-	else
-		to.value = from
-	end
-end
-
-local function classdef(item, def)
-	local function class(_, methodname)
-		item.class = item.name
-		item.name = methodname
-		return def
-	end
-
-	return setmetatable({} , { __index = class, __call = function(_, value) return def(value) end })
-end
-
-local function new_type(typename)
-	local t = { name = typename }
-	if #comments > 0 then
-		t.comments = comments
-		comments = {}
-	end
-	all_types[#all_types+1] = t
-	return t
-end
-
-local function typedef(_, typename)
-	local t = new_type(typename)
-
-	local function type_attrib(attrib)
-		copy_attribs(t, attrib)
-	end
-	return function(cname)
-		local typ = type(cname)
-		if typ == "table" then
-			type_attrib(cname)
-			return
-		end
-		assert(typ == "string" , "type should be a string")
-		t.cname = cname
-		return type_attrib
-	end
-end
-
-idl.typedef = setmetatable({} , { __index = typedef, __call = typedef })
-idl.types = all_types
-
-local function add_comment(item, comment)
-	-- strip space
-	comment = comment:match "(.-)%s*$"
-	if item.comment then
-		table.insert(item.comment, comment)
-	else
-		item.comment = { comment }
-	end
-end
-
-local function enumdef(what)
-	local function deffunc (_, typename)
-		local t = new_type(typename)
-		t[what] = {}
-
-		local function enum_attrib(obj, attribs)
-			copy_attribs(t, attribs)
-			return obj
-		end
-
-		local function new_enum_item(_, itemname)
-			local item = { name = itemname }
-			t[what][#t[what] + 1] = item
-			local function add_attrib_or_comment(obj , attribs)
-				if type(attribs) == "string" then
-					add_comment(item, attribs)
-				elseif attribs then
-					copy_attribs(item, attribs)
-				end
-				return obj
-			end
-			return setmetatable({}, { __index = new_enum_item, __call = add_attrib_or_comment })
-		end
-
-		return setmetatable({}, { __index = new_enum_item , __call = enum_attrib })
-	end
-
-	return setmetatable({} , { __index = deffunc , __call = deffunc })
-end
-
-idl.enum = enumdef "enum"
-idl.flag = enumdef "flag"
-
-local function structdef(_, typename)
-	local t = new_type(typename)
-	t.struct = {}
-
-	local function struct_attrib(obj, attribs)
-		copy_attribs(t, attribs)
-		return obj
-	end
-
-	local function new_struct_item(_, itemname)
-		local item = { name = itemname }
-		t.struct[#t.struct + 1] = item
-
-		local function item_attrib(obj, attribs)
-			if type(attribs) == "string" then
-				add_comment(item, attribs)
-			else
-				copy_attribs(item, attribs)
-			end
-			return obj
-		end
-
-		return function (itemtype)
-			item.fulltype = itemtype
-			return setmetatable({}, { __index = new_struct_item, __call = item_attrib })
-		end
-	end
-
-	return setmetatable({}, { __index = new_struct_item , __call = struct_attrib })
-end
-
-idl.struct = setmetatable({}, { __index = structdef , __call = structdef })
-
-local function handledef(_, typename)
-	local t = new_type(typename)
-	t.handle = true
-
-	return function (attribs)
-		copy_attribs(t, attribs)
-		return obj
-	end
-end
-
-idl.handle = setmetatable({} , { __index = handledef, __call = handledef })
-
-local all_funcs = {}
-
-local function duplicate_arg_name(_, name)
-	error ("Duplicate arg name " .. name)
-end
-
-local function attribs_setter(args, arg, args_desc)
-	local attribs_setter
-	local function arg_attrib_or_comment(_, attrib_or_comment )
-		if type(attrib_or_comment) == "string" then
-			add_comment(arg, attrib_or_comment)
-		else
-			copy_attribs(arg, attrib_or_comment)
-		end
-		return attribs_setter
-	end
-	-- next field (__index) or attrib/comment (__call)
-	attribs_setter = setmetatable( {} , {
-		__index = function(_, name)
-			return args_desc(args, name)
-		end
-		, __call = arg_attrib_or_comment } )
-	return attribs_setter
-end
-
-local function func(sets)
-	return function (_, funcname)
-		local f = { name = funcname , args = {} }
-		if #comments > 0 then
-			f.comments = comments
-			comments = {}
-		end
-		sets[#sets+1] = f
-		local args
-		local function args_desc(_, args_name)
-			args[args_name] = duplicate_arg_name
-			return function (fulltype)
-				local arg = {
-					name = "_" .. args_name,
-					fulltype = fulltype,
-				}
-				f.args[#f.args+1] = arg
-				return attribs_setter(args, arg, args_desc)
-			end
-		end
-		args = setmetatable({}, { __index = args_desc })
-		local function rettype(value)
-			assert(type(value) == "string", "Need return type")
-			local ret = { fulltype = value }
-			f.ret = ret
-			return attribs_setter(args, ret, args_desc)
-		end
-
-		local function funcdef(value)
-			if type(value) == "table" then
-				copy_attribs(f, value)
-				return rettype
-			end
-			return rettype(value)
-		end
-
-		return classdef(f, funcdef)
-	end
-end
-
-idl.funcptr = setmetatable({}, { __index = func(all_types) })
-idl.func    = setmetatable({}, { __index = func(all_funcs) })
-idl.funcs   = all_funcs
-
-function idl.version(v)
-	rawset(idl, "_version", v)
-end
-
-idl.vararg     = "vararg"
-idl.out        = "out"
-idl.inout      = "inout"
-idl.const      = "const"
-idl.ctor       = "ctor"
-idl.cfunc      = "cfunc"
-idl.underscore = "underscore"
-idl.conly      = "conly"
-idl.cpponly    = "cpponly"
-idl.shortname  = "shortname"
-idl.NULL       = "NULL"
-idl.UINT16_MAX = "UINT16_MAX"
-idl.INT32_MAX  = "INT32_MAX"
-idl.UINT32_MAX = "UINT32_MAX"
-idl.UINT8_MAX  = "UINT8_MAX"
-
-return setmetatable(idl , { __index = function (_, keyword)
-	error (tostring(keyword) .. " is invalid")
-	end})

+ 0 - 75
3rdparty/bgfx/scripts/shader-embeded.mk

@@ -1,75 +0,0 @@
-#
-# Copyright 2011-2019 Branimir Karadzic. All rights reserved.
-# License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
-#
-
-THISDIR:=$(dir $(lastword $(MAKEFILE_LIST)))
-include $(THISDIR)/tools.mk
-
-VS_FLAGS+=-i $(THISDIR)../src/ --type vertex
-FS_FLAGS+=-i $(THISDIR)../src/ --type fragment
-CS_FLAGS+=-i $(THISDIR)../src/ --type compute
-
-VS_SOURCES=$(wildcard vs_*.sc)
-FS_SOURCES=$(wildcard fs_*.sc)
-CS_SOURCES=$(wildcard cs_*.sc)
-
-VS_BIN = $(addsuffix .bin.h, $(basename $(VS_SOURCES)))
-FS_BIN = $(addsuffix .bin.h, $(basename $(FS_SOURCES)))
-CS_BIN = $(addsuffix .bin.h, $(basename $(CS_SOURCES)))
-
-BIN = $(VS_BIN) $(FS_BIN) $(CS_BIN)
-
-SHADER_TMP = $(TEMP)/tmp
-
-vs_%.bin.h : vs_%.sc
-	@echo [$(<)]
-	 $(SILENT) $(SHADERC) $(VS_FLAGS) --platform linux                  -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_glsl
-	@cat $(SHADER_TMP) > $(@)
-	-$(SILENT) $(SHADERC) $(VS_FLAGS) --platform linux   -p spirv       -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_spv
-	-@cat $(SHADER_TMP) >> $(@)
-	-$(SILENT) $(SHADERC) $(VS_FLAGS) --platform windows -p vs_3_0 -O 3 -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_dx9
-	-@cat $(SHADER_TMP) >> $(@)
-	-$(SILENT) $(SHADERC) $(VS_FLAGS) --platform windows -p vs_4_0 -O 3 -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_dx11
-	-@cat $(SHADER_TMP) >> $(@)
-	-$(SILENT) $(SHADERC) $(VS_FLAGS) --platform ios     -p metal  -O 3 -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_mtl
-	-@cat $(SHADER_TMP) >> $(@)
-	-@echo extern const uint8_t* $(basename $(<))_pssl;>> $(@)
-	-@echo extern const uint32_t $(basename $(<))_pssl_size;>> $(@)
-
-fs_%.bin.h : fs_%.sc
-	@echo [$(<)]
-	 $(SILENT) $(SHADERC) $(FS_FLAGS) --platform linux                  -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_glsl
-	@cat $(SHADER_TMP) > $(@)
-	-$(SILENT) $(SHADERC) $(FS_FLAGS) --platform linux   -p spirv       -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_spv
-	-@cat $(SHADER_TMP) >> $(@)
-	-$(SILENT) $(SHADERC) $(FS_FLAGS) --platform windows -p ps_3_0 -O 3 -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_dx9
-	-@cat $(SHADER_TMP) >> $(@)
-	-$(SILENT) $(SHADERC) $(FS_FLAGS) --platform windows -p ps_4_0 -O 3 -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_dx11
-	-@cat $(SHADER_TMP) >> $(@)
-	-$(SILENT) $(SHADERC) $(FS_FLAGS) --platform ios     -p metal  -O 3 -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_mtl
-	-@cat $(SHADER_TMP) >> $(@)
-	-@echo extern const uint8_t* $(basename $(<))_pssl;>> $(@)
-	-@echo extern const uint32_t $(basename $(<))_pssl_size;>> $(@)
-
-cs_%.bin.h : cs_%.sc
-	@echo [$(<)]
-	 $(SILENT) $(SHADERC) $(CS_FLAGS) --platform linux -p 430           -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_glsl
-	@cat $(SHADER_TMP) > $(@)
-#	-$(SILENT) $(SHADERC) $(CS_FLAGS) --platform linux   -p spirv       -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_spv
-#	-@cat $(SHADER_TMP) >> $(@)
-	-$(SILENT) $(SHADERC) $(CS_FLAGS) --platform windows -p cs_5_0 -O 1 -f $(<) -o $(SHADER_TMP) --bin2c $(basename $(<))_dx11
-	-@cat $(SHADER_TMP) >> $(@)
-	-@echo extern const uint8_t* $(basename $(<))_pssl;>> $(@)
-	-@echo extern const uint32_t $(basename $(<))_pssl_size;>> $(@)
-
-.PHONY: all
-all: $(BIN)
-
-.PHONY: clean
-clean:
-	@echo Cleaning...
-	@-rm -vf $(BIN)
-
-.PHONY: rebuild
-rebuild: clean all

+ 0 - 167
3rdparty/bgfx/scripts/shader.mk

@@ -1,167 +0,0 @@
-#
-# Copyright 2011-2019 Branimir Karadzic. All rights reserved.
-# License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
-#
-
-THISDIR:=$(dir $(lastword $(MAKEFILE_LIST)))
-include $(THISDIR)/tools.mk
-
-# Define SHADERS_DIR if your shader files are in a different dir than the makefile including this.
-# Notice: If defined, SHADERS_DIR should end with dir slash '/'.
-# Example:
-#     SHADERS_DIR=shader_files/
-
-ifndef TARGET
-.PHONY: all
-all:
-	@echo Usage: make TARGET=# [clean, all, rebuild]
-	@echo "  TARGET=0 (hlsl  - d3d9)"
-	@echo "  TARGET=1 (hlsl  - d3d11)"
-	@echo "  TARGET=2 (essl  - nacl)"
-	@echo "  TARGET=3 (essl  - android)"
-	@echo "  TARGET=4 (glsl)"
-	@echo "  TARGET=5 (metal)"
-	@echo "  TARGET=6 (pssl)"
-	@echo "  TARGET=7 (spirv)"
-
-.PHONY: rebuild
-rebuild:
-	@make -s --no-print-directory TARGET=0 clean all
-	@make -s --no-print-directory TARGET=1 clean all
-	@make -s --no-print-directory TARGET=2 clean all
-	@make -s --no-print-directory TARGET=3 clean all
-	@make -s --no-print-directory TARGET=4 clean all
-	@make -s --no-print-directory TARGET=5 clean all
-	@make -s --no-print-directory TARGET=7 clean all
-
-else
-
-ADDITIONAL_INCLUDES?=
-
-ifeq ($(TARGET), 0)
-VS_FLAGS=--platform windows -p vs_3_0 -O 3
-FS_FLAGS=--platform windows -p ps_3_0 -O 3
-SHADER_PATH=shaders/dx9
-else
-ifeq ($(TARGET), 1)
-VS_FLAGS=--platform windows -p vs_5_0 -O 3
-FS_FLAGS=--platform windows -p ps_5_0 -O 3
-CS_FLAGS=--platform windows -p cs_5_0 -O 1
-SHADER_PATH=shaders/dx11
-else
-ifeq ($(TARGET), 2)
-VS_FLAGS=--platform nacl
-FS_FLAGS=--platform nacl
-SHADER_PATH=shaders/essl
-else
-ifeq ($(TARGET), 3)
-VS_FLAGS=--platform android
-FS_FLAGS=--platform android
-CS_FLAGS=--platform android
-SHADER_PATH=shaders/essl
-else
-ifeq ($(TARGET), 4)
-VS_FLAGS=--platform linux -p 120
-FS_FLAGS=--platform linux -p 120
-CS_FLAGS=--platform linux -p 430
-SHADER_PATH=shaders/glsl
-else
-ifeq ($(TARGET), 5)
-VS_FLAGS=--platform osx -p metal
-FS_FLAGS=--platform osx -p metal
-CS_FLAGS=--platform osx -p metal
-SHADER_PATH=shaders/metal
-else
-ifeq ($(TARGET), 6)
-VS_FLAGS=--platform orbis -p pssl
-FS_FLAGS=--platform orbis -p pssl
-CS_FLAGS=--platform orbis -p pssl
-SHADER_PATH=shaders/pssl
-else
-ifeq ($(TARGET), 7)
-VS_FLAGS=--platform linux -p spirv
-FS_FLAGS=--platform linux -p spirv
-CS_FLAGS=--platform linux -p spirv
-SHADER_PATH=shaders/spirv
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-
-THISDIR := $(dir $(lastword $(MAKEFILE_LIST)))
-VS_FLAGS+=-i $(THISDIR)../src/ $(ADDITIONAL_INCLUDES)
-FS_FLAGS+=-i $(THISDIR)../src/ $(ADDITIONAL_INCLUDES)
-CS_FLAGS+=-i $(THISDIR)../src/ $(ADDITIONAL_INCLUDES)
-
-BUILD_OUTPUT_DIR=$(addprefix ./, $(RUNTIME_DIR)/$(SHADER_PATH))
-BUILD_INTERMEDIATE_DIR=$(addprefix $(BUILD_DIR)/, $(SHADER_PATH))
-
-VS_SOURCES=$(notdir $(wildcard $(addprefix $(SHADERS_DIR), vs_*.sc)))
-VS_DEPS=$(addprefix $(BUILD_INTERMEDIATE_DIR)/,$(addsuffix .bin.d, $(basename $(notdir $(VS_SOURCES)))))
-
-FS_SOURCES=$(notdir $(wildcard $(addprefix $(SHADERS_DIR), fs_*.sc)))
-FS_DEPS=$(addprefix $(BUILD_INTERMEDIATE_DIR)/,$(addsuffix .bin.d, $(basename $(notdir $(FS_SOURCES)))))
-
-CS_SOURCES=$(notdir $(wildcard $(addprefix $(SHADERS_DIR), cs_*.sc)))
-CS_DEPS=$(addprefix $(BUILD_INTERMEDIATE_DIR)/,$(addsuffix .bin.d, $(basename $(notdir $(CS_SOURCES)))))
-
-VS_BIN = $(addprefix $(BUILD_INTERMEDIATE_DIR)/, $(addsuffix .bin, $(basename $(notdir $(VS_SOURCES)))))
-FS_BIN = $(addprefix $(BUILD_INTERMEDIATE_DIR)/, $(addsuffix .bin, $(basename $(notdir $(FS_SOURCES)))))
-CS_BIN = $(addprefix $(BUILD_INTERMEDIATE_DIR)/, $(addsuffix .bin, $(basename $(notdir $(CS_SOURCES)))))
-
-BIN = $(VS_BIN) $(FS_BIN)
-ASM = $(VS_ASM) $(FS_ASM)
-
-ifeq ($(TARGET), $(filter $(TARGET),1 3 4 5 6 7))
-BIN += $(CS_BIN)
-ASM += $(CS_ASM)
-endif
-
-$(BUILD_INTERMEDIATE_DIR)/vs_%.bin: $(SHADERS_DIR)vs_%.sc
-	@echo [$(<)]
-	$(SILENT) $(SHADERC) $(VS_FLAGS) --type vertex --depends -o $(@) -f $(<) --disasm
-	$(SILENT) cp $(@) $(BUILD_OUTPUT_DIR)/$(@F)
-
-$(BUILD_INTERMEDIATE_DIR)/fs_%.bin: $(SHADERS_DIR)fs_%.sc
-	@echo [$(<)]
-	$(SILENT) $(SHADERC) $(FS_FLAGS) --type fragment --depends -o $(@) -f $(<) --disasm
-	$(SILENT) cp $(@) $(BUILD_OUTPUT_DIR)/$(@F)
-
-$(BUILD_INTERMEDIATE_DIR)/cs_%.bin: $(SHADERS_DIR)cs_%.sc
-	@echo [$(<)]
-	$(SILENT) $(SHADERC) $(CS_FLAGS) --type compute --depends -o $(@) -f $(<) --disasm
-	$(SILENT) cp $(@) $(BUILD_OUTPUT_DIR)/$(@F)
-
-.PHONY: all
-all: dirs $(BIN)
-	@echo Target $(SHADER_PATH)
-
-.PHONY: clean
-clean:
-	@echo Cleaning...
-	@-rm -vf $(BIN)
-
-.PHONY: cleanall
-cleanall:
-	@echo Cleaning...
-	@-$(call CMD_RMDIR,$(BUILD_INTERMEDIATE_DIR))
-
-.PHONY: dirs
-dirs:
-	@-$(call CMD_MKDIR,$(BUILD_INTERMEDIATE_DIR))
-	@-$(call CMD_MKDIR,$(BUILD_OUTPUT_DIR))
-
-.PHONY: rebuild
-rebuild: clean all
-
-$(BIN) : | $(BUILD_INTERMEDIATE_DIR)
-
-endif # TARGET
-
--include $(VS_DEPS)
--include $(FS_DEPS)
--include $(CS_DEPS)

+ 0 - 139
3rdparty/bgfx/scripts/temp.bgfx.h

@@ -1,139 +0,0 @@
-/*
- * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
- * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
- */
-
-/*
- *
- * AUTO GENERATED FROM IDL! DO NOT EDIT! (source : $source)
- *
- * More info about IDL:
- * https://gist.github.com/bkaradzic/05a1c86a6dd57bf86e2d828878e88dc2#bgfx-is-switching-to-idl-to-generate-api
- *
- */
-
-#ifndef BGFX_C99_H_HEADER_GUARD
-#define BGFX_C99_H_HEADER_GUARD
-
-#include <stdarg.h>  // va_list
-#include <stdbool.h> // bool
-#include <stdint.h>  // uint32_t
-#include <stdlib.h>  // size_t
-
-#include <bx/platform.h>
-
-#if !defined(BGFX_INVALID_HANDLE)
-#   define BGFX_INVALID_HANDLE { UINT16_MAX }
-#endif // !defined(BGFX_INVALID_HANDLE)
-
-#ifndef BGFX_SHARED_LIB_BUILD
-#    define BGFX_SHARED_LIB_BUILD 0
-#endif // BGFX_SHARED_LIB_BUILD
-
-#ifndef BGFX_SHARED_LIB_USE
-#    define BGFX_SHARED_LIB_USE 0
-#endif // BGFX_SHARED_LIB_USE
-
-#if BX_PLATFORM_WINDOWS
-#   define BGFX_SYMBOL_EXPORT __declspec(dllexport)
-#   define BGFX_SYMBOL_IMPORT __declspec(dllimport)
-#else
-#   define BGFX_SYMBOL_EXPORT __attribute__((visibility("default")))
-#   define BGFX_SYMBOL_IMPORT
-#endif // BX_PLATFORM_WINDOWS
-
-#if BGFX_SHARED_LIB_BUILD
-#   define BGFX_SHARED_LIB_API BGFX_SYMBOL_EXPORT
-#elif BGFX_SHARED_LIB_USE
-#   define BGFX_SHARED_LIB_API BGFX_SYMBOL_IMPORT
-#else
-#   define BGFX_SHARED_LIB_API
-#endif // BGFX_SHARED_LIB_*
-
-#if defined(__cplusplus)
-#   define BGFX_C_API extern "C" BGFX_SHARED_LIB_API
-#else
-#   define BGFX_C_API BGFX_SHARED_LIB_API
-#endif // defined(__cplusplus)
-
-#include "../defines.h"
-
-$cenums
-
-/**/
-typedef uint16_t bgfx_view_id_t;
-
-/**/
-typedef struct bgfx_allocator_interface_s
-{
-	const struct bgfx_allocator_vtbl_s* vtbl;
-
-} bgfx_allocator_interface_t;
-
-/**/
-typedef struct bgfx_allocator_vtbl_s
-{
-	void* (*realloc)(bgfx_allocator_interface_t* _this, void* _ptr, size_t _size, size_t _align, const char* _file, uint32_t _line);
-
-} bgfx_allocator_vtbl_t;
-
-/**/
-typedef struct bgfx_interface_vtbl bgfx_interface_vtbl_t;
-
-/**/
-typedef struct bgfx_callback_interface_s
-{
-	const struct bgfx_callback_vtbl_s* vtbl;
-
-} bgfx_callback_interface_t;
-
-/**/
-typedef struct bgfx_callback_vtbl_s
-{
-	void (*fatal)(bgfx_callback_interface_t* _this, const char* _filePath, uint16_t _line, bgfx_fatal_t _code, const char* _str);
-	void (*trace_vargs)(bgfx_callback_interface_t* _this, const char* _filePath, uint16_t _line, const char* _format, va_list _argList);
-	void (*profiler_begin)(bgfx_callback_interface_t* _this, const char* _name, uint32_t _abgr, const char* _filePath, uint16_t _line);
-	void (*profiler_begin_literal)(bgfx_callback_interface_t* _this, const char* _name, uint32_t _abgr, const char* _filePath, uint16_t _line);
-	void (*profiler_end)(bgfx_callback_interface_t* _this);
-	uint32_t (*cache_read_size)(bgfx_callback_interface_t* _this, uint64_t _id);
-	bool (*cache_read)(bgfx_callback_interface_t* _this, uint64_t _id, void* _data, uint32_t _size);
-	void (*cache_write)(bgfx_callback_interface_t* _this, uint64_t _id, const void* _data, uint32_t _size);
-	void (*screen_shot)(bgfx_callback_interface_t* _this, const char* _filePath, uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _data, uint32_t _size, bool _yflip);
-	void (*capture_begin)(bgfx_callback_interface_t* _this, uint32_t _width, uint32_t _height, uint32_t _pitch, bgfx_texture_format_t _format, bool _yflip);
-	void (*capture_end)(bgfx_callback_interface_t* _this);
-	void (*capture_frame)(bgfx_callback_interface_t* _this, const void* _data, uint32_t _size);
-
-} bgfx_callback_vtbl_t;
-
-$chandles
-
-#define BGFX_HANDLE_IS_VALID(h) ((h).idx != UINT16_MAX)
-
-$cfuncptrs
-
-$cstructs
-
-$c99decl
-
-/**/
-typedef enum bgfx_function_id
-{
-	$c99_functionid
-
-	BGFX_FUNCTION_ID_COUNT
-
-} bgfx_function_id_t;
-
-/**/
-struct bgfx_interface_vtbl
-{
-	$interface_struct
-};
-
-/**/
-typedef bgfx_interface_vtbl_t* (*PFN_BGFX_GET_INTERFACE)(uint32_t _version);
-
-/**/
-BGFX_C_API bgfx_interface_vtbl_t* bgfx_get_interface(uint32_t _version);
-
-#endif // BGFX_C99_H_HEADER_GUARD

+ 0 - 101
3rdparty/bgfx/scripts/temp.bgfx.idl.inl

@@ -1,101 +0,0 @@
-/*
- * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
- * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
- */
-
-/*
- *
- * AUTO GENERATED FROM IDL! DO NOT EDIT! (source : $source)
- *
- * More info about IDL:
- * https://gist.github.com/bkaradzic/05a1c86a6dd57bf86e2d828878e88dc2#bgfx-is-switching-to-idl-to-generate-api
- *
- */
-
-#define BGFX_C99_ENUM_CHECK(_enum, _c99enumcount) \
-	BX_STATIC_ASSERT(_enum::Count == _enum::Enum(_c99enumcount) )
-
-BGFX_C99_ENUM_CHECK(bgfx::Fatal,                BGFX_FATAL_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::RendererType,         BGFX_RENDERER_TYPE_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::Attrib,               BGFX_ATTRIB_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::AttribType,           BGFX_ATTRIB_TYPE_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::TextureFormat,        BGFX_TEXTURE_FORMAT_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::UniformType,          BGFX_UNIFORM_TYPE_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::BackbufferRatio,      BGFX_BACKBUFFER_RATIO_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::OcclusionQueryResult, BGFX_OCCLUSION_QUERY_RESULT_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::Topology,             BGFX_TOPOLOGY_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::TopologyConvert,      BGFX_TOPOLOGY_CONVERT_COUNT);
-BGFX_C99_ENUM_CHECK(bgfx::RenderFrame,          BGFX_RENDER_FRAME_COUNT);
-
-#undef BGFX_C99_ENUM_CHECK
-
-#define BGFX_C99_STRUCT_SIZE_CHECK(_cppstruct, _c99struct) \
-	BX_STATIC_ASSERT(sizeof(_cppstruct) == sizeof(_c99struct) )
-
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Memory,                bgfx_memory_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Transform,             bgfx_transform_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Stats,                 bgfx_stats_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::VertexLayout,          bgfx_vertex_layout_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::TransientIndexBuffer,  bgfx_transient_index_buffer_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::TransientVertexBuffer, bgfx_transient_vertex_buffer_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::InstanceDataBuffer,    bgfx_instance_data_buffer_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::TextureInfo,           bgfx_texture_info_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::UniformInfo,           bgfx_uniform_info_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Attachment,            bgfx_attachment_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Caps::GPU,             bgfx_caps_gpu_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Caps::Limits,          bgfx_caps_limits_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Caps,                  bgfx_caps_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::PlatformData,          bgfx_platform_data_t);
-BGFX_C99_STRUCT_SIZE_CHECK(bgfx::InternalData,          bgfx_internal_data_t);
-
-#undef BGFX_C99_STRUCT_SIZE_CHECK
-
-$c99
-
-/* user define functions */
-BGFX_C_API void bgfx_init_ctor(bgfx_init_t* _init)
-{
-	BX_PLACEMENT_NEW(_init, bgfx::Init);
-
-}
-
-BGFX_C_API bool bgfx_init(const bgfx_init_t * _init)
-{
-	bgfx_init_t init =*_init;
-
-	if (init.callback != NULL)
-	{
-		static bgfx::CallbackC99 s_callback;
-		s_callback.m_interface = init.callback;
-		init.callback = reinterpret_cast<bgfx_callback_interface_t*>(&s_callback);
-	}
-
-	if (init.allocator != NULL)
-	{
-		static bgfx::AllocatorC99 s_allocator;
-		s_allocator.m_interface = init.allocator;
-		init.allocator = reinterpret_cast<bgfx_allocator_interface_t*>(&s_allocator);
-	}
-
-	union { const bgfx_init_t* c; const bgfx::Init* cpp; } in;
-	in.c = &init;
-
-	return bgfx::init(*in.cpp);
-
-}
-
-/**/
-BGFX_C_API bgfx_interface_vtbl_t* bgfx_get_interface(uint32_t _version)
-{
-	if (_version == BGFX_API_VERSION)
-	{
-		static bgfx_interface_vtbl_t s_bgfx_interface =
-		{
-			$interface_import
-		};
-
-		return &s_bgfx_interface;
-	}
-
-	return NULL;
-}

+ 0 - 103
3rdparty/bgfx/scripts/temp.defines.h

@@ -1,103 +0,0 @@
-/*
- * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
- * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
- */
-
-/*
- *
- * AUTO GENERATED FROM IDL! DO NOT EDIT! (source : $source)
- *
- * More info about IDL:
- * https://gist.github.com/bkaradzic/05a1c86a6dd57bf86e2d828878e88dc2#bgfx-is-switching-to-idl-to-generate-api
- *
- */
-
-#ifndef BGFX_DEFINES_H_HEADER_GUARD
-#define BGFX_DEFINES_H_HEADER_GUARD
-
-$version
-
-$cflags
-
-/// Blend function separate.
-#define BGFX_STATE_BLEND_FUNC_SEPARATE(_srcRGB, _dstRGB, _srcA, _dstA) (UINT64_C(0) \
-	| ( ( (uint64_t)(_srcRGB)|( (uint64_t)(_dstRGB)<<4) )   )                       \
-	| ( ( (uint64_t)(_srcA  )|( (uint64_t)(_dstA  )<<4) )<<8)                       \
-	)
-
-/// Blend equation separate.
-#define BGFX_STATE_BLEND_EQUATION_SEPARATE(_equationRGB, _equationA) ( (uint64_t)(_equationRGB)|( (uint64_t)(_equationA)<<3) )
-
-/// Blend function.
-#define BGFX_STATE_BLEND_FUNC(_src, _dst)    BGFX_STATE_BLEND_FUNC_SEPARATE(_src, _dst, _src, _dst)
-
-/// Blend equation.
-#define BGFX_STATE_BLEND_EQUATION(_equation) BGFX_STATE_BLEND_EQUATION_SEPARATE(_equation, _equation)
-
-/// Utility predefined blend modes.
-
-/// Additive blending.
-#define BGFX_STATE_BLEND_ADD (0                                         \
-	| BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_ONE, BGFX_STATE_BLEND_ONE) \
-	)
-
-/// Alpha blend.
-#define BGFX_STATE_BLEND_ALPHA (0                                                       \
-	| BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA) \
-	)
-
-/// Selects darker color of blend.
-#define BGFX_STATE_BLEND_DARKEN (0                                      \
-	| BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_ONE, BGFX_STATE_BLEND_ONE) \
-	| BGFX_STATE_BLEND_EQUATION(BGFX_STATE_BLEND_EQUATION_MIN)          \
-	)
-
-/// Selects lighter color of blend.
-#define BGFX_STATE_BLEND_LIGHTEN (0                                     \
-	| BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_ONE, BGFX_STATE_BLEND_ONE) \
-	| BGFX_STATE_BLEND_EQUATION(BGFX_STATE_BLEND_EQUATION_MAX)          \
-	)
-
-/// Multiplies colors.
-#define BGFX_STATE_BLEND_MULTIPLY (0                                           \
-	| BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_DST_COLOR, BGFX_STATE_BLEND_ZERO) \
-	)
-
-/// Opaque pixels will cover the pixels directly below them without any math or algorithm applied to them.
-#define BGFX_STATE_BLEND_NORMAL (0                                                \
-	| BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_ONE, BGFX_STATE_BLEND_INV_SRC_ALPHA) \
-	)
-
-/// Multiplies the inverse of the blend and base colors.
-#define BGFX_STATE_BLEND_SCREEN (0                                                \
-	| BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_ONE, BGFX_STATE_BLEND_INV_SRC_COLOR) \
-	)
-
-/// Decreases the brightness of the base color based on the value of the blend color.
-#define BGFX_STATE_BLEND_LINEAR_BURN (0                                                 \
-	| BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_DST_COLOR, BGFX_STATE_BLEND_INV_DST_COLOR) \
-	| BGFX_STATE_BLEND_EQUATION(BGFX_STATE_BLEND_EQUATION_SUB)                          \
-	)
-
-///
-#define BGFX_STATE_BLEND_FUNC_RT_x(_src, _dst) (0         \
-	| ( (uint32_t)( (_src)>>BGFX_STATE_BLEND_SHIFT)       \
-	| ( (uint32_t)( (_dst)>>BGFX_STATE_BLEND_SHIFT)<<4) ) \
-	)
-
-///
-#define BGFX_STATE_BLEND_FUNC_RT_xE(_src, _dst, _equation) (0         \
-	| BGFX_STATE_BLEND_FUNC_RT_x(_src, _dst)                          \
-	| ( (uint32_t)( (_equation)>>BGFX_STATE_BLEND_EQUATION_SHIFT)<<8) \
-	)
-
-#define BGFX_STATE_BLEND_FUNC_RT_1(_src, _dst)  (BGFX_STATE_BLEND_FUNC_RT_x(_src, _dst)<< 0)
-#define BGFX_STATE_BLEND_FUNC_RT_2(_src, _dst)  (BGFX_STATE_BLEND_FUNC_RT_x(_src, _dst)<<11)
-#define BGFX_STATE_BLEND_FUNC_RT_3(_src, _dst)  (BGFX_STATE_BLEND_FUNC_RT_x(_src, _dst)<<22)
-
-#define BGFX_STATE_BLEND_FUNC_RT_1E(_src, _dst, _equation) (BGFX_STATE_BLEND_FUNC_RT_xE(_src, _dst, _equation)<< 0)
-#define BGFX_STATE_BLEND_FUNC_RT_2E(_src, _dst, _equation) (BGFX_STATE_BLEND_FUNC_RT_xE(_src, _dst, _equation)<<11)
-#define BGFX_STATE_BLEND_FUNC_RT_3E(_src, _dst, _equation) (BGFX_STATE_BLEND_FUNC_RT_xE(_src, _dst, _equation)<<22)
-
-
-#endif // BGFX_DEFINES_H_HEADER_GUARD

+ 0 - 27
3rdparty/bgfx/scripts/tools.mk

@@ -1,27 +0,0 @@
-#
-# Copyright 2011-2019 Branimir Karadzic. All rights reserved.
-# License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
-#
-
-SILENT?=@
-
-THISDIR:=$(dir $(lastword $(MAKEFILE_LIST)))
-
-UNAME:=$(shell uname)
-ifeq ($(UNAME),$(filter $(UNAME),Linux Darwin))
-CMD_MKDIR=mkdir -p "$(1)"
-CMD_RMDIR=rm -r "$(1)"
-ifeq ($(UNAME),$(filter $(UNAME),Darwin))
-OS=darwin
-else
-OS=linux
-endif
-else
-CMD_MKDIR=cmd /C "if not exist "$(subst /,\,$(1))" mkdir "$(subst /,\,$(1))""
-CMD_RMDIR=cmd /C "if exist "$(subst /,\,$(1))" rmdir /S /Q "$(subst /,\,$(1))""
-OS=windows
-endif
-
-SHADERC:="$(THISDIR)../tools/bin/$(OS)/shaderc"
-GEOMETRYC:="$(THISDIR)../tools/bin/$(OS)/geometryc"
-TEXTUREC:="$(THISDIR)../tools/bin/$(OS)/texturec"

+ 11 - 1
3rdparty/bgfx/src/renderer_mtl.h

@@ -968,7 +968,10 @@ namespace bgfx { namespace mtl
 
 		void destroy()
 		{
-			MTL_RELEASE(m_ptr);
+			if (0 == (m_flags & BGFX_SAMPLER_INTERNAL_SHARED))
+			{
+				MTL_RELEASE(m_ptr);
+			}
 			MTL_RELEASE(m_ptrStencil);
 			for (uint32_t ii = 0; ii < m_numMips; ++ii)
 			{
@@ -976,6 +979,13 @@ namespace bgfx { namespace mtl
 			}
 		}
 
+		void overrideInternal(uintptr_t _ptr)
+		{
+			destroy();
+			m_flags |= BGFX_SAMPLER_INTERNAL_SHARED;
+			m_ptr = id<MTLTexture>(_ptr);
+		}
+
 		void update(
 			  uint8_t _side
 			, uint8_t _mip

+ 2 - 3
3rdparty/bgfx/src/renderer_mtl.mm

@@ -894,13 +894,12 @@ namespace bgfx { namespace mtl
 
 		void overrideInternal(TextureHandle _handle, uintptr_t _ptr) override
 		{
-			BX_UNUSED(_handle, _ptr);
+			m_textures[_handle.idx].overrideInternal(_ptr);
 		}
 
 		uintptr_t getInternal(TextureHandle _handle) override
 		{
-			BX_UNUSED(_handle);
-			return 0;
+			return uintptr_t(id<MTLTexture>(m_textures[_handle.idx].m_ptr));
 		}
 
 		void destroyTexture(TextureHandle _handle) override

+ 312 - 299
3rdparty/bimg/src/image.cpp

@@ -1834,327 +1834,340 @@ namespace bimg
 			return;
 		}
 
-		BitReader bit(_src);
+		uint8_t src[16];
+		bx::memCopy(src, _src, 16);
 
-		uint8_t mode = uint8_t(bit.read(2) );
-		if (mode & 2)
-		{
-			// 5-bit mode
-			mode |= bit.read(3) << 2;
-		}
+		BitReader bit(src);
 
-		const Bc6hModeInfo& mi = s_bc6hModeInfo[mode];
-		if (0 == mi.endpointBits)
-		{
-			bx::memSet(_dst, 0, 16*3*2);
-			return;
-		}
+		uint8_t mode = uint8_t(bit.read(2));
 
 		uint16_t epR[4] = { /* rw, rx, ry, rz */ };
 		uint16_t epG[4] = { /* gw, gx, gy, gz */ };
 		uint16_t epB[4] = { /* bw, bx, by, bz */ };
 
-		switch (mode)
-		{
-		case 0:
-			epG[2] |= bit.read( 1) <<  4;
-			epB[2] |= bit.read( 1) <<  4;
-			epB[3] |= bit.read( 1) <<  4;
-			epR[0] |= bit.read(10) <<  0;
-			epG[0] |= bit.read(10) <<  0;
-			epB[0] |= bit.read(10) <<  0;
-			epR[1] |= bit.read( 5) <<  0;
-			epG[3] |= bit.read( 1) <<  4;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  0;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  2;
-			epR[3] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  3;
-			break;
+		if (mode & 2)
+		{
+			// 5-bit mode
+			mode |= bit.read(3) << 2;
 
-		case 1:
-			epG[2] |= bit.read( 1) <<  5;
-			epG[3] |= bit.read( 1) <<  4;
-			epG[3] |= bit.read( 1) <<  5;
-			epR[0] |= bit.read( 7) <<  0;
-			epB[3] |= bit.read( 1) <<  0;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[2] |= bit.read( 1) <<  4;
-			epG[0] |= bit.read( 7) <<  0;
-			epB[2] |= bit.read( 1) <<  5;
-			epB[3] |= bit.read( 1) <<  2;
-			epG[2] |= bit.read( 1) <<  4;
-			epB[0] |= bit.read( 7) <<  0;
-			epB[3] |= bit.read( 1) <<  3;
-			epB[3] |= bit.read( 1) <<  5;
-			epB[3] |= bit.read( 1) <<  4;
-			epR[1] |= bit.read( 6) <<  0;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 6) <<  0;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 6) <<  0;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 6) <<  0;
-			epR[3] |= bit.read( 6) <<  0;
-			break;
+			if (0 == s_bc6hModeInfo[mode].endpointBits)
+			{
+				bx::memSet(_dst, 0, 16*3*2);
+				return;
+			}
 
-		case 2:
-			epR[0] |= bit.read(10) <<  0;
-			epG[0] |= bit.read(10) <<  0;
-			epB[0] |= bit.read(10) <<  0;
-			epR[1] |= bit.read( 5) <<  0;
-			epR[0] |= bit.read( 1) << 10;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 4) <<  0;
-			epG[0] |= bit.read( 1) << 10;
-			epB[3] |= bit.read( 1) <<  0;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 4) <<  0;
-			epB[0] |= bit.read( 1) << 10;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  2;
-			epR[3] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  3;
-			break;
+			switch (mode)
+			{
+			case 2:
+				epR[0] |= bit.read(10) <<  0;
+				epG[0] |= bit.read(10) <<  0;
+				epB[0] |= bit.read(10) <<  0;
+				epR[1] |= bit.read( 5) <<  0;
+				epR[0] |= bit.read( 1) << 10;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 4) <<  0;
+				epG[0] |= bit.read( 1) << 10;
+				epB[3] |= bit.read( 1) <<  0;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 4) <<  0;
+				epB[0] |= bit.read( 1) << 10;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  2;
+				epR[3] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  3;
+				break;
 
-		case 3:
-			epR[0] |= bit.read(10) <<  0;
-			epG[0] |= bit.read(10) <<  0;
-			epB[0] |= bit.read(10) <<  0;
-			epR[1] |= bit.read(10) <<  0;
-			epG[1] |= bit.read(10) <<  0;
-			epB[1] |= bit.read(10) <<  0;
-			break;
+			case 3:
+				epR[0] |= bit.read(10) <<  0;
+				epG[0] |= bit.read(10) <<  0;
+				epB[0] |= bit.read(10) <<  0;
+				epR[1] |= bit.read(10) <<  0;
+				epG[1] |= bit.read(10) <<  0;
+				epB[1] |= bit.read(10) <<  0;
+				break;
 
-		case 6:
-			epR[0] |= bit.read(10) <<  0;
-			epG[0] |= bit.read(10) <<  0;
-			epB[0] |= bit.read(10) <<  0;
-			epR[1] |= bit.read( 4) <<  0;
-			epR[0] |= bit.read( 1) << 10;
-			epG[3] |= bit.read( 1) <<  4;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 5) <<  0;
-			epG[0] |= bit.read( 1) << 10;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 4) <<  0;
-			epB[0] |= bit.read( 1) << 10;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 4) <<  0;
-			epB[3] |= bit.read( 1) <<  0;
-			epB[3] |= bit.read( 1) <<  2;
-			epR[3] |= bit.read( 4) <<  0;
-			epG[2] |= bit.read( 1) <<  4;
-			epB[3] |= bit.read( 1) <<  3;
-			break;
+			case 6:
+				epR[0] |= bit.read(10) <<  0;
+				epG[0] |= bit.read(10) <<  0;
+				epB[0] |= bit.read(10) <<  0;
+				epR[1] |= bit.read( 4) <<  0;
+				epR[0] |= bit.read( 1) << 10;
+				epG[3] |= bit.read( 1) <<  4;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 5) <<  0;
+				epG[0] |= bit.read( 1) << 10;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 4) <<  0;
+				epB[0] |= bit.read( 1) << 10;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 4) <<  0;
+				epB[3] |= bit.read( 1) <<  0;
+				epB[3] |= bit.read( 1) <<  2;
+				epR[3] |= bit.read( 4) <<  0;
+				epG[2] |= bit.read( 1) <<  4;
+				epB[3] |= bit.read( 1) <<  3;
+				break;
 
-		case 7:
-			epR[0] |= bit.read(10) <<  0;
-			epG[0] |= bit.read(10) <<  0;
-			epB[0] |= bit.read(10) <<  0;
-			epR[1] |= bit.read( 9) <<  0;
-			epR[0] |= bit.read( 1) << 10;
-			epG[1] |= bit.read( 9) <<  0;
-			epG[0] |= bit.read( 1) << 10;
-			epB[1] |= bit.read( 9) <<  0;
-			epB[0] |= bit.read( 1) << 10;
-			break;
+			case 7:
+				epR[0] |= bit.read(10) <<  0;
+				epG[0] |= bit.read(10) <<  0;
+				epB[0] |= bit.read(10) <<  0;
+				epR[1] |= bit.read( 9) <<  0;
+				epR[0] |= bit.read( 1) << 10;
+				epG[1] |= bit.read( 9) <<  0;
+				epG[0] |= bit.read( 1) << 10;
+				epB[1] |= bit.read( 9) <<  0;
+				epB[0] |= bit.read( 1) << 10;
+				break;
 
-		case 10:
-			epR[0] |= bit.read(10) <<  0;
-			epG[0] |= bit.read(10) <<  0;
-			epB[0] |= bit.read(10) <<  0;
-			epR[1] |= bit.read( 4) <<  0;
-			epR[0] |= bit.read( 1) << 10;
-			epB[2] |= bit.read( 1) <<  4;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 4) <<  0;
-			epG[0] |= bit.read( 1) << 10;
-			epB[3] |= bit.read( 1) <<  0;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 5) <<  0;
-			epB[0] |= bit.read( 1) << 10;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 4) <<  0;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[3] |= bit.read( 1) <<  2;
-			epR[3] |= bit.read( 4) <<  0;
-			epB[3] |= bit.read( 1) <<  4;
-			epB[3] |= bit.read( 1) <<  3;
-			break;
+			case 10:
+				epR[0] |= bit.read(10) <<  0;
+				epG[0] |= bit.read(10) <<  0;
+				epB[0] |= bit.read(10) <<  0;
+				epR[1] |= bit.read( 4) <<  0;
+				epR[0] |= bit.read( 1) << 10;
+				epB[2] |= bit.read( 1) <<  4;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 4) <<  0;
+				epG[0] |= bit.read( 1) << 10;
+				epB[3] |= bit.read( 1) <<  0;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 5) <<  0;
+				epB[0] |= bit.read( 1) << 10;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 4) <<  0;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[3] |= bit.read( 1) <<  2;
+				epR[3] |= bit.read( 4) <<  0;
+				epB[3] |= bit.read( 1) <<  4;
+				epB[3] |= bit.read( 1) <<  3;
+				break;
 
-		case 11:
-			epR[0] |= bit.read(10) <<  0;
-			epG[0] |= bit.read(10) <<  0;
-			epB[0] |= bit.read(10) <<  0;
-			epR[1] |= bit.read( 8) <<  0;
-			epR[0] |= bit.read( 1) << 11;
-			epR[0] |= bit.read( 1) << 10;
-			epG[1] |= bit.read( 8) <<  0;
-			epG[0] |= bit.read( 1) << 11;
-			epG[0] |= bit.read( 1) << 10;
-			epB[1] |= bit.read( 8) <<  0;
-			epB[0] |= bit.read( 1) << 11;
-			epB[0] |= bit.read( 1) << 10;
-			break;
+			case 11:
+				epR[0] |= bit.read(10) <<  0;
+				epG[0] |= bit.read(10) <<  0;
+				epB[0] |= bit.read(10) <<  0;
+				epR[1] |= bit.read( 8) <<  0;
+				epR[0] |= bit.read( 1) << 11;
+				epR[0] |= bit.read( 1) << 10;
+				epG[1] |= bit.read( 8) <<  0;
+				epG[0] |= bit.read( 1) << 11;
+				epG[0] |= bit.read( 1) << 10;
+				epB[1] |= bit.read( 8) <<  0;
+				epB[0] |= bit.read( 1) << 11;
+				epB[0] |= bit.read( 1) << 10;
+				break;
 
-		case 14:
-			epR[0] |= bit.read( 9) <<  0;
-			epB[2] |= bit.read( 1) <<  4;
-			epG[0] |= bit.read( 9) <<  0;
-			epG[2] |= bit.read( 1) <<  4;
-			epB[0] |= bit.read( 9) <<  0;
-			epB[3] |= bit.read( 1) <<  4;
-			epR[1] |= bit.read( 5) <<  0;
-			epG[3] |= bit.read( 1) <<  4;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  0;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  2;
-			epR[3] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  3;
-			break;
+			case 14:
+				epR[0] |= bit.read( 9) <<  0;
+				epB[2] |= bit.read( 1) <<  4;
+				epG[0] |= bit.read( 9) <<  0;
+				epG[2] |= bit.read( 1) <<  4;
+				epB[0] |= bit.read( 9) <<  0;
+				epB[3] |= bit.read( 1) <<  4;
+				epR[1] |= bit.read( 5) <<  0;
+				epG[3] |= bit.read( 1) <<  4;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  0;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  2;
+				epR[3] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  3;
+				break;
 
-		case 15:
-			epR[0] |= bit.read(10) <<  0;
-			epG[0] |= bit.read(10) <<  0;
-			epB[0] |= bit.read(10) <<  0;
-			epR[1] |= bit.read( 4) <<  0;
-			epR[0] |= bit.read( 1) << 15;
-			epR[0] |= bit.read( 1) << 14;
-			epR[0] |= bit.read( 1) << 13;
-			epR[0] |= bit.read( 1) << 12;
-			epR[0] |= bit.read( 1) << 11;
-			epR[0] |= bit.read( 1) << 10;
-			epG[1] |= bit.read( 4) <<  0;
-			epG[0] |= bit.read( 1) << 15;
-			epG[0] |= bit.read( 1) << 14;
-			epG[0] |= bit.read( 1) << 13;
-			epG[0] |= bit.read( 1) << 12;
-			epG[0] |= bit.read( 1) << 11;
-			epG[0] |= bit.read( 1) << 10;
-			epB[1] |= bit.read( 4) <<  0;
-			epB[0] |= bit.read( 1) << 15;
-			epB[0] |= bit.read( 1) << 14;
-			epB[0] |= bit.read( 1) << 13;
-			epB[0] |= bit.read( 1) << 12;
-			epB[0] |= bit.read( 1) << 11;
-			epB[0] |= bit.read( 1) << 10;
-			break;
+			case 15:
+				epR[0] |= bit.read(10) <<  0;
+				epG[0] |= bit.read(10) <<  0;
+				epB[0] |= bit.read(10) <<  0;
+				epR[1] |= bit.read( 4) <<  0;
+				epR[0] |= bit.read( 1) << 15;
+				epR[0] |= bit.read( 1) << 14;
+				epR[0] |= bit.read( 1) << 13;
+				epR[0] |= bit.read( 1) << 12;
+				epR[0] |= bit.read( 1) << 11;
+				epR[0] |= bit.read( 1) << 10;
+				epG[1] |= bit.read( 4) <<  0;
+				epG[0] |= bit.read( 1) << 15;
+				epG[0] |= bit.read( 1) << 14;
+				epG[0] |= bit.read( 1) << 13;
+				epG[0] |= bit.read( 1) << 12;
+				epG[0] |= bit.read( 1) << 11;
+				epG[0] |= bit.read( 1) << 10;
+				epB[1] |= bit.read( 4) <<  0;
+				epB[0] |= bit.read( 1) << 15;
+				epB[0] |= bit.read( 1) << 14;
+				epB[0] |= bit.read( 1) << 13;
+				epB[0] |= bit.read( 1) << 12;
+				epB[0] |= bit.read( 1) << 11;
+				epB[0] |= bit.read( 1) << 10;
+				break;
 
-		case 18:
-			epR[0] |= bit.read( 8) <<  0;
-			epG[3] |= bit.read( 1) <<  4;
-			epB[2] |= bit.read( 1) <<  4;
-			epG[0] |= bit.read( 8) <<  0;
-			epB[3] |= bit.read( 1) <<  2;
-			epG[2] |= bit.read( 1) <<  4;
-			epB[0] |= bit.read( 8) <<  0;
-			epB[3] |= bit.read( 1) <<  3;
-			epB[3] |= bit.read( 1) <<  4;
-			epR[1] |= bit.read( 6) <<  0;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  0;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 6) <<  0;
-			epR[3] |= bit.read( 6) <<  0;
-			break;
+			case 18:
+				epR[0] |= bit.read( 8) <<  0;
+				epG[3] |= bit.read( 1) <<  4;
+				epB[2] |= bit.read( 1) <<  4;
+				epG[0] |= bit.read( 8) <<  0;
+				epB[3] |= bit.read( 1) <<  2;
+				epG[2] |= bit.read( 1) <<  4;
+				epB[0] |= bit.read( 8) <<  0;
+				epB[3] |= bit.read( 1) <<  3;
+				epB[3] |= bit.read( 1) <<  4;
+				epR[1] |= bit.read( 6) <<  0;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  0;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 6) <<  0;
+				epR[3] |= bit.read( 6) <<  0;
+				break;
 
-		case 22:
-			epR[0] |= bit.read( 8) <<  0;
-			epB[3] |= bit.read( 1) <<  0;
-			epB[2] |= bit.read( 1) <<  4;
-			epG[0] |= bit.read( 8) <<  0;
-			epG[2] |= bit.read( 1) <<  5;
-			epG[2] |= bit.read( 1) <<  4;
-			epB[0] |= bit.read( 8) <<  0;
-			epG[3] |= bit.read( 1) <<  5;
-			epB[3] |= bit.read( 1) <<  4;
-			epR[1] |= bit.read( 5) <<  0;
-			epG[3] |= bit.read( 1) <<  4;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 6) <<  0;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  2;
-			epR[3] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  3;
-			break;
+			case 22:
+				epR[0] |= bit.read( 8) <<  0;
+				epB[3] |= bit.read( 1) <<  0;
+				epB[2] |= bit.read( 1) <<  4;
+				epG[0] |= bit.read( 8) <<  0;
+				epG[2] |= bit.read( 1) <<  5;
+				epG[2] |= bit.read( 1) <<  4;
+				epB[0] |= bit.read( 8) <<  0;
+				epG[3] |= bit.read( 1) <<  5;
+				epB[3] |= bit.read( 1) <<  4;
+				epR[1] |= bit.read( 5) <<  0;
+				epG[3] |= bit.read( 1) <<  4;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 6) <<  0;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  2;
+				epR[3] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  3;
+				break;
 
-		case 26:
-			epR[0] |= bit.read( 8) <<  0;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[2] |= bit.read( 1) <<  4;
-			epG[0] |= bit.read( 8) <<  0;
-			epB[2] |= bit.read( 1) <<  5;
-			epG[2] |= bit.read( 1) <<  4;
-			epB[0] |= bit.read( 8) <<  0;
-			epB[3] |= bit.read( 1) <<  5;
-			epB[3] |= bit.read( 1) <<  4;
-			epR[1] |= bit.read( 5) <<  0;
-			epG[3] |= bit.read( 1) <<  4;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  0;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 6) <<  0;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  2;
-			epR[3] |= bit.read( 5) <<  0;
-			epB[3] |= bit.read( 1) <<  3;
-			break;
+			case 26:
+				epR[0] |= bit.read( 8) <<  0;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[2] |= bit.read( 1) <<  4;
+				epG[0] |= bit.read( 8) <<  0;
+				epB[2] |= bit.read( 1) <<  5;
+				epG[2] |= bit.read( 1) <<  4;
+				epB[0] |= bit.read( 8) <<  0;
+				epB[3] |= bit.read( 1) <<  5;
+				epB[3] |= bit.read( 1) <<  4;
+				epR[1] |= bit.read( 5) <<  0;
+				epG[3] |= bit.read( 1) <<  4;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  0;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 6) <<  0;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  2;
+				epR[3] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  3;
+				break;
 
-		case 30:
-			epR[0] |= bit.read( 6) <<  0;
-			epG[3] |= bit.read( 1) <<  4;
-			epB[3] |= bit.read( 1) <<  0;
-			epB[3] |= bit.read( 1) <<  1;
-			epB[2] |= bit.read( 1) <<  4;
-			epG[0] |= bit.read( 6) <<  0;
-			epG[2] |= bit.read( 1) <<  5;
-			epB[2] |= bit.read( 1) <<  5;
-			epB[3] |= bit.read( 1) <<  2;
-			epG[2] |= bit.read( 1) <<  4;
-			epB[0] |= bit.read( 6) <<  0;
-			epG[3] |= bit.read( 1) <<  5;
-			epB[3] |= bit.read( 1) <<  3;
-			epB[3] |= bit.read( 1) <<  5;
-			epB[3] |= bit.read( 1) <<  4;
-			epR[1] |= bit.read( 6) <<  0;
-			epG[2] |= bit.read( 4) <<  0;
-			epG[1] |= bit.read( 6) <<  0;
-			epG[3] |= bit.read( 4) <<  0;
-			epB[1] |= bit.read( 6) <<  0;
-			epB[2] |= bit.read( 4) <<  0;
-			epR[2] |= bit.read( 6) <<  0;
-			epR[3] |= bit.read( 6) <<  0;
-			break;
+			case 30:
+				epR[0] |= bit.read( 6) <<  0;
+				epG[3] |= bit.read( 1) <<  4;
+				epB[3] |= bit.read( 1) <<  0;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[2] |= bit.read( 1) <<  4;
+				epG[0] |= bit.read( 6) <<  0;
+				epG[2] |= bit.read( 1) <<  5;
+				epB[2] |= bit.read( 1) <<  5;
+				epB[3] |= bit.read( 1) <<  2;
+				epG[2] |= bit.read( 1) <<  4;
+				epB[0] |= bit.read( 6) <<  0;
+				epG[3] |= bit.read( 1) <<  5;
+				epB[3] |= bit.read( 1) <<  3;
+				epB[3] |= bit.read( 1) <<  5;
+				epB[3] |= bit.read( 1) <<  4;
+				epR[1] |= bit.read( 6) <<  0;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 6) <<  0;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 6) <<  0;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 6) <<  0;
+				epR[3] |= bit.read( 6) <<  0;
+				break;
 
-		default:
-			break;
+			default:
+				break;
+			}
 		}
+		else
+		{
+			switch (mode)
+			{
+			case 0:
+				epG[2] |= bit.read( 1) <<  4;
+				epB[2] |= bit.read( 1) <<  4;
+				epB[3] |= bit.read( 1) <<  4;
+				epR[0] |= bit.read(10) <<  0;
+				epG[0] |= bit.read(10) <<  0;
+				epB[0] |= bit.read(10) <<  0;
+				epR[1] |= bit.read( 5) <<  0;
+				epG[3] |= bit.read( 1) <<  4;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  0;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  2;
+				epR[3] |= bit.read( 5) <<  0;
+				epB[3] |= bit.read( 1) <<  3;
+				break;
+
+			case 1:
+				epG[2] |= bit.read( 1) <<  5;
+				epG[3] |= bit.read( 1) <<  4;
+				epG[3] |= bit.read( 1) <<  5;
+				epR[0] |= bit.read( 7) <<  0;
+				epB[3] |= bit.read( 1) <<  0;
+				epB[3] |= bit.read( 1) <<  1;
+				epB[2] |= bit.read( 1) <<  4;
+				epG[0] |= bit.read( 7) <<  0;
+				epB[2] |= bit.read( 1) <<  5;
+				epB[3] |= bit.read( 1) <<  2;
+				epG[2] |= bit.read( 1) <<  4;
+				epB[0] |= bit.read( 7) <<  0;
+				epB[3] |= bit.read( 1) <<  3;
+				epB[3] |= bit.read( 1) <<  5;
+				epB[3] |= bit.read( 1) <<  4;
+				epR[1] |= bit.read( 6) <<  0;
+				epG[2] |= bit.read( 4) <<  0;
+				epG[1] |= bit.read( 6) <<  0;
+				epG[3] |= bit.read( 4) <<  0;
+				epB[1] |= bit.read( 6) <<  0;
+				epB[2] |= bit.read( 4) <<  0;
+				epR[2] |= bit.read( 6) <<  0;
+				epR[3] |= bit.read( 6) <<  0;
+				break;
+
+			default:
+				break;
+			}
+		}
+
+		const Bc6hModeInfo mi = s_bc6hModeInfo[mode];
 
 		if (_signed)
 		{