Exemplo n.º 1
0
        private static EffectTypeDescription CreateTypeInfo(TypeBase variableType, List <AttributeBase> attributes)
        {
            var parameterTypeInfo = new EffectTypeDescription();

            if (variableType.TypeInference.TargetType != null)
            {
                variableType = variableType.TypeInference.TargetType;
            }

            if (variableType is ArrayType)
            {
                var arrayType = (ArrayType)variableType;
                variableType = arrayType.Type;
                parameterTypeInfo.Elements = (int)((LiteralExpression)arrayType.Dimensions[0]).Literal.Value;

                if (variableType.TypeInference.TargetType != null)
                {
                    variableType = variableType.TypeInference.TargetType;
                }
            }

            if (variableType is ScalarType)
            {
                // Uint and int are collapsed to int
                if (variableType == ScalarType.Int || variableType == ScalarType.UInt)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Scalar;
                    parameterTypeInfo.Type  = variableType == ScalarType.Int ? EffectParameterType.Int : EffectParameterType.UInt;
                }
                else if (variableType == ScalarType.Float)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Scalar;
                    parameterTypeInfo.Type  = EffectParameterType.Float;
                }
                else if (variableType == ScalarType.Bool)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Scalar;
                    parameterTypeInfo.Type  = EffectParameterType.Bool;
                }

                parameterTypeInfo.RowCount    = 1;
                parameterTypeInfo.ColumnCount = 1;
            }
            else if (variableType is VectorType)
            {
                if (variableType == VectorType.Float2 || variableType == VectorType.Float3 || variableType == VectorType.Float4)
                {
                    bool isColor = attributes.OfType <AttributeDeclaration>().Any(x => x.Name == "Color");
                    parameterTypeInfo.Class = isColor ? EffectParameterClass.Color : EffectParameterClass.Vector;
                    parameterTypeInfo.Type  = EffectParameterType.Float;
                }
                else if (variableType == VectorType.Int2 || variableType == VectorType.Int3 || variableType == VectorType.Int4)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Vector;
                    parameterTypeInfo.Type  = EffectParameterType.Int;
                }
                else if (variableType == VectorType.UInt2 || variableType == VectorType.UInt3 || variableType == VectorType.UInt4)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Vector;
                    parameterTypeInfo.Type  = EffectParameterType.UInt;
                }

                parameterTypeInfo.RowCount    = 1;
                parameterTypeInfo.ColumnCount = ((VectorType)variableType).Dimension;
            }
            else if (variableType is MatrixType)
            {
                parameterTypeInfo.Class       = EffectParameterClass.MatrixColumns;
                parameterTypeInfo.Type        = EffectParameterType.Float;
                parameterTypeInfo.RowCount    = ((MatrixType)variableType).RowCount;
                parameterTypeInfo.ColumnCount = ((MatrixType)variableType).ColumnCount;
            }
            else if (variableType is StructType)
            {
                var structType = (StructType)variableType;

                parameterTypeInfo.Class       = EffectParameterClass.Struct;
                parameterTypeInfo.RowCount    = 1;
                parameterTypeInfo.ColumnCount = 1;
                parameterTypeInfo.Name        = structType.Name.Text;

                var members = new List <EffectTypeMemberDescription>();
                foreach (var field in structType.Fields)
                {
                    var memberInfo = new EffectTypeMemberDescription
                    {
                        Name = field.Name.Text,
                        Type = CreateTypeInfo(field.Type, field.Attributes),
                    };
                    members.Add(memberInfo);
                }

                parameterTypeInfo.Members = members.ToArray();
            }
            else
            {
                var variableTypeName = variableType.Name.Text.ToLowerInvariant();

                switch (variableTypeName)
                {
                case "cbuffer":
                    parameterTypeInfo.Class = EffectParameterClass.ConstantBuffer;
                    parameterTypeInfo.Type  = EffectParameterType.ConstantBuffer;
                    break;

                case "tbuffer":
                    parameterTypeInfo.Class = EffectParameterClass.TextureBuffer;
                    parameterTypeInfo.Type  = EffectParameterType.TextureBuffer;
                    break;

                case "structuredbuffer":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.StructuredBuffer;
                    break;

                case "rwstructuredbuffer":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.RWStructuredBuffer;
                    break;

                case "consumestructuredbuffer":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.ConsumeStructuredBuffer;
                    break;

                case "appendstructuredbuffer":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.AppendStructuredBuffer;
                    break;

                case "buffer":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.Buffer;
                    break;

                case "rwbuffer":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.RWBuffer;
                    break;

                case "byteaddressbuffer":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.ByteAddressBuffer;
                    break;

                case "rwbyteaddressbuffer":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.RWByteAddressBuffer;
                    break;

                case "texture1d":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.Texture1D;
                    break;

                case "texturecube":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.TextureCube;
                    break;

                case "texture2d":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.Texture2D;
                    break;

                case "texture2dms":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.Texture2DMultisampled;
                    break;

                case "texture3d":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.Texture3D;
                    break;

                case "texture1darray":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.Texture1DArray;
                    break;

                case "texturecubearray":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.TextureCubeArray;
                    break;

                case "texture2darray":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.Texture2DArray;
                    break;

                case "texture2dmsarray":
                    parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                    parameterTypeInfo.Type  = EffectParameterType.Texture2DMultisampledArray;
                    break;

                case "rwtexture1d":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.RWTexture1D;
                    break;

                case "rwtexture2d":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.RWTexture2D;
                    break;

                case "rwtexture3d":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.RWTexture3D;
                    break;

                case "rwtexture1darray":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.RWTexture1DArray;
                    break;

                case "rwtexture2darray":
                    parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                    parameterTypeInfo.Type  = EffectParameterType.RWTexture2DArray;
                    break;

                case "samplerstate":
                case "samplercomparisonstate":
                    parameterTypeInfo.Class = EffectParameterClass.Sampler;
                    parameterTypeInfo.Type  = EffectParameterType.Sampler;
                    break;
                }
            }

            return(parameterTypeInfo);
        }
