Пример #1
0
        public ConstantBufferPreviewer(Core c, ShaderStageType stage, UInt32 slot, UInt32 idx)
        {
            InitializeComponent();

            if (SystemInformation.HighContrast)
            {
                toolStrip1.Renderer = new ToolStripSystemRenderer();
            }

            m_Core     = c;
            Stage      = stage;
            Slot       = slot;
            ArrayIdx   = idx;
            shader     = m_Core.CurPipelineState.GetShader(stage);
            entryPoint = m_Core.CurPipelineState.GetShaderEntryPoint(stage);
            UpdateLabels();

            ulong offs = 0;
            ulong size = 0;

            m_Core.CurPipelineState.GetConstantBuffer(Stage, Slot, ArrayIdx, out cbuffer, out offs, out size);

            m_Core.Renderer.BeginInvoke((ReplayRenderer r) =>
            {
                SetVariables(r.GetCBufferVariableContents(shader, entryPoint, Slot, cbuffer, offs));
            });

            m_Core.AddLogViewer(this);
        }
Пример #2
0
        public ConstantBufferPreviewer(Core c, ShaderStageType stage, UInt32 slot, UInt32 idx)
        {
            InitializeComponent();

            if (SystemInformation.HighContrast)
                toolStrip1.Renderer = new ToolStripSystemRenderer();

            m_Core = c;
            Stage = stage;
            Slot = slot;
            ArrayIdx = idx;
            shader = m_Core.CurPipelineState.GetShader(stage);
            entryPoint = m_Core.CurPipelineState.GetShaderEntryPoint(stage);
            UpdateLabels();

            ulong offs = 0;
            ulong size = 0;
            m_Core.CurPipelineState.GetConstantBuffer(Stage, Slot, ArrayIdx, out cbuffer, out offs, out size);

            m_Core.Renderer.BeginInvoke((ReplayRenderer r) =>
            {
                SetVariables(r.GetCBufferVariableContents(shader, entryPoint, Slot, cbuffer, offs));
            });

            m_Core.AddLogViewer(this);
        }
Пример #3
0
        public ShaderBindpointMapping GetBindpointMapping(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_D3D11.m_VS.BindpointMapping);

                    case ShaderStageType.Domain: return(m_D3D11.m_DS.BindpointMapping);

                    case ShaderStageType.Hull: return(m_D3D11.m_HS.BindpointMapping);

                    case ShaderStageType.Geometry: return(m_D3D11.m_GS.BindpointMapping);

                    case ShaderStageType.Pixel: return(m_D3D11.m_PS.BindpointMapping);

                    case ShaderStageType.Compute: return(m_D3D11.m_CS.BindpointMapping);
                    }
                }
                else if (IsLogGL)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_GL.m_VS.BindpointMapping);

                    case ShaderStageType.Tess_Control: return(m_GL.m_TCS.BindpointMapping);

                    case ShaderStageType.Tess_Eval: return(m_GL.m_TES.BindpointMapping);

                    case ShaderStageType.Geometry: return(m_GL.m_GS.BindpointMapping);

                    case ShaderStageType.Fragment: return(m_GL.m_FS.BindpointMapping);

                    case ShaderStageType.Compute: return(m_GL.m_CS.BindpointMapping);
                    }
                }
                else if (IsLogVK)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_Vulkan.VS.BindpointMapping);

                    case ShaderStageType.Tess_Control: return(m_Vulkan.TCS.BindpointMapping);

                    case ShaderStageType.Tess_Eval: return(m_Vulkan.TES.BindpointMapping);

                    case ShaderStageType.Geometry: return(m_Vulkan.GS.BindpointMapping);

                    case ShaderStageType.Fragment: return(m_Vulkan.FS.BindpointMapping);

                    case ShaderStageType.Compute: return(m_Vulkan.CS.BindpointMapping);
                    }
                }
            }

            return(null);
        }
Пример #4
0
        public ResourceId GetShader(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_D3D11.m_VS.Shader);

                    case ShaderStageType.Domain: return(m_D3D11.m_DS.Shader);

                    case ShaderStageType.Hull: return(m_D3D11.m_HS.Shader);

                    case ShaderStageType.Geometry: return(m_D3D11.m_GS.Shader);

                    case ShaderStageType.Pixel: return(m_D3D11.m_PS.Shader);

                    case ShaderStageType.Compute: return(m_D3D11.m_CS.Shader);
                    }
                }
                else if (IsLogGL)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_GL.m_VS.Shader);

                    case ShaderStageType.Tess_Control: return(m_GL.m_TCS.Shader);

                    case ShaderStageType.Tess_Eval: return(m_GL.m_TES.Shader);

                    case ShaderStageType.Geometry: return(m_GL.m_GS.Shader);

                    case ShaderStageType.Fragment: return(m_GL.m_FS.Shader);

                    case ShaderStageType.Compute: return(m_GL.m_CS.Shader);
                    }
                }
                else if (IsLogVK)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_Vulkan.VS.Shader);

                    case ShaderStageType.Tess_Control: return(m_Vulkan.TCS.Shader);

                    case ShaderStageType.Tess_Eval: return(m_Vulkan.TES.Shader);

                    case ShaderStageType.Geometry: return(m_Vulkan.GS.Shader);

                    case ShaderStageType.Fragment: return(m_Vulkan.FS.Shader);

                    case ShaderStageType.Compute: return(m_Vulkan.CS.Shader);
                    }
                }
            }

            return(ResourceId.Null);
        }
Пример #5
0
        public string GetShaderName(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_D3D11.m_VS.ShaderName);

                    case ShaderStageType.Domain: return(m_D3D11.m_DS.ShaderName);

                    case ShaderStageType.Hull: return(m_D3D11.m_HS.ShaderName);

                    case ShaderStageType.Geometry: return(m_D3D11.m_GS.ShaderName);

                    case ShaderStageType.Pixel: return(m_D3D11.m_PS.ShaderName);

                    case ShaderStageType.Compute: return(m_D3D11.m_CS.ShaderName);
                    }
                }
                else if (IsLogGL)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(String.Format("Shader {0}", m_GL.m_VS.Shader));

                    case ShaderStageType.Tess_Control: return(String.Format("Shader {0}", m_GL.m_TCS.Shader));

                    case ShaderStageType.Tess_Eval: return(String.Format("Shader {0}", m_GL.m_TES.Shader));

                    case ShaderStageType.Geometry: return(String.Format("Shader {0}", m_GL.m_GS.Shader));

                    case ShaderStageType.Fragment: return(String.Format("Shader {0}", m_GL.m_FS.Shader));

                    case ShaderStageType.Compute: return(String.Format("Shader {0}", m_GL.m_CS.Shader));
                    }
                }
                else if (IsLogVK)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_Vulkan.VS.ShaderName);

                    case ShaderStageType.Domain: return(m_Vulkan.TCS.ShaderName);

                    case ShaderStageType.Hull: return(m_Vulkan.TES.ShaderName);

                    case ShaderStageType.Geometry: return(m_Vulkan.GS.ShaderName);

                    case ShaderStageType.Pixel: return(m_Vulkan.FS.ShaderName);

                    case ShaderStageType.Compute: return(m_Vulkan.CS.ShaderName);
                    }
                }
            }

            return("");
        }
Пример #6
0
        public static DockContent Has(ShaderStageType stage, UInt32 slot)
        {
            foreach (var cb in m_Docks)
            {
                if(cb.Stage == stage && cb.Slot == slot)
                    return cb as DockContent;
            }

            return null;
        }
Пример #7
0
        public static DockContent Has(ShaderStageType stage, UInt32 slot, UInt32 idx)
        {
            foreach (var cb in m_Docks)
            {
                if (cb.Stage == stage && cb.Slot == slot && cb.ArrayIdx == idx)
                {
                    return(cb as DockContent);
                }
            }

            return(null);
        }
Пример #8
0
        public static DockContent Has(ShaderStageType stage, UInt32 slot)
        {
            foreach (var d in m_Docks)
            {
                ConstantBufferPreviewer cb = d.Controls[0] as ConstantBufferPreviewer;

                if (cb.Stage == stage && cb.Slot == slot)
                {
                    return(cb.Parent as DockContent);
                }
            }

            return(null);
        }
Пример #9
0
        public ConstantBufferPreviewer(Core c, ShaderStageType stage, UInt32 slot, UInt32 idx)
        {
            InitializeComponent();

            if (SystemInformation.HighContrast)
                toolStrip1.Renderer = new ToolStripSystemRenderer();

            m_Core = c;
            Stage = stage;
            Slot = slot;
            ArrayIdx = idx;
            shader = m_Core.CurPipelineState.GetShader(stage);
            entryPoint = m_Core.CurPipelineState.GetShaderEntryPoint(stage);
            UpdateLabels();
        }
Пример #10
0
        public ConstantBufferPreviewer(Core c, ShaderStageType stage, UInt32 slot, UInt32 idx)
        {
            InitializeComponent();

            if (SystemInformation.HighContrast)
            {
                toolStrip1.Renderer = new ToolStripSystemRenderer();
            }

            m_Core     = c;
            Stage      = stage;
            Slot       = slot;
            ArrayIdx   = idx;
            shader     = m_Core.CurPipelineState.GetShader(stage);
            entryPoint = m_Core.CurPipelineState.GetShaderEntryPoint(stage);
            UpdateLabels();
        }
Пример #11
0
        public ResourceId[] GetResources(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                    case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;

                    case ShaderStageType.Domain: s = m_D3D11.m_DS; break;

                    case ShaderStageType.Hull: s = m_D3D11.m_HS; break;

                    case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;

                    case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;

                    case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    ResourceId[] ret = new ResourceId[s.SRVs.Length];
                    for (int i = 0; i < s.SRVs.Length; i++)
                    {
                        ret[i] = s.SRVs[i].Resource;
                    }

                    return(ret);
                }
                else if (IsLogGL)
                {
                    ResourceId[] ret = new ResourceId[m_GL.Textures.Length];
                    for (int i = 0; i < m_GL.Textures.Length; i++)
                    {
                        ret[i] = m_GL.Textures[i].Resource;
                    }

                    return(ret);
                }
            }

            return(null);
        }
Пример #12
0
        public ShaderReflection GetShaderReflection(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_D3D11.m_VS.ShaderDetails);

                    case ShaderStageType.Domain: return(m_D3D11.m_DS.ShaderDetails);

                    case ShaderStageType.Hull: return(m_D3D11.m_HS.ShaderDetails);

                    case ShaderStageType.Geometry: return(m_D3D11.m_GS.ShaderDetails);

                    case ShaderStageType.Pixel: return(m_D3D11.m_PS.ShaderDetails);

                    case ShaderStageType.Compute: return(m_D3D11.m_CS.ShaderDetails);
                    }
                }
                else if (IsLogGL)
                {
                    switch (stage)
                    {
                    case ShaderStageType.Vertex: return(m_GL.m_VS.ShaderDetails);

                    case ShaderStageType.Tess_Control: return(m_GL.m_TCS.ShaderDetails);

                    case ShaderStageType.Tess_Eval: return(m_GL.m_TES.ShaderDetails);

                    case ShaderStageType.Geometry: return(m_GL.m_GS.ShaderDetails);

                    case ShaderStageType.Fragment: return(m_GL.m_FS.ShaderDetails);

                    case ShaderStageType.Compute: return(m_GL.m_CS.ShaderDetails);
                    }
                }
            }

            return(null);
        }
