Пример #1
0
        void WriteInterfacePointers(IrInterfaceManger manager)
        {
            var interfaces = manager.Chunk;
            var rdef       = Context.Shader.ResourceDefinition.Chunk;

            WriteLine("// Interface Pointers");
            foreach (var cb in rdef.ConstantBuffers
                     .Where(cb => cb.BufferType == ConstantBufferType.InterfacePointers))
            {
                WriteLine($"{cb.ToString()}");
            }
            var cbVariables = rdef.ConstantBuffers
                              .Where(cb => cb.BufferType == ConstantBufferType.InterfacePointers)
                              .Single()
                              .Variables;

            foreach (var group in cbVariables.GroupBy(v => GetShaderTypeName(v.ShaderType)))
            {
                var itf = group.First();
                WriteLine($"interface {group.Key} ");
                WriteLine("{");

                var slots          = interfaces.InterfaceSlots.Single(i => i.StartSlot == itf.StartOffset);
                var tableId        = slots.TableIDs.First();
                var functionTables = manager.FunctionTables[$"ft{tableId}"];
                for (int i = 0; i < functionTables.Count; i++)
                {
                    WriteLine($"    void Call{i}();");
                }
                WriteLine("};");
            }
            foreach (var variable in cbVariables)
            {
                // interface definition must come before instance
                var indexString = variable.ShaderType.ElementCount > 0 ? $"[{variable.ShaderType.ElementCount}]" : "";
                WriteLine($"{GetShaderTypeName(variable.ShaderType)} {variable.Name}{indexString};");
            }
            foreach (var ct in interfaces.AvailableClassTypes)
            {
                var slots = interfaces.InterfaceSlots.First(i => i.TypeIDs.Contains(ct.ID));
                var itf   = cbVariables.First(v => v.StartOffset == slots.StartSlot);
                WriteLine($"class {ct.Name} : {GetShaderTypeName(itf.ShaderType)}");
                WriteLine("{");
                IncreaseIndent();
                var functionTables = manager.FunctionTables[$"ft{ct.ID}"];
                WriteIndent();
                WriteLine($"// ft{ct.ID}");
                WriteIndent();
                WriteLine($"{slots}");
                for (int i = 0; i < functionTables.Count; i++)
                {
                    var functionBody = manager.Passes[functionTables[i]];
                    WriteIndent();
                    WriteLine($"void Call{i}(){{");
                    IncreaseIndent();
                    foreach (var token in functionBody.Instructions)
                    {
                        Context.InstructionWriter.WriteInstruction(token);
                    }
                    DecreaseIndent();
                    WriteIndent();
                    WriteLine($"}}");
                }
                DecreaseIndent();
                WriteLine("};");
            }
        }
Пример #2
0
 public void WriteInterface(IrInterfaceManger manager)
 {
     WriteFormat(manager.Chunk.ToString());
     WriteInterfacePointers(manager);
 }