Exemplo n.º 2
0
        private static EffectTypeDescription CreateTypeInfo(TypeBase variableType, List<AttributeBase> attributes)
        {
            var parameterTypeInfo = new EffectTypeDescription();

            if (variableType.TypeInference.TargetType != null)
                variableType = variableType.TypeInference.TargetType;

            if (variableType is ArrayType)
            {
                var arrayType = (ArrayType)variableType;
                variableType = arrayType.Type;
                parameterTypeInfo.Elements = (int)((LiteralExpression)arrayType.Dimensions[0]).Literal.Value;

                if (variableType.TypeInference.TargetType != null)
                    variableType = variableType.TypeInference.TargetType;
            }

            if (variableType is ScalarType)
            {
                // Uint and int are collapsed to int
                if (variableType == ScalarType.Int || variableType == ScalarType.UInt)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Scalar;
                    parameterTypeInfo.Type = variableType == ScalarType.Int ? EffectParameterType.Int : EffectParameterType.UInt;
                }
                else if (variableType == ScalarType.Float)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Scalar;
                    parameterTypeInfo.Type = EffectParameterType.Float;
                }
                else if (variableType == ScalarType.Bool)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Scalar;
                    parameterTypeInfo.Type = EffectParameterType.Bool;
                }

                parameterTypeInfo.RowCount = 1;
                parameterTypeInfo.ColumnCount = 1;
            }
            else if (variableType is VectorType)
            {
                if (variableType == VectorType.Float2 || variableType == VectorType.Float3 || variableType == VectorType.Float4)
                {
                    bool isColor = attributes.OfType<AttributeDeclaration>().Any(x => x.Name == "Color");
                    parameterTypeInfo.Class = isColor ? EffectParameterClass.Color : EffectParameterClass.Vector;
                    parameterTypeInfo.Type = EffectParameterType.Float;
                }
                else if (variableType == VectorType.Int2 || variableType == VectorType.Int3 || variableType == VectorType.Int4)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Vector;
                    parameterTypeInfo.Type = EffectParameterType.Int;
                }
                else if (variableType == VectorType.UInt2 || variableType == VectorType.UInt3 || variableType == VectorType.UInt4)
                {
                    parameterTypeInfo.Class = EffectParameterClass.Vector;
                    parameterTypeInfo.Type = EffectParameterType.UInt;
                }

                parameterTypeInfo.RowCount = 1;
                parameterTypeInfo.ColumnCount = ((VectorType)variableType).Dimension;
            }
            else if (variableType is MatrixType)
            {
                parameterTypeInfo.Class = EffectParameterClass.MatrixColumns;
                parameterTypeInfo.Type = EffectParameterType.Float;
                parameterTypeInfo.RowCount = ((MatrixType)variableType).RowCount;
                parameterTypeInfo.ColumnCount = ((MatrixType)variableType).ColumnCount;
            }
            else if (variableType is StructType)
            {
                var structType = (StructType)variableType;

                parameterTypeInfo.Class = EffectParameterClass.Struct;
                parameterTypeInfo.RowCount = 1;
                parameterTypeInfo.ColumnCount = 1;
                parameterTypeInfo.Name = structType.Name.Text;

                var members = new List<EffectTypeMemberDescription>();
                foreach (var field in structType.Fields)
                {
                    var memberInfo = new EffectTypeMemberDescription
                    {
                        Name = field.Name.Text,
                        Type = CreateTypeInfo(field.Type, field.Attributes),
                    };
                    members.Add(memberInfo);
                }

                parameterTypeInfo.Members = members.ToArray();
            }
            else
            {
                var variableTypeName = variableType.Name.Text.ToLower();

                switch (variableTypeName)
                {
                    case "cbuffer":
                        parameterTypeInfo.Class = EffectParameterClass.ConstantBuffer;
                        parameterTypeInfo.Type = EffectParameterType.ConstantBuffer;
                        break;

                    case "tbuffer":
                        parameterTypeInfo.Class = EffectParameterClass.TextureBuffer;
                        parameterTypeInfo.Type = EffectParameterType.TextureBuffer;
                        break;

                    case "structuredbuffer":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.StructuredBuffer;
                        break;
                    case "rwstructuredbuffer":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.RWStructuredBuffer;
                        break;
                    case "consumestructuredbuffer":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.ConsumeStructuredBuffer;
                        break;
                    case "appendstructuredbuffer":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.AppendStructuredBuffer;
                        break;
                    case "buffer":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.Buffer;
                        break;
                    case "rwbuffer":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.RWBuffer;
                        break;
                    case "byteaddressbuffer":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.ByteAddressBuffer;
                        break;
                    case "rwbyteaddressbuffer":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.RWByteAddressBuffer;
                        break;

                    case "texture1d":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.Texture1D;
                        break;

                    case "texturecube":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.TextureCube;
                        break;

                    case "texture2d":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.Texture2D;
                        break;

                    case "texture3d":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.Texture3D;
                        break;

                    case "texture1darray":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.Texture1DArray;
                        break;

                    case "texturecubearray":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.TextureCubeArray;
                        break;

                    case "texture2darray":
                        parameterTypeInfo.Class = EffectParameterClass.ShaderResourceView;
                        parameterTypeInfo.Type = EffectParameterType.Texture2DArray;
                        break;

                    case "rwtexture1d":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.RWTexture1D;
                        break;

                    case "rwtexture2d":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.RWTexture2D;
                        break;

                    case "rwtexture3d":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.RWTexture3D;
                        break;

                    case "rwtexture1darray":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.RWTexture1DArray;
                        break;

                    case "rwtexture2darray":
                        parameterTypeInfo.Class = EffectParameterClass.UnorderedAccessView;
                        parameterTypeInfo.Type = EffectParameterType.RWTexture2DArray;
                        break;

                    case "samplerstate":
                    case "samplercomparisonstate":
                        parameterTypeInfo.Class = EffectParameterClass.Sampler;
                        parameterTypeInfo.Type = EffectParameterType.Sampler;
                        break;
                }
            }

            return parameterTypeInfo;
        }