예제 #1
0
        public void WriteResourceDefinition(IrResourceDefinition resourceDefinition)
        {
            HashSet <string> seen = new HashSet <string>();

            WriteLine("// ConstantBuffers");
            WriteLine(resourceDefinition.ConstantBuffersDebug);
            foreach (var constantBuffer in resourceDefinition.ConstantBuffers)
            {
                WriteConstantBuffer(resourceDefinition, constantBuffer, ref seen);
            }
            WriteLine("// ResourceBindings");
            WriteLine(resourceDefinition.ResourceBindingsDebug);
            foreach (var resourceBinding in resourceDefinition.ResourceBindings)
            {
                WriteResourceBinding(resourceBinding);
            }
            WriteLine();
        }
예제 #2
0
        public static void Parse(IrShader shader, ResourceDefinitionChunk chunk)
        {
            var rdef = new IrResourceDefinition(chunk);

            shader.ResourceDefinition  = rdef;
            rdef.ResourceBindingsDebug = DisassembleBindings(chunk.ResourceBindings, chunk.Target.IsSM51);
            rdef.ResourceBindings      = new List <IrResourceBinding>();
            foreach (var binding in chunk.ResourceBindings)
            {
                rdef.ResourceBindings.Add(ParseBinding(binding));
            }
            rdef.ConstantBuffersDebug = DisassembleBuffers(chunk.ConstantBuffers);
            rdef.ConstantBuffers      = new List <IrConstantBuffer>();
            foreach (var cbuffer in chunk.ConstantBuffers)
            {
                rdef.ConstantBuffers.Add(ParseBuffer(cbuffer));
            }
        }
예제 #3
0
 void WriteConstantBuffer(IrResourceDefinition rdef, IrConstantBuffer constantBuffer, ref HashSet <string> seen)
 {
     if (!string.IsNullOrEmpty(constantBuffer.Debug))
     {
         WriteLineFormat("// {0}", constantBuffer.Debug);
     }
     if (constantBuffer.BufferType == ConstantBufferType.ConstantBuffer ||
         constantBuffer.BufferType == ConstantBufferType.TextureBuffer)
     {
         if (constantBuffer.Name == "$Globals")
         {
             WriteLine("// Globals");
             foreach (var variable in constantBuffer.Variables)
             {
                 WriteVariable(variable, 0, packOffset: false);
             }
             WriteLine();
         }
         else if (constantBuffer.Name == "$Params")
         {
         }
         else
         {
             var resourceBinding = rdef.ResourceBindings.FirstOrDefault(rb =>
                                                                        (rb.Kind == IrResourceKind.CBuffer || rb.Kind == IrResourceKind.TBuffer) &&
                                                                        rb.Name == constantBuffer.Name);
             var bufferName = resourceBinding.Kind == IrResourceKind.CBuffer ?
                              "cbuffer" :
                              "tbuffer";
             Write($"{bufferName} {constantBuffer.Name}");
             if (EmitRegisterDeclarations)
             {
                 var registerName = resourceBinding.Kind == IrResourceKind.CBuffer ?
                                    "b" :
                                    "t";
                 Write($" : register({registerName}{resourceBinding.BindPoint})");
             }
             WriteLine();
             WriteLine("{");
             foreach (var variable in constantBuffer.Variables)
             {
                 WriteVariable(variable);
             }
             WriteLine("}");
             WriteLine("");
         }
     }
     else if (constantBuffer.BufferType == ConstantBufferType.ResourceBindInformation)
     {
         WriteLineFormat("// Resource bind info for {0}", constantBuffer.Name);
         var element  = constantBuffer.Variables.Single();
         var baseType = element.ShaderType;
         if (baseType.VariableClass != ShaderVariableClass.Struct)
         {
             Write("// ");
             WriteVariable(element);
             return;
         }
         var typeName = element.ShaderType.BaseTypeName;
         if (string.IsNullOrEmpty(typeName))
         {
             var index = rdef.ConstantBuffers
                         .Where(cb => cb.BufferType == ConstantBufferType.ResourceBindInformation)
                         .ToList()
                         .IndexOf(constantBuffer);
             typeName = $"struct{index}";
         }
         if (seen.Contains(typeName))
         {
             WriteLine($"// {baseType} {typeName}");
         }
         else
         {
             seen.Add(typeName);
             WriteLine(GetShaderTypeDeclaration(baseType, overrideName: typeName));
         }
     }
 }