From e476267cb8aa97b2ed5ccf04b45b48464d9a798b Mon Sep 17 00:00:00 2001 From: Ben Bredesen Date: Fri, 31 Mar 2023 08:03:56 -0500 Subject: [PATCH 1/3] Ignore all local xml files --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6d34121..0be295d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ vk/ vk-gen vk-gen.exe -vk.xml +*.xml .vscode/ .DS_Store \ No newline at end of file From 3267573167aa854cde6287dafcf6f0172e6d061b Mon Sep 17 00:00:00 2001 From: Ben Bredesen Date: Fri, 31 Mar 2023 08:54:02 -0500 Subject: [PATCH 2/3] Fixes #40 --- exceptions.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/exceptions.json b/exceptions.json index 65a7edd..3dc849a 100644 --- a/exceptions.json +++ b/exceptions.json @@ -314,6 +314,25 @@ }, "PFN_vkGetInstanceProcAddrLUNARG": { "underlyingTypeName": "!pointer" + }, + + "MTLDevice_id": { + "underlyingTypeName": "!pointer" + }, + "MTLCommandQueue_id": { + "underlyingTypeName": "!pointer" + }, + "MTLBuffer_id": { + "underlyingTypeName": "!pointer" + }, + "MTLTexture_id": { + "underlyingTypeName": "!pointer" + }, + "MTLSharedEvent_id": { + "underlyingTypeName": "!pointer" + }, + "IOSurfaceRef": { + "underlyingTypeName": "!pointer" } }, From 388c79c001d1fad1c438d62b95a30716e495b628 Mon Sep 17 00:00:00 2001 From: Ben Bredesen Date: Fri, 31 Mar 2023 09:36:55 -0500 Subject: [PATCH 3/3] Add support for api flag, fixes #20 --- def/base_type.go | 6 ++++-- def/bitmask_type.go | 6 ++++-- def/command_type.go | 14 +++++++++----- def/define_type.go | 5 +++-- def/enum_type.go | 6 ++++-- def/external_type.go | 6 ++++-- def/handle_type.go | 6 ++++-- def/include_type.go | 8 ++++++-- def/registry_base.go | 2 +- def/struct_type.go | 13 ++++++++----- def/union_type.go | 13 ++++++++----- main.go | 11 +++++++---- 12 files changed, 62 insertions(+), 34 deletions(-) diff --git a/def/base_type.go b/def/base_type.go index e85d872..888c525 100644 --- a/def/base_type.go +++ b/def/base_type.go @@ -91,8 +91,10 @@ func (t *baseType) PrintTranslateToInternal(w io.Writer, inputVar, outputVar str } } -func ReadBaseTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, _ ValueRegistry) { - for _, node := range xmlquery.Find(doc, "//types/type[@category='basetype']") { +func ReadBaseTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, _ ValueRegistry, api string) { + queryString := fmt.Sprintf("//types/type[@category='basetype' and (@api='%s' or not(@api))]", api) + + for _, node := range xmlquery.Find(doc, queryString) { newType := NewBaseTypeFromXML(node) if tr[newType.RegistryName()] != nil { logrus.WithField("registry name", newType.RegistryName()).Warn("Overwriting base type in registry") diff --git a/def/bitmask_type.go b/def/bitmask_type.go index 7a37761..640a923 100644 --- a/def/bitmask_type.go +++ b/def/bitmask_type.go @@ -49,8 +49,10 @@ func (t *bitmaskType) PrintPublicDeclaration(w io.Writer) { } } -func ReadBitmaskTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry) { - for _, node := range xmlquery.Find(doc, "//type[@category='bitmask']") { +func ReadBitmaskTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry, api string) { + queryString := fmt.Sprintf("//types/type[@category='bitmask' and (@api='%s' or not(@api))]", api) + + for _, node := range xmlquery.Find(doc, queryString) { newType := NewBitmaskTypeFromXML(node) if tr[newType.RegistryName()] != nil { logrus.WithField("registry name", newType.RegistryName()).Warn("Overwriting bitmask type in registry") diff --git a/def/command_type.go b/def/command_type.go index 6ba36c4..fd6db4f 100644 --- a/def/command_type.go +++ b/def/command_type.go @@ -635,14 +635,17 @@ func (p *commandParam) Resolve(tr TypeRegistry, vr ValueRegistry) *IncludeSet { return iset } -func ReadCommandTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry) { - for _, commandNode := range append(xmlquery.Find(doc, "//commands/command"), xmlquery.Find(doc, "//extension/command")...) { - val := NewCommandFromXML(commandNode) +func ReadCommandTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry, api string) { + cQueryString := fmt.Sprintf("//commands/command[@api='%s' or not(@api)]", api) + exQueryString := fmt.Sprintf("//extension/command[@api='%s' or not(@api)]", api) + + for _, commandNode := range append(xmlquery.Find(doc, cQueryString), xmlquery.Find(doc, exQueryString)...) { + val := NewCommandFromXML(commandNode, api) tr[val.RegistryName()] = val } } -func NewCommandFromXML(elt *xmlquery.Node) *commandType { +func NewCommandFromXML(elt *xmlquery.Node, api string) *commandType { rval := commandType{} name := elt.SelectAttr("name") if name != "" { @@ -652,7 +655,8 @@ func NewCommandFromXML(elt *xmlquery.Node) *commandType { rval.registryName = xmlquery.FindOne(elt, "/proto/name").InnerText() rval.returnTypeName = xmlquery.FindOne(elt, "/proto/type").InnerText() - for _, m := range xmlquery.Find(elt, "param") { + paramQueryString := fmt.Sprintf("param[@api='%s' or not(@api)]", api) + for _, m := range xmlquery.Find(elt, paramQueryString) { par := NewCommandParamFromXML(m, &rval) rval.parameters = append(rval.parameters, par) } diff --git a/def/define_type.go b/def/define_type.go index f1757d2..4f2140e 100644 --- a/def/define_type.go +++ b/def/define_type.go @@ -56,8 +56,9 @@ func (t *defineType) PrintPublicDeclaration(w io.Writer) { } } -func ReadDefineTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, _ ValueRegistry) { - for _, node := range xmlquery.Find(doc, "//types/type[@category='define']") { +func ReadDefineTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, _ ValueRegistry, api string) { + queryString := fmt.Sprintf("//types/type[@category='define' and (@api='%s' or not(@api))]", api) + for _, node := range xmlquery.Find(doc, queryString) { newType := NewDefineTypeFromXML(node) if tr[newType.RegistryName()] != nil { logrus.WithField("registry name", newType.RegistryName()). diff --git a/def/enum_type.go b/def/enum_type.go index b20a27d..7c2debe 100644 --- a/def/enum_type.go +++ b/def/enum_type.go @@ -59,8 +59,10 @@ func (t *enumType) PrintPublicDeclaration(w io.Writer) { } } -func ReadEnumTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry) { - for _, node := range xmlquery.Find(doc, "//type[@category='enum']") { +func ReadEnumTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry, api string) { + queryString := fmt.Sprintf("//types/type[@category='enum' and (@api='%s' or not(@api))]", api) + + for _, node := range xmlquery.Find(doc, queryString) { newType := NewEnumTypeFromXML(node) if tr[newType.RegistryName()] != nil { logrus.WithField("registry name", newType.RegistryName()).Warn("Overwriting enum type in registry") diff --git a/def/external_type.go b/def/external_type.go index d4d1658..a19391d 100644 --- a/def/external_type.go +++ b/def/external_type.go @@ -39,8 +39,10 @@ func (t *externalType) TranslateToInternal(inputVar string) string { return t.genericType.TranslateToInternal(inputVar) } -func ReadExternalTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry) { - for _, node := range xmlquery.Find(doc, "//types/type[not(@category)]") { +func ReadExternalTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry, api string) { + queryString := fmt.Sprintf("//types/type[not(@category) and (@api='%s' or not(@api))]", api) + + for _, node := range xmlquery.Find(doc, queryString) { typ := NewExternalTypeFromXML(node) if tr[typ.RegistryName()] != nil { logrus.WithField("registry name", typ.RegistryName()).Warn("Overwriting external type in registry") diff --git a/def/handle_type.go b/def/handle_type.go index f290732..c61b7cb 100644 --- a/def/handle_type.go +++ b/def/handle_type.go @@ -43,8 +43,10 @@ func (t *handleType) PrintPublicDeclaration(w io.Writer) { } } -func ReadHandleTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, _ ValueRegistry) { - for _, node := range xmlquery.Find(doc, "//type[@category='handle']") { +func ReadHandleTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, _ ValueRegistry, api string) { + queryString := fmt.Sprintf("//types/type[@category='handle' and (@api='%s' or not(@api))]", api) + + for _, node := range xmlquery.Find(doc, queryString) { newType := NewHandleTypeFromXML(node) if tr[newType.RegistryName()] != nil { logrus.WithField("registry name", newType.RegistryName()).Warn("Overwriting handle type in registry") diff --git a/def/include_type.go b/def/include_type.go index e5721e6..cefc711 100644 --- a/def/include_type.go +++ b/def/include_type.go @@ -1,6 +1,8 @@ package def import ( + "fmt" + "github.com/antchfx/xmlquery" "github.com/sirupsen/logrus" "github.com/tidwall/gjson" @@ -34,8 +36,10 @@ func (t *includeType) Resolve(tr TypeRegistry, vr ValueRegistry) *IncludeSet { return rval } -func ReadIncludeTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, _ ValueRegistry) { - for _, node := range xmlquery.Find(doc, "//types/type[@category='include']") { +func ReadIncludeTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, _ ValueRegistry, api string) { + queryString := fmt.Sprintf("//types/type[@category='include' and (@api='%s' or @api='')]", api) + + for _, node := range xmlquery.Find(doc, queryString) { typ := NewIncludeTypeFromXML(node) if tr[typ.RegistryName()] != nil { logrus.WithField("registry name", typ.RegistryName()).Warn("Overwriting include type in registry") diff --git a/def/registry_base.go b/def/registry_base.go index 9b1745f..0e7b510 100644 --- a/def/registry_base.go +++ b/def/registry_base.go @@ -39,7 +39,7 @@ const ( CatMaximum ) -type fnReadFromXML func(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry) +type fnReadFromXML func(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry, api string) type fnReadFromJSON func(exceptions gjson.Result, tr TypeRegistry, vr ValueRegistry) func (c TypeCategory) ReadFns() (fnReadFromXML, fnReadFromJSON) { diff --git a/def/struct_type.go b/def/struct_type.go index a8549bd..08e199a 100644 --- a/def/struct_type.go +++ b/def/struct_type.go @@ -422,20 +422,23 @@ func (m *structMember) PrintGoifyContent(preamble, structDecl, epilogue io.Write } } -func ReadStructTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry) { - for _, node := range xmlquery.Find(doc, "//type[@category='struct']") { - s := newStructTypeFromXML(node) +func ReadStructTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry, api string) { + queryString := fmt.Sprintf("//types/type[@category='struct' and (@api='%s' or not(@api))]", api) + + for _, node := range xmlquery.Find(doc, queryString) { + s := newStructTypeFromXML(node, api) tr[s.RegistryName()] = s } } -func newStructTypeFromXML(node *xmlquery.Node) *structType { +func newStructTypeFromXML(node *xmlquery.Node, api string) *structType { rval := structType{} rval.registryName = node.SelectAttr("name") rval.isReturnedOnly = node.SelectAttr("returnedonly") == "true" - for _, mNode := range xmlquery.Find(node, "member") { + queryString := fmt.Sprintf("member[@api='%s' or not(@api)]", api) + for _, mNode := range xmlquery.Find(node, queryString) { rval.members = append(rval.members, newStructMemberFromXML(mNode)) } diff --git a/def/union_type.go b/def/union_type.go index 2a5a76f..756c4a9 100644 --- a/def/union_type.go +++ b/def/union_type.go @@ -130,20 +130,23 @@ func (t *unionType) TranslateToInternal(inputVar string) string { } } -func ReadUnionTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry) { - for _, node := range xmlquery.Find(doc, "//type[@category='union']") { - s := newUnionTypeFromXML(node) +func ReadUnionTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, vr ValueRegistry, api string) { + queryString := fmt.Sprintf("//types/type[@category='union' and (@api='%s' or not(@api))]", api) + + for _, node := range xmlquery.Find(doc, queryString) { + s := newUnionTypeFromXML(node, api) tr[s.RegistryName()] = s } } -func newUnionTypeFromXML(node *xmlquery.Node) *unionType { +func newUnionTypeFromXML(node *xmlquery.Node, api string) *unionType { rval := unionType{} rval.registryName = node.SelectAttr("name") rval.isReturnedOnly = node.SelectAttr("returnedonly") == "true" - for _, mNode := range xmlquery.Find(node, "member") { + queryString := fmt.Sprintf("member[@api='%s' or not(@api)]", api) + for _, mNode := range xmlquery.Find(node, queryString) { rval.members = append(rval.members, newStructMemberFromXML(mNode)) } diff --git a/main.go b/main.go index 4f1166f..dc39ea9 100644 --- a/main.go +++ b/main.go @@ -23,6 +23,7 @@ import ( var ( inFileName, outDirName string + apiName string platformTargets string separatedPlatforms []string useTemplates bool @@ -31,6 +32,7 @@ var ( func init() { flag.StringVar(&inFileName, "inFile", "vk.xml", "Vulkan XML registry file to read") flag.StringVar(&outDirName, "outDir", "vk", "Directory to write go-vk output to") + flag.StringVar(&apiName, "api", "vulkan", "API to generate against; possible values include 'vulkan' and 'vulkansc'") flag.StringVar(&platformTargets, "platform", "win32,macos,metal", "Comma-separated list of platforms to generate for; this looks at the Vulkan name, not the GOOS name for the platform") flag.Parse() @@ -92,7 +94,7 @@ func main() { for tc := def.CatNone; tc < def.CatMaximum; tc++ { xml, json := tc.ReadFns() if xml != nil { - xml(xmlDoc, globalTypes, globalValues) + xml(xmlDoc, globalTypes, globalValues, apiName) } if json != nil { json(jsonDoc, globalTypes, globalValues) @@ -133,7 +135,8 @@ func main() { } // "Core" extensions - for _, extNode := range xmlquery.Find(xmlDoc, "//extension[not(@platform) and @supported='vulkan']") { + extQueryString := fmt.Sprintf("//extension[not(@platform) and contains(@supported,'%s')]", apiName) + for _, extNode := range xmlquery.Find(xmlDoc, extQueryString) { ext := feat.ReadExtensionFromXML(extNode, globalTypes, globalValues) platforms[""].IncludeExtension(ext) } @@ -174,7 +177,7 @@ func main() { pf := plat.GeneratePlatformFeatures() pf.Resolve(globalTypes, globalValues) - for tc, reg := range pf.FilterByCategory() { + for tc, reg := range pf.FilterByCategory() { printCategory(tc, reg, plat, commandCount, goimportsPath) if tc == def.CatCommand { commandCount += len(reg.ResolvedTypes) @@ -209,7 +212,7 @@ func printCategory(tc def.TypeCategory, fc *feat.Feature, platform *feat.Platfor f, _ := os.Create(outpath) // explicit f.Close() below; not deferred because the file must be written to disk before goimports is run - if platform != nil && platform.GoBuildTag != "" && tc != def.CatEnum { + if platform != nil && platform.GoBuildTag != "" && tc != def.CatEnum && tc != def.CatBitmask { fmt.Fprintf(f, "//go:build %s\n", platform.GoBuildTag) }