From e94fe16f546ae242af035a314a0f97c40361fe26 Mon Sep 17 00:00:00 2001 From: Ben Bredesen Date: Tue, 28 Mar 2023 10:54:23 -0500 Subject: [PATCH 1/4] remove lazyCommands map and commandKey type --- static_include/static_common.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/static_include/static_common.go b/static_include/static_common.go index e272acb..87d40f3 100644 --- a/static_include/static_common.go +++ b/static_include/static_common.go @@ -38,7 +38,6 @@ func (r Result) Error() string { return r.String() } -type vkCommandKey int type vkCommand struct { protoName string argCount int @@ -46,8 +45,6 @@ type vkCommand struct { fnHandle unsafe.Pointer } -var lazyCommands map[vkCommandKey]vkCommand = make(map[vkCommandKey]vkCommand) - var dlHandle unsafe.Pointer var overrideLibName string @@ -60,7 +57,7 @@ func OverrideDefaultVulkanLibrary(nameOrPath string) { overrideLibName = nameOrPath } -func execTrampoline(commandKey vkCommandKey, args ...uintptr) uintptr { +func execTrampoline(cmd *vkCommand, args ...uintptr) uintptr { if dlHandle == nil { var libName string switch runtime.GOOS { @@ -86,10 +83,10 @@ func execTrampoline(commandKey vkCommandKey, args ...uintptr) uintptr { C.free(unsafe.Pointer(cstr)) } - cmd := lazyCommands[commandKey] + // cmd := lazyCommands[commandKey] if cmd.fnHandle == nil { cmd.fnHandle = C.SymbolFromName(dlHandle, unsafe.Pointer(sys_stringToBytePointer(cmd.protoName))) - lazyCommands[commandKey] = cmd + // lazyCommands[commandKey] = cmd } if len(args) != cmd.argCount { @@ -126,9 +123,7 @@ func execTrampoline(commandKey vkCommandKey, args ...uintptr) uintptr { panic("Unhandled number of arguments passed for cmd " + cmd.protoName) } - // Trampoline is always returning a file does not exist error in the second return value, so that error reporting is disabled - - return uintptr(result) //, err + return uintptr(result) } func stringToNullTermBytes(s string) *byte { From e88387593d2ab03efc7c804b89858989206b5168 Mon Sep 17 00:00:00 2001 From: Ben Bredesen Date: Tue, 28 Mar 2023 10:55:26 -0500 Subject: [PATCH 2/4] Change trampoline call from map key to var --- def/command_type.go | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/def/command_type.go b/def/command_type.go index d24a39e..a395c38 100644 --- a/def/command_type.go +++ b/def/command_type.go @@ -444,17 +444,28 @@ func (t *commandType) PrintPublicDeclaration(w io.Writer) { } - specStringFromParams := func(sl []*commandParam) string { + specStringFromParams := func(sl []*commandParam) (string, bool) { + var remapResultToError bool = false sb := &strings.Builder{} for _, param := range sl { + if param.resolvedType.RegistryName() == "VkResult" { + remapResultToError = true + continue + } fmt.Fprintf(sb, ", %s %s", param.publicName, param.resolvedType.PublicName()) } - return strings.TrimPrefix(sb.String(), ", ") + + if remapResultToError { + fmt.Fprintf(sb, ", r error") + } + return strings.TrimPrefix(sb.String(), ", "), remapResultToError + } t.bindingParamCount = len(funcTrampolineParams) - inputSpecString, returnSpecString := specStringFromParams(funcInputParams), specStringFromParams(funcReturnParams) + inputSpecString, _ := specStringFromParams(funcInputParams) + returnSpecString, hasResult := specStringFromParams(funcReturnParams) t.PrintDocLink(w) fmt.Fprintf(w, "func %s(%s) (%s) {\n", @@ -469,11 +480,18 @@ func (t *commandType) PrintPublicDeclaration(w io.Writer) { fmt.Fprintf(w, epilogue.String()) + if hasResult { + fmt.Fprint(w, " if r == Result(0) {\nr = SUCCESS\n}\n") + } + if len(funcReturnParams) > 0 { fmt.Fprintf(w, " return\n") } fmt.Fprintf(w, "}\n\n") + + fmt.Fprintf(w, "var %s = &vkCommand{\"%s\", %d, %v, nil}\n", + t.RegistryName(), t.RegistryName(), t.bindingParamCount, t.resolvedReturnType != nil) } func trampStringFromParams(sl []*commandParam) string { @@ -494,13 +512,13 @@ func (t *commandType) printTrampolineCall(w io.Writer, trampParams []*commandPar if returnParam != nil { if returnParam.resolvedType.IsIdenticalPublicAndInternal() { - fmt.Fprintf(w, " %s = %s(execTrampoline(%s%s))\n", returnParam.publicName, returnParam.resolvedType.PublicName(), t.keyName(), trampParamsString) + fmt.Fprintf(w, " %s = %s(execTrampoline(%s%s))\n", returnParam.publicName, returnParam.resolvedType.PublicName(), t.RegistryName(), trampParamsString) } else { - fmt.Fprintf(w, " rval := %s(execTrampoline(%s%s))\n", returnParam.resolvedType.InternalName(), t.keyName(), trampParamsString) + fmt.Fprintf(w, " rval := %s(execTrampoline(%s%s))\n", returnParam.resolvedType.InternalName(), t.RegistryName(), trampParamsString) fmt.Fprintf(w, " %s = %s\n", returnParam.publicName, returnParam.resolvedType.TranslateToPublic("rval")) } } else { - fmt.Fprintf(w, " execTrampoline(%s%s)\n", t.keyName(), trampParamsString) + fmt.Fprintf(w, " execTrampoline(%s%s)\n", t.RegistryName(), trampParamsString) } } From 19d2a8b43f55869b068fc81aadb5eed253a1235a Mon Sep 17 00:00:00 2001 From: Ben Bredesen Date: Tue, 28 Mar 2023 11:07:59 -0500 Subject: [PATCH 3/4] Remove global and init content --- def/command_type.go | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/def/command_type.go b/def/command_type.go index a395c38..6ba36c4 100644 --- a/def/command_type.go +++ b/def/command_type.go @@ -83,34 +83,6 @@ func (t *commandType) Resolve(tr TypeRegistry, vr ValueRegistry) *IncludeSet { return iset } -func (t *commandType) PrintGlobalDeclarations(w io.Writer, idx int, isStart bool) { - if t.staticCodeRef != "" || t.IsAlias() { - // Ignored, static refs from exceptions.json aren't processed through - // Cgo/lazyCommands and no need to write key entries for alias commands - return - } - - if isStart { - if idx == 0 { - fmt.Fprintf(w, "%s vkCommandKey = iota\n", t.keyName()) - } else { - fmt.Fprintf(w, "%s vkCommandKey = iota + %d\n", t.keyName(), idx) - } - } else { - fmt.Fprintln(w, t.keyName()) - } -} - -func (t *commandType) PrintFileInitContent(w io.Writer) { - if t.IsAlias() { - // No need to write key entries for alias commands - return - } - fmt.Fprintf(w, "lazyCommands[%s] = vkCommand{\"%s\", %d, %v, nil}\n", - t.keyName(), t.RegistryName(), t.bindingParamCount, t.resolvedReturnType != nil) - -} - func (t *commandType) PrintPublicDeclaration(w io.Writer) { if t.staticCodeRef != "" { fmt.Fprintf(w, "// %s is static code, not generated from vk.xml; aliased to %s\n", t.PublicName(), t.staticCodeRef) From 533cf1af3d8dd6d749f53a077b0d9ac131e02a08 Mon Sep 17 00:00:00 2001 From: Ben Bredesen Date: Tue, 28 Mar 2023 12:00:44 -0500 Subject: [PATCH 4/4] Add version specific XML download instructions --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 9c4269c..47caf95 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,9 @@ Install: `go install github.com/bbredesen/vk-gen@latest` Download the latest registry file: `curl https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/registry/vk.xml > vk.xml` +(Or, replace "main" in the URL above with the tagged version you want to generate against: e.g., +`https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/v1.2.203/registry/vk.xml` for the last version 1.2 specification.) + Run the tool: `vk-gen` Use `-inFile` to specify a registry filename or path (defaults to `./vk.xml`)