Exemple #1
0
        // launch the appropriate kind of viewer, depending on the type of resource that's in this node
        private void textureCell_CellDoubleClick(TreelistView.Node node)
        {
            object tag = node.Tag;

            GLPipelineState.ShaderStage stage = GetStageForSender(node.OwnerView);

            if (stage == null)
            {
                return;
            }

            if (tag is FetchTexture)
            {
                FetchTexture tex = (FetchTexture)tag;

                var viewer = m_Core.GetTextureViewer();
                viewer.Show(m_DockContent.DockPanel);
                if (!viewer.IsDisposed)
                {
                    viewer.ViewTexture(tex.ID, true);
                }
            }
            else if (tag is FetchBuffer)
            {
            }
        }
Exemple #2
0
        private void cbuffers_NodeDoubleClicked(TreelistView.Node node)
        {
            GLPipelineState.ShaderStage stage = GetStageForSender(node.OwnerView);

            if (stage != null && node.Tag is UInt32)
            {
                ShowCBuffer(stage, (UInt32)node.Tag);
            }
        }
Exemple #3
0
        private void CBuffers_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            GLPipelineState.ShaderStage stage = GetStageForSender(sender);

            object tag = ((DataGridView)sender).Rows[e.RowIndex].Tag;

            if (stage != null && tag is UInt32)
            {
                ShowCBuffer(stage, (UInt32)tag);
            }
        }
Exemple #4
0
        private void ShowCBuffer(GLPipelineState.ShaderStage stage, UInt32 slot)
        {
            var existing = ConstantBufferPreviewer.Has(stage.stage, slot);

            if (existing != null)
            {
                existing.Show();
                return;
            }

            var prev = new ConstantBufferPreviewer(m_Core, stage.stage, slot);

            prev.ShowDock(m_DockContent.Pane, DockAlignment.Right, 0.3);
        }
Exemple #5
0
        private void shaderCog_MouseEnter(object sender, EventArgs e)
        {
            if (sender is PictureBox)
            {
                GLPipelineState.ShaderStage stage = GetStageForSender(sender);

                if (stage != null && stage.Shader != ResourceId.Null)
                {
                    (sender as PictureBox).Image = global::renderdocui.Properties.Resources.action_hover;
                }
            }

            if (sender is Label)
            {
                GLPipelineState.ShaderStage stage = GetStageForSender(sender);

                if (stage == null)
                {
                    return;
                }

                if (stage.stage == ShaderStageType.Vertex)
                {
                    shaderCog_MouseEnter(vsShaderCog, e);
                }
                if (stage.stage == ShaderStageType.Tess_Control)
                {
                    shaderCog_MouseEnter(tcsShaderCog, e);
                }
                if (stage.stage == ShaderStageType.Tess_Eval)
                {
                    shaderCog_MouseEnter(tesShaderCog, e);
                }
                if (stage.stage == ShaderStageType.Geometry)
                {
                    shaderCog_MouseEnter(gsShaderCog, e);
                }
                if (stage.stage == ShaderStageType.Fragment)
                {
                    shaderCog_MouseEnter(fsShaderCog, e);
                }
                if (stage.stage == ShaderStageType.Compute)
                {
                    shaderCog_MouseEnter(csShaderCog, e);
                }
            }
        }
        // Set a shader stage's resources and values
        private void SetShaderState(FetchTexture[] texs, FetchBuffer[] bufs,
                                    GLPipelineState.ShaderStage stage,
                                    Label shader, TreelistView.TreeListView resources, TreelistView.TreeListView samplers,
                                    TreelistView.TreeListView cbuffers, TreelistView.TreeListView classes)
        {
            ShaderReflection shaderDetails = stage.ShaderDetails;

            if (stage.Shader == ResourceId.Null)
            {
                shader.Text = "Unbound";
            }
            else
            {
                shader.Text = "Shader " + stage.Shader.ToString();
            }

            if (shaderDetails != null && shaderDetails.DebugInfo.entryFunc != "" && shaderDetails.DebugInfo.files.Length > 0)
            {
                shader.Text = shaderDetails.DebugInfo.entryFunc + "()" + " - " +
                              Path.GetFileName(shaderDetails.DebugInfo.files[0].filename);
            }

            cbuffers.BeginUpdate();
            cbuffers.Nodes.Clear();
            if (shaderDetails != null)
            {
                UInt32 i = 0;
                foreach (var shaderCBuf in shaderDetails.ConstantBlocks)
                {
                    {
                        string name    = shaderCBuf.name;
                        int    numvars = shaderCBuf.variables.Length;

                        string slotname = i.ToString();

                        var node = cbuffers.Nodes.Add(new object[] { slotname, name, "", "", numvars, "" });

                        node.Image      = global::renderdocui.Properties.Resources.action;
                        node.HoverImage = global::renderdocui.Properties.Resources.action_hover;
                        node.Tag        = i;
                    }
                    i++;
                }
            }
            cbuffers.EndUpdate();
            cbuffers.NodesSelection.Clear();
        }
        private void ShowCBuffer(GLPipelineState.ShaderStage stage, UInt32 slot)
        {
            var existing = ConstantBufferPreviewer.Has(stage.stage, slot);

            if (existing != null)
            {
                existing.Show();
                return;
            }

            var prev = new ConstantBufferPreviewer(m_Core, stage.stage, slot);

            var dock = Helpers.WrapDockContent(m_DockContent.DockPanel, prev);

            dock.DockState  = DockState.DockRight;
            dock.DockAreas |= DockAreas.Float;
            ConstantBufferPreviewer.ShowDock(dock, m_DockContent.Pane, DockAlignment.Right, 0.3);
        }