Пример #13
0
        public ConstantBufferPreviewer(Core c, ShaderStageType stage, UInt32 slot)
        {
            InitializeComponent();

            m_Core = c;
            Stage = stage;
            Slot = slot;
            shader = m_Core.CurPipelineState.GetShader(stage);
            UpdateLabels();

            uint offs = 0;
            m_Core.CurPipelineState.GetConstantBuffer(Stage, Slot, out cbuffer, out offs);

            m_Core.Renderer.BeginInvoke((ReplayRenderer r) =>
            {
                SetVariables(r.GetCBufferVariableContents(shader, Slot, cbuffer, offs));
            });

            m_Core.AddLogViewer(this);
        }
Пример #14
0
        public ResourceId[] GetReadWriteResources(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    if (stage == ShaderStageType.Compute)
                    {
                        ResourceId[] ret = new ResourceId[m_D3D11.m_CS.UAVs.Length];
                        for (int i = 0; i < m_D3D11.m_CS.UAVs.Length; i++)
                        {
                            ret[i] = m_D3D11.m_CS.UAVs[i].Resource;
                        }

                        return(ret);
                    }
                    else
                    {
                        ResourceId[] ret = new ResourceId[m_D3D11.m_OM.UAVs.Length];
                        for (int i = 0; i < m_D3D11.m_OM.UAVs.Length; i++)
                        {
                            ret[i] = m_D3D11.m_OM.UAVs[i].Resource;
                        }

                        return(ret);
                    }
                }
                else if (IsLogGL)
                {
                    ResourceId[] ret = new ResourceId[m_GL.Images.Length];
                    for (int i = 0; i < m_GL.Images.Length; i++)
                    {
                        ret[i] = m_GL.Images[i].Resource;
                    }

                    return(ret);
                }
            }

            return(new ResourceId[0]);
        }
Пример #15
0
        public ConstantBufferPreviewer(Core c, ShaderStageType stage, UInt32 slot)
        {
            InitializeComponent();

            m_Core = c;
            Stage  = stage;
            Slot   = slot;
            shader = m_Core.CurPipelineState.GetShader(stage);
            UpdateLabels();

            uint offs = 0;

            m_Core.CurPipelineState.GetConstantBuffer(Stage, Slot, out cbuffer, out offs);

            m_Core.Renderer.BeginInvoke((ReplayRenderer r) =>
            {
                SetVariables(r.GetCBufferVariableContents(shader, Slot, cbuffer, offs));
            });

            m_Core.AddLogViewer(this);
        }
Пример #16
0
        public string Abbrev(ShaderStageType stage)
        {
            if (IsLogD3D11 || (!LogLoaded && DefaultType == APIPipelineStateType.D3D11))
            {
                switch (stage)
                {
                case ShaderStageType.Vertex: return("VS");

                case ShaderStageType.Hull: return("HS");

                case ShaderStageType.Domain: return("DS");

                case ShaderStageType.Geometry: return("GS");

                case ShaderStageType.Pixel: return("PS");

                case ShaderStageType.Compute: return("CS");
                }
            }
            else if (IsLogGL || (!LogLoaded && DefaultType == APIPipelineStateType.OpenGL) ||
                     IsLogVK || (!LogLoaded && DefaultType == APIPipelineStateType.Vulkan))
            {
                switch (stage)
                {
                case ShaderStageType.Vertex: return("VS");

                case ShaderStageType.Tess_Control: return("TCS");

                case ShaderStageType.Tess_Eval: return("TES");

                case ShaderStageType.Geometry: return("GS");

                case ShaderStageType.Fragment: return("FS");

                case ShaderStageType.Compute: return("CS");
                }
            }

            return("?S");
        }
Пример #17
0
        public void GetConstantBuffer(ShaderStageType stage, uint BindPoint, out ResourceId buf, out uint ByteOffset)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                    case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;

                    case ShaderStageType.Domain: s = m_D3D11.m_DS; break;

                    case ShaderStageType.Hull: s = m_D3D11.m_HS; break;

                    case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;

                    case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;

                    case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    buf        = s.ConstantBuffers[BindPoint].Buffer;
                    ByteOffset = s.ConstantBuffers[BindPoint].VecOffset * 4 * sizeof(float);

                    return;
                }
                else if (IsLogGL)
                {
                    buf        = ResourceId.Null;
                    ByteOffset = 0;

                    return;
                }
            }

            buf        = ResourceId.Null;
            ByteOffset = 0;
        }
Пример #18
0
        public static string Str(this ShaderStageType stage, GraphicsAPI apitype)
        {
            if (apitype.IsD3D())
            {
                switch (stage)
                {
                case ShaderStageType.Vertex: return("Vertex");

                case ShaderStageType.Hull: return("Hull");

                case ShaderStageType.Domain: return("Domain");

                case ShaderStageType.Geometry: return("Geometry");

                case ShaderStageType.Pixel: return("Pixel");

                case ShaderStageType.Compute: return("Compute");
                }
            }
            else if (apitype == GraphicsAPI.OpenGL || apitype == GraphicsAPI.Vulkan)
            {
                switch (stage)
                {
                case ShaderStageType.Vertex: return("Vertex");

                case ShaderStageType.Tess_Control: return("Tess. Control");

                case ShaderStageType.Tess_Eval: return("Tess. Eval");

                case ShaderStageType.Geometry: return("Geometry");

                case ShaderStageType.Fragment: return("Fragment");

                case ShaderStageType.Compute: return("Compute");
                }
            }

            return(stage.ToString());
        }
Пример #19
0
        public String GetShaderEntryPoint(ShaderStageType stage)
        {
            if (LogLoaded && IsLogVK)
            {
                switch (stage)
                {
                case ShaderStageType.Vertex: return(m_Vulkan.VS.entryPoint);

                case ShaderStageType.Tess_Control: return(m_Vulkan.TCS.entryPoint);

                case ShaderStageType.Tess_Eval: return(m_Vulkan.TES.entryPoint);

                case ShaderStageType.Geometry: return(m_Vulkan.GS.entryPoint);

                case ShaderStageType.Fragment: return(m_Vulkan.FS.entryPoint);

                case ShaderStageType.Compute: return(m_Vulkan.CS.entryPoint);
                }
            }

            return("");
        }
Пример #20
0
        public static string Str(this ShaderStageType stage, APIPipelineStateType apitype)
        {
            if (apitype == APIPipelineStateType.D3D11)
            {
                switch (stage)
                {
                case ShaderStageType.Vertex: return("Vertex");

                case ShaderStageType.Hull: return("Hull");

                case ShaderStageType.Domain: return("Domain");

                case ShaderStageType.Geometry: return("Geometry");

                case ShaderStageType.Pixel: return("Pixel");

                case ShaderStageType.Compute: return("Compute");
                }
            }
            else if (apitype == APIPipelineStateType.OpenGL)
            {
                switch (stage)
                {
                case ShaderStageType.Vertex: return("Vertex");

                case ShaderStageType.Tess_Control: return("Tess. Control");

                case ShaderStageType.Tess_Eval: return("Tess. Eval");

                case ShaderStageType.Geometry: return("Geometry");

                case ShaderStageType.Fragment: return("Fragment");

                case ShaderStageType.Compute: return("Compute");
                }
            }

            return(stage.ToString());
        }
Пример #21
0
        public static string Abbrev(this ShaderStageType stage, APIPipelineStateType apitype)
        {
            if (apitype == APIPipelineStateType.D3D11)
            {
                switch (stage)
                {
                case ShaderStageType.Vertex: return("VS");

                case ShaderStageType.Hull: return("HS");

                case ShaderStageType.Domain: return("DS");

                case ShaderStageType.Geometry: return("GS");

                case ShaderStageType.Pixel: return("PS");

                case ShaderStageType.Compute: return("CS");
                }
            }
            else if (apitype == APIPipelineStateType.OpenGL)
            {
                switch (stage)
                {
                case ShaderStageType.Vertex: return("VS");

                case ShaderStageType.Tess_Control: return("TCS");

                case ShaderStageType.Tess_Eval: return("TES");

                case ShaderStageType.Geometry: return("GS");

                case ShaderStageType.Fragment: return("FS");

                case ShaderStageType.Compute: return("CS");
                }
            }

            return("?S");
        }
Пример #22
0
            public static ShaderReflection GetReflection(Core core, ShaderStageType stage)
            {
                var curDraw = core.CurDrawcall;
                bool copy, compute;
                GetDrawContext(core, out copy, out compute);

                if (copy)
                    return null;
                else if (compute)
                    return core.CurPipelineState.GetShaderReflection(ShaderStageType.Compute);
                else
                    return core.CurPipelineState.GetShaderReflection(stage);
            }
Пример #23
0
            public static Dictionary<BindpointMap, BoundResource[]> GetReadOnlyResources(Core core, ShaderStageType stage)
            {
                var curDraw = core.CurDrawcall;
                bool copy, compute;
                GetDrawContext(core, out copy, out compute);

                if (copy)
                {
                    var ret = new Dictionary<BindpointMap, BoundResource[]>();

                    // only return copy source for one stage
                    if(stage == ShaderStageType.Pixel)
                        ret.Add(new BindpointMap(0, 0), new BoundResource[] { new BoundResource(curDraw.copySource) });

                    return ret;
                }
                else if (compute)
                {
                    // only return compute resources for one stage
                    if (stage == ShaderStageType.Pixel || stage == ShaderStageType.Compute)
                        return core.CurPipelineState.GetReadOnlyResources(ShaderStageType.Compute);
                    else
                        return new Dictionary<BindpointMap, BoundResource[]>();
                }
                else
                {
                    return core.CurPipelineState.GetReadOnlyResources(stage);
                }
            }
Пример #24
0
 public Following(FollowType t, ShaderStageType s, int i, int a)
 {
     Type = t; Stage = s; index = i; arrayEl = a;
 }
Пример #25
0
        public string GetShaderName(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_D3D11.m_VS.ShaderName;
                        case ShaderStageType.Domain: return m_D3D11.m_DS.ShaderName;
                        case ShaderStageType.Hull: return m_D3D11.m_HS.ShaderName;
                        case ShaderStageType.Geometry: return m_D3D11.m_GS.ShaderName;
                        case ShaderStageType.Pixel: return m_D3D11.m_PS.ShaderName;
                        case ShaderStageType.Compute: return m_D3D11.m_CS.ShaderName;
                    }
                }
                else if (IsLogGL)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return String.Format("Shader {0}", m_GL.m_VS.Shader);
                        case ShaderStageType.Tess_Control: return String.Format("Shader {0}", m_GL.m_TCS.Shader);
                        case ShaderStageType.Tess_Eval: return String.Format("Shader {0}", m_GL.m_TES.Shader);
                        case ShaderStageType.Geometry: return String.Format("Shader {0}", m_GL.m_GS.Shader);
                        case ShaderStageType.Fragment: return String.Format("Shader {0}", m_GL.m_FS.Shader);
                        case ShaderStageType.Compute: return String.Format("Shader {0}", m_GL.m_CS.Shader);
                    }
                }
            }

            return "";
        }
