mirror of
https://github.com/Ryujinx/Opentk.git
synced 2025-08-04 07:31:12 +00:00
Improved override/overload lookup
The lookup for function overrides and overloads now tries to work around extension case mismatches (e.g. IBM vs Ibm). This fixes a few specific cases of missing overrides.
This commit is contained in:
parent
d28c428e99
commit
5f7008d746
|
@ -79,10 +79,12 @@ namespace Bind
|
||||||
{
|
{
|
||||||
foreach (var d in signatures)
|
foreach (var d in signatures)
|
||||||
{
|
{
|
||||||
|
var replace = GetFuncOverride(nav, d, apiname, apiversion);
|
||||||
|
|
||||||
TranslateExtension(d);
|
TranslateExtension(d);
|
||||||
TranslateReturnType(enum_processor, nav, d, enums, apiname, version);
|
TranslateReturnType(d, replace, nav, enum_processor, enums, apiname, version);
|
||||||
TranslateParameters(enum_processor, nav, d, enums, apiname, version);
|
TranslateParameters(d, replace, nav, enum_processor, enums, apiname, version);
|
||||||
TranslateAttributes(nav, d, enums, apiname, version);
|
TranslateAttributes(d, replace, nav, apiname, version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,8 +97,9 @@ namespace Bind
|
||||||
foreach (XPathNavigator overload_element in overload_elements)
|
foreach (XPathNavigator overload_element in overload_elements)
|
||||||
{
|
{
|
||||||
var overload = new Delegate(d);
|
var overload = new Delegate(d);
|
||||||
ApplyParameterReplacement(overload, overload_element);
|
TranslateReturnType(overload, overload_element, nav, enum_processor, enums, apiname, version);
|
||||||
ApplyReturnTypeReplacement(overload, overload_element);
|
TranslateParameters(overload, overload_element, nav, enum_processor, enums, apiname, version);
|
||||||
|
TranslateAttributes(overload, overload_element, nav, apiname, version);
|
||||||
overload_list.Add(overload);
|
overload_list.Add(overload);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,7 +199,9 @@ namespace Bind
|
||||||
return GetPath("replace", apiname, apiversion, function, extension);
|
return GetPath("replace", apiname, apiversion, function, extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TranslateType(Bind.Structures.Type type, EnumProcessor enum_processor, XPathNavigator overrides, EnumCollection enums,
|
void TranslateType(Bind.Structures.Type type,
|
||||||
|
XPathNavigator function_override, XPathNavigator overrides,
|
||||||
|
EnumProcessor enum_processor, EnumCollection enums,
|
||||||
string category, string apiname)
|
string category, string apiname)
|
||||||
{
|
{
|
||||||
Bind.Structures.Enum @enum;
|
Bind.Structures.Enum @enum;
|
||||||
|
@ -209,6 +214,7 @@ namespace Bind
|
||||||
bool normal = enums.TryGetValue(type.CurrentType, out @enum);
|
bool normal = enums.TryGetValue(type.CurrentType, out @enum);
|
||||||
|
|
||||||
// Translate enum types
|
// Translate enum types
|
||||||
|
type.IsEnum = false;
|
||||||
if (normal && @enum.Name != "GLenum" && @enum.Name != "Boolean")
|
if (normal && @enum.Name != "GLenum" && @enum.Name != "Boolean")
|
||||||
{
|
{
|
||||||
type.IsEnum = true;
|
type.IsEnum = true;
|
||||||
|
@ -256,8 +262,6 @@ namespace Bind
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
type.IsEnum = false;
|
|
||||||
|
|
||||||
// Todo: what is the point of this here? It is overwritten below.
|
// Todo: what is the point of this here? It is overwritten below.
|
||||||
// A few translations for consistency
|
// A few translations for consistency
|
||||||
switch (type.CurrentType.ToLower())
|
switch (type.CurrentType.ToLower())
|
||||||
|
@ -300,16 +304,29 @@ namespace Bind
|
||||||
"[Error] Type '{0}' has a high pointer level. Bindings will be incorrect.",
|
"[Error] Type '{0}' has a high pointer level. Bindings will be incorrect.",
|
||||||
type));
|
type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!type.IsEnum)
|
||||||
|
{
|
||||||
|
// Remove qualifier if type is not an enum
|
||||||
|
// Resolves issues when replacing / overriding
|
||||||
|
// an enum parameter with a non-enum type
|
||||||
|
type.QualifiedType = type.CurrentType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TranslateExtension(Delegate d)
|
static string TranslateExtension(string extension)
|
||||||
{
|
{
|
||||||
var extension = d.Extension.ToUpper();
|
extension = extension.ToUpper();
|
||||||
if (extension.Length > 2)
|
if (extension.Length > 2)
|
||||||
{
|
{
|
||||||
extension = extension[0] + extension.Substring(1).ToLower();
|
extension = extension[0] + extension.Substring(1).ToLower();
|
||||||
}
|
}
|
||||||
d.Extension = extension;
|
return extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TranslateExtension(Delegate d)
|
||||||
|
{
|
||||||
|
d.Extension = TranslateExtension(d.Extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
static string GetTrimmedExtension(string name, string extension)
|
static string GetTrimmedExtension(string name, string extension)
|
||||||
|
@ -375,28 +392,47 @@ namespace Bind
|
||||||
|
|
||||||
static XPathNodeIterator GetFuncOverload(XPathNavigator nav, Delegate d, string apiname, string apiversion)
|
static XPathNodeIterator GetFuncOverload(XPathNavigator nav, Delegate d, string apiname, string apiversion)
|
||||||
{
|
{
|
||||||
string ext = d.Extension;
|
// Try a few different extension variations that appear in the overrides xml file
|
||||||
|
string[] extensions = { d.Extension, TranslateExtension(d.Extension), d.Extension.ToUpper() };
|
||||||
string trimmed_name = GetTrimmedName(d);
|
string trimmed_name = GetTrimmedName(d);
|
||||||
string extensionless_name = GetTrimmedExtension(d.Name, ext);
|
XPathNodeIterator function_overload = null;
|
||||||
|
|
||||||
var function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, d.Name, ext));
|
foreach (var ext in extensions)
|
||||||
if (function_overload.Count == 0)
|
{
|
||||||
|
string extensionless_name = GetTrimmedExtension(d.Name, ext);
|
||||||
|
function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, d.Name, ext));
|
||||||
|
if (function_overload.Count != 0)
|
||||||
|
break;
|
||||||
function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, extensionless_name, ext));
|
function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, extensionless_name, ext));
|
||||||
if (function_overload.Count == 0)
|
if (function_overload.Count != 0)
|
||||||
|
break;
|
||||||
function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, trimmed_name, ext));
|
function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, trimmed_name, ext));
|
||||||
|
if (function_overload.Count != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
return function_overload;
|
return function_overload;
|
||||||
}
|
}
|
||||||
|
|
||||||
static XPathNavigator GetFuncOverride(XPathNavigator nav, Delegate d, string apiname, string apiversion)
|
static XPathNavigator GetFuncOverride(XPathNavigator nav, Delegate d, string apiname, string apiversion)
|
||||||
{
|
{
|
||||||
string ext = d.Extension;
|
// Try a few different extension variations that appear in the overrides xml file
|
||||||
|
string[] extensions = { d.Extension, TranslateExtension(d.Extension), d.Extension.ToUpper() };
|
||||||
string trimmed_name = GetTrimmedName(d);
|
string trimmed_name = GetTrimmedName(d);
|
||||||
string extensionless_name = GetTrimmedExtension(d.Name, ext);
|
XPathNavigator function_override = null;
|
||||||
|
|
||||||
var function_override =
|
foreach (var ext in extensions)
|
||||||
nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, d.Name, ext)) ??
|
{
|
||||||
nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, extensionless_name, ext)) ??
|
string extensionless_name = GetTrimmedExtension(d.Name, ext);
|
||||||
nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, trimmed_name, ext));
|
function_override =
|
||||||
|
nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, d.Name, ext)) ??
|
||||||
|
nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, extensionless_name, ext)) ??
|
||||||
|
nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, trimmed_name, ext));
|
||||||
|
|
||||||
|
if (function_override != null)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
return function_override;
|
return function_override;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,13 +496,14 @@ namespace Bind
|
||||||
// 3) A generic object or void* (translates to IntPtr)
|
// 3) A generic object or void* (translates to IntPtr)
|
||||||
// 4) A GLenum (translates to int on Legacy.Tao or GL.Enums.GLenum otherwise).
|
// 4) A GLenum (translates to int on Legacy.Tao or GL.Enums.GLenum otherwise).
|
||||||
// Return types must always be CLS-compliant, because .Net does not support overloading on return types.
|
// Return types must always be CLS-compliant, because .Net does not support overloading on return types.
|
||||||
void TranslateReturnType(EnumProcessor enum_processor, XPathNavigator nav, Delegate d,
|
void TranslateReturnType(Delegate d,
|
||||||
EnumCollection enums, string apiname, string apiversion)
|
XPathNavigator function_override, XPathNavigator nav,
|
||||||
|
EnumProcessor enum_processor, EnumCollection enums,
|
||||||
|
string apiname, string apiversion)
|
||||||
{
|
{
|
||||||
var function_override = GetFuncOverride(nav, d, apiname, apiversion);
|
|
||||||
ApplyReturnTypeReplacement(d, function_override);
|
ApplyReturnTypeReplacement(d, function_override);
|
||||||
|
|
||||||
TranslateType(d.ReturnType, enum_processor, nav, enums, d.Category, apiname);
|
TranslateType(d.ReturnType, function_override, nav, enum_processor,enums, d.Category, apiname);
|
||||||
|
|
||||||
if (d.ReturnType.CurrentType.ToLower().Contains("void") && d.ReturnType.Pointer != 0)
|
if (d.ReturnType.CurrentType.ToLower().Contains("void") && d.ReturnType.Pointer != 0)
|
||||||
{
|
{
|
||||||
|
@ -513,26 +550,27 @@ namespace Bind
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TranslateParameters(EnumProcessor enum_processor,
|
void TranslateParameters(Delegate d,
|
||||||
XPathNavigator nav, Delegate d, EnumCollection enums,
|
XPathNavigator function_override, XPathNavigator nav,
|
||||||
|
EnumProcessor enum_processor, EnumCollection enums,
|
||||||
string apiname, string apiversion)
|
string apiname, string apiversion)
|
||||||
{
|
{
|
||||||
var function_override = GetFuncOverride(nav, d, apiname, apiversion);
|
|
||||||
ApplyParameterReplacement(d, function_override);
|
ApplyParameterReplacement(d, function_override);
|
||||||
|
|
||||||
for (int i = 0; i < d.Parameters.Count; i++)
|
for (int i = 0; i < d.Parameters.Count; i++)
|
||||||
{
|
{
|
||||||
TranslateParameter(d.Parameters[i], enum_processor, nav, enums, d.Category, apiname);
|
TranslateParameter(d.Parameters[i], function_override, nav, enum_processor, enums, d.Category, apiname);
|
||||||
if (d.Parameters[i].CurrentType == "UInt16" && d.Name.Contains("LineStipple"))
|
if (d.Parameters[i].CurrentType == "UInt16" && d.Name.Contains("LineStipple"))
|
||||||
d.Parameters[i].WrapperType = WrapperTypes.UncheckedParameter;
|
d.Parameters[i].WrapperType = WrapperTypes.UncheckedParameter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TranslateParameter(Parameter p, EnumProcessor enum_processor,
|
void TranslateParameter(Parameter p,
|
||||||
XPathNavigator overrides, EnumCollection enums,
|
XPathNavigator function_override, XPathNavigator overrides,
|
||||||
|
EnumProcessor enum_processor, EnumCollection enums,
|
||||||
string category, string apiname)
|
string category, string apiname)
|
||||||
{
|
{
|
||||||
TranslateType(p, enum_processor, overrides, enums, category, apiname);
|
TranslateType(p, function_override, overrides, enum_processor, enums, category, apiname);
|
||||||
|
|
||||||
// Find out the necessary wrapper types.
|
// Find out the necessary wrapper types.
|
||||||
if (p.Pointer != 0)/* || CurrentType == "IntPtr")*/
|
if (p.Pointer != 0)/* || CurrentType == "IntPtr")*/
|
||||||
|
@ -585,11 +623,10 @@ namespace Bind
|
||||||
// WrapperType = WrapperTypes.BoolParameter;
|
// WrapperType = WrapperTypes.BoolParameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TranslateAttributes(XPathNavigator nav, Delegate d, EnumCollection enums,
|
void TranslateAttributes(Delegate d,
|
||||||
|
XPathNavigator function_override, XPathNavigator nav,
|
||||||
string apiname, string apiversion)
|
string apiname, string apiversion)
|
||||||
{
|
{
|
||||||
var function_override = GetFuncOverride(nav, d, apiname, apiversion);
|
|
||||||
|
|
||||||
if (function_override != null)
|
if (function_override != null)
|
||||||
{
|
{
|
||||||
var version_override = function_override.SelectSingleNode("version");
|
var version_override = function_override.SelectSingleNode("version");
|
||||||
|
|
Loading…
Reference in a new issue