private void ForceTypeDiscovery(string setName, TypeReference fd) { if (ShaderPrimitiveTypes.IsPrimitiveType(fd.Name)) { return; } if (fd.TypeInfo.Type.TypeKind == TypeKind.Enum) { INamedTypeSymbol enumBaseType = ((INamedTypeSymbol)fd.TypeInfo.Type).EnumUnderlyingType; if (enumBaseType != null && enumBaseType.SpecialType != SpecialType.System_Int32 && enumBaseType.SpecialType != SpecialType.System_UInt32) { throw new ShaderGenerationException("Resource type's field had an invalid enum base type: " + enumBaseType.ToDisplayString()); } return; } if (!TryDiscoverStructure(setName, fd.Name, out StructureDefinition sd)) { throw new ShaderGenerationException("" + "Resource type's field could not be resolved: " + fd.Name + " " + fd.Name); } foreach (FieldDefinition field in sd.Fields) { ForceTypeDiscovery(setName, field.Type); } }
private void ForceTypeDiscovery(string setName, TypeReference tr) { if (ShaderPrimitiveTypes.IsPrimitiveType(tr.Name)) { return; } if (tr.TypeInfo.TypeKind == TypeKind.Enum) { INamedTypeSymbol enumBaseType = ((INamedTypeSymbol)tr.TypeInfo).EnumUnderlyingType; if (enumBaseType != null && enumBaseType.SpecialType != SpecialType.System_Int32 && enumBaseType.SpecialType != SpecialType.System_UInt32) { throw new ShaderGenerationException("Resource type's field had an invalid enum base type: " + enumBaseType.ToDisplayString()); } return; } ITypeSymbol type = tr.TypeInfo; string name = tr.Name; if (type is INamedTypeSymbol namedTypeSymb && namedTypeSymb.TypeArguments.Length == 1) { name = Utilities.GetFullTypeName(namedTypeSymb.TypeArguments[0], out _); } if (!TryDiscoverStructure(setName, name, out StructureDefinition sd)) { throw new ShaderGenerationException("" + "Resource type's field could not be resolved: " + name); } foreach (FieldDefinition field in sd.Fields) { ForceTypeDiscovery(setName, field.Type); } }
private void ValidateUniformType(TypeInfo typeInfo) { string name = typeInfo.Type.ToDisplayString(); if (name != nameof(ShaderGen) + "." + nameof(Texture1DResource) && name != nameof(ShaderGen) + "." + nameof(Texture2DResource) && name != nameof(ShaderGen) + "." + nameof(Texture3DResource) && name != nameof(ShaderGen) + "." + nameof(Texture2DArrayResource) && name != nameof(ShaderGen) + "." + nameof(Texture2DRectResource) && name != nameof(ShaderGen) + "." + nameof(Texture2DMSResource) && name != nameof(ShaderGen) + "." + nameof(TextureCubeResource) && name != nameof(ShaderGen) + "." + nameof(TextureBufferResource) && name != nameof(ShaderGen) + "." + nameof(SamplerResource) && name != nameof(ShaderGen) + "." + nameof(SamplerComparisonResource) && !name.StartsWith(nameof(ShaderGen) + "." + nameof(UniformBuffer <int>))) { var elementType = typeInfo.Type; if (typeInfo.Type is IArrayTypeSymbol arrayType) { elementType = arrayType.ElementType; } if (elementType.IsReferenceType && !ShaderPrimitiveTypes.IsPrimitiveType(name)) { throw new ShaderGenerationException("Shader resource fields must be simple blittable structures."); } } }
private void ForceTypeDiscovery(string setName, TypeReference fd) { if (ShaderPrimitiveTypes.IsPrimitiveType(fd.Name)) { return; } if (!TryDiscoverStructure(setName, fd.Name, out StructureDefinition sd)) { throw new ShaderGenerationException("" + "Resource type's field could not be resolved: " + fd.Name + " " + fd.Name); } foreach (FieldDefinition field in sd.Fields) { ForceTypeDiscovery(setName, field.Type); } }
internal void ForceTypeDiscovery(string setName, TypeReference tr, out StructureDefinition sd) { if (ShaderPrimitiveTypes.IsPrimitiveType(tr.Name)) { sd = null; return; } if (tr.TypeInfo.TypeKind == TypeKind.Enum) { INamedTypeSymbol enumBaseType = ((INamedTypeSymbol)tr.TypeInfo).EnumUnderlyingType; if (enumBaseType != null && enumBaseType.SpecialType != SpecialType.System_Int32 && enumBaseType.SpecialType != SpecialType.System_UInt32) { throw new ShaderGenerationException("Resource type's field had an invalid enum base type: " + enumBaseType.ToDisplayString()); } sd = null; return; } if (tr.TypeInfo is IArrayTypeSymbol arrayType) { ForceTypeDiscovery(setName, new TypeReference(arrayType.ElementType.GetFullMetadataName(), arrayType.ElementType), out sd); return; } ITypeSymbol type = tr.TypeInfo; string name = tr.Name; if (type is INamedTypeSymbol namedTypeSymb && namedTypeSymb.TypeArguments.Length == 1) { name = Utilities.GetFullTypeName(namedTypeSymb.TypeArguments[0], out _); } if (!TryDiscoverStructure(setName, name, out sd)) { throw new ShaderGenerationException("" + "Resource type's field could not be resolved: " + name); } foreach (FieldDefinition field in sd.Fields) { ForceTypeDiscovery(setName, field.Type); if (field.IsBuiltIn) { GetContext(setName).BuiltIns.Add(field); } } }
protected void ValidateRequiredSemantics(string setName, ShaderFunction function, ShaderFunctionType type) { StructureDefinition outputType = null; if (function.ReturnType.TypeInfo.TypeKind == TypeKind.Struct && function.ReturnType.TypeInfo.SpecialType != SpecialType.System_Void && !ShaderPrimitiveTypes.IsPrimitiveType(function.ReturnType.TypeInfo.GetFullMetadataName())) { outputType = GetRequiredStructureType(setName, function.ReturnType); } foreach (ParameterDefinition pd in function.Parameters) { GetRequiredStructureType(setName, pd.Type); } if (type == ShaderFunctionType.FragmentEntryPoint) { if (outputType != null) { foreach (FieldDefinition field in outputType.Fields) { if (field.SemanticType == SemanticType.None) { throw new ShaderGenerationException("Function return type is missing semantics on field: " + field.Name); } } } } else if (type == ShaderFunctionType.VertexEntryPoint) { foreach (ParameterDefinition pd in function.Parameters) { StructureDefinition pType = GetRequiredStructureType(setName, pd.Type); foreach (FieldDefinition field in pType.Fields) { if (field.SemanticType == SemanticType.None) { //throw new ShaderGenerationException( // $"Function parameter {pd.Name}'s type is missing semantics on field: {field.Name}"); } } } } }