Exemple #8
0
        private void shader_Click(object sender, EventArgs e)
        {
            GLPipelineState.ShaderStage stage = GetStageForSender(sender);

            if (stage == null)
            {
                return;
            }

            ShaderReflection shaderDetails = stage.ShaderDetails;

            if (stage.Shader == ResourceId.Null)
            {
                return;
            }

            ShaderViewer s = new ShaderViewer(m_Core, shaderDetails, stage.stage, null, "");

            s.Show(m_DockContent.DockPanel);
        }
Exemple #9
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;
        }
        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;
        }
Exemple #11
0
        private GLPipelineState.ShaderStage GetStageForSender(object sender)
        {
            GLPipelineState.ShaderStage stage = null;

            if (!m_Core.LogLoaded)
            {
                return(null);
            }

            object cur = sender;

            while (cur is Control)
            {
                if (cur == tabVS)
                {
                    stage = m_Core.CurGLPipelineState.m_VS;
                }
                else if (cur == tabGS)
                {
                    stage = m_Core.CurGLPipelineState.m_GS;
                }
                else if (cur == tabTCS)
                {
                    stage = m_Core.CurGLPipelineState.m_TCS;
                }
                else if (cur == tabTES)
                {
                    stage = m_Core.CurGLPipelineState.m_TES;
                }
                else if (cur == tabFS)
                {
                    stage = m_Core.CurGLPipelineState.m_FS;
                }
                else if (cur == tabCS)
                {
                    stage = m_Core.CurGLPipelineState.m_CS;
                }
                else if (cur == tabFB)
                {
                    stage = m_Core.CurGLPipelineState.m_FS;
                }

                if (stage != null)
                {
                    return(stage);
                }

                Control c = (Control)cur;

                if (c.Parent == null)
                {
                    break;
                }

                cur = ((Control)cur).Parent;
            }

            System.Diagnostics.Debug.Fail("Unrecognised control calling event handler");

            return(null);
        }
Exemple #12
0
        // Set a shader stage's resources and values
        private void SetShaderState(FetchTexture[] texs, FetchBuffer[] bufs,
                                    GLPipelineState state, GLPipelineState.ShaderStage stage,
                                    Label shader, TreelistView.TreeListView resources, TreelistView.TreeListView samplers,
                                    TreelistView.TreeListView cbuffers, TreelistView.TreeListView classes)
        {
            ShaderReflection shaderDetails = stage.ShaderDetails;

            if (stage.Shader == ResourceId.Null)
            {
                shader.Text = "Unbound";
            }
            else
            {
                shader.Text = "Shader " + stage.Shader.ToString();
            }

            if (shaderDetails != null && shaderDetails.DebugInfo.entryFunc != "" && shaderDetails.DebugInfo.files.Length > 0)
            {
                shader.Text = shaderDetails.DebugInfo.entryFunc + "()" + " - " +
                              Path.GetFileName(shaderDetails.DebugInfo.files[0].filename);
            }

            cbuffers.BeginUpdate();
            cbuffers.Nodes.Clear();
            if (shaderDetails != null)
            {
                UInt32 i = 0;
                foreach (var shaderCBuf in shaderDetails.ConstantBlocks)
                {
                    int bindPoint = stage.BindpointMapping.ConstantBlocks[i].bind;

                    bool filledSlot = !shaderCBuf.bufferBacked ||
                                      (bindPoint >= 0 && bindPoint < state.UniformBuffers.Length && state.UniformBuffers[bindPoint].Resource != ResourceId.Null);
                    bool usedSlot = stage.BindpointMapping.ConstantBlocks[i].used;

                    // show if
                    if (usedSlot ||                                          // it's referenced by the shader - regardless of empty or not
                        (showDisabled.Checked && !usedSlot && filledSlot) || // it's bound, but not referenced, and we have "show disabled"
                        (showEmpty.Checked && !filledSlot)                   // it's empty, and we have "show empty"
                        )
                    {
                        string name    = shaderCBuf.name;
                        int    numvars = shaderCBuf.variables.Length;

                        string slotname = i.ToString();

                        var node = cbuffers.Nodes.Add(new object[] { slotname, name, bindPoint, "", numvars, "" });

                        node.Image      = global::renderdocui.Properties.Resources.action;
                        node.HoverImage = global::renderdocui.Properties.Resources.action_hover;
                        node.Tag        = i;

                        if (!filledSlot)
                        {
                            EmptyRow(node);
                        }

                        if (!usedSlot)
                        {
                            InactiveRow(node);
                        }
                    }
                    i++;
                }
            }
            cbuffers.EndUpdate();
            cbuffers.NodesSelection.Clear();
        }