示例#1
0
        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;
                }
            }
        }
示例#2
0
 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");
         }
     }
 }
示例#3
0
        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);
        }