diff --git a/CMakeLists.txt b/CMakeLists.txt index 59649aa3a..22d0e0a2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,6 +341,7 @@ set(MISC_LIBS src/core/libraries/screenshot/screenshot.cpp set(DEV_TOOLS src/core/devtools/layer.cpp src/core/devtools/layer.h src/core/devtools/gcn/gcn_context_regs.cpp + src/core/devtools/gcn/gcn_op_names.cpp src/core/devtools/gcn/gcn_shader_regs.cpp src/core/devtools/widget/cmd_list.cpp src/core/devtools/widget/cmd_list.h diff --git a/externals/gcn/include/gcn/si_ci_vi_merged_pm4_it_opcodes.h b/externals/gcn/include/gcn/si_ci_vi_merged_pm4_it_opcodes.h new file mode 100644 index 000000000..0c2ac3abc --- /dev/null +++ b/externals/gcn/include/gcn/si_ci_vi_merged_pm4_it_opcodes.h @@ -0,0 +1,117 @@ +/* + *********************************************************************************************************************** + * + * Copyright (c) 2015-2021 Advanced Micro Devices, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **********************************************************************************************************************/ + +#ifndef PM4_IT_OPCODES_H +#define PM4_IT_OPCODES_H + +enum IT_OpCodeType { + IT_NOP = 0x10, + IT_SET_BASE = 0x11, + IT_CLEAR_STATE = 0x12, + IT_INDEX_BUFFER_SIZE = 0x13, + IT_DISPATCH_DIRECT = 0x15, + IT_DISPATCH_INDIRECT = 0x16, + IT_ATOMIC_GDS = 0x1D, + IT_ATOMIC = 0x1E, + IT_OCCLUSION_QUERY = 0x1F, + IT_SET_PREDICATION = 0x20, + IT_REG_RMW = 0x21, + IT_COND_EXEC = 0x22, + IT_PRED_EXEC = 0x23, + IT_DRAW_INDIRECT = 0x24, + IT_DRAW_INDEX_INDIRECT = 0x25, + IT_INDEX_BASE = 0x26, + IT_DRAW_INDEX_2 = 0x27, + IT_CONTEXT_CONTROL = 0x28, + IT_INDEX_TYPE = 0x2A, + IT_DRAW_INDIRECT_MULTI = 0x2C, + IT_DRAW_INDEX_AUTO = 0x2D, + IT_NUM_INSTANCES = 0x2F, + IT_DRAW_INDEX_MULTI_AUTO = 0x30, + IT_INDIRECT_BUFFER_CNST = 0x33, + IT_STRMOUT_BUFFER_UPDATE = 0x34, + IT_DRAW_INDEX_OFFSET_2 = 0x35, + IT_WRITE_DATA = 0x37, + IT_DRAW_INDEX_INDIRECT_MULTI = 0x38, + IT_MEM_SEMAPHORE = 0x39, + IT_COPY_DW__SI__CI = 0x3B, + IT_WAIT_REG_MEM = 0x3C, + IT_INDIRECT_BUFFER = 0x3F, + IT_COND_INDIRECT_BUFFER = 0x3F, + IT_COPY_DATA = 0x40, + IT_CP_DMA = 0x41, + IT_PFP_SYNC_ME = 0x42, + IT_SURFACE_SYNC = 0x43, + IT_COND_WRITE = 0x45, + IT_EVENT_WRITE = 0x46, + IT_EVENT_WRITE_EOP = 0x47, + IT_EVENT_WRITE_EOS = 0x48, + IT_PREAMBLE_CNTL = 0x4A, + IT_CONTEXT_REG_RMW = 0x51, + IT_LOAD_SH_REG = 0x5F, + IT_LOAD_CONFIG_REG = 0x60, + IT_LOAD_CONTEXT_REG = 0x61, + IT_SET_CONFIG_REG = 0x68, + IT_SET_CONTEXT_REG = 0x69, + IT_SET_CONTEXT_REG_INDIRECT = 0x73, + IT_SET_SH_REG = 0x76, + IT_SET_SH_REG_OFFSET = 0x77, + IT_SCRATCH_RAM_WRITE = 0x7D, + IT_SCRATCH_RAM_READ = 0x7E, + IT_LOAD_CONST_RAM = 0x80, + IT_WRITE_CONST_RAM = 0x81, + IT_DUMP_CONST_RAM = 0x83, + IT_INCREMENT_CE_COUNTER = 0x84, + IT_INCREMENT_DE_COUNTER = 0x85, + IT_WAIT_ON_CE_COUNTER = 0x86, + IT_WAIT_ON_DE_COUNTER__SI = 0x87, + IT_WAIT_ON_DE_COUNTER_DIFF = 0x88, + IT_SWITCH_BUFFER = 0x8B, + IT_DRAW_PREAMBLE__CI__VI = 0x36, + IT_RELEASE_MEM__CI__VI = 0x49, + IT_DMA_DATA__CI__VI = 0x50, + IT_ACQUIRE_MEM__CI__VI = 0x58, + IT_REWIND__CI__VI = 0x59, + IT_LOAD_UCONFIG_REG__CI__VI = 0x5E, + IT_SET_QUEUE_REG__CI__VI = 0x78, + IT_SET_UCONFIG_REG__CI__VI = 0x79, + IT_INDEX_ATTRIBUTES_INDIRECT__CI__VI = 0x91, + IT_SET_SH_REG_INDEX__CI__VI = 0x9B, + IT_SET_RESOURCES__CI__VI = 0xA0, + IT_MAP_PROCESS__CI__VI = 0xA1, + IT_MAP_QUEUES__CI__VI = 0xA2, + IT_UNMAP_QUEUES__CI__VI = 0xA3, + IT_QUERY_STATUS__CI__VI = 0xA4, + IT_RUN_LIST__CI__VI = 0xA5, + IT_LOAD_SH_REG_INDEX__VI = 0x63, + IT_LOAD_CONTEXT_REG_INDEX__VI = 0x9F, + IT_DUMP_CONST_RAM_OFFSET__VI = 0x9E, +}; + +#define PM4_TYPE_0 0 +#define PM4_TYPE_2 2 +#define PM4_TYPE_3 3 + +#endif diff --git a/src/core/devtools/gcn/gcn_context_regs.cpp b/src/core/devtools/gcn/gcn_context_regs.cpp index 675ba98b2..843ba9e65 100644 --- a/src/core/devtools/gcn/gcn_context_regs.cpp +++ b/src/core/devtools/gcn/gcn_context_regs.cpp @@ -1,6 +1,8 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +// Credits to https://github.com/psucien/tlg-emu-tools/ + #include "common/types.h" #include "gcn/si_ci_vi_merged_offset.h" diff --git a/src/core/devtools/gcn/gcn_op_names.cpp b/src/core/devtools/gcn/gcn_op_names.cpp new file mode 100644 index 000000000..6684b660e --- /dev/null +++ b/src/core/devtools/gcn/gcn_op_names.cpp @@ -0,0 +1,118 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// Credits to https://github.com/psucien/tlg-emu-tools/ + +#include "common/types.h" +#include "gcn/si_ci_vi_merged_pm4_it_opcodes.h" + +namespace Core::Devtools::Gcn { +const char* GetOpCodeName(u32 op) { + switch (op) { + case IT_NOP: + return "IT_NOP"; + case IT_SET_BASE: + return "IT_SET_BASE"; + case IT_INDEX_BUFFER_SIZE: + return "IT_INDEX_BUFFER_SIZE"; + case IT_SET_PREDICATION: + return "IT_SET_PREDICATION"; + case IT_COND_EXEC: + return "IT_COND_EXEC"; + case IT_INDEX_BASE: + return "IT_INDEX_BASE"; + case IT_INDEX_TYPE: + return "IT_INDEX_TYPE"; + case IT_NUM_INSTANCES: + return "IT_NUM_INSTANCES"; + case IT_STRMOUT_BUFFER_UPDATE: + return "IT_STRMOUT_BUFFER_UPDATE"; + case IT_WRITE_DATA: + return "IT_WRITE_DATA"; + case IT_MEM_SEMAPHORE: + return "IT_MEM_SEMAPHORE"; + case IT_WAIT_REG_MEM: + return "IT_WAIT_REG_MEM"; + case IT_INDIRECT_BUFFER: + return "IT_INDIRECT_BUFFER"; + case IT_PFP_SYNC_ME: + return "IT_PFP_SYNC_ME"; + case IT_EVENT_WRITE: + return "IT_EVENT_WRITE"; + case IT_EVENT_WRITE_EOP: + return "IT_EVENT_WRITE_EOP"; + case IT_EVENT_WRITE_EOS: + return "IT_EVENT_WRITE_EOS"; + case IT_DMA_DATA__CI__VI: + return "IT_DMA_DATA"; + case IT_ACQUIRE_MEM__CI__VI: + return "IT_ACQUIRE_MEM"; + case IT_REWIND__CI__VI: + return "IT_REWIND"; + case IT_SET_CONFIG_REG: + return "IT_SET_CONFIG_REG"; + case IT_SET_CONTEXT_REG: + return "IT_SET_CONTEXT_REG"; + case IT_SET_SH_REG: + return "IT_SET_SH_REG"; + case IT_SET_UCONFIG_REG__CI__VI: + return "IT_SET_UCONFIG_REG"; + case IT_INCREMENT_DE_COUNTER: + return "IT_INCREMENT_DE_COUNTER"; + case IT_WAIT_ON_CE_COUNTER: + return "IT_WAIT_ON_CE_COUNTER"; + case IT_DISPATCH_DIRECT: + return "IT_DISPATCH_DIRECT"; + case IT_DISPATCH_INDIRECT: + return "IT_DISPATCH_INDIRECT"; + case IT_OCCLUSION_QUERY: + return "IT_OCCLUSION_QUERY"; + case IT_REG_RMW: + return "IT_REG_RMW"; + case IT_PRED_EXEC: + return "IT_PRED_EXEC"; + case IT_DRAW_INDIRECT: + return "IT_DRAW_INDIRECT"; + case IT_DRAW_INDEX_INDIRECT: + return "IT_DRAW_INDEX_INDIRECT"; + case IT_DRAW_INDEX_2: + return "IT_DRAW_INDEX_2"; + case IT_DRAW_INDEX_OFFSET_2: + return "IT_DRAW_INDEX_OFFSET_2"; + case IT_CONTEXT_CONTROL: + return "IT_CONTEXT_CONTROL"; + case IT_DRAW_INDIRECT_MULTI: + return "IT_DRAW_INDIRECT_MULTI"; + case IT_DRAW_INDEX_AUTO: + return "IT_DRAW_INDEX_AUTO"; + case IT_DRAW_INDEX_MULTI_AUTO: + return "IT_DRAW_INDEX_MULTI_AUTO"; + case IT_COPY_DATA: + return "IT_COPY_DATA"; + case IT_CP_DMA: + return "IT_CP_DMA"; + case IT_SURFACE_SYNC: + return "IT_SURFACE_SYNC"; + case IT_COND_WRITE: + return "IT_COND_WRITE"; + case IT_RELEASE_MEM__CI__VI: + return "IT_RELEASE_MEM"; + case IT_WRITE_CONST_RAM: + return "IT_WRITE_CONST_RAM"; // used in CCB + case IT_WAIT_ON_DE_COUNTER_DIFF: + return "IT_WAIT_ON_DE_COUNTER_DIFF"; // used in CCB + case IT_DUMP_CONST_RAM: + return "IT_DUMP_CONST_RAM"; // used in CCB + case IT_INCREMENT_CE_COUNTER: + return "IT_INCREMENT_CE_COUNTER"; // used in CCB + case IT_CLEAR_STATE: + return "IT_CLEAR_STATE"; + case 0xFF: + return ""; + default: + break; + } + + return ""; +} +} // namespace Core::Devtools::Gcn \ No newline at end of file diff --git a/src/core/devtools/gcn/gcn_shader_regs.cpp b/src/core/devtools/gcn/gcn_shader_regs.cpp index 0392e51b1..16778dd07 100644 --- a/src/core/devtools/gcn/gcn_shader_regs.cpp +++ b/src/core/devtools/gcn/gcn_shader_regs.cpp @@ -1,6 +1,8 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +// Credits to https://github.com/psucien/tlg-emu-tools/ + #include "common/types.h" #include "gcn/si_ci_vi_merged_offset.h" diff --git a/src/core/devtools/widget/cmd_list.cpp b/src/core/devtools/widget/cmd_list.cpp index f151c7352..012891c37 100644 --- a/src/core/devtools/widget/cmd_list.cpp +++ b/src/core/devtools/widget/cmd_list.cpp @@ -26,6 +26,7 @@ namespace Core::Devtools::Gcn { const char* GetContextRegName(u32 reg_offset); const char* GetShaderRegName(u32 reg_offset); +const char* GetOpCodeName(u32 op); } // namespace Core::Devtools::Gcn @@ -1098,15 +1099,17 @@ CmdListViewer::CmdListViewer(FrameDumpViewer* parent, const std::vector& cm } void CmdListViewer::Draw() { - std::string queue_name = vqid > 254 ? "GFX" : "ASC"; + if (BeginChild("cmd_queue", {})) { + char queue_name[32]{}; + if (vqid < 254) { + std::snprintf(queue_name, sizeof(queue_name), "%s %d", vqid > 254 ? "GFX" : "ASC", + vqid); + } else { + std::snprintf(queue_name, sizeof(queue_name), "%s", vqid > 254 ? "GFX" : "ASC"); + } - if (vqid < 254) { - queue_name += std::to_string(vqid); - } - - if (BeginChild(queue_name.c_str())) { - Text("queue : %s", queue_name.c_str()); - Text("base addr: %08lX", cmdb_addr); + Text("queue : %s", queue_name); + Text("base addr: %08llX", cmdb_addr); SameLine(); if (SmallButton(">")) { parent->cmdb_view.Open ^= true; @@ -1141,7 +1144,7 @@ void CmdListViewer::Draw() { static char header_name[128]; sprintf(header_name, "%08llX: %s", cmdb_addr + batches[batch_id].start_addr + processed_size, - enum_name(op).data()); + Gcn::GetOpCodeName((u32)op)); if (TreeNode(header_name)) { bool just_opened = IsItemToggledOpen();