예제 #1
0
파일: Varying.cs 프로젝트: ianuub/Ryujinxxx
        public static string GetName(int offset)
        {
            offset <<= 2;

            if (offset >= AttributeConsts.UserAttributeBase &&
                offset < AttributeConsts.UserAttributeEnd)
            {
                offset -= AttributeConsts.UserAttributeBase;

                string name = $"{ DefaultNames.OAttributePrefix}{(offset >> 4)}";

                name += "_" + "xyzw"[(offset >> 2) & 3];

                return(name);
            }

            switch (offset)
            {
            case AttributeConsts.PositionX:
            case AttributeConsts.PositionY:
            case AttributeConsts.PositionZ:
            case AttributeConsts.PositionW:
                return("gl_Position");

            case AttributeConsts.PointSize:
                return("gl_PointSize");

            case AttributeConsts.ClipDistance0:
                return("gl_ClipDistance[0]");

            case AttributeConsts.ClipDistance1:
                return("gl_ClipDistance[1]");

            case AttributeConsts.ClipDistance2:
                return("gl_ClipDistance[2]");

            case AttributeConsts.ClipDistance3:
                return("gl_ClipDistance[3]");

            case AttributeConsts.ClipDistance4:
                return("gl_ClipDistance[4]");

            case AttributeConsts.ClipDistance5:
                return("gl_ClipDistance[5]");

            case AttributeConsts.ClipDistance6:
                return("gl_ClipDistance[6]");

            case AttributeConsts.ClipDistance7:
                return("gl_ClipDistance[7]");

            case AttributeConsts.VertexId:
                return("gl_VertexID");
            }

            return(null);
        }
예제 #2
0
        public static string GetAttributeName(AstOperand attr, ShaderConfig config, bool isOutAttr = false, string indexExpr = "0")
        {
            int value = attr.Value;

            char swzMask = GetSwizzleMask((value >> 2) & 3);

            if (value >= AttributeConsts.UserAttributeBase && value < AttributeConsts.UserAttributeEnd)
            {
                value -= AttributeConsts.UserAttributeBase;

                string prefix = isOutAttr
                    ? DefaultNames.OAttributePrefix
                    : DefaultNames.IAttributePrefix;

                if ((config.Flags & TranslationFlags.Feedback) != 0)
                {
                    string name = $"{prefix}{(value >> 4)}_{swzMask}";

                    if (config.Stage == ShaderStage.Geometry && !isOutAttr)
                    {
                        name += $"[{indexExpr}]";
                    }

                    return(name);
                }
                else
                {
                    string name = $"{prefix}{(value >> 4)}";

                    if (config.Stage == ShaderStage.Geometry && !isOutAttr)
                    {
                        name += $"[{indexExpr}]";
                    }

                    return(name + '.' + swzMask);
                }
            }
            else
            {
                if (value >= AttributeConsts.FragmentOutputColorBase && value < AttributeConsts.FragmentOutputColorEnd)
                {
                    value -= AttributeConsts.FragmentOutputColorBase;

                    return($"{DefaultNames.OAttributePrefix}{(value >> 4)}.{swzMask}");
                }
                else if (_builtInAttributes.TryGetValue(value & ~3, out BuiltInAttribute builtInAttr))
                {
                    // TODO: There must be a better way to handle this...
                    if (config.Stage == ShaderStage.Fragment)
                    {
                        switch (value & ~3)
                        {
                        case AttributeConsts.PositionX: return("(gl_FragCoord.x / fp_renderScale[0])");

                        case AttributeConsts.PositionY: return("(gl_FragCoord.y / fp_renderScale[0])");

                        case AttributeConsts.PositionZ: return("gl_FragCoord.z");

                        case AttributeConsts.PositionW: return("gl_FragCoord.w");
                        }
                    }

                    string name = builtInAttr.Name;

                    if (config.Stage == ShaderStage.Geometry && (value & AttributeConsts.SpecialMask) == 0 && !isOutAttr)
                    {
                        name = $"gl_in[{indexExpr}].{name}";
                    }

                    return(name);
                }
            }

            // TODO: Warn about unknown built-in attribute.

            return(isOutAttr ? "// bad_attr0x" + value.ToString("X") : "0.0");
        }
예제 #3
0
        private static string GetAttributeName(AstOperand attr, GalShaderType shaderType, bool isOutAttr = false)
        {
            int value = attr.Value;

            string swzMask = GetSwizzleMask((value >> 2) & 3);

            if (value >= AttributeConsts.UserAttributeBase &&
                value < AttributeConsts.UserAttributeEnd)
            {
                value -= AttributeConsts.UserAttributeBase;

                string prefix = isOutAttr
                    ? DefaultNames.OAttributePrefix
                    : DefaultNames.IAttributePrefix;

                string name = $"{prefix}{(value >> 4)}";

                if (shaderType == GalShaderType.Geometry && !isOutAttr)
                {
                    name += "[0]";
                }

                name += "." + swzMask;

                return(name);
            }
            else
            {
                if (value >= AttributeConsts.FragmentOutputColorBase &&
                    value < AttributeConsts.FragmentOutputColorEnd)
                {
                    value -= AttributeConsts.FragmentOutputColorBase;

                    return($"{DefaultNames.OAttributePrefix}{(value >> 4)}.{swzMask}");
                }
                else if (_builtInAttributes.TryGetValue(value & ~3, out BuiltInAttribute builtInAttr))
                {
                    // TODO: There must be a better way to handle this...
                    if (shaderType == GalShaderType.Fragment)
                    {
                        switch (value & ~3)
                        {
                        case AttributeConsts.PositionX: return("gl_FragCoord.x");

                        case AttributeConsts.PositionY: return("gl_FragCoord.y");

                        case AttributeConsts.PositionZ: return("gl_FragCoord.z");

                        case AttributeConsts.PositionW: return("1.0");
                        }
                    }

                    string name = builtInAttr.Name;

                    if (shaderType == GalShaderType.Geometry && !isOutAttr)
                    {
                        name = "gl_in[0]." + name;
                    }

                    return(name);
                }
            }

            // TODO: Warn about unknown built-in attribute.

            return(isOutAttr ? "// bad_attr0x" + value.ToString("X") : "0.0");
        }