private static void DeclareStorageBuffers(CodeGenContext context, BufferDescriptor[] descriptors) { if (descriptors.Length == 0) { return; } int setIndex = context.Config.Options.TargetApi == TargetApi.Vulkan ? 1 : 0; int count = descriptors.Max(x => x.Binding) + 1; var sbArrayType = context.TypeRuntimeArray(context.TypeU32()); context.Decorate(sbArrayType, Decoration.ArrayStride, (LiteralInteger)4); var sbStructType = context.TypeStruct(true, sbArrayType); context.Decorate(sbStructType, Decoration.BufferBlock); context.MemberDecorate(sbStructType, 0, Decoration.Offset, (LiteralInteger)0); var sbStructArrayType = context.TypeArray(sbStructType, context.Constant(context.TypeU32(), count)); var sbPointerType = context.TypePointer(StorageClass.Uniform, sbStructArrayType); var sbVariable = context.Variable(sbPointerType, StorageClass.Uniform); context.Name(sbVariable, $"{GetStagePrefix(context.Config.Stage)}_s"); context.Decorate(sbVariable, Decoration.DescriptorSet, (LiteralInteger)setIndex); context.Decorate(sbVariable, Decoration.Binding, (LiteralInteger)descriptors[0].Binding); context.AddGlobalVariable(sbVariable); context.StorageBuffersArray = sbVariable; }
private static void DeclareSupportBuffer(CodeGenContext context) { if (!context.Config.Stage.SupportsRenderScale() && !(context.Config.LastInVertexPipeline && context.Config.GpuAccessor.QueryViewportTransformDisable())) { return; } var isBgraArrayType = context.TypeArray(context.TypeU32(), context.Constant(context.TypeU32(), SupportBuffer.FragmentIsBgraCount)); var viewportInverseVectorType = context.TypeVector(context.TypeFP32(), 4); var renderScaleArrayType = context.TypeArray(context.TypeFP32(), context.Constant(context.TypeU32(), SupportBuffer.RenderScaleMaxCount)); context.Decorate(isBgraArrayType, Decoration.ArrayStride, (LiteralInteger)SupportBuffer.FieldSize); context.Decorate(renderScaleArrayType, Decoration.ArrayStride, (LiteralInteger)SupportBuffer.FieldSize); var supportBufferStructType = context.TypeStruct(false, context.TypeU32(), isBgraArrayType, viewportInverseVectorType, context.TypeS32(), renderScaleArrayType); context.MemberDecorate(supportBufferStructType, 0, Decoration.Offset, (LiteralInteger)SupportBuffer.FragmentAlphaTestOffset); context.MemberDecorate(supportBufferStructType, 1, Decoration.Offset, (LiteralInteger)SupportBuffer.FragmentIsBgraOffset); context.MemberDecorate(supportBufferStructType, 2, Decoration.Offset, (LiteralInteger)SupportBuffer.ViewportInverseOffset); context.MemberDecorate(supportBufferStructType, 3, Decoration.Offset, (LiteralInteger)SupportBuffer.FragmentRenderScaleCountOffset); context.MemberDecorate(supportBufferStructType, 4, Decoration.Offset, (LiteralInteger)SupportBuffer.GraphicsRenderScaleOffset); context.Decorate(supportBufferStructType, Decoration.Block); var supportBufferPointerType = context.TypePointer(StorageClass.Uniform, supportBufferStructType); var supportBufferVariable = context.Variable(supportBufferPointerType, StorageClass.Uniform); context.Decorate(supportBufferVariable, Decoration.DescriptorSet, (LiteralInteger)0); context.Decorate(supportBufferVariable, Decoration.Binding, (LiteralInteger)0); context.AddGlobalVariable(supportBufferVariable); context.SupportBuffer = supportBufferVariable; }
private static void DeclareUniformBuffers(CodeGenContext context, BufferDescriptor[] descriptors) { if (descriptors.Length == 0) { return; } uint ubSize = Constants.ConstantBufferSize / 16; var ubArrayType = context.TypeArray(context.TypeVector(context.TypeFP32(), 4), context.Constant(context.TypeU32(), ubSize), true); context.Decorate(ubArrayType, Decoration.ArrayStride, (LiteralInteger)16); var ubStructType = context.TypeStruct(true, ubArrayType); context.Decorate(ubStructType, Decoration.Block); context.MemberDecorate(ubStructType, 0, Decoration.Offset, (LiteralInteger)0); if (context.Config.UsedFeatures.HasFlag(FeatureFlags.CbIndexing)) { int count = descriptors.Max(x => x.Slot) + 1; var ubStructArrayType = context.TypeArray(ubStructType, context.Constant(context.TypeU32(), count)); var ubPointerType = context.TypePointer(StorageClass.Uniform, ubStructArrayType); var ubVariable = context.Variable(ubPointerType, StorageClass.Uniform); context.Name(ubVariable, $"{GetStagePrefix(context.Config.Stage)}_u"); context.Decorate(ubVariable, Decoration.DescriptorSet, (LiteralInteger)0); context.Decorate(ubVariable, Decoration.Binding, (LiteralInteger)context.Config.FirstConstantBufferBinding); context.AddGlobalVariable(ubVariable); context.UniformBuffersArray = ubVariable; } else { var ubPointerType = context.TypePointer(StorageClass.Uniform, ubStructType); foreach (var descriptor in descriptors) { var ubVariable = context.Variable(ubPointerType, StorageClass.Uniform); context.Name(ubVariable, $"{GetStagePrefix(context.Config.Stage)}_c{descriptor.Slot}"); context.Decorate(ubVariable, Decoration.DescriptorSet, (LiteralInteger)0); context.Decorate(ubVariable, Decoration.Binding, (LiteralInteger)descriptor.Binding); context.AddGlobalVariable(ubVariable); context.UniformBuffers.Add(descriptor.Slot, ubVariable); } } }
private static void DeclareUniformBuffers(CodeGenContext context, BufferDescriptor[] descriptors) { uint ubSize = Constants.ConstantBufferSize / 16; var ubArrayType = context.TypeArray(context.TypeVector(context.TypeFP32(), 4), context.Constant(context.TypeU32(), ubSize), true); context.Decorate(ubArrayType, Decoration.ArrayStride, (LiteralInteger)16); var ubStructType = context.TypeStruct(true, ubArrayType); context.Decorate(ubStructType, Decoration.Block); context.MemberDecorate(ubStructType, 0, Decoration.Offset, (LiteralInteger)0); var ubPointerType = context.TypePointer(StorageClass.Uniform, ubStructType); foreach (var descriptor in descriptors) { var ubVariable = context.Variable(ubPointerType, StorageClass.Uniform); context.Name(ubVariable, $"{GetStagePrefix(context.Config.Stage)}_c{descriptor.Slot}"); context.Decorate(ubVariable, Decoration.DescriptorSet, (LiteralInteger)0); context.Decorate(ubVariable, Decoration.Binding, (LiteralInteger)descriptor.Binding); context.AddGlobalVariable(ubVariable); context.UniformBuffers.Add(descriptor.Slot, ubVariable); } }