Пример #26
0
        public string GetShaderName(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_D3D11.m_VS.ShaderName;
                        case ShaderStageType.Domain: return m_D3D11.m_DS.ShaderName;
                        case ShaderStageType.Hull: return m_D3D11.m_HS.ShaderName;
                        case ShaderStageType.Geometry: return m_D3D11.m_GS.ShaderName;
                        case ShaderStageType.Pixel: return m_D3D11.m_PS.ShaderName;
                        case ShaderStageType.Compute: return m_D3D11.m_CS.ShaderName;
                    }
                }
                else if (IsLogD3D12)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_D3D12.PipelineName + " VS";
                        case ShaderStageType.Domain: return m_D3D12.PipelineName + " DS";
                        case ShaderStageType.Hull: return m_D3D12.PipelineName + " HS";
                        case ShaderStageType.Geometry: return m_D3D12.PipelineName + " GS";
                        case ShaderStageType.Pixel: return m_D3D12.PipelineName + " PS";
                        case ShaderStageType.Compute: return m_D3D12.PipelineName + " CS";
                    }
                }
                else if (IsLogGL)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_GL.m_VS.ShaderName;
                        case ShaderStageType.Tess_Control: return m_GL.m_TCS.ShaderName;
                        case ShaderStageType.Tess_Eval: return m_GL.m_TES.ShaderName;
                        case ShaderStageType.Geometry: return m_GL.m_GS.ShaderName;
                        case ShaderStageType.Fragment: return m_GL.m_FS.ShaderName;
                        case ShaderStageType.Compute: return m_GL.m_CS.ShaderName;
                    }
                }
                else if (IsLogVK)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_Vulkan.VS.ShaderName;
                        case ShaderStageType.Domain: return m_Vulkan.TCS.ShaderName;
                        case ShaderStageType.Hull: return m_Vulkan.TES.ShaderName;
                        case ShaderStageType.Geometry: return m_Vulkan.GS.ShaderName;
                        case ShaderStageType.Pixel: return m_Vulkan.FS.ShaderName;
                        case ShaderStageType.Compute: return m_Vulkan.CS.ShaderName;
                    }
                }
            }

            return "";
        }
Пример #27
0
        public Dictionary <BindpointMap, BoundResource[]> GetReadWriteResources(ShaderStageType stage)
        {
            var ret = new Dictionary <BindpointMap, BoundResource[]>();

            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    if (stage == ShaderStageType.Compute)
                    {
                        for (int i = 0; i < m_D3D11.m_CS.UAVs.Length; i++)
                        {
                            var key = new BindpointMap(0, i);
                            var val = new BoundResource();

                            val.Id         = m_D3D11.m_CS.UAVs[i].Resource;
                            val.HighestMip = (int)m_D3D11.m_CS.UAVs[i].HighestMip;
                            val.FirstSlice = (int)m_D3D11.m_CS.UAVs[i].FirstArraySlice;

                            ret.Add(key, new BoundResource[] { val });
                        }
                    }
                    else
                    {
                        for (int i = 0; i < m_D3D11.m_OM.UAVs.Length; i++)
                        {
                            var key = new BindpointMap(0, i);
                            var val = new BoundResource();

                            val.Id         = m_D3D11.m_OM.UAVs[i].Resource;
                            val.HighestMip = (int)m_D3D11.m_OM.UAVs[i].HighestMip;
                            val.FirstSlice = (int)m_D3D11.m_OM.UAVs[i].FirstArraySlice;

                            ret.Add(key, new BoundResource[] { val });
                        }
                    }

                    return(ret);
                }
                else if (IsLogGL)
                {
                    for (int i = 0; i < m_GL.Images.Length; i++)
                    {
                        var key = new BindpointMap(0, i);
                        var val = new BoundResource();

                        val.Id         = m_GL.Images[i].Resource;
                        val.HighestMip = (int)m_GL.Images[i].Level;
                        val.FirstSlice = (int)m_GL.Images[i].Layer;

                        ret.Add(key, new BoundResource[] { val });
                    }

                    return(ret);
                }
                else if (IsLogVK)
                {
                    VulkanPipelineState.Pipeline.DescriptorSet[] descsets = m_Vulkan.graphics.DescSets;

                    if (stage == ShaderStageType.Compute)
                    {
                        descsets = m_Vulkan.compute.DescSets;
                    }

                    ShaderStageBits mask = (ShaderStageBits)(1 << (int)stage);
                    for (int set = 0; set < descsets.Length; set++)
                    {
                        var descset = descsets[set];
                        for (int slot = 0; slot < descset.bindings.Length; slot++)
                        {
                            var bind = descset.bindings[slot];

                            if ((bind.type == ShaderBindType.ReadWriteBuffer ||
                                 bind.type == ShaderBindType.ReadWriteImage ||
                                 bind.type == ShaderBindType.ReadWriteTBuffer
                                 ) && (bind.stageFlags & mask) == mask)
                            {
                                var key = new BindpointMap(set, slot);
                                var val = new BoundResource[bind.descriptorCount];

                                for (UInt32 i = 0; i < bind.descriptorCount; i++)
                                {
                                    val[i]            = new BoundResource();
                                    val[i].Id         = bind.binds[i].res;
                                    val[i].HighestMip = (int)bind.binds[i].baseMip;
                                    val[i].FirstSlice = (int)bind.binds[i].baseLayer;
                                }

                                ret.Add(key, val);
                            }
                        }
                    }

                    return(ret);
                }
            }

            return(ret);
        }
Пример #28
0
        public ResourceId BuildTargetShader(string entry, string source, UInt32 compileFlags, ShaderStageType type, out string errors)
        {
            IntPtr mem = CustomMarshal.Alloc(typeof(templated_array));

            ResourceId ret = ResourceId.Null;

            IntPtr entry_mem  = CustomMarshal.MakeUTF8String(entry);
            IntPtr source_mem = CustomMarshal.MakeUTF8String(source);

            bool success = ReplayRenderer_BuildTargetShader(m_Real, entry_mem, source_mem, compileFlags, type, ref ret, mem);

            CustomMarshal.Free(entry_mem);
            CustomMarshal.Free(source_mem);

            if (!success)
            {
                ret = ResourceId.Null;
            }

            errors = CustomMarshal.TemplatedArrayToString(mem, true);

            CustomMarshal.Free(mem);

            return(ret);
        }
Пример #29
0
        public void GetConstantBuffer(ShaderStageType stage, uint BufIdx, uint ArrayIdx, out ResourceId buf, out ulong ByteOffset, out ulong ByteSize)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                        case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;
                        case ShaderStageType.Domain: s = m_D3D11.m_DS; break;
                        case ShaderStageType.Hull: s = m_D3D11.m_HS; break;
                        case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;
                        case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;
                        case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    if(BufIdx < s.ConstantBuffers.Length)
                    {
                        buf = s.ConstantBuffers[BufIdx].Buffer;
                        ByteOffset = (ulong)(s.ConstantBuffers[BufIdx].VecOffset * 4 * sizeof(float));
                        ByteSize = (ulong)(s.ConstantBuffers[BufIdx].VecCount * 4 * sizeof(float));

                        return;
                    }
                }
                else if (IsLogGL)
                {
                    GLPipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                        case ShaderStageType.Vertex: s = m_GL.m_VS; break;
                        case ShaderStageType.Tess_Control: s = m_GL.m_TCS; break;
                        case ShaderStageType.Tess_Eval: s = m_GL.m_TES; break;
                        case ShaderStageType.Geometry: s = m_GL.m_GS; break;
                        case ShaderStageType.Fragment: s = m_GL.m_FS; break;
                        case ShaderStageType.Compute: s = m_GL.m_CS; break;
                    }

                    if(s.ShaderDetails != null && BufIdx < s.ShaderDetails.ConstantBlocks.Length)
                    {
                        if (s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint >= 0)
                        {
                            int uboIdx = s.BindpointMapping.ConstantBlocks[s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint].bind;
                            if (uboIdx >= 0 && uboIdx < m_GL.UniformBuffers.Length)
                            {
                                var b = m_GL.UniformBuffers[uboIdx];

                                buf = b.Resource;
                                ByteOffset = b.Offset;
                                ByteSize = b.Size;

                                return;
                            }
                        }
                    }
                }
                else if (IsLogVK)
                {
                    VulkanPipelineState.Pipeline pipe = m_Vulkan.graphics;
                    if (stage == ShaderStageType.Compute)
                        pipe = m_Vulkan.compute;

                    VulkanPipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                        case ShaderStageType.Vertex: s = m_Vulkan.VS; break;
                        case ShaderStageType.Tess_Control: s = m_Vulkan.TCS; break;
                        case ShaderStageType.Tess_Eval: s = m_Vulkan.TES; break;
                        case ShaderStageType.Geometry: s = m_Vulkan.GS; break;
                        case ShaderStageType.Fragment: s = m_Vulkan.FS; break;
                        case ShaderStageType.Compute: s = m_Vulkan.CS; break;
                    }

                    if (s.ShaderDetails != null && BufIdx < s.ShaderDetails.ConstantBlocks.Length)
                    {
                        var bind = s.BindpointMapping.ConstantBlocks[s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint];

                        if (s.ShaderDetails.ConstantBlocks[BufIdx].bufferBacked == false)
                        {
                            // dummy values, it would be nice to fetch these properly
                            buf = ResourceId.Null;
                            ByteOffset = 0;
                            ByteSize = 1024;
                            return;
                        }

                        var descriptorBind = pipe.DescSets[bind.bindset].bindings[bind.bind].binds[ArrayIdx];

                        buf = descriptorBind.res;
                        ByteOffset = descriptorBind.offset;
                        ByteSize = descriptorBind.size;

                        return;
                    }
                }
            }

            buf = ResourceId.Null;
            ByteOffset = 0;
            ByteSize = 0;
        }
