コード例 #1
0
        public EmitterContext(GalShaderType shaderType, ShaderHeader header)
        {
            _shaderType = shaderType;
            _header     = header;

            _operations = new List <Operation>();

            _labels = new Dictionary <ulong, Operand>();
        }
コード例 #2
0
 public ShaderConfig(ShaderHeader header, TranslationFlags flags, TranslatorCallbacks callbacks)
 {
     Stage             = header.Stage;
     OutputTopology    = header.OutputTopology;
     MaxOutputVertices = header.MaxOutputVertexCount;
     OmapTargets       = header.OmapTargets;
     OmapSampleMask    = header.OmapSampleMask;
     OmapDepth         = header.OmapDepth;
     Flags             = flags;
     _callbacks        = callbacks;
 }
コード例 #3
0
 public ShaderConfig(ShaderHeader header, IGpuAccessor gpuAccessor, TranslationOptions options, TranslationCounts counts) : this(gpuAccessor, options, counts)
 {
     Stage             = header.Stage;
     GpPassthrough     = header.Stage == ShaderStage.Geometry && header.GpPassthrough;
     OutputTopology    = header.OutputTopology;
     MaxOutputVertices = header.MaxOutputVertexCount;
     LocalMemorySize   = header.ShaderLocalMemoryLowSize + header.ShaderLocalMemoryHighSize;
     ImapTypes         = header.ImapTypes;
     OmapTargets       = header.OmapTargets;
     OmapSampleMask    = header.OmapSampleMask;
     OmapDepth         = header.OmapDepth;
 }
コード例 #4
0
 public ShaderConfig(ShaderHeader header, TranslationFlags flags, TranslatorCallbacks callbacks)
 {
     Stage             = header.Stage;
     OutputTopology    = header.OutputTopology;
     MaxOutputVertices = header.MaxOutputVertexCount;
     LocalMemorySize   = header.ShaderLocalMemoryLowSize + header.ShaderLocalMemoryHighSize;
     ImapTypes         = header.ImapTypes;
     OmapTargets       = header.OmapTargets;
     OmapSampleMask    = header.OmapSampleMask;
     OmapDepth         = header.OmapDepth;
     Flags             = flags;
     _callbacks        = callbacks;
 }
コード例 #5
0
ファイル: ShaderConfig.cs プロジェクト: valx76/Ryujinx
 public ShaderConfig(ShaderHeader header, IGpuAccessor gpuAccessor, TranslationFlags flags)
 {
     Stage             = header.Stage;
     OutputTopology    = header.OutputTopology;
     MaxOutputVertices = header.MaxOutputVertexCount;
     LocalMemorySize   = header.ShaderLocalMemoryLowSize + header.ShaderLocalMemoryHighSize;
     ImapTypes         = header.ImapTypes;
     OmapTargets       = header.OmapTargets;
     OmapSampleMask    = header.OmapSampleMask;
     OmapDepth         = header.OmapDepth;
     GpuAccessor       = gpuAccessor;
     Flags             = flags;
     UsedFeatures      = FeatureFlags.None;
 }
コード例 #6
0
ファイル: ShaderConfig.cs プロジェクト: Thealexbarney/Ryujinx
 public ShaderConfig(ShaderHeader header, IGpuAccessor gpuAccessor, TranslationOptions options, TranslationCounts counts) : this(gpuAccessor, options, counts)
 {
     Stage                    = header.Stage;
     GpPassthrough            = header.Stage == ShaderStage.Geometry && header.GpPassthrough;
     ThreadsPerInputPrimitive = header.ThreadsPerInputPrimitive;
     OutputTopology           = header.OutputTopology;
     MaxOutputVertices        = header.MaxOutputVertexCount;
     LocalMemorySize          = header.ShaderLocalMemoryLowSize + header.ShaderLocalMemoryHighSize;
     ImapTypes                = header.ImapTypes;
     OmapTargets              = header.OmapTargets;
     OmapSampleMask           = header.OmapSampleMask;
     OmapDepth                = header.OmapDepth;
     TransformFeedbackEnabled = gpuAccessor.QueryTransformFeedbackEnabled();
 }
コード例 #7
0
ファイル: ShaderConfig.cs プロジェクト: yuyaokeng/Ryujinx
 public ShaderConfig(ShaderHeader header, IGpuAccessor gpuAccessor, TranslationFlags flags, TranslationCounts counts)
 {
     Stage             = header.Stage;
     OutputTopology    = header.OutputTopology;
     MaxOutputVertices = header.MaxOutputVertexCount;
     LocalMemorySize   = header.ShaderLocalMemoryLowSize + header.ShaderLocalMemoryHighSize;
     ImapTypes         = header.ImapTypes;
     OmapTargets       = header.OmapTargets;
     OmapSampleMask    = header.OmapSampleMask;
     OmapDepth         = header.OmapDepth;
     GpuAccessor       = gpuAccessor;
     Flags             = flags;
     Size                   = 0;
     UsedFeatures           = FeatureFlags.None;
     Counts                 = counts;
     TextureHandlesForCache = new HashSet <int>();
 }
コード例 #8
0
        private static Operation[] DecodeShader(IGalMemory memory, ulong address, GalShaderType shaderType)
        {
            ShaderHeader header = new ShaderHeader(memory, address);

            Block[] cfg = Decoder.Decode(memory, address);

            EmitterContext context = new EmitterContext(shaderType, header);

            for (int blkIndex = 0; blkIndex < cfg.Length; blkIndex++)
            {
                Block block = cfg[blkIndex];

                context.CurrBlock = block;

                context.MarkLabel(context.GetLabel(block.Address));

                for (int opIndex = 0; opIndex < block.OpCodes.Count; opIndex++)
                {
                    OpCode op = block.OpCodes[opIndex];

                    if (op.NeverExecute)
                    {
                        continue;
                    }

                    Operand predSkipLbl = null;

                    bool skipPredicateCheck = op.Emitter == InstEmit.Bra;

                    if (op is OpCodeSync opSync)
                    {
                        // If the instruction is a SYNC instruction with only one
                        // possible target address, then the instruction is basically
                        // just a simple branch, we can generate code similar to branch
                        // instructions, with the condition check on the branch itself.
                        skipPredicateCheck |= opSync.Targets.Count < 2;
                    }

                    if (!(op.Predicate.IsPT || skipPredicateCheck))
                    {
                        Operand label;

                        if (opIndex == block.OpCodes.Count - 1 && block.Next != null)
                        {
                            label = context.GetLabel(block.Next.Address);
                        }
                        else
                        {
                            label = Label();

                            predSkipLbl = label;
                        }

                        Operand pred = Register(op.Predicate);

                        if (op.InvertPredicate)
                        {
                            context.BranchIfTrue(label, pred);
                        }
                        else
                        {
                            context.BranchIfFalse(label, pred);
                        }
                    }

                    context.CurrOp = op;

                    op.Emitter(context);

                    if (predSkipLbl != null)
                    {
                        context.MarkLabel(predSkipLbl);
                    }
                }
            }

            return(context.GetOperations());
        }