private static void DeclareSamplers(CodeGenContext context, TextureDescriptor[] descriptors) { int arraySize = 0; foreach (var descriptor in descriptors) { if (descriptor.Type.HasFlag(SamplerType.Indexed)) { if (arraySize == 0) { arraySize = ShaderConfig.SamplerArraySize; } else if (--arraySize != 0) { continue; } } string indexExpr = NumberFormatter.FormatInt(arraySize); string samplerName = OperandManager.GetSamplerName( context.Config.Stage, descriptor.CbufSlot, descriptor.HandleIndex, descriptor.Type.HasFlag(SamplerType.Indexed), indexExpr); string samplerTypeName = descriptor.Type.ToGlslSamplerType(); context.AppendLine($"layout (binding = {descriptor.Binding}) uniform {samplerTypeName} {samplerName};"); } }
private static void DeclareImages(CodeGenContext context, StructuredProgramInfo info) { Dictionary <string, AstTextureOperation> images = new Dictionary <string, AstTextureOperation>(); foreach (AstTextureOperation texOp in info.Images.OrderBy(x => x.Handle)) { string indexExpr = NumberFormatter.FormatInt(texOp.ArraySize); string imageName = OperandManager.GetImageName(context.Config.Stage, texOp, indexExpr); if (!images.TryAdd(imageName, texOp)) { // Ensure that all texture operations share the same format. // This avoid errors like mismatched formats. texOp.Format = images[imageName].Format; continue; } string layout = texOp.Format.ToGlslFormat(); if (!string.IsNullOrEmpty(layout)) { layout = "layout(" + layout + ") "; } string imageTypeName = GetImageTypeName(texOp.Type, texOp.Format.GetComponentType()); context.AppendLine("uniform " + layout + imageTypeName + " " + imageName + ";"); } foreach (KeyValuePair <string, AstTextureOperation> kv in images) { string imageName = kv.Key; AstTextureOperation texOp = kv.Value; if ((texOp.Type & SamplerType.Indexed) != 0) { for (int index = 0; index < texOp.ArraySize; index++) { string indexExpr = NumberFormatter.FormatInt(index); string indexedSamplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr); var desc = new TextureDescriptor(indexedSamplerName, texOp.Type, texOp.Handle + index * 2); context.TextureDescriptors.Add(desc); } } else { var desc = new TextureDescriptor(imageName, texOp.Type, texOp.Handle); context.ImageDescriptors.Add(desc); } } }
private static void DeclareSamplers(CodeGenContext context, StructuredProgramInfo info) { Dictionary <string, AstTextureOperation> samplers = new Dictionary <string, AstTextureOperation>(); foreach (AstTextureOperation texOp in info.Samplers.OrderBy(x => x.Handle)) { string indexExpr = NumberFormatter.FormatInt(texOp.ArraySize); string samplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr); if (!samplers.TryAdd(samplerName, texOp)) { continue; } string samplerTypeName = GetSamplerTypeName(texOp.Type); context.AppendLine("uniform " + samplerTypeName + " " + samplerName + ";"); } foreach (KeyValuePair <string, AstTextureOperation> kv in samplers) { string samplerName = kv.Key; AstTextureOperation texOp = kv.Value; TextureDescriptor desc; if ((texOp.Flags & TextureFlags.Bindless) != 0) { AstOperand operand = texOp.GetSource(0) as AstOperand; desc = new TextureDescriptor(samplerName, texOp.Type, operand.CbufSlot, operand.CbufOffset); context.TextureDescriptors.Add(desc); } else if ((texOp.Type & SamplerType.Indexed) != 0) { for (int index = 0; index < texOp.ArraySize; index++) { string indexExpr = NumberFormatter.FormatInt(index); string indexedSamplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr); desc = new TextureDescriptor(indexedSamplerName, texOp.Type, texOp.Handle + index * 2); context.TextureDescriptors.Add(desc); } } else { desc = new TextureDescriptor(samplerName, texOp.Type, texOp.Handle); context.TextureDescriptors.Add(desc); } } }
private static void DeclareSamplers(CodeGenContext context, StructuredProgramInfo info) { HashSet <string> samplers = new HashSet <string>(); // Texture instructions other than TextureSample (like TextureSize) // may have incomplete sampler type information. In those cases, // we prefer instead the more accurate information from the // TextureSample instruction, if both are available. foreach (AstTextureOperation texOp in info.Samplers.OrderBy(x => x.Handle * 2 + (x.Inst == Instruction.TextureSample ? 0 : 1))) { string indexExpr = NumberFormatter.FormatInt(texOp.ArraySize); string samplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr); if ((texOp.Flags & TextureFlags.Bindless) != 0 || !samplers.Add(samplerName)) { continue; } int firstBinding = -1; if ((texOp.Type & SamplerType.Indexed) != 0) { for (int index = 0; index < texOp.ArraySize; index++) { int binding = context.Config.Counts.IncrementTexturesCount(); if (firstBinding < 0) { firstBinding = binding; } var desc = new TextureDescriptor(binding, texOp.Type, texOp.Format, texOp.CbufSlot, texOp.Handle + index * 2); context.TextureDescriptors.Add(desc); } } else { firstBinding = context.Config.Counts.IncrementTexturesCount(); var desc = new TextureDescriptor(firstBinding, texOp.Type, texOp.Format, texOp.CbufSlot, texOp.Handle); context.TextureDescriptors.Add(desc); } string samplerTypeName = texOp.Type.ToGlslSamplerType(); context.AppendLine($"layout (binding = {firstBinding}) uniform {samplerTypeName} {samplerName};"); } }
private static void DeclareImages(CodeGenContext context, StructuredProgramInfo info) { Dictionary <string, AstTextureOperation> images = new Dictionary <string, AstTextureOperation>(); foreach (AstTextureOperation texOp in info.Images.OrderBy(x => x.Handle)) { string indexExpr = NumberFormatter.FormatInt(texOp.ArraySize); string imageName = OperandManager.GetImageName(context.Config.Stage, texOp, indexExpr); if (!images.TryAdd(imageName, texOp)) { continue; } string imageTypeName = GetImageTypeName(texOp.Type); context.AppendLine("writeonly uniform " + imageTypeName + " " + imageName + ";"); } foreach (KeyValuePair <string, AstTextureOperation> kv in images) { string imageName = kv.Key; AstTextureOperation texOp = kv.Value; if ((texOp.Type & SamplerType.Indexed) != 0) { for (int index = 0; index < texOp.ArraySize; index++) { string indexExpr = NumberFormatter.FormatInt(index); string indexedSamplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr); var desc = new TextureDescriptor(indexedSamplerName, texOp.Type, texOp.Handle + index * 2); context.TextureDescriptors.Add(desc); } } else { var desc = new TextureDescriptor(imageName, texOp.Type, texOp.Handle); context.ImageDescriptors.Add(desc); } } }
private static void DeclareSamplers(CodeGenContext context, TextureDescriptor[] descriptors) { int arraySize = 0; foreach (var descriptor in descriptors) { if (descriptor.Type.HasFlag(SamplerType.Indexed)) { if (arraySize == 0) { arraySize = ShaderConfig.SamplerArraySize; } else if (--arraySize != 0) { continue; } } string indexExpr = NumberFormatter.FormatInt(arraySize); string samplerName = OperandManager.GetSamplerName( context.Config.Stage, descriptor.CbufSlot, descriptor.HandleIndex, descriptor.Type.HasFlag(SamplerType.Indexed), indexExpr); string samplerTypeName = descriptor.Type.ToGlslSamplerType(); string layout = string.Empty; if (context.Config.Options.TargetApi == TargetApi.Vulkan) { bool isBuffer = (descriptor.Type & SamplerType.Mask) == SamplerType.TextureBuffer; int setIndex = isBuffer ? 4 : 2; layout = $", set = {setIndex}"; } context.AppendLine($"layout (binding = {descriptor.Binding}{layout}) uniform {samplerTypeName} {samplerName};"); } }
private static void DeclareSamplers(CodeGenContext context, StructuredProgramInfo info) { Dictionary <string, AstTextureOperation> samplers = new Dictionary <string, AstTextureOperation>(); // Texture instructions other than TextureSample (like TextureSize) // may have incomplete sampler type information. In those cases, // we prefer instead the more accurate information from the // TextureSample instruction, if both are available. foreach (AstTextureOperation texOp in info.Samplers.OrderBy(x => x.Handle * 2 + (x.Inst == Instruction.TextureSample ? 0 : 1))) { string indexExpr = NumberFormatter.FormatInt(texOp.ArraySize); string samplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr); if (!samplers.TryAdd(samplerName, texOp)) { continue; } string samplerTypeName = GetSamplerTypeName(texOp.Type); context.AppendLine("uniform " + samplerTypeName + " " + samplerName + ";"); } foreach (KeyValuePair <string, AstTextureOperation> kv in samplers) { string samplerName = kv.Key; AstTextureOperation texOp = kv.Value; TextureDescriptor desc; if ((texOp.Flags & TextureFlags.Bindless) != 0) { AstOperand operand = texOp.GetSource(0) as AstOperand; desc = new TextureDescriptor(samplerName, texOp.Type, operand.CbufSlot, operand.CbufOffset); context.TextureDescriptors.Add(desc); } else if ((texOp.Type & SamplerType.Indexed) != 0) { for (int index = 0; index < texOp.ArraySize; index++) { string indexExpr = NumberFormatter.FormatInt(index); string indexedSamplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr); desc = new TextureDescriptor(indexedSamplerName, texOp.Type, texOp.Handle + index * 2); context.TextureDescriptors.Add(desc); } } else { desc = new TextureDescriptor(samplerName, texOp.Type, texOp.Handle); context.TextureDescriptors.Add(desc); } } }