Пример #30
0
        public Dictionary<BindpointMap, BoundResource[]> GetReadOnlyResources(ShaderStageType stage)
        {
            var ret = new Dictionary<BindpointMap, BoundResource[]>();

            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                        case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;
                        case ShaderStageType.Domain: s = m_D3D11.m_DS; break;
                        case ShaderStageType.Hull: s = m_D3D11.m_HS; break;
                        case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;
                        case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;
                        case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    for (int i = 0; i < s.SRVs.Length; i++)
                    {
                        var key = new BindpointMap(0, i);
                        var val = new BoundResource();

                        val.Id = s.SRVs[i].Resource;
                        val.HighestMip = (int)s.SRVs[i].HighestMip;
                        val.FirstSlice = (int)s.SRVs[i].FirstArraySlice;
                        val.typeHint = s.SRVs[i].Format.compType;

                        ret.Add(key, new BoundResource[] { val });
                    }

                    return ret;
                }
                else if (IsLogGL)
                {
                    for (int i = 0; i < m_GL.Textures.Length; i++)
                    {
                        var key = new BindpointMap(0, i);
                        var val = new BoundResource();

                        val.Id = m_GL.Textures[i].Resource;
                        val.HighestMip = (int)m_GL.Textures[i].HighestMip;
                        val.FirstSlice = (int)m_GL.Textures[i].FirstSlice;
                        val.typeHint = FormatComponentType.None;

                        ret.Add(key, new BoundResource[] { val });
                    }

                    return ret;
                }
                else if (IsLogVK)
                {
                    VulkanPipelineState.Pipeline.DescriptorSet[] descsets = m_Vulkan.graphics.DescSets;

                    if (stage == ShaderStageType.Compute)
                        descsets = m_Vulkan.compute.DescSets;

                    ShaderStageBits mask = (ShaderStageBits)(1 << (int)stage);

                    for (int set = 0; set < descsets.Length; set++)
                    {
                        var descset = descsets[set];
                        for (int slot = 0; slot < descset.bindings.Length; slot++)
                        {
                            var bind = descset.bindings[slot];
                            if ((bind.type == ShaderBindType.ImageSampler ||
                                bind.type == ShaderBindType.InputAttachment ||
                                bind.type == ShaderBindType.ReadOnlyImage ||
                                bind.type == ShaderBindType.ReadOnlyTBuffer
                               ) && (bind.stageFlags & mask) == mask)
                            {
                                var key = new BindpointMap(set, slot);
                                var val = new BoundResource[bind.descriptorCount];

                                for (UInt32 i = 0; i < bind.descriptorCount; i++)
                                {
                                    val[i] = new BoundResource();
                                    val[i].Id = bind.binds[i].res;
                                    val[i].HighestMip = (int)bind.binds[i].baseMip;
                                    val[i].FirstSlice = (int)bind.binds[i].baseLayer;
                                    val[i].typeHint = bind.binds[i].viewfmt.compType;
                                }

                                ret.Add(key, val);
                            }
                        }
                    }

                    return ret;
                }
            }

            return ret;
        }
Пример #31
0
        // there's a lot of redundancy in these functions
        public ShaderReflection GetShaderReflection(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_D3D11.m_VS.ShaderDetails;
                        case ShaderStageType.Domain: return m_D3D11.m_DS.ShaderDetails;
                        case ShaderStageType.Hull: return m_D3D11.m_HS.ShaderDetails;
                        case ShaderStageType.Geometry: return m_D3D11.m_GS.ShaderDetails;
                        case ShaderStageType.Pixel: return m_D3D11.m_PS.ShaderDetails;
                        case ShaderStageType.Compute: return m_D3D11.m_CS.ShaderDetails;
                    }
                }
                else if (IsLogGL)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_GL.m_VS.ShaderDetails;
                        case ShaderStageType.Tess_Control: return m_GL.m_TCS.ShaderDetails;
                        case ShaderStageType.Tess_Eval: return m_GL.m_TES.ShaderDetails;
                        case ShaderStageType.Geometry: return m_GL.m_GS.ShaderDetails;
                        case ShaderStageType.Fragment: return m_GL.m_FS.ShaderDetails;
                        case ShaderStageType.Compute: return m_GL.m_CS.ShaderDetails;
                    }
                }
            }

            return null;
        }
Пример #32
0
        public ResourceId GetShader(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_D3D11.m_VS.Shader;
                        case ShaderStageType.Domain: return m_D3D11.m_DS.Shader;
                        case ShaderStageType.Hull: return m_D3D11.m_HS.Shader;
                        case ShaderStageType.Geometry: return m_D3D11.m_GS.Shader;
                        case ShaderStageType.Pixel: return m_D3D11.m_PS.Shader;
                        case ShaderStageType.Compute: return m_D3D11.m_CS.Shader;
                    }
                }
                else if (IsLogGL)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_GL.m_VS.Shader;
                        case ShaderStageType.Tess_Control: return m_GL.m_TCS.Shader;
                        case ShaderStageType.Tess_Eval: return m_GL.m_TES.Shader;
                        case ShaderStageType.Geometry: return m_GL.m_GS.Shader;
                        case ShaderStageType.Fragment: return m_GL.m_FS.Shader;
                        case ShaderStageType.Compute: return m_GL.m_CS.Shader;
                    }
                }
            }

            return ResourceId.Null;
        }
Пример #33
0
        public ResourceId[] GetResources(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                        case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;
                        case ShaderStageType.Domain: s = m_D3D11.m_DS; break;
                        case ShaderStageType.Hull: s = m_D3D11.m_HS; break;
                        case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;
                        case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;
                        case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    ResourceId[] ret = new ResourceId[s.SRVs.Length];
                    for (int i = 0; i < s.SRVs.Length; i++)
                        ret[i] = s.SRVs[i].Resource;

                    return ret;
                }
                else if (IsLogGL)
                {
                    ResourceId[] ret = new ResourceId[m_GL.Textures.Length];
                    for (int i = 0; i < m_GL.Textures.Length; i++)
                        ret[i] = m_GL.Textures[i].Resource;

                    return ret;
                }
            }

            return null;
        }
Пример #34
0
        public void GetConstantBuffer(ShaderStageType stage, uint BindPoint, out ResourceId buf, out uint ByteOffset)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                        case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;
                        case ShaderStageType.Domain: s = m_D3D11.m_DS; break;
                        case ShaderStageType.Hull: s = m_D3D11.m_HS; break;
                        case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;
                        case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;
                        case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    buf = s.ConstantBuffers[BindPoint].Buffer;
                    ByteOffset = s.ConstantBuffers[BindPoint].VecOffset * 4 * sizeof(float);

                    return;
                }
                else if (IsLogGL)
                {
                    buf = ResourceId.Null;
                    ByteOffset = 0;

                    return;
                }
            }

            buf = ResourceId.Null;
            ByteOffset = 0;
        }
Пример #35
0
        public void GetConstantBuffer(ShaderStageType stage, uint BufIdx, out ResourceId buf, out uint ByteOffset, out uint ByteSize)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                        case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;
                        case ShaderStageType.Domain: s = m_D3D11.m_DS; break;
                        case ShaderStageType.Hull: s = m_D3D11.m_HS; break;
                        case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;
                        case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;
                        case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    if(BufIdx < s.ConstantBuffers.Length)
                    {
                        buf = s.ConstantBuffers[BufIdx].Buffer;
                        ByteOffset = s.ConstantBuffers[BufIdx].VecOffset * 4 * sizeof(float);
                        ByteSize = s.ConstantBuffers[BufIdx].VecCount * 4 * sizeof(float);

                        return;
                    }
                }
                else if (IsLogGL)
                {
                    GLPipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                        case ShaderStageType.Vertex: s = m_GL.m_VS; break;
                        case ShaderStageType.Tess_Control: s = m_GL.m_TCS; break;
                        case ShaderStageType.Tess_Eval: s = m_GL.m_TES; break;
                        case ShaderStageType.Geometry: s = m_GL.m_GS; break;
                        case ShaderStageType.Fragment: s = m_GL.m_FS; break;
                        case ShaderStageType.Compute: s = m_GL.m_CS; break;
                    }

                    if(s.ShaderDetails != null && BufIdx < s.ShaderDetails.ConstantBlocks.Length)
                    {
                        if (s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint >= 0)
                        {
                            int uboIdx = s.BindpointMapping.ConstantBlocks[s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint].bind;
                            if (uboIdx >= 0 && uboIdx < m_GL.UniformBuffers.Length)
                            {
                                var b = m_GL.UniformBuffers[uboIdx];

                                buf = b.Resource;
                                ByteOffset = (uint)b.Offset;
                                ByteSize = (uint)b.Size;

                                return;
                            }
                        }
                    }
                }
            }

            buf = ResourceId.Null;
            ByteOffset = 0;
            ByteSize = 0;
        }
