Skip to content

Commit

Permalink
Merge pull request #41 from bbredesen/bugfix/20
Browse files Browse the repository at this point in the history
Bugfix/20
  • Loading branch information
bbredesen committed Mar 31, 2023
2 parents f7dcceb + 388c79c commit 6771e75
Show file tree
Hide file tree
Showing 14 changed files with 82 additions and 35 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ vk/

vk-gen
vk-gen.exe
vk.xml
*.xml

.vscode/
.DS_Store
6 changes: 4 additions & 2 deletions def/base_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
6 changes: 4 additions & 2 deletions def/bitmask_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
14 changes: 9 additions & 5 deletions def/command_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 != "" {
Expand All @@ -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)
}
Expand Down
5 changes: 3 additions & 2 deletions def/define_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()).
Expand Down
6 changes: 4 additions & 2 deletions def/enum_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
6 changes: 4 additions & 2 deletions def/external_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
6 changes: 4 additions & 2 deletions def/handle_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
8 changes: 6 additions & 2 deletions def/include_type.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package def

import (
"fmt"

"github.com/antchfx/xmlquery"
"github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
Expand Down Expand Up @@ -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")
Expand Down
2 changes: 1 addition & 1 deletion def/registry_base.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
13 changes: 8 additions & 5 deletions def/struct_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}

Expand Down
13 changes: 8 additions & 5 deletions def/union_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}

Expand Down
19 changes: 19 additions & 0 deletions exceptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
},

Expand Down
11 changes: 7 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (

var (
inFileName, outDirName string
apiName string
platformTargets string
separatedPlatforms []string
useTemplates bool
Expand All @@ -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()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
}

Expand Down

0 comments on commit 6771e75

Please sign in to comment.