void RewriteCommandDefinition(VkCommand vkCommand) { if (vkCommand.Name.StartsWith("vk")) { vkCommand.Name = vkCommand.Name.Remove(0, 2); // trim `Vk` } for (var x = 0; x < vkCommand.Parameters.Length; x++) { var param = vkCommand.Parameters[x]; var paramName = param.Name; if (param.IsPointer) { paramName = paramName.TrimStart(new[] { 'p' }); } paramName = char.ToLower(paramName[0]) + paramName.Substring(1); if (paramName == "event" || paramName == "object") { paramName = '@' + paramName; } param.Name = paramName; if (!string.IsNullOrEmpty(param.Len)) { var lenName = param.Len; lenName = lenName.TrimStart(new[] { 'p' }); lenName = char.ToLower(lenName[0]) + lenName.Substring(1); param.Len = lenName; } } if (vkCommand.CmdBufferLevel.Length != 0) { for (int x = 0; x < vkCommand.CmdBufferLevel.Length; x++) { var str = vkCommand.CmdBufferLevel[x]; str = char.ToUpper(str[0]) + str.Substring(1, str.Length - 1); vkCommand.CmdBufferLevel[x] = str; } } if (!string.IsNullOrEmpty(vkCommand.RenderPass)) { vkCommand.RenderPass = char.ToUpper(vkCommand.RenderPass[0]) + vkCommand.RenderPass.Substring(1, vkCommand.RenderPass.Length - 1); } if (vkCommand.Queues.Length != 0) { for (int x = 0; x < vkCommand.Queues.Length; x++) { var str = vkCommand.Queues[x]; str = char.ToUpper(str[0]) + str.Substring(1, str.Length - 1); vkCommand.Queues[x] = str; } } }
void RewriteCommandParamLen(VkCommand vkCommand, VkStruct[] allStructs) { for (var x = 0; x < vkCommand.Parameters.Length; x++) { var param = vkCommand.Parameters[x]; if (param.Len == @"latexmath:[$dataSize \over 4$]" && param.Type.Name == "UInt32") { param.Len = "dataSize"; param.Type = allStructs.First(y => y.Name == "Byte"); } } }
VkCommand ReadCommand(XElement xcommand) { if (xcommand.Name != "command") { throw new ArgumentException("Not a command", nameof(xcommand)); } var xproto = xcommand.Element("proto"); if (xproto == null) { throw new ArgumentException("No prototype", nameof(xcommand)); } var vkCommand = new VkCommand(); vkCommand.Name = vkCommand.SpecName = xproto.Element("name").Value; vkCommand.ErrorCodes = new string[0]; vkCommand.SuccessCodes = new string[0]; vkCommand.Queues = new string[0]; var returnType = xproto.Element("type").Value; if (returnType != "void") { vkCommand.ReturnType = GetOrAddType(returnType); } // todo: return is const // todo: return is pointer var xprotoStr = xproto.Value; if (xprotoStr.Contains("*") || xprotoStr.Contains("const")) { throw new NotImplementedException(); } var xparams = xcommand.Elements("param"); vkCommand.Parameters = xparams.Select(ReadParam).ToArray(); var elements = xcommand.Elements(); if (!elements.Any()) { throw new ArgumentException("Contains no elements", nameof(xcommand)); } foreach (var xelm in elements) { switch (xelm.Name.ToString()) { case "proto": case "param": break; case "validity": vkCommand.Validity = xelm.Elements().Select(x => x.Value).ToArray(); break; case "implicitexternsyncparams": vkCommand.ImplicitExternSyncParams = xelm.Elements().Select(x => x.Value).ToArray(); break; default: throw new NotImplementedException(xelm.Name.ToString()); } } // note: queues / renderpass / cmdbufferlevel - If one is present all three must be // read command attributes var xattributes = xcommand.Attributes(); if (xattributes.Any()) { foreach (var xattrib in xattributes) { switch (xattrib.Name.ToString()) { case "successcodes": vkCommand.SuccessCodes = xattrib.Value.Split(','); break; case "errorcodes": vkCommand.ErrorCodes = xattrib.Value.Split(','); break; case "queues": vkCommand.Queues = xattrib.Value.Split(','); break; case "renderpass": vkCommand.RenderPass = xattrib.Value; break; case "cmdbufferlevel": vkCommand.CmdBufferLevel = xattrib.Value.Split(','); break; default: throw new NotImplementedException(xattrib.Name.ToString()); } } } return(vkCommand); }