Пример #36
0
        public ShaderViewer(Core core, ShaderReflection shader, ShaderStageType stage, ShaderDebugTrace trace, string debugContext)
        {
            InitializeComponent();

            constantRegs.Font =
                variableRegs.Font =
                watchRegs.Font =
                inSig.Font =
                outSig.Font =
                core.Config.PreferredFont;

            Icon = global::renderdocui.Properties.Resources.icon;

            this.SuspendLayout();

            mainLayout.Dock = DockStyle.Fill;

            constantRegs.Font =
                variableRegs.Font =
                watchRegs.Font =
                inSig.Font =
                outSig.Font =
                core.Config.PreferredFont;

            m_Core = core;
            m_ShaderDetails = shader;
            m_Trace = trace;
            m_Stage = null;
            switch (stage)
            {
                case ShaderStageType.Vertex: m_Stage = m_Core.CurD3D11PipelineState.m_VS; break;
                case ShaderStageType.Domain: m_Stage = m_Core.CurD3D11PipelineState.m_DS; break;
                case ShaderStageType.Hull: m_Stage = m_Core.CurD3D11PipelineState.m_HS; break;
                case ShaderStageType.Geometry: m_Stage = m_Core.CurD3D11PipelineState.m_GS; break;
                case ShaderStageType.Pixel: m_Stage = m_Core.CurD3D11PipelineState.m_PS; break;
                case ShaderStageType.Compute: m_Stage = m_Core.CurD3D11PipelineState.m_CS; break;
            }

            if (trace != null)
                Text = String.Format("Debugging {0} - {1}", m_Core.CurPipelineState.GetShaderName(stage), debugContext);
            else
                Text = m_Core.CurPipelineState.GetShaderName(stage);

            var disasm = shader.Disassembly;

            if (m_Core.Config.ShaderViewer_FriendlyNaming)
            {
                for (int i = 0; i < m_ShaderDetails.ConstantBlocks.Length; i++)
                {
                    var stem = string.Format("cb{0}", i);

                    var cbuf = m_ShaderDetails.ConstantBlocks[i];

                    if (cbuf.variables.Length == 0)
                        continue;

                    disasm = FriendlyName(disasm, stem, "", cbuf.variables);
                }

                foreach (var r in m_ShaderDetails.Resources)
                {
                    if (r.IsSRV)
                    {
                        var needle = string.Format(", t{0}([^0-9])", r.bindPoint);
                        var replacement = string.Format(", {0}$1", r.name);

                        Regex rgx = new Regex(needle);
                        disasm = rgx.Replace(disasm, replacement);
                    }
                    if (r.IsSampler)
                    {
                        var needle = string.Format(", s{0}([^0-9])", r.bindPoint);
                        var replacement = string.Format(", {0}$1", r.name);

                        Regex rgx = new Regex(needle);
                        disasm = rgx.Replace(disasm, replacement);
                    }
                    if (r.IsReadWrite)
                    {
                        var needle = string.Format(", u{0}([^0-9])", r.bindPoint);
                        var replacement = string.Format(", {0}$1", r.name);

                        Regex rgx = new Regex(needle);
                        disasm = rgx.Replace(disasm, replacement);
                    }
                }
            }

            {
                m_DisassemblyView = MakeEditor("scintillaDisassem", disasm, false);
                m_DisassemblyView.IsReadOnly = true;
                m_DisassemblyView.TabIndex = 0;

                m_DisassemblyView.KeyDown += new KeyEventHandler(m_DisassemblyView_KeyDown);
                m_DisassemblyView.KeyDown += new KeyEventHandler(readonlyScintilla_KeyDown);

                m_DisassemblyView.Markers[CURRENT_MARKER].BackColor = System.Drawing.Color.LightCoral;
                m_DisassemblyView.Markers[CURRENT_MARKER].Symbol = ScintillaNET.MarkerSymbol.Background;
                m_DisassemblyView.Markers[CURRENT_MARKER+1].BackColor = System.Drawing.Color.LightCoral;
                m_DisassemblyView.Markers[CURRENT_MARKER+1].Symbol = ScintillaNET.MarkerSymbol.ShortArrow;

                CurrentLineMarkers.Add(CURRENT_MARKER);
                CurrentLineMarkers.Add(CURRENT_MARKER+1);

                m_DisassemblyView.Markers[FINISHED_MARKER].BackColor = System.Drawing.Color.LightSlateGray;
                m_DisassemblyView.Markers[FINISHED_MARKER].Symbol = ScintillaNET.MarkerSymbol.Background;
                m_DisassemblyView.Markers[FINISHED_MARKER + 1].BackColor = System.Drawing.Color.LightSlateGray;
                m_DisassemblyView.Markers[FINISHED_MARKER + 1].Symbol = ScintillaNET.MarkerSymbol.RoundRectangle;

                FinishedMarkers.Add(FINISHED_MARKER);
                FinishedMarkers.Add(FINISHED_MARKER + 1);

                m_DisassemblyView.Markers[BREAKPOINT_MARKER].BackColor = System.Drawing.Color.Red;
                m_DisassemblyView.Markers[BREAKPOINT_MARKER].Symbol = ScintillaNET.MarkerSymbol.Background;
                m_DisassemblyView.Markers[BREAKPOINT_MARKER+1].BackColor = System.Drawing.Color.Red;
                m_DisassemblyView.Markers[BREAKPOINT_MARKER+1].Symbol = ScintillaNET.MarkerSymbol.Circle;

                BreakpointMarkers.Add(BREAKPOINT_MARKER);
                BreakpointMarkers.Add(BREAKPOINT_MARKER + 1);

                if (trace != null)
                {
                    m_DisassemblyView.ContextMenu = AssemblyContextMenu();
                    m_DisassemblyView.MouseDown += new MouseEventHandler(contextMouseDown);
                }

                m_Scintillas.Add(m_DisassemblyView);

                var w = Helpers.WrapDockContent(dockPanel, m_DisassemblyView, "Disassembly");
                w.DockState = DockState.Document;
                w.Show();

                w.CloseButton = false;
                w.CloseButtonVisible = false;
            }

            if (shader.DebugInfo.entryFunc.Length > 0 && shader.DebugInfo.files.Length > 0)
            {
                if(trace != null)
                    Text = String.Format("Debug {0}() - {1}", shader.DebugInfo.entryFunc, debugContext);
                else
                    Text = String.Format("{0}()", shader.DebugInfo.entryFunc);

                int fileIdx = 0;

                DockContent sel = null;
                foreach (var f in shader.DebugInfo.files)
                {
                    var name = f.BaseFilename;

                    ScintillaNET.Scintilla scintilla1 = MakeEditor("scintilla" + name, f.filetext, true);
                    scintilla1.IsReadOnly = true;

                    scintilla1.Tag = name;

                    scintilla1.KeyDown += new KeyEventHandler(readonlyScintilla_KeyDown);

                    var w = Helpers.WrapDockContent(dockPanel, scintilla1, name);
                    w.CloseButton = false;
                    w.CloseButtonVisible = false;
                    w.Show(dockPanel);

                    m_Scintillas.Add(scintilla1);

                    if (shader.DebugInfo.entryFile >= 0 && shader.DebugInfo.entryFile < shader.DebugInfo.files.Length)
                    {
                        if (fileIdx == shader.DebugInfo.entryFile)
                            sel = w;
                    }
                    else if (f.filetext.Contains(shader.DebugInfo.entryFunc))
                    {
                        sel = w;
                    }

                    fileIdx++;
                }

                if (shader.DebugInfo.files.Length > 2)
                    AddFileList();

                if (trace != null || sel == null)
                    sel = (DockContent)m_DisassemblyView.Parent;

                sel.Show();
            }

            m_FindAll = new FindAllDialog(FindAllFiles);
            m_FindAll.Hide();

            ShowConstants();
            ShowVariables();
            ShowWatch();
            ShowErrors();

            editStrip.Visible = false;

            m_ErrorsDock.Hide();

            if (trace == null)
            {
                debuggingStrip.Visible = false;
                m_ConstantsDock.Hide();
                m_VariablesDock.Hide();
                m_WatchDock.Hide();

                var insig = Helpers.WrapDockContent(dockPanel, inSigBox);
                insig.CloseButton = insig.CloseButtonVisible = false;

                var outsig = Helpers.WrapDockContent(dockPanel, outSigBox);
                outsig.CloseButton = outsig.CloseButtonVisible = false;

                insig.Show(dockPanel, DockState.DockBottom);
                outsig.Show(insig.Pane, DockAlignment.Right, 0.5);

                foreach (var s in m_ShaderDetails.InputSig)
                {
                    string name = s.varName.Length == 0 ? s.semanticName : String.Format("{0} ({1})", s.varName, s.semanticName);
                    if (s.semanticName.Length == 0) name = s.varName;

                    inSig.Nodes.Add(new object[] { name, s.semanticIndex, s.regIndex, s.TypeString, s.systemValue.ToString(),
                                                                SigParameter.GetComponentString(s.regChannelMask), SigParameter.GetComponentString(s.channelUsedMask) });
                }

                bool multipleStreams = false;
                for (int i = 0; i < m_ShaderDetails.OutputSig.Length; i++)
                {
                    if (m_ShaderDetails.OutputSig[i].stream > 0)
                    {
                        multipleStreams = true;
                        break;
                    }
                }

                foreach (var s in m_ShaderDetails.OutputSig)
                {
                    string name = s.varName.Length == 0 ? s.semanticName : String.Format("{0} ({1})", s.varName, s.semanticName);
                    if (s.semanticName.Length == 0) name = s.varName;

                    if(multipleStreams)
                        name = String.Format("Stream {0} : {1}", s.stream, name);

                    outSig.Nodes.Add(new object[] { name, s.semanticIndex, s.regIndex, s.TypeString, s.systemValue.ToString(),
                                                                SigParameter.GetComponentString(s.regChannelMask), SigParameter.GetComponentString(s.channelUsedMask) });
                }
            }
            else
            {
                inSigBox.Visible = false;
                outSigBox.Visible = false;

                m_DisassemblyView.Margins.Margin1.Width = 20;

                m_DisassemblyView.Margins.Margin2.Width = 0;

                m_DisassemblyView.Margins.Margin3.Width = 20;
                m_DisassemblyView.Margins.Margin3.IsMarkerMargin = true;
                m_DisassemblyView.Margins.Margin3.IsFoldMargin = false;
                m_DisassemblyView.Margins.Margin3.Type = ScintillaNET.MarginType.Symbol;

                m_DisassemblyView.Margins.Margin1.Mask = (int)m_DisassemblyView.Markers[BREAKPOINT_MARKER + 1].Mask;
                m_DisassemblyView.Margins.Margin3.Mask &= ~((int)m_DisassemblyView.Markers[BREAKPOINT_MARKER + 1].Mask);

                m_DisassemblyView.MouseMove += new MouseEventHandler(scintilla1_MouseMove);
                m_DisassemblyView.Leave += new EventHandler(scintilla1_Leave);
                m_DisassemblyView.KeyDown += new KeyEventHandler(scintilla1_DebuggingKeyDown);

                watchRegs.Items.Add(new ListViewItem(new string[] { "", "", "" }));
            }

            CurrentStep = 0;

            this.ResumeLayout(false);
        }
Пример #37
0
 private static extern bool ReplayRenderer_BuildTargetShader(IntPtr real, IntPtr entry, IntPtr source, UInt32 compileFlags, ShaderStageType type, ref ResourceId shaderID, IntPtr errorMem);
Пример #38
0
        public string Abbrev(ShaderStageType stage)
        {
            if (IsLogD3D11 || (!LogLoaded && DefaultType == APIPipelineStateType.D3D11))
            {
                switch (stage)
                {
                    case ShaderStageType.Vertex: return "VS";
                    case ShaderStageType.Hull: return "HS";
                    case ShaderStageType.Domain: return "DS";
                    case ShaderStageType.Geometry: return "GS";
                    case ShaderStageType.Pixel: return "PS";
                    case ShaderStageType.Compute: return "CS";
                }
            }
            else if (IsLogGL || (!LogLoaded && DefaultType == APIPipelineStateType.OpenGL) ||
                     IsLogVK || (!LogLoaded && DefaultType == APIPipelineStateType.Vulkan))
            {
                switch (stage)
                {
                    case ShaderStageType.Vertex: return "VS";
                    case ShaderStageType.Tess_Control: return "TCS";
                    case ShaderStageType.Tess_Eval: return "TES";
                    case ShaderStageType.Geometry: return "GS";
                    case ShaderStageType.Fragment: return "FS";
                    case ShaderStageType.Compute: return "CS";
                }
            }

            return "?S";
        }
Пример #39
0
        public Dictionary <BindpointMap, BoundResource[]> GetReadOnlyResources(ShaderStageType stage)
        {
            var ret = new Dictionary <BindpointMap, BoundResource[]>();

            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                    case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;

                    case ShaderStageType.Domain: s = m_D3D11.m_DS; break;

                    case ShaderStageType.Hull: s = m_D3D11.m_HS; break;

                    case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;

                    case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;

                    case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    for (int i = 0; i < s.SRVs.Length; i++)
                    {
                        var key = new BindpointMap(0, i);
                        var val = new BoundResource();

                        val.Id         = s.SRVs[i].Resource;
                        val.HighestMip = (int)s.SRVs[i].HighestMip;
                        val.FirstSlice = (int)s.SRVs[i].FirstArraySlice;

                        ret.Add(key, new BoundResource[] { val });
                    }

                    return(ret);
                }
                else if (IsLogGL)
                {
                    for (int i = 0; i < m_GL.Textures.Length; i++)
                    {
                        var key = new BindpointMap(0, i);
                        var val = new BoundResource();

                        val.Id         = m_GL.Textures[i].Resource;
                        val.HighestMip = (int)m_GL.Textures[i].HighestMip;
                        val.FirstSlice = (int)m_GL.Textures[i].FirstSlice;

                        ret.Add(key, new BoundResource[] { val });
                    }

                    return(ret);
                }
                else if (IsLogVK)
                {
                    VulkanPipelineState.Pipeline.DescriptorSet[] descsets = m_Vulkan.graphics.DescSets;

                    if (stage == ShaderStageType.Compute)
                    {
                        descsets = m_Vulkan.compute.DescSets;
                    }

                    ShaderStageBits mask = (ShaderStageBits)(1 << (int)stage);

                    for (int set = 0; set < m_Vulkan.graphics.DescSets.Length; set++)
                    {
                        var descset = m_Vulkan.graphics.DescSets[set];
                        for (int slot = 0; slot < descset.bindings.Length; slot++)
                        {
                            var bind = descset.bindings[slot];
                            if ((bind.type == ShaderBindType.ImageSampler ||
                                 bind.type == ShaderBindType.InputAttachment ||
                                 bind.type == ShaderBindType.ReadOnlyImage ||
                                 bind.type == ShaderBindType.ReadOnlyTBuffer
                                 ) && (bind.stageFlags & mask) == mask)
                            {
                                var key = new BindpointMap(set, slot);
                                var val = new BoundResource[bind.descriptorCount];

                                for (UInt32 i = 0; i < bind.descriptorCount; i++)
                                {
                                    val[i]            = new BoundResource();
                                    val[i].Id         = bind.binds[i].res;
                                    val[i].HighestMip = (int)bind.binds[i].baseMip;
                                    val[i].FirstSlice = (int)bind.binds[i].baseLayer;
                                }

                                ret.Add(key, val);
                            }
                        }
                    }

                    return(ret);
                }
            }

            return(ret);
        }
