Exemple #1
0
 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);
            }
        }
Exemple #3
0
        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.");
                }
            }
        }
Exemple #4
0
 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}");
                        }
                    }
                }
            }
        }