Пример #40
0
        public ResourceId BuildTargetShader(string entry, string source, UInt32 compileFlags, ShaderStageType type, out string errors)
        {
            IntPtr mem = CustomMarshal.Alloc(typeof(templated_array));

            ResourceId ret = ResourceId.Null;

            bool success = ReplayRenderer_BuildTargetShader(m_Real, entry, source, compileFlags, type, ref ret, mem);

            if (!success)
                ret = ResourceId.Null;

            errors = CustomMarshal.TemplatedArrayToUniString(mem, true);

            CustomMarshal.Free(mem);

            return ret;
        }
Пример #41
0
        public ResourceId BuildTargetShader(string entry, string source, UInt32 compileFlags, ShaderStageType type, out string errors)
        {
            IntPtr mem = CustomMarshal.Alloc(typeof(templated_array));

            ResourceId ret = ResourceId.Null;

            IntPtr entry_mem = CustomMarshal.MakeUTF8String(entry);
            IntPtr source_mem = CustomMarshal.MakeUTF8String(source);

            ReplayRenderer_BuildTargetShader(m_Real, entry_mem, source_mem, compileFlags, type, ref ret, mem);

            CustomMarshal.Free(entry_mem);
            CustomMarshal.Free(source_mem);

            errors = CustomMarshal.TemplatedArrayToString(mem, true);

            CustomMarshal.Free(mem);

            return ret;
        }
Пример #42
0
        public void GetConstantBuffer(ShaderStageType stage, uint BufIdx, uint ArrayIdx, out ResourceId buf, out ulong ByteOffset, out ulong ByteSize)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                    case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;

                    case ShaderStageType.Domain: s = m_D3D11.m_DS; break;

                    case ShaderStageType.Hull: s = m_D3D11.m_HS; break;

                    case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;

                    case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;

                    case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    if (BufIdx < s.ConstantBuffers.Length)
                    {
                        buf        = s.ConstantBuffers[BufIdx].Buffer;
                        ByteOffset = (ulong)(s.ConstantBuffers[BufIdx].VecOffset * 4 * sizeof(float));
                        ByteSize   = (ulong)(s.ConstantBuffers[BufIdx].VecCount * 4 * sizeof(float));

                        return;
                    }
                }
                else if (IsLogGL)
                {
                    GLPipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                    case ShaderStageType.Vertex: s = m_GL.m_VS; break;

                    case ShaderStageType.Tess_Control: s = m_GL.m_TCS; break;

                    case ShaderStageType.Tess_Eval: s = m_GL.m_TES; break;

                    case ShaderStageType.Geometry: s = m_GL.m_GS; break;

                    case ShaderStageType.Fragment: s = m_GL.m_FS; break;

                    case ShaderStageType.Compute: s = m_GL.m_CS; break;
                    }

                    if (s.ShaderDetails != null && BufIdx < s.ShaderDetails.ConstantBlocks.Length)
                    {
                        if (s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint >= 0)
                        {
                            int uboIdx = s.BindpointMapping.ConstantBlocks[s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint].bind;
                            if (uboIdx >= 0 && uboIdx < m_GL.UniformBuffers.Length)
                            {
                                var b = m_GL.UniformBuffers[uboIdx];

                                buf        = b.Resource;
                                ByteOffset = b.Offset;
                                ByteSize   = b.Size;

                                return;
                            }
                        }
                    }
                }
                else if (IsLogVK)
                {
                    VulkanPipelineState.Pipeline pipe = m_Vulkan.graphics;
                    if (stage == ShaderStageType.Compute)
                    {
                        pipe = m_Vulkan.compute;
                    }

                    VulkanPipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                    case ShaderStageType.Vertex: s = m_Vulkan.VS; break;

                    case ShaderStageType.Tess_Control: s = m_Vulkan.TCS; break;

                    case ShaderStageType.Tess_Eval: s = m_Vulkan.TES; break;

                    case ShaderStageType.Geometry: s = m_Vulkan.GS; break;

                    case ShaderStageType.Fragment: s = m_Vulkan.FS; break;

                    case ShaderStageType.Compute: s = m_Vulkan.CS; break;
                    }

                    if (s.ShaderDetails != null && BufIdx < s.ShaderDetails.ConstantBlocks.Length)
                    {
                        var bind = s.BindpointMapping.ConstantBlocks[s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint];

                        if (s.ShaderDetails.ConstantBlocks[BufIdx].bufferBacked == false)
                        {
                            // dummy values, it would be nice to fetch these properly
                            buf        = ResourceId.Null;
                            ByteOffset = 0;
                            ByteSize   = 1024;
                            return;
                        }

                        var descriptorBind = pipe.DescSets[bind.bindset].bindings[bind.bind].binds[ArrayIdx];

                        buf        = descriptorBind.res;
                        ByteOffset = descriptorBind.offset;
                        ByteSize   = descriptorBind.size;

                        return;
                    }
                }
            }

            buf        = ResourceId.Null;
            ByteOffset = 0;
            ByteSize   = 0;
        }
Пример #43
0
        public void GetConstantBuffer(ShaderStageType stage, uint BufIdx, out ResourceId buf, out uint ByteOffset, out uint ByteSize)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    D3D11PipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                    case ShaderStageType.Vertex: s = m_D3D11.m_VS; break;

                    case ShaderStageType.Domain: s = m_D3D11.m_DS; break;

                    case ShaderStageType.Hull: s = m_D3D11.m_HS; break;

                    case ShaderStageType.Geometry: s = m_D3D11.m_GS; break;

                    case ShaderStageType.Pixel: s = m_D3D11.m_PS; break;

                    case ShaderStageType.Compute: s = m_D3D11.m_CS; break;
                    }

                    if (BufIdx < s.ConstantBuffers.Length)
                    {
                        buf        = s.ConstantBuffers[BufIdx].Buffer;
                        ByteOffset = s.ConstantBuffers[BufIdx].VecOffset * 4 * sizeof(float);
                        ByteSize   = s.ConstantBuffers[BufIdx].VecCount * 4 * sizeof(float);

                        return;
                    }
                }
                else if (IsLogGL)
                {
                    GLPipelineState.ShaderStage s = null;

                    switch (stage)
                    {
                    case ShaderStageType.Vertex: s = m_GL.m_VS; break;

                    case ShaderStageType.Tess_Control: s = m_GL.m_TCS; break;

                    case ShaderStageType.Tess_Eval: s = m_GL.m_TES; break;

                    case ShaderStageType.Geometry: s = m_GL.m_GS; break;

                    case ShaderStageType.Fragment: s = m_GL.m_FS; break;

                    case ShaderStageType.Compute: s = m_GL.m_CS; break;
                    }

                    if (s.ShaderDetails != null && BufIdx < s.ShaderDetails.ConstantBlocks.Length)
                    {
                        if (s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint >= 0)
                        {
                            int uboIdx = s.BindpointMapping.ConstantBlocks[s.ShaderDetails.ConstantBlocks[BufIdx].bindPoint].bind;
                            if (uboIdx >= 0 && uboIdx < m_GL.UniformBuffers.Length)
                            {
                                var b = m_GL.UniformBuffers[uboIdx];

                                buf        = b.Resource;
                                ByteOffset = (uint)b.Offset;
                                ByteSize   = (uint)b.Size;

                                return;
                            }
                        }
                    }
                }
            }

            buf        = ResourceId.Null;
            ByteOffset = 0;
            ByteSize   = 0;
        }
Пример #44
0
        // there's a lot of redundancy in these functions

        public ShaderBindpointMapping GetBindpointMapping(ShaderStageType stage)
        {
            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_D3D11.m_VS.BindpointMapping;
                        case ShaderStageType.Domain: return m_D3D11.m_DS.BindpointMapping;
                        case ShaderStageType.Hull: return m_D3D11.m_HS.BindpointMapping;
                        case ShaderStageType.Geometry: return m_D3D11.m_GS.BindpointMapping;
                        case ShaderStageType.Pixel: return m_D3D11.m_PS.BindpointMapping;
                        case ShaderStageType.Compute: return m_D3D11.m_CS.BindpointMapping;
                    }
                }
                else if (IsLogGL)
                {
                    switch (stage)
                    {
                        case ShaderStageType.Vertex: return m_GL.m_VS.BindpointMapping;
                        case ShaderStageType.Tess_Control: return m_GL.m_TCS.BindpointMapping;
                        case ShaderStageType.Tess_Eval: return m_GL.m_TES.BindpointMapping;
                        case ShaderStageType.Geometry: return m_GL.m_GS.BindpointMapping;
                        case ShaderStageType.Fragment: return m_GL.m_FS.BindpointMapping;
                        case ShaderStageType.Compute: return m_GL.m_CS.BindpointMapping;
                    }
                }
            }

            return null;
        }
Пример #45
0
 private static extern bool ReplayRenderer_BuildCustomShader(IntPtr real, string entry, string source, UInt32 compileFlags, ShaderStageType type, ref ResourceId shaderID, IntPtr errorMem);
Пример #46
0
 private static extern bool ReplayRenderer_BuildCustomShader(IntPtr real, string entry, string source, UInt32 compileFlags, ShaderStageType type, ref ResourceId shaderID, IntPtr errorMem);
Пример #47
0
        private void InitStageResourcePreviews(ShaderStageType stage, ShaderResource[] resourceDetails, BindpointMap[] mapping,
            Dictionary<BindpointMap, BoundResource[]> ResList,
            ThumbnailStrip prevs, ref int prevIndex,
            bool copy, bool rw)
        {
            for (int idx = 0; idx < mapping.Length; idx++)
            {
                var key = mapping[idx];

                BoundResource[] resArray = null;

                if (ResList.ContainsKey(key))
                    resArray = ResList[key];

                int arrayLen = resArray != null ? resArray.Length : 1;

                for (int arrayIdx = 0; arrayIdx < arrayLen; arrayIdx++)
                {
                    ResourceId id = resArray != null ? resArray[arrayIdx].Id : ResourceId.Null;
                    FormatComponentType typeHint = resArray != null ? resArray[arrayIdx].typeHint : FormatComponentType.None;

                    bool used = key.used;
                    bool samplerBind = false;
                    bool otherBind = false;

                    string bindName = "";

                    foreach (var bind in resourceDetails)
                    {
                        if (bind.bindPoint == idx && bind.IsSRV)
                        {
                            bindName = bind.name;
                            otherBind = true;
                            break;
                        }

                        if (bind.bindPoint == idx)
                        {
                            if(bind.IsSampler && !bind.IsSRV)
                                samplerBind = true;
                            else
                                otherBind = true;
                        }
                    }

                    if (samplerBind && !otherBind)
                        continue;

                    if (copy)
                    {
                        used = true;
                        bindName = "Source";
                    }

                    Following follow = new Following(rw ? FollowType.ReadWrite : FollowType.ReadOnly, stage, idx, arrayIdx);
                    string slotName = String.Format("{0} {1}{2}", m_Core.CurPipelineState.Abbrev(stage), rw ? "RW " : "", idx);

                    if (arrayLen > 1)
                        slotName += String.Format("[{0}]", arrayIdx);

                    if (copy)
                        slotName = "SRC";

                    // show if
                    bool show = (used || // it's referenced by the shader - regardless of empty or not
                        (showDisabled.Checked && !used && id != ResourceId.Null) || // it's bound, but not referenced, and we have "show disabled"
                        (showEmpty.Checked && id == ResourceId.Null) // it's empty, and we have "show empty"
                        );

                    ResourcePreview prev;

                    if (prevIndex < prevs.Thumbnails.Length)
                    {
                        prev = prevs.Thumbnails[prevIndex];
                    }
                    else
                    {
                        // don't create it if we're not actually going to show it
                        if (!show)
                            continue;

                        prev = UI_CreateThumbnail(prevs);
                    }

                    prevIndex++;

                    InitResourcePreview(prev, show ? id : ResourceId.Null, typeHint, show, follow, bindName, slotName);
                }
            }
        }
Пример #48
0
 public static extern void sg_apply_uniforms(ShaderStageType stage, int ub_index, IntPtr data, int num_bytes);
Пример #49
0
            public static ShaderBindpointMapping GetMapping(Core core, ShaderStageType stage)
            {
                var curDraw = core.CurDrawcall;
                bool copy, compute;
                GetDrawContext(core, out copy, out compute);

                if (copy)
                {
                    ShaderBindpointMapping mapping = new ShaderBindpointMapping();
                    mapping.ConstantBlocks = new BindpointMap[0];
                    mapping.ReadWriteResources = new BindpointMap[0];
                    mapping.InputAttributes = new int[0];

                    // for PS only add a single mapping to get the copy source
                    if (stage == ShaderStageType.Pixel)
                        mapping.ReadOnlyResources = new BindpointMap[] { new BindpointMap(0, 0) };
                    else
                        mapping.ReadOnlyResources = new BindpointMap[0];

                    return mapping;
                }
                else if (compute)
                {
                    return core.CurPipelineState.GetBindpointMapping(ShaderStageType.Compute);
                }
                else
                {
                    return core.CurPipelineState.GetBindpointMapping(stage);
                }
            }
Пример #50
0
 private static extern void ReplayRenderer_BuildTargetShader(IntPtr real, IntPtr entry, IntPtr source, UInt32 compileFlags, ShaderStageType type, ref ResourceId shaderID, IntPtr errorMem);
Пример #51
0
            public static Dictionary<BindpointMap, BoundResource[]> GetReadWriteResources(Core core, ShaderStageType stage)
            {
                var curDraw = core.CurDrawcall;
                bool copy, compute;
                GetDrawContext(core, out copy, out compute);

                if (copy)
                {
                    return new Dictionary<BindpointMap, BoundResource[]>();
                }
                else if (compute)
                {
                    // only return compute resources for one stage
                    if (stage == ShaderStageType.Pixel || stage == ShaderStageType.Compute)
                        return core.CurPipelineState.GetReadWriteResources(ShaderStageType.Compute);
                    else
                        return new Dictionary<BindpointMap, BoundResource[]>();
                }
                else
                {
                    return core.CurPipelineState.GetReadWriteResources(stage);
                }
            }
Пример #52
0
        public static DockContent Has(ShaderStageType stage, UInt32 slot)
        {
            foreach (var d in m_Docks)
            {
                ConstantBufferPreviewer cb = d.Controls[0] as ConstantBufferPreviewer;

                if(cb.Stage == stage && cb.Slot == slot)
                    return cb.Parent as DockContent;
            }

            return null;
        }
Пример #53
0
        public void OnEventSelected(UInt32 eventID)
        {
            if (IsDisposed) return;

            if (!CurrentTextureIsLocked || (CurrentTexture != null && m_TexDisplay.texid != CurrentTexture.ID))
                UI_OnTextureSelectionChanged(true);

            if (m_Output == null) return;

            UI_CreateThumbnails();

            BoundResource[] RTs = Following.GetOutputTargets(m_Core);
            BoundResource Depth = Following.GetDepthTarget(m_Core);

            int rwIndex = 0;
            int roIndex = 0;

            var curDraw = m_Core.GetDrawcall(eventID);
            bool copy = curDraw != null && (curDraw.flags & (DrawcallFlags.Copy|DrawcallFlags.Resolve)) != 0;
            bool compute = curDraw != null && (curDraw.flags & (DrawcallFlags.Dispatch)) != 0;

            for(int rt=0; rt < RTs.Length; rt++)
            {
                ResourcePreview prev;

                if (rwIndex < rwPanel.Thumbnails.Length)
                    prev = rwPanel.Thumbnails[rwIndex];
                else
                    prev = UI_CreateThumbnail(rwPanel);

                rwIndex++;

                Following follow = new Following(FollowType.OutputColour, ShaderStageType.Pixel, rt, 0);
                string bindName = copy ? "Destination" : "";
                string slotName = copy ? "DST" : String.Format("{0}{1}", m_Core.CurPipelineState.OutputAbbrev(), rt);

                InitResourcePreview(prev, RTs[rt].Id, RTs[rt].typeHint, false, follow, bindName, slotName);
            }

            // depth
            {
                ResourcePreview prev;

                if (rwIndex < rwPanel.Thumbnails.Length)
                    prev = rwPanel.Thumbnails[rwIndex];
                else
                    prev = UI_CreateThumbnail(rwPanel);

                rwIndex++;

                Following follow = new Following(FollowType.OutputDepth, ShaderStageType.Pixel, 0, 0);

                InitResourcePreview(prev, Depth.Id, Depth.typeHint, false, follow, "", "DS");
            }

            ShaderStageType[] stages = new ShaderStageType[] {
                ShaderStageType.Vertex,
                ShaderStageType.Hull,
                ShaderStageType.Domain,
                ShaderStageType.Geometry,
                ShaderStageType.Pixel
            };

            if (compute) stages = new ShaderStageType[] { ShaderStageType.Compute };

            // display resources used for all stages
            foreach (ShaderStageType stage in stages)
            {
                Dictionary<BindpointMap, BoundResource[]> RWs = Following.GetReadWriteResources(m_Core, stage);
                Dictionary<BindpointMap, BoundResource[]> ROs = Following.GetReadOnlyResources(m_Core, stage);

                ShaderReflection details = Following.GetReflection(m_Core, stage);
                ShaderBindpointMapping mapping = Following.GetMapping(m_Core, stage);

                if (mapping == null)
                    continue;

                InitStageResourcePreviews(stage,
                    details != null ? details.ReadWriteResources : new ShaderResource[0],
                    mapping.ReadWriteResources,
                    RWs, rwPanel, ref rwIndex, copy, true);

                InitStageResourcePreviews(stage,
                    details != null ? details.ReadOnlyResources : new ShaderResource[0],
                    mapping.ReadOnlyResources,
                    ROs, roPanel, ref roIndex, copy, false);
            }

            // hide others
            for (; rwIndex < rwPanel.Thumbnails.Length; rwIndex++)
            {
                rwPanel.Thumbnails[rwIndex].Init();
                rwPanel.Thumbnails[rwIndex].Visible = false;
            }

            rwPanel.RefreshLayout();

            for (; roIndex < roPanel.Thumbnails.Length; roIndex++)
            {
                roPanel.Thumbnails[roIndex].Init();
                roPanel.Thumbnails[roIndex].Visible = false;
            }

            roPanel.RefreshLayout();

            m_Core.Renderer.BeginInvoke(RT_UpdateAndDisplay);

            if(autoFit.Checked)
                AutoFitRange();
        }
Пример #54
0
        public Dictionary<BindpointMap, BoundResource[]> GetReadWriteResources(ShaderStageType stage)
        {
            var ret = new Dictionary<BindpointMap, BoundResource[]>();

            if (LogLoaded)
            {
                if (IsLogD3D11)
                {
                    if (stage == ShaderStageType.Compute)
                    {
                        for (int i = 0; i < m_D3D11.m_CS.UAVs.Length; i++)
                        {
                            var key = new BindpointMap(0, i);
                            var val = new BoundResource();

                            val.Id = m_D3D11.m_CS.UAVs[i].Resource;
                            val.HighestMip = (int)m_D3D11.m_CS.UAVs[i].HighestMip;
                            val.FirstSlice = (int)m_D3D11.m_CS.UAVs[i].FirstArraySlice;
                            val.typeHint = m_D3D11.m_CS.UAVs[i].Format.compType;

                            ret.Add(key, new BoundResource[] { val });
                        }
                    }
                    else
                    {
                        for (int i = 0; i < m_D3D11.m_OM.UAVs.Length; i++)
                        {
                            var key = new BindpointMap(0, i);
                            var val = new BoundResource();

                            val.Id = m_D3D11.m_OM.UAVs[i].Resource;
                            val.HighestMip = (int)m_D3D11.m_OM.UAVs[i].HighestMip;
                            val.FirstSlice = (int)m_D3D11.m_OM.UAVs[i].FirstArraySlice;
                            val.typeHint = FormatComponentType.None;

                            ret.Add(key, new BoundResource[] { val });
                        }
                    }

                    return ret;
                }
                else if (IsLogGL)
                {
                    for (int i = 0; i < m_GL.Images.Length; i++)
                    {
                        var key = new BindpointMap(0, i);
                        var val = new BoundResource();

                        val.Id = m_GL.Images[i].Resource;
                        val.HighestMip = (int)m_GL.Images[i].Level;
                        val.FirstSlice = (int)m_GL.Images[i].Layer;
                        val.typeHint = m_GL.Images[i].Format.compType;

                        ret.Add(key, new BoundResource[] { val });
                    }

                    return ret;
                }
                else if (IsLogVK)
                {
                    VulkanPipelineState.Pipeline.DescriptorSet[] descsets = m_Vulkan.graphics.DescSets;

                    if (stage == ShaderStageType.Compute)
                        descsets = m_Vulkan.compute.DescSets;

                    ShaderStageBits mask = (ShaderStageBits)(1 << (int)stage);
                    for (int set = 0; set < descsets.Length; set++)
                    {
                        var descset = descsets[set];
                        for (int slot = 0; slot < descset.bindings.Length; slot++)
                        {
                            var bind = descset.bindings[slot];

                            if ((bind.type == ShaderBindType.ReadWriteBuffer ||
                                bind.type == ShaderBindType.ReadWriteImage ||
                                bind.type == ShaderBindType.ReadWriteTBuffer
                               ) && (bind.stageFlags & mask) == mask)
                            {
                                var key = new BindpointMap(set, slot);
                                var val = new BoundResource[bind.descriptorCount];

                                for (UInt32 i = 0; i < bind.descriptorCount; i++)
                                {
                                    val[i] = new BoundResource();
                                    val[i].Id = bind.binds[i].res;
                                    val[i].HighestMip = (int)bind.binds[i].baseMip;
                                    val[i].FirstSlice = (int)bind.binds[i].baseLayer;
                                    val[i].typeHint = bind.binds[i].viewfmt.compType;
                                }

                                ret.Add(key, val);
                            }
                        }
                    }

                    return ret;
                }
            }

            return ret;
        }
Пример #55
0
        public ShaderViewer(Core core, ShaderReflection shader, ShaderStageType stage, ShaderDebugTrace trace)
        {
            InitializeComponent();

            Icon = global::renderdocui.Properties.Resources.icon;

            this.SuspendLayout();

            mainLayout.Dock = DockStyle.Fill;

            m_Core          = core;
            m_ShaderDetails = shader;
            m_Trace         = trace;
            m_Stage         = null;
            switch (stage)
            {
            case ShaderStageType.Vertex: m_Stage = m_Core.CurD3D11PipelineState.m_VS; break;

            case ShaderStageType.Domain: m_Stage = m_Core.CurD3D11PipelineState.m_DS; break;

            case ShaderStageType.Hull: m_Stage = m_Core.CurD3D11PipelineState.m_HS; break;

            case ShaderStageType.Geometry: m_Stage = m_Core.CurD3D11PipelineState.m_GS; break;

            case ShaderStageType.Pixel: m_Stage = m_Core.CurD3D11PipelineState.m_PS; break;

            case ShaderStageType.Compute: m_Stage = m_Core.CurD3D11PipelineState.m_CS; break;
            }

            var disasm = shader.Disassembly;

            if (m_Core.Config.ShaderViewer_FriendlyNaming)
            {
                for (int i = 0; i < m_ShaderDetails.ConstantBlocks.Length; i++)
                {
                    var stem = string.Format("cb{0}", i);

                    var cbuf = m_ShaderDetails.ConstantBlocks[i];

                    if (cbuf.variables.Length == 0)
                    {
                        continue;
                    }

                    disasm = FriendlyName(disasm, stem, cbuf.variables);
                }

                foreach (var r in m_ShaderDetails.Resources)
                {
                    if (r.IsSRV)
                    {
                        var needle      = string.Format(", t{0}([^0-9])", r.bindPoint);
                        var replacement = string.Format(", {0}$1", r.name);

                        Regex rgx = new Regex(needle);
                        disasm = rgx.Replace(disasm, replacement);
                    }
                    if (r.IsSampler)
                    {
                        var needle      = string.Format(", s{0}([^0-9])", r.bindPoint);
                        var replacement = string.Format(", {0}$1", r.name);

                        Regex rgx = new Regex(needle);
                        disasm = rgx.Replace(disasm, replacement);
                    }
                    if (r.IsUAV)
                    {
                        var needle      = string.Format(", u{0}([^0-9])", r.bindPoint);
                        var replacement = string.Format(", {0}$1", r.name);

                        Regex rgx = new Regex(needle);
                        disasm = rgx.Replace(disasm, replacement);
                    }
                }
            }

            {
                m_DisassemblyView            = MakeEditor("scintillaDisassem", disasm, false);
                m_DisassemblyView.IsReadOnly = true;
                m_DisassemblyView.TabIndex   = 0;

                m_DisassemblyView.KeyDown += new KeyEventHandler(m_DisassemblyView_KeyDown);

                m_DisassemblyView.Markers[CURRENT_MARKER].BackColor     = System.Drawing.Color.LightCoral;
                m_DisassemblyView.Markers[CURRENT_MARKER].Symbol        = ScintillaNET.MarkerSymbol.Background;
                m_DisassemblyView.Markers[CURRENT_MARKER + 1].BackColor = System.Drawing.Color.LightCoral;
                m_DisassemblyView.Markers[CURRENT_MARKER + 1].Symbol    = ScintillaNET.MarkerSymbol.ShortArrow;

                CurrentLineMarkers.Add(CURRENT_MARKER);
                CurrentLineMarkers.Add(CURRENT_MARKER + 1);

                m_DisassemblyView.Markers[FINISHED_MARKER].BackColor     = System.Drawing.Color.LightSlateGray;
                m_DisassemblyView.Markers[FINISHED_MARKER].Symbol        = ScintillaNET.MarkerSymbol.Background;
                m_DisassemblyView.Markers[FINISHED_MARKER + 1].BackColor = System.Drawing.Color.LightSlateGray;
                m_DisassemblyView.Markers[FINISHED_MARKER + 1].Symbol    = ScintillaNET.MarkerSymbol.RoundRectangle;

                FinishedMarkers.Add(FINISHED_MARKER);
                FinishedMarkers.Add(FINISHED_MARKER + 1);

                m_DisassemblyView.Markers[BREAKPOINT_MARKER].BackColor     = System.Drawing.Color.Red;
                m_DisassemblyView.Markers[BREAKPOINT_MARKER].Symbol        = ScintillaNET.MarkerSymbol.Background;
                m_DisassemblyView.Markers[BREAKPOINT_MARKER + 1].BackColor = System.Drawing.Color.Red;
                m_DisassemblyView.Markers[BREAKPOINT_MARKER + 1].Symbol    = ScintillaNET.MarkerSymbol.Circle;

                BreakpointMarkers.Add(BREAKPOINT_MARKER);
                BreakpointMarkers.Add(BREAKPOINT_MARKER + 1);

                m_Scintillas.Add(m_DisassemblyView);

                var w = Helpers.WrapDockContent(dockPanel, m_DisassemblyView, "Disassembly");
                w.DockState = DockState.Document;
                w.Show();

                w.CloseButton        = false;
                w.CloseButtonVisible = false;
            }

            if (shader.DebugInfo.entryFunc != "" && shader.DebugInfo.files.Length > 0)
            {
                Text = shader.DebugInfo.entryFunc + "()";

                DockContent sel = null;
                foreach (var f in shader.DebugInfo.files)
                {
                    var name = Path.GetFileName(f.filename);

                    ScintillaNET.Scintilla scintilla1 = MakeEditor("scintilla" + name, f.filetext, true);
                    scintilla1.IsReadOnly = true;

                    scintilla1.Tag = name;

                    var w = Helpers.WrapDockContent(dockPanel, scintilla1, name);
                    w.CloseButton        = false;
                    w.CloseButtonVisible = false;
                    w.Show(dockPanel);

                    m_Scintillas.Add(scintilla1);

                    if (f.filetext.Contains(shader.DebugInfo.entryFunc))
                    {
                        sel = w;
                    }
                }

                if (trace != null || sel == null)
                {
                    sel = (DockContent)m_DisassemblyView.Parent;
                }

                sel.Show();
            }

            ShowConstants();
            ShowVariables();
            ShowWatch();
            ShowErrors();

            editStrip.Visible = false;

            m_ErrorsDock.Hide();

            if (trace == null)
            {
                debuggingStrip.Visible = false;
                m_ConstantsDock.Hide();
                m_VariablesDock.Hide();
                m_WatchDock.Hide();

                var insig = Helpers.WrapDockContent(dockPanel, inSigBox);
                insig.CloseButton = insig.CloseButtonVisible = false;

                var outsig = Helpers.WrapDockContent(dockPanel, outSigBox);
                outsig.CloseButton = outsig.CloseButtonVisible = false;

                insig.Show(dockPanel, DockState.DockBottom);
                outsig.Show(insig.Pane, DockAlignment.Right, 0.5);

                foreach (var s in m_ShaderDetails.InputSig)
                {
                    string name = s.varName == "" ? s.semanticName : String.Format("{0} ({1})", s.varName, s.semanticName);
                    var    node = inSig.Nodes.Add(new object[] { name, s.semanticIndex, s.regIndex, s.TypeString, s.systemValue.ToString(),
                                                                 SigParameter.GetComponentString(s.regChannelMask), SigParameter.GetComponentString(s.channelUsedMask) });
                }

                bool multipleStreams = false;
                for (int i = 0; i < m_ShaderDetails.OutputSig.Length; i++)
                {
                    if (m_ShaderDetails.OutputSig[i].stream > 0)
                    {
                        multipleStreams = true;
                        break;
                    }
                }

                foreach (var s in m_ShaderDetails.OutputSig)
                {
                    string name = s.varName == "" ? s.semanticName : String.Format("{0} ({1})", s.varName, s.semanticName);

                    if (multipleStreams)
                    {
                        name = String.Format("Stream {0} : {1}", s.stream, name);
                    }

                    var node = outSig.Nodes.Add(new object[] { name, s.semanticIndex, s.regIndex, s.TypeString, s.systemValue.ToString(),
                                                               SigParameter.GetComponentString(s.regChannelMask), SigParameter.GetComponentString(s.channelUsedMask) });
                }
            }
            else
            {
                inSigBox.Visible  = false;
                outSigBox.Visible = false;

                m_DisassemblyView.Margins.Margin1.Width = 20;

                m_DisassemblyView.Margins.Margin2.Width = 0;

                m_DisassemblyView.Margins.Margin3.Width          = 20;
                m_DisassemblyView.Margins.Margin3.IsMarkerMargin = true;
                m_DisassemblyView.Margins.Margin3.IsFoldMargin   = false;
                m_DisassemblyView.Margins.Margin3.Type           = ScintillaNET.MarginType.Symbol;

                m_DisassemblyView.Margins.Margin1.Mask  = (int)m_DisassemblyView.Markers[BREAKPOINT_MARKER + 1].Mask;
                m_DisassemblyView.Margins.Margin3.Mask &= ~((int)m_DisassemblyView.Markers[BREAKPOINT_MARKER + 1].Mask);

                m_DisassemblyView.KeyDown += new KeyEventHandler(scintilla1_DebuggingKeyDown);

                watchRegs.Items.Add(new ListViewItem(new string[] { "", "", "" }));
            }

            CurrentStep = 0;

            this.ResumeLayout(false);
        }
Пример #56
0
        public String GetShaderEntryPoint(ShaderStageType stage)
        {
            if (LogLoaded && IsLogVK)
            {
                switch (stage)
                {
                    case ShaderStageType.Vertex: return m_Vulkan.VS.entryPoint;
                    case ShaderStageType.Tess_Control: return m_Vulkan.TCS.entryPoint;
                    case ShaderStageType.Tess_Eval: return m_Vulkan.TES.entryPoint;
                    case ShaderStageType.Geometry: return m_Vulkan.GS.entryPoint;
                    case ShaderStageType.Fragment: return m_Vulkan.FS.entryPoint;
                    case ShaderStageType.Compute: return m_Vulkan.CS.entryPoint;
                }
            }

            return "";
        }