summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt139
-rw-r--r--appveyor.yml2
-rw-r--r--src/citra/CMakeLists.txt3
-rw-r--r--src/citra_qt/bootmanager.cpp14
-rw-r--r--src/citra_qt/bootmanager.h2
-rw-r--r--src/citra_qt/config.cpp6
-rw-r--r--src/citra_qt/debugger/callstack.cpp6
-rw-r--r--src/citra_qt/debugger/callstack.h2
-rw-r--r--src/citra_qt/debugger/disassembler.cpp23
-rw-r--r--src/citra_qt/debugger/graphics.cpp4
-rw-r--r--src/citra_qt/debugger/graphics.h2
-rw-r--r--src/citra_qt/debugger/graphics_breakpoint_observer.cpp2
-rw-r--r--src/citra_qt/debugger/graphics_breakpoints.cpp8
-rw-r--r--src/citra_qt/debugger/graphics_breakpoints.h1
-rw-r--r--src/citra_qt/debugger/graphics_breakpoints_p.h2
-rw-r--r--src/citra_qt/debugger/graphics_cmdlists.cpp18
-rw-r--r--src/citra_qt/debugger/graphics_cmdlists.h2
-rw-r--r--src/citra_qt/debugger/graphics_framebuffer.cpp9
-rw-r--r--src/citra_qt/debugger/graphics_framebuffer.h4
-rw-r--r--src/citra_qt/debugger/graphics_tracing.cpp11
-rw-r--r--src/citra_qt/debugger/graphics_tracing.h2
-rw-r--r--src/citra_qt/debugger/graphics_vertex_shader.cpp304
-rw-r--r--src/citra_qt/debugger/graphics_vertex_shader.h13
-rw-r--r--src/citra_qt/debugger/profiler.cpp7
-rw-r--r--src/citra_qt/debugger/profiler.h4
-rw-r--r--src/citra_qt/debugger/ramview.cpp3
-rw-r--r--src/citra_qt/debugger/ramview.h2
-rw-r--r--src/citra_qt/debugger/registers.cpp28
-rw-r--r--src/citra_qt/debugger/registers.h4
-rw-r--r--src/citra_qt/hotkeys.cpp2
-rw-r--r--src/citra_qt/hotkeys.h2
-rw-r--r--src/citra_qt/main.cpp65
-rw-r--r--src/citra_qt/util/spinbox.cpp2
-rw-r--r--src/citra_qt/util/util.cpp2
-rw-r--r--src/common/CMakeLists.txt1
-rw-r--r--src/common/break_points.cpp90
-rw-r--r--src/common/break_points.h49
-rw-r--r--src/common/chunk_file.h4
-rw-r--r--src/common/debug_interface.h36
-rw-r--r--src/common/memory_util.cpp21
-rw-r--r--src/common/swap.h4
-rw-r--r--src/common/synchronized_wrapper.h1
-rw-r--r--src/core/arm/disassembler/arm_disasm.cpp4
-rw-r--r--src/core/arm/skyeye_common/vfp/vfpdouble.cpp28
-rw-r--r--src/core/arm/skyeye_common/vfp/vfpsingle.cpp28
-rw-r--r--src/core/core_timing.cpp2
-rw-r--r--src/core/file_sys/disk_archive.h2
-rw-r--r--src/core/hle/kernel/mutex.h7
-rw-r--r--src/core/hle/kernel/semaphore.h1
-rw-r--r--src/core/hle/kernel/thread.h1
-rw-r--r--src/core/hle/service/fs/archive.h2
-rw-r--r--src/core/hle/service/soc_u.cpp2
-rw-r--r--src/core/hw/y2r.cpp9
-rw-r--r--src/core/loader/loader.cpp2
-rw-r--r--src/core/loader/ncch.h4
-rw-r--r--src/core/memory.cpp21
-rw-r--r--src/core/tracer/recorder.h3
-rw-r--r--src/video_core/clipper.cpp8
-rw-r--r--src/video_core/command_processor.cpp21
-rw-r--r--src/video_core/debug_utils/debug_utils.cpp5
-rw-r--r--src/video_core/gpu_debugger.h3
-rw-r--r--src/video_core/pica.cpp4
-rw-r--r--src/video_core/pica.h2
-rw-r--r--src/video_core/primitive_assembly.cpp8
-rw-r--r--src/video_core/primitive_assembly.h2
-rw-r--r--src/video_core/rasterizer.cpp12
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp8
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h5
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp2
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h12
-rw-r--r--src/video_core/renderer_opengl/gl_shader_util.cpp8
-rw-r--r--src/video_core/renderer_opengl/gl_state.cpp2
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp10
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.h6
-rw-r--r--src/video_core/shader/shader.cpp1
-rw-r--r--src/video_core/shader/shader.h12
-rw-r--r--src/video_core/shader/shader_interpreter.cpp5
-rw-r--r--src/video_core/shader/shader_interpreter.h4
-rw-r--r--src/video_core/shader/shader_jit_x64.cpp27
-rw-r--r--src/video_core/shader/shader_jit_x64.h3
-rw-r--r--src/video_core/utils.cpp4
-rw-r--r--src/video_core/video_core.cpp11
82 files changed, 554 insertions, 653 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ebffc0d85..fa6463b01 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,20 +2,67 @@
# dependent libraries.
cmake_minimum_required(VERSION 2.8.11)
+function(download_bundled_external remote_path lib_name prefix_var)
+ set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}")
+ if (NOT EXISTS "${prefix}")
+ message(STATUS "Downloading binaries for ${lib_name}...")
+ file(DOWNLOAD
+ https://github.com/citra-emu/ext-windows-bin/raw/master/${remote_path}${lib_name}.7z
+ "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z" SHOW_PROGRESS)
+ execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z"
+ WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
+ endif()
+ message(STATUS "Using bundled binaries at ${prefix}")
+ set(${prefix_var} "${prefix}" PARENT_SCOPE)
+endfunction()
+
+include(CheckSymbolExists)
+function(detect_architecture symbol arch)
+ if (NOT DEFINED ARCHITECTURE)
+ set(CMAKE_REQUIRED_QUIET 1)
+ check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch})
+ unset(CMAKE_REQUIRED_QUIET)
+
+ # The output variable needs to be unique across invocations otherwise
+ # CMake's crazy scope rules will keep it defined
+ if (ARCHITECTURE_${arch})
+ set(ARCHITECTURE "${arch}" PARENT_SCOPE)
+ set(ARCHITECTURE_${arch} 1 PARENT_SCOPE)
+ add_definitions(-DARCHITECTURE_${arch}=1)
+ endif()
+ endif()
+endfunction()
+
project(citra)
+option(ENABLE_GLFW "Enable the GLFW frontend" ON)
+option(CITRA_USE_BUNDLED_GLFW "Download bundled GLFW binaries" OFF)
+
+option(ENABLE_QT "Enable the Qt frontend" ON)
+option(CITRA_USE_BUNDLED_QT "Download bundled Qt binaries" OFF)
+option(CITRA_FORCE_QT4 "Use Qt4 even if Qt5 is available." OFF)
+
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git/hooks/pre-commit)
message(STATUS "Copying pre-commit hook")
file(COPY hooks/pre-commit
DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/.git/hooks)
endif()
-# Platform-agnostic definition to check if we are on x86_64
-if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "[xX]86_64" OR
- ${CMAKE_SYSTEM_PROCESSOR} MATCHES "[aA][mM][dD]64")
- set(ARCHITECTURE_x86_64 1)
- add_definitions(-DARCHITECTURE_x86_64=1)
+if (MSVC)
+ detect_architecture("_M_AMD64" x86_64)
+ detect_architecture("_M_IX86" x86)
+ detect_architecture("_M_ARM" ARM)
+else()
+ detect_architecture("__x86_64__" x86_64)
+ detect_architecture("__i386__" x86)
+ detect_architecture("__arm__" ARM)
+endif()
+if (NOT DEFINED ARCHITECTURE)
+ set(ARCHITECTURE "GENERIC")
+ set(ARCHITECTURE_GENERIC 1)
+ add_definitions(-DARCHITECTURE_GENERIC=1)
endif()
+message(STATUS "Target architecture: ${ARCHITECTURE}")
if (NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wno-attributes -pthread")
@@ -75,7 +122,7 @@ else()
message(STATUS "libpng not found. Some debugging features have been disabled.")
endif()
-find_package(Boost 1.57.0)
+find_package(Boost 1.57.0 QUIET)
if (Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
else()
@@ -89,60 +136,28 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/externals/cmake-modules")
find_package(OpenGL REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR})
-option(ENABLE_GLFW "Enable the GLFW frontend" ON)
if (ENABLE_GLFW)
- if (WIN32)
+ if (CITRA_USE_BUNDLED_GLFW)
# Detect toolchain and platform
- if (MSVC)
- if (CMAKE_SIZEOF_VOID_P EQUAL 8)
- set(TMP_ARCH "x64")
- elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
- set(TMP_ARCH "Win32")
- else()
- set(TMP_ARCH "UNKNOWN")
- message(SEND_ERROR "Couldn't detect your compiler's architecture, you'll have to manually specify the GLFW library to use. (Try checking CMakeOutput.log to find out why.)")
- endif()
-
- if (MSVC11) # Visual C++ 2012
- set(TMP_TOOLSET "v110")
- elseif (MSVC12) # Visual C++ 2013
- set(TMP_TOOLSET "v120")
- else()
- set(TMP_TOOLSET "UNSUPPORTED")
- message(SEND_ERROR "We don't supply GLFW binaries for your version of MSVC, you might have to provide them yourself.")
- endif()
-
- set(TMP_TOOLSET "msvc_${TMP_TOOLSET}-${TMP_ARCH}")
+ if (MSVC14 AND ARCHITECTURE_x86_64)
+ set(GLFW_VER "glfw-3.1.1-msvc2015_64")
+ elseif (MSVC12 AND ARCHITECTURE_x86_64)
+ set(GLFW_VER "glfw-3.1.1-msvc2013_64")
else()
- # Assume mingw
- if (CMAKE_SIZEOF_VOID_P EQUAL 8)
- set(TMP_ARCH "x86_64")
- elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
- set(TMP_ARCH "i686")
- else()
- set(TMP_ARCH "UNKNOWN")
- message(SEND_ERROR "Couldn't detect your compiler's architecture, you'll have to manually specify the GLFW library to use.")
- endif()
-
- set(TMP_TOOLSET "mingw-${TMP_ARCH}")
+ message(FATAL_ERROR "No bundled GLFW binaries for your toolchain. Disable CITRA_USE_BUNDLED_GLFW and provide your own.")
endif()
- set(GLFW_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/externals/glfw-3.1.1.bin")
- set(GLFW_INCLUDE_DIRS "${GLFW_PREFIX}/include" CACHE PATH "Path to GLFW3 headers")
- set(GLFW_LIBRARY_DIRS "${GLFW_PREFIX}/lib-${TMP_TOOLSET}" CACHE PATH "Path to GLFW3 libraries")
-
- # Clean up after ourselves
- unset(TMP_TOOLSET)
- unset(TMP_ARCH)
+ if (DEFINED GLFW_VER)
+ download_bundled_external("glfw/" ${GLFW_VER} GLFW_PREFIX)
+ endif()
+ set(GLFW_INCLUDE_DIRS "${GLFW_PREFIX}/include" CACHE PATH "Path to GLFW3 headers")
+ set(GLFW_LIBRARY_DIRS "${GLFW_PREFIX}/lib" CACHE PATH "Path to GLFW3 libraries")
set(GLFW_LIBRARIES glfw3)
else()
find_package(PkgConfig REQUIRED)
pkg_search_module(GLFW REQUIRED glfw3)
endif()
-
- include_directories(${GLFW_INCLUDE_DIRS})
- link_directories(${GLFW_LIBRARY_DIRS})
endif()
IF (APPLE)
@@ -166,23 +181,33 @@ ELSE()
set(PLATFORM_LIBRARIES rt)
ENDIF (APPLE)
-option(ENABLE_QT "Enable the Qt frontend" ON)
-option(CITRA_FORCE_QT4 "Use Qt4 even if Qt5 is available." OFF)
if (ENABLE_QT)
- # Set CMAKE_PREFIX_PATH if QTDIR is defined in the environment This allows CMake to
- # automatically find the Qt packages on Windows
- if (DEFINED ENV{QTDIR})
- list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR}")
+ if (CITRA_USE_BUNDLED_QT)
+ if (MSVC14 AND ARCHITECTURE_x86_64)
+ set(QT_VER qt-5.5-msvc2015_64)
+ else()
+ message(FATAL_ERROR "No bundled Qt binaries for your toolchain. Disable CITRA_USE_BUNDLED_QT and provide your own.")
+ endif()
+
+ if (DEFINED QT_VER)
+ download_bundled_external("qt/" ${QT_VER} QT_PREFIX)
+ endif()
+
+ set(QT_PREFIX_HINT HINTS "${QT_PREFIX}")
+ else()
+ # Passing an empty HINTS seems to cause default system paths to get ignored in CMake 2.8 so
+ # make sure to not pass anything if we don't have one.
+ set(QT_PREFIX_HINT)
endif()
if (NOT CITRA_FORCE_QT4)
- find_package(Qt5 COMPONENTS Widgets OpenGL)
+ find_package(Qt5 COMPONENTS Widgets OpenGL ${QT_PREFIX_HINT})
set(CITRA_QT_LIBS Qt5::Widgets Qt5::OpenGL)
endif()
if (CITRA_FORCE_QT4 OR NOT Qt5_FOUND)
# Try to fallback to Qt4
- find_package(Qt4 REQUIRED COMPONENTS QtGui QtOpenGL)
+ find_package(Qt4 REQUIRED COMPONENTS QtGui QtOpenGL ${QT_PREFIX_HINT})
set(CITRA_QT_LIBS Qt4::QtGui Qt4::QtOpenGL)
endif()
endif()
diff --git a/appveyor.yml b/appveyor.yml
index 5dc147639..6e073ece7 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -18,7 +18,7 @@ install:
before_build:
- mkdir build
- cd build
- - cmake -G "Visual Studio 12 Win64" ..
+ - cmake -G "Visual Studio 12 Win64" -DCITRA_USE_BUNDLED_GLFW=1 -DQt5_DIR=%QTDIR%/lib/cmake/Qt5 ..
- cd ..
after_build:
diff --git a/src/citra/CMakeLists.txt b/src/citra/CMakeLists.txt
index beb96bd30..e7f8a17f9 100644
--- a/src/citra/CMakeLists.txt
+++ b/src/citra/CMakeLists.txt
@@ -13,6 +13,9 @@ set(HEADERS
create_directory_groups(${SRCS} ${HEADERS})
+include_directories(${GLFW_INCLUDE_DIRS})
+link_directories(${GLFW_LIBRARY_DIRS})
+
add_executable(citra ${SRCS} ${HEADERS})
target_link_libraries(citra core video_core common)
target_link_libraries(citra ${GLFW_LIBRARIES} ${OPENGL_gl_LIBRARY} inih glad)
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index 2aab343f2..7a1360d34 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -1,6 +1,6 @@
+#include <QApplication>
#include <QHBoxLayout>
#include <QKeyEvent>
-#include <QApplication>
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
// Required for screen DPI information
@@ -8,23 +8,19 @@
#include <QWindow>
#endif
-#include "bootmanager.h"
-#include "main.h"
+#include "citra_qt/bootmanager.h"
-#include "common/string_util.h"
-#include "common/scm_rev.h"
#include "common/key_map.h"
#include "common/microprofile.h"
+#include "common/scm_rev.h"
+#include "common/string_util.h"
#include "core/core.h"
#include "core/settings.h"
#include "core/system.h"
-#include "video_core/debug_utils/debug_utils.h"
-
#include "video_core/video_core.h"
-
-#include "citra_qt/version.h"
+#include "video_core/debug_utils/debug_utils.h"
#define APP_NAME "citra"
#define APP_VERSION "0.1-" VERSION
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index d0fe397af..dc422358e 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -6,8 +6,8 @@
#include <condition_variable>
#include <mutex>
-#include <QThread>
#include <QGLWidget>
+#include <QThread>
#include "common/emu_window.h"
#include "common/thread.h"
diff --git a/src/citra_qt/config.cpp b/src/citra_qt/config.cpp
index a20351fb8..1f4981ce1 100644
--- a/src/citra_qt/config.cpp
+++ b/src/citra_qt/config.cpp
@@ -6,10 +6,10 @@
#include <QString>
#include <QStringList>
-#include "core/settings.h"
-#include "common/file_util.h"
+#include "citra_qt/config.h"
-#include "config.h"
+#include "common/file_util.h"
+#include "core/settings.h"
Config::Config() {
diff --git a/src/citra_qt/debugger/callstack.cpp b/src/citra_qt/debugger/callstack.cpp
index e97e81b65..d45eed179 100644
--- a/src/citra_qt/debugger/callstack.cpp
+++ b/src/citra_qt/debugger/callstack.cpp
@@ -4,14 +4,14 @@
#include <QStandardItemModel>
+#include "citra_qt/debugger/callstack.h"
+
#include "common/common_types.h"
#include "common/symbols.h"
-#include "callstack.h"
-
#include "core/core.h"
-#include "core/arm/arm_interface.h"
#include "core/memory.h"
+#include "core/arm/arm_interface.h"
#include "core/arm/disassembler/arm_disasm.h"
CallstackWidget::CallstackWidget(QWidget* parent): QDockWidget(parent)
diff --git a/src/citra_qt/debugger/callstack.h b/src/citra_qt/debugger/callstack.h
index 1a9b6dc81..7aa83db1e 100644
--- a/src/citra_qt/debugger/callstack.h
+++ b/src/citra_qt/debugger/callstack.h
@@ -12,7 +12,7 @@ class CallstackWidget : public QDockWidget
Q_OBJECT
public:
- CallstackWidget(QWidget* parent = 0);
+ CallstackWidget(QWidget* parent = nullptr);
public slots:
void OnDebugModeEntered();
diff --git a/src/citra_qt/debugger/disassembler.cpp b/src/citra_qt/debugger/disassembler.cpp
index d3629bbf6..d4f72809d 100644
--- a/src/citra_qt/debugger/disassembler.cpp
+++ b/src/citra_qt/debugger/disassembler.cpp
@@ -4,20 +4,19 @@
#include <QShortcut>
-#include "disassembler.h"
+#include "citra_qt/bootmanager.h"
+#include "citra_qt/hotkeys.h"
+#include "citra_qt/debugger/disassembler.h"
+#include "citra_qt/util/util.h"
-#include "../bootmanager.h"
-#include "../hotkeys.h"
-
-#include "core/memory.h"
-
-#include "core/core.h"
#include "common/break_points.h"
#include "common/symbols.h"
+
+#include "core/core.h"
+#include "core/memory.h"
#include "core/arm/arm_interface.h"
#include "core/arm/disassembler/arm_disasm.h"
-
DisassemblerModel::DisassemblerModel(QObject* parent) :
QAbstractListModel(parent), base_address(0), code_size(0), program_counter(0), selection(QModelIndex()) {
}
@@ -78,6 +77,14 @@ QVariant DisassemblerModel::data(const QModelIndex& index, int role) const {
break;
}
+ case Qt::FontRole:
+ {
+ if (index.column() == 0 || index.column() == 1) { // 2 is the symbols column
+ return GetMonospaceFont();
+ }
+ break;
+ }
+
default:
break;
}
diff --git a/src/citra_qt/debugger/graphics.cpp b/src/citra_qt/debugger/graphics.cpp
index 7d15028f0..8008f914c 100644
--- a/src/citra_qt/debugger/graphics.cpp
+++ b/src/citra_qt/debugger/graphics.cpp
@@ -2,11 +2,9 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "graphics.h"
#include <QListView>
-#include <QVBoxLayout>
-#include <QDebug>
+#include "citra_qt/debugger/graphics.h"
#include "citra_qt/util/util.h"
extern GraphicsDebugger g_debugger;
diff --git a/src/citra_qt/debugger/graphics.h b/src/citra_qt/debugger/graphics.h
index 8119b4c87..36b25b81d 100644
--- a/src/citra_qt/debugger/graphics.h
+++ b/src/citra_qt/debugger/graphics.h
@@ -37,7 +37,7 @@ class GPUCommandStreamWidget : public QDockWidget
Q_OBJECT
public:
- GPUCommandStreamWidget(QWidget* parent = 0);
+ GPUCommandStreamWidget(QWidget* parent = nullptr);
private:
};
diff --git a/src/citra_qt/debugger/graphics_breakpoint_observer.cpp b/src/citra_qt/debugger/graphics_breakpoint_observer.cpp
index 10ac1ebad..f134eef63 100644
--- a/src/citra_qt/debugger/graphics_breakpoint_observer.cpp
+++ b/src/citra_qt/debugger/graphics_breakpoint_observer.cpp
@@ -4,7 +4,7 @@
#include <QMetaType>
-#include "graphics_breakpoint_observer.h"
+#include "citra_qt/debugger/graphics_breakpoint_observer.h"
BreakPointObserverDock::BreakPointObserverDock(std::shared_ptr<Pica::DebugContext> debug_context,
const QString& title, QWidget* parent)
diff --git a/src/citra_qt/debugger/graphics_breakpoints.cpp b/src/citra_qt/debugger/graphics_breakpoints.cpp
index 5202c168c..819ec7707 100644
--- a/src/citra_qt/debugger/graphics_breakpoints.cpp
+++ b/src/citra_qt/debugger/graphics_breakpoints.cpp
@@ -2,16 +2,16 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <QLabel>
#include <QMetaType>
#include <QPushButton>
#include <QTreeView>
#include <QVBoxLayout>
-#include <QLabel>
-#include "common/assert.h"
+#include "citra_qt/debugger/graphics_breakpoints.h"
+#include "citra_qt/debugger/graphics_breakpoints_p.h"
-#include "graphics_breakpoints.h"
-#include "graphics_breakpoints_p.h"
+#include "common/assert.h"
BreakPointModel::BreakPointModel(std::shared_ptr<Pica::DebugContext> debug_context, QObject* parent)
: QAbstractListModel(parent), context_weak(debug_context),
diff --git a/src/citra_qt/debugger/graphics_breakpoints.h b/src/citra_qt/debugger/graphics_breakpoints.h
index d900729da..2371b0e39 100644
--- a/src/citra_qt/debugger/graphics_breakpoints.h
+++ b/src/citra_qt/debugger/graphics_breakpoints.h
@@ -6,7 +6,6 @@
#include <memory>
-#include <QAbstractListModel>
#include <QDockWidget>
#include "video_core/debug_utils/debug_utils.h"
diff --git a/src/citra_qt/debugger/graphics_breakpoints_p.h b/src/citra_qt/debugger/graphics_breakpoints_p.h
index 00d8d5101..251114d06 100644
--- a/src/citra_qt/debugger/graphics_breakpoints_p.h
+++ b/src/citra_qt/debugger/graphics_breakpoints_p.h
@@ -23,7 +23,7 @@ public:
int columnCount(const QModelIndex& parent = QModelIndex()) const override;
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
- Qt::ItemFlags flags(const QModelIndex &index) const;
+ Qt::ItemFlags flags(const QModelIndex &index) const override;
bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
diff --git a/src/citra_qt/debugger/graphics_cmdlists.cpp b/src/citra_qt/debugger/graphics_cmdlists.cpp
index 025434687..ab97c8d2d 100644
--- a/src/citra_qt/debugger/graphics_cmdlists.cpp
+++ b/src/citra_qt/debugger/graphics_cmdlists.cpp
@@ -4,26 +4,24 @@
#include <QApplication>
#include <QClipboard>
+#include <QComboBox>
+#include <QHeaderView>
#include <QLabel>
#include <QListView>
#include <QMainWindow>
#include <QPushButton>
-#include <QVBoxLayout>
-#include <QTreeView>
-#include <QHeaderView>
#include <QSpinBox>
-#include <QComboBox>
+#include <QTreeView>
+#include <QVBoxLayout>
+#include "citra_qt/debugger/graphics_cmdlists.h"
+#include "citra_qt/util/spinbox.h"
#include "citra_qt/util/util.h"
#include "common/vector_math.h"
-#include "video_core/debug_utils/debug_utils.h"
#include "video_core/pica.h"
-
-#include "graphics_cmdlists.h"
-
-#include "util/spinbox.h"
+#include "video_core/debug_utils/debug_utils.h"
QImage LoadTexture(u8* src, const Pica::DebugUtils::TextureInfo& info) {
QImage decoded_image(info.width, info.height, QImage::Format_ARGB32);
@@ -359,7 +357,7 @@ void GPUCommandListWidget::CopyAllToClipboard() {
QClipboard* clipboard = QApplication::clipboard();
QString text;
- QAbstractItemModel* model = static_cast<QAbstractListModel*>(list_widget->model());
+ QAbstractItemModel* model = static_cast<QAbstractItemModel*>(list_widget->model());
for (int row = 0; row < model->rowCount({}); ++row) {
for (int col = 0; col < model->columnCount({}); ++col) {
diff --git a/src/citra_qt/debugger/graphics_cmdlists.h b/src/citra_qt/debugger/graphics_cmdlists.h
index 4859b6ec8..586cc7239 100644
--- a/src/citra_qt/debugger/graphics_cmdlists.h
+++ b/src/citra_qt/debugger/graphics_cmdlists.h
@@ -41,7 +41,7 @@ class GPUCommandListWidget : public QDockWidget
Q_OBJECT
public:
- GPUCommandListWidget(QWidget* parent = 0);
+ GPUCommandListWidget(QWidget* parent = nullptr);
public slots:
void OnToggleTracing();
diff --git a/src/citra_qt/debugger/graphics_framebuffer.cpp b/src/citra_qt/debugger/graphics_framebuffer.cpp
index 39eefbf75..80b32eaff 100644
--- a/src/citra_qt/debugger/graphics_framebuffer.cpp
+++ b/src/citra_qt/debugger/graphics_framebuffer.cpp
@@ -9,18 +9,17 @@
#include <QPushButton>
#include <QSpinBox>
+#include "citra_qt/debugger/graphics_framebuffer.h"
+#include "citra_qt/util/spinbox.h"
+
#include "common/color.h"
-#include "core/hw/gpu.h"
#include "core/memory.h"
+#include "core/hw/gpu.h"
#include "video_core/pica.h"
#include "video_core/utils.h"
-#include "graphics_framebuffer.h"
-
-#include "util/spinbox.h"
-
GraphicsFramebufferWidget::GraphicsFramebufferWidget(std::shared_ptr<Pica::DebugContext> debug_context,
QWidget* parent)
: BreakPointObserverDock(debug_context, tr("Pica Framebuffer"), parent),
diff --git a/src/citra_qt/debugger/graphics_framebuffer.h b/src/citra_qt/debugger/graphics_framebuffer.h
index e9eae679f..5cd96f2e9 100644
--- a/src/citra_qt/debugger/graphics_framebuffer.h
+++ b/src/citra_qt/debugger/graphics_framebuffer.h
@@ -4,9 +4,7 @@
#pragma once
-#include <QDockWidget>
-
-#include "graphics_breakpoint_observer.h"
+#include "citra_qt/debugger/graphics_breakpoint_observer.h"
class QComboBox;
class QLabel;
diff --git a/src/citra_qt/debugger/graphics_tracing.cpp b/src/citra_qt/debugger/graphics_tracing.cpp
index f80cb7493..b0bc782df 100644
--- a/src/citra_qt/debugger/graphics_tracing.cpp
+++ b/src/citra_qt/debugger/graphics_tracing.cpp
@@ -4,26 +4,25 @@
#include <memory>
+#include <boost/range/algorithm/copy.hpp>
+
#include <QBoxLayout>
#include <QComboBox>
#include <QFileDialog>
-#include <QLabel>
#include <QMessageBox>
#include <QPushButton>
-#include <QSpinBox>
-#include <boost/range/algorithm/copy.hpp>
+#include "citra_qt/debugger/graphics_tracing.h"
#include "common/common_types.h"
#include "core/hw/gpu.h"
#include "core/hw/lcd.h"
-#include "video_core/pica.h"
-
#include "nihstro/float24.h"
-#include "graphics_tracing.h"
+#include "video_core/pica.h"
+
GraphicsTracingWidget::GraphicsTracingWidget(std::shared_ptr<Pica::DebugContext> debug_context,
QWidget* parent)
diff --git a/src/citra_qt/debugger/graphics_tracing.h b/src/citra_qt/debugger/graphics_tracing.h
index 2a0e4819b..753dfa914 100644
--- a/src/citra_qt/debugger/graphics_tracing.h
+++ b/src/citra_qt/debugger/graphics_tracing.h
@@ -4,7 +4,7 @@
#pragma once
-#include "graphics_breakpoint_observer.h"
+#include "citra_qt/debugger/graphics_breakpoint_observer.h"
class EmuThread;
diff --git a/src/citra_qt/debugger/graphics_vertex_shader.cpp b/src/citra_qt/debugger/graphics_vertex_shader.cpp
index 1d9a00e89..f915d2bab 100644
--- a/src/citra_qt/debugger/graphics_vertex_shader.cpp
+++ b/src/citra_qt/debugger/graphics_vertex_shader.cpp
@@ -7,6 +7,7 @@
#include <QBoxLayout>
#include <QFileDialog>
+#include <QFormLayout>
#include <QGroupBox>
#include <QLabel>
#include <QLineEdit>
@@ -15,27 +16,18 @@
#include <QSpinBox>
#include <QTreeView>
+#include "citra_qt/debugger/graphics_vertex_shader.h"
#include "citra_qt/util/util.h"
#include "video_core/shader/shader.h"
-#include "graphics_vertex_shader.h"
-
using nihstro::OpCode;
using nihstro::Instruction;
using nihstro::SourceRegister;
using nihstro::SwizzlePattern;
-GraphicsVertexShaderModel::GraphicsVertexShaderModel(GraphicsVertexShaderWidget* parent): QAbstractItemModel(parent), par(parent) {
-
-}
+GraphicsVertexShaderModel::GraphicsVertexShaderModel(GraphicsVertexShaderWidget* parent): QAbstractTableModel(parent), par(parent) {
-QModelIndex GraphicsVertexShaderModel::index(int row, int column, const QModelIndex& parent) const {
- return createIndex(row, column);
-}
-
-QModelIndex GraphicsVertexShaderModel::parent(const QModelIndex& child) const {
- return QModelIndex();
}
int GraphicsVertexShaderModel::columnCount(const QModelIndex& parent) const {
@@ -65,6 +57,28 @@ QVariant GraphicsVertexShaderModel::headerData(int section, Qt::Orientation orie
return QVariant();
}
+static std::string SelectorToString(u32 selector) {
+ std::string ret;
+ for (int i = 0; i < 4; ++i) {
+ int component = (selector >> ((3 - i) * 2)) & 3;
+ ret += "xyzw"[component];
+ }
+ return ret;
+}
+
+// e.g. "-c92[a0.x].xyzw"
+static void print_input(std::ostringstream& output, const SourceRegister& input,
+ bool negate, const std::string& swizzle_mask, bool align = true,
+ const std::string& address_register_name = std::string()) {
+ if (align)
+ output << std::setw(4) << std::right;
+ output << ((negate ? "-" : "") + input.GetName());
+
+ if (!address_register_name.empty())
+ output << '[' << address_register_name << ']';
+ output << '.' << swizzle_mask;
+};
+
QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) const {
switch (role) {
case Qt::DisplayRole:
@@ -81,102 +95,120 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
case 2:
{
- std::stringstream output;
- output.flags(std::ios::hex);
-
- Instruction instr = par->info.code[index.row()];
- const SwizzlePattern& swizzle = par->info.swizzle_info[instr.common.operand_desc_id].pattern;
-
- // longest known instruction name: "setemit "
- output << std::setw(8) << std::left << instr.opcode.Value().GetInfo().name;
-
- // e.g. "-c92.xyzw"
- static auto print_input = [](std::stringstream& output, const SourceRegister& input,
- bool negate, const std::string& swizzle_mask) {
- output << std::setw(4) << std::right << (negate ? "-" : "") + input.GetName();
- output << "." << swizzle_mask;
+ std::ostringstream output;
+ output.flags(std::ios::uppercase);
+
+ // To make the code aligning columns of assembly easier to keep track of, this function
+ // keeps track of the start of the start of the previous column, allowing alignment
+ // based on desired field widths.
+ int current_column = 0;
+ auto AlignToColumn = [&](int col_width) {
+ // Prints spaces to the output to pad previous column to size and advances the
+ // column marker.
+ current_column += col_width;
+ int to_add = std::max(1, current_column - (int)output.tellp());
+ for (int i = 0; i < to_add; ++i) {
+ output << ' ';
+ }
};
- // e.g. "-c92[a0.x].xyzw"
- static auto print_input_indexed = [](std::stringstream& output, const SourceRegister& input,
- bool negate, const std::string& swizzle_mask,
- const std::string& address_register_name) {
- std::string relative_address;
- if (!address_register_name.empty())
- relative_address = "[" + address_register_name + "]";
+ const Instruction instr = par->info.code[index.row()];
+ const OpCode opcode = instr.opcode;
+ const OpCode::Info opcode_info = opcode.GetInfo();
+ const u32 operand_desc_id = opcode_info.type == OpCode::Type::MultiplyAdd ?
+ instr.mad.operand_desc_id.Value() : instr.common.operand_desc_id.Value();
+ const SwizzlePattern swizzle = par->info.swizzle_info[operand_desc_id].pattern;
- output << std::setw(10) << std::right << (negate ? "-" : "") + input.GetName() + relative_address;
- output << "." << swizzle_mask;
- };
+ // longest known instruction name: "setemit "
+ int kOpcodeColumnWidth = 8;
+ // "rXX.xyzw "
+ int kOutputColumnWidth = 10;
+ // "-rXX.xyzw ", no attempt is made to align indexed inputs
+ int kInputOperandColumnWidth = 11;
- // Use print_input or print_input_indexed depending on whether relative addressing is used or not.
- static auto print_input_indexed_compact = [](std::stringstream& output, const SourceRegister& input,
- bool negate, const std::string& swizzle_mask,
- const std::string& address_register_name) {
- if (address_register_name.empty())
- print_input(output, input, negate, swizzle_mask);
- else
- print_input_indexed(output, input, negate, swizzle_mask, address_register_name);
- };
+ output << opcode_info.name;
- switch (instr.opcode.Value().GetInfo().type) {
+ switch (opcode_info.type) {
case OpCode::Type::Trivial:
// Nothing to do here
break;
case OpCode::Type::Arithmetic:
+ case OpCode::Type::MultiplyAdd:
{
// Use custom code for special instructions
- switch (instr.opcode.Value().EffectiveOpCode()) {
+ switch (opcode.EffectiveOpCode()) {
case OpCode::Id::CMP:
{
+ AlignToColumn(kOpcodeColumnWidth);
+
// NOTE: CMP always writes both cc components, so we do not consider the dest mask here.
- output << std::setw(4) << std::right << "cc.";
- output << "xy ";
+ output << " cc.xy";
+ AlignToColumn(kOutputColumnWidth);
SourceRegister src1 = instr.common.GetSrc1(false);
SourceRegister src2 = instr.common.GetSrc2(false);
- print_input_indexed_compact(output, src1, swizzle.negate_src1, swizzle.SelectorToString(false).substr(0,1), instr.common.AddressRegisterName());
- output << " " << instr.common.compare_op.ToString(instr.common.compare_op.x) << " ";
- print_input(output, src2, swizzle.negate_src2, swizzle.SelectorToString(true).substr(0,1));
+ output << ' ';
+ print_input(output, src1, swizzle.negate_src1, swizzle.SelectorToString(false).substr(0,1), false, instr.common.AddressRegisterName());
+ output << ' ' << instr.common.compare_op.ToString(instr.common.compare_op.x) << ' ';
+ print_input(output, src2, swizzle.negate_src2, swizzle.SelectorToString(true).substr(0,1), false);
output << ", ";
- print_input_indexed_compact(output, src1, swizzle.negate_src1, swizzle.SelectorToString(false).substr(1,1), instr.common.AddressRegisterName());
- output << " " << instr.common.compare_op.ToString(instr.common.compare_op.y) << " ";
- print_input(output, src2, swizzle.negate_src2, swizzle.SelectorToString(true).substr(1,1));
+ print_input(output, src1, swizzle.negate_src1, swizzle.SelectorToString(false).substr(1,1), false, instr.common.AddressRegisterName());
+ output << ' ' << instr.common.compare_op.ToString(instr.common.compare_op.y) << ' ';
+ print_input(output, src2, swizzle.negate_src2, swizzle.SelectorToString(true).substr(1,1), false);
break;
}
+ case OpCode::Id::MAD:
+ case OpCode::Id::MADI:
+ {
+ AlignToColumn(kOpcodeColumnWidth);
+
+ bool src_is_inverted = 0 != (opcode_info.subtype & OpCode::Info::SrcInversed);
+ SourceRegister src1 = instr.mad.GetSrc1(src_is_inverted);
+ SourceRegister src2 = instr.mad.GetSrc2(src_is_inverted);
+ SourceRegister src3 = instr.mad.GetSrc3(src_is_inverted);
+
+ output << std::setw(3) << std::right << instr.mad.dest.Value().GetName() << '.' << swizzle.DestMaskToString();
+ AlignToColumn(kOutputColumnWidth);
+ print_input(output, src1, swizzle.negate_src1, SelectorToString(swizzle.src1_selector));
+ AlignToColumn(kInputOperandColumnWidth);
+ print_input(output, src2, swizzle.negate_src2, SelectorToString(swizzle.src2_selector));
+ AlignToColumn(kInputOperandColumnWidth);
+ print_input(output, src3, swizzle.negate_src3, SelectorToString(swizzle.src3_selector));
+ AlignToColumn(kInputOperandColumnWidth);
+ break;
+ }
+
default:
{
- bool src_is_inverted = 0 != (instr.opcode.Value().GetInfo().subtype & OpCode::Info::SrcInversed);
+ AlignToColumn(kOpcodeColumnWidth);
+
+ bool src_is_inverted = 0 != (opcode_info.subtype & OpCode::Info::SrcInversed);
- if (instr.opcode.Value().GetInfo().subtype & OpCode::Info::Dest) {
+ if (opcode_info.subtype & OpCode::Info::Dest) {
// e.g. "r12.xy__"
- output << std::setw(4) << std::right << instr.common.dest.Value().GetName() + ".";
- output << swizzle.DestMaskToString();
- } else if (instr.opcode.Value().GetInfo().subtype == OpCode::Info::MOVA) {
- output << std::setw(4) << std::right << "a0.";
- output << swizzle.DestMaskToString();
- } else {
- output << " ";
+ output << std::setw(3) << std::right << instr.common.dest.Value().GetName() << '.' << swizzle.DestMaskToString();
+ } else if (opcode_info.subtype == OpCode::Info::MOVA) {
+ output << " a0." << swizzle.DestMaskToString();
}
- output << " ";
+ AlignToColumn(kOutputColumnWidth);
- if (instr.opcode.Value().GetInfo().subtype & OpCode::Info::Src1) {
+ if (opcode_info.subtype & OpCode::Info::Src1) {
SourceRegister src1 = instr.common.GetSrc1(src_is_inverted);
- print_input_indexed(output, src1, swizzle.negate_src1, swizzle.SelectorToString(false), instr.common.AddressRegisterName());
- } else {
- output << " ";
+ print_input(output, src1, swizzle.negate_src1, swizzle.SelectorToString(false), true, instr.common.AddressRegisterName());
+ AlignToColumn(kInputOperandColumnWidth);
}
// TODO: In some cases, the Address Register is used as an index for SRC2 instead of SRC1
- if (instr.opcode.Value().GetInfo().subtype & OpCode::Info::Src2) {
+ if (opcode_info.subtype & OpCode::Info::Src2) {
SourceRegister src2 = instr.common.GetSrc2(src_is_inverted);
print_input(output, src2, swizzle.negate_src2, swizzle.SelectorToString(true));
+ AlignToColumn(kInputOperandColumnWidth);
}
break;
}
@@ -186,46 +218,55 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
}
case OpCode::Type::Conditional:
+ case OpCode::Type::UniformFlowControl:
{
- switch (instr.opcode.Value().EffectiveOpCode()) {
+ output << ' ';
+
+ switch (opcode.EffectiveOpCode()) {
case OpCode::Id::LOOP:
output << "(unknown instruction format)";
break;
default:
- output << "if ";
-
- if (instr.opcode.Value().GetInfo().subtype & OpCode::Info::HasCondition) {
- const char* ops[] = {
- " || ", " && ", "", ""
- };
- if (instr.flow_control.op != instr.flow_control.JustY)
- output << ((!instr.flow_control.refx) ? "!" : " ") << "cc.x";
-
- output << ops[instr.flow_control.op];
-
- if (instr.flow_control.op != instr.flow_control.JustX)
- output << ((!instr.flow_control.refy) ? "!" : " ") << "cc.y";
-
- output << " ";
- } else if (instr.opcode.Value().GetInfo().subtype & OpCode::Info::HasUniformIndex) {
- output << "b" << instr.flow_control.bool_uniform_id << " ";
+ if (opcode_info.subtype & OpCode::Info::HasCondition) {
+ output << '(';
+
+ if (instr.flow_control.op != instr.flow_control.JustY) {
+ if (instr.flow_control.refx) output << '!';
+ output << "cc.x";
+ }
+
+ if (instr.flow_control.op == instr.flow_control.Or) {
+ output << " || ";
+ } else if (instr.flow_control.op == instr.flow_control.And) {
+ output << " && ";
+ }
+
+ if (instr.flow_control.op != instr.flow_control.JustX) {
+ if (instr.flow_control.refy) output << '!';
+ output << "cc.y";
+ }
+
+ output << ") ";
+ } else if (opcode_info.subtype & OpCode::Info::HasUniformIndex) {
+ output << 'b' << instr.flow_control.bool_uniform_id << ' ';
}
u32 target_addr = instr.flow_control.dest_offset;
u32 target_addr_else = instr.flow_control.dest_offset;
- if (instr.opcode.Value().GetInfo().subtype & OpCode::Info::HasAlternative) {
- output << "else jump to 0x" << std::setw(4) << std::right << std::setfill('0') << 4 * instr.flow_control.dest_offset << " ";
- } else if (instr.opcode.Value().GetInfo().subtype & OpCode::Info::HasExplicitDest) {
- output << "jump to 0x" << std::setw(4) << std::right << std::setfill('0') << 4 * instr.flow_control.dest_offset << " ";
+ if (opcode_info.subtype & OpCode::Info::HasAlternative) {
+ output << "else jump to 0x" << std::setw(4) << std::right << std::setfill('0') << std::hex << (4 * instr.flow_control.dest_offset);
+ } else if (opcode_info.subtype & OpCode::Info::HasExplicitDest) {
+ output << "jump to 0x" << std::setw(4) << std::right << std::setfill('0') << std::hex << (4 * instr.flow_control.dest_offset);
} else {
// TODO: Handle other cases
+ output << "(unknown destination)";
}
- if (instr.opcode.Value().GetInfo().subtype & OpCode::Info::HasFinishPoint) {
- output << "(return on " << std::setw(4) << std::right << std::setfill('0')
- << 4 * instr.flow_control.dest_offset + 4 * instr.flow_control.num_instructions << ")";
+ if (opcode_info.subtype & OpCode::Info::HasFinishPoint) {
+ output << " (return on 0x" << std::setw(4) << std::right << std::setfill('0') << std::hex
+ << (4 * instr.flow_control.dest_offset + 4 * instr.flow_control.num_instructions) << ')';
}
break;
@@ -234,7 +275,7 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
}
default:
- output << "(unknown instruction format)";
+ output << " (unknown instruction format)";
break;
}
@@ -250,12 +291,23 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
return GetMonospaceFont();
case Qt::BackgroundRole:
- // Highlight instructions which have no debug data associated to them
+ {
+ // Highlight current instruction
+ int current_record_index = par->cycle_index->value();
+ if (current_record_index < par->debug_data.records.size()) {
+ const auto& current_record = par->debug_data.records[current_record_index];
+ if (index.row() == current_record.instruction_offset) {
+ return QColor(255, 255, 63);
+ }
+ }
+
+ // Use a grey background for instructions which have no debug data associated to them
for (const auto& record : par->debug_data.records)
if (index.row() == record.instruction_offset)
return QVariant();
- return QBrush(QColor(255, 255, 127));
+ return QBrush(QColor(192, 192, 192));
+ }
// TODO: Draw arrows for each "reachable" instruction to visualize control flow
@@ -288,6 +340,13 @@ GraphicsVertexShaderWidget::GraphicsVertexShaderWidget(std::shared_ptr< Pica::De
: BreakPointObserverDock(debug_context, "Pica Vertex Shader", parent) {
setObjectName("PicaVertexShader");
+ // Clear input vertex data so that it contains valid float values in case a debug shader
+ // execution happens before the first Vertex Loaded breakpoint.
+ // TODO: This makes a crash in the interpreter much less likely, but not impossible. The
+ // interpreter should guard against out-of-bounds accesses to ensure crashes in it aren't
+ // possible.
+ std::memset(&input_vertex, 0, sizeof(input_vertex));
+
auto input_data_mapper = new QSignalMapper(this);
// TODO: Support inputting data in hexadecimal raw format
@@ -312,9 +371,6 @@ GraphicsVertexShaderWidget::GraphicsVertexShaderWidget(std::shared_ptr< Pica::De
cycle_index = new QSpinBox;
- connect(this, SIGNAL(SelectCommand(const QModelIndex&, QItemSelectionModel::SelectionFlags)),
- binary_list->selectionModel(), SLOT(select(const QModelIndex&, QItemSelectionModel::SelectionFlags)));
-
connect(dump_shader, SIGNAL(clicked()), this, SLOT(DumpShader()));
connect(cycle_index, SIGNAL(valueChanged(int)), this, SLOT(OnCycleIndexChanged(int)));
@@ -339,6 +395,9 @@ GraphicsVertexShaderWidget::GraphicsVertexShaderWidget(std::shared_ptr< Pica::De
// Create an HBoxLayout to store the widgets used to specify a particular attribute
// and store it in a QWidget to allow for easy hiding and unhiding.
auto row_layout = new QHBoxLayout;
+ // Remove unecessary padding between rows
+ row_layout->setContentsMargins(0, 0, 0, 0);
+
row_layout->addWidget(new QLabel(tr("Attribute %1").arg(i, 2)));
for (unsigned comp = 0; comp < 4; ++comp)
row_layout->addWidget(input_data[4 * i + comp]);
@@ -358,20 +417,25 @@ GraphicsVertexShaderWidget::GraphicsVertexShaderWidget(std::shared_ptr< Pica::De
input_data_group->setLayout(sub_layout);
main_layout->addWidget(input_data_group);
}
- {
- auto sub_layout = new QHBoxLayout;
- sub_layout->addWidget(binary_list);
- main_layout->addLayout(sub_layout);
- }
+
+ // Make program listing expand to fill available space in the dialog
+ binary_list->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+ main_layout->addWidget(binary_list);
+
main_layout->addWidget(dump_shader);
{
- auto sub_layout = new QHBoxLayout;
- sub_layout->addWidget(new QLabel(tr("Cycle Index:")));
- sub_layout->addWidget(cycle_index);
+ auto sub_layout = new QFormLayout;
+ sub_layout->addRow(tr("Cycle Index:"), cycle_index);
+
main_layout->addLayout(sub_layout);
}
+
+ // Set a minimum height so that the size of this label doesn't cause the rest of the bottom
+ // part of the UI to keep jumping up and down when cycling through instructions.
+ instruction_description->setMinimumHeight(instruction_description->fontMetrics().lineSpacing() * 6);
+ instruction_description->setAlignment(Qt::AlignLeft | Qt::AlignTop);
main_layout->addWidget(instruction_description);
- main_layout->addStretch();
+
main_widget->setLayout(main_layout);
setWidget(main_widget);
@@ -418,6 +482,7 @@ void GraphicsVertexShaderWidget::Reload(bool replace_vertex_data, void* vertex_d
auto& shader_config = Pica::g_state.regs.vs;
for (auto instr : shader_setup.program_code)
info.code.push_back({instr});
+ int num_attributes = Pica::g_state.regs.vertex_attributes.GetNumTotalAttributes();
for (auto pattern : shader_setup.swizzle_data)
info.swizzle_info.push_back({pattern});
@@ -426,19 +491,18 @@ void GraphicsVertexShaderWidget::Reload(bool replace_vertex_data, void* vertex_d
info.labels.insert({ entry_point, "main" });
// Generate debug information
- debug_data = Pica::Shader::ProduceDebugInfo(input_vertex, 1, shader_config, shader_setup);
+ debug_data = Pica::Shader::ProduceDebugInfo(input_vertex, num_attributes, shader_config, shader_setup);
// Reload widget state
-
- // Only show input attributes which are used as input to the shader
- for (unsigned int attr = 0; attr < 16; ++attr) {
- input_data_container[attr]->setVisible(false);
- }
- for (unsigned int attr = 0; attr < Pica::g_state.regs.vertex_attributes.GetNumTotalAttributes(); ++attr) {
+ for (unsigned int attr = 0; attr < num_attributes; ++attr) {
unsigned source_attr = shader_config.input_register_map.GetRegisterForAttribute(attr);
input_data_mapping[source_attr]->setText(QString("-> v%1").arg(attr));
input_data_container[source_attr]->setVisible(true);
}
+ // Only show input attributes which are used as input to the shader
+ for (unsigned int attr = num_attributes; attr < 16; ++attr) {
+ input_data_container[attr]->setVisible(false);
+ }
// Initialize debug info text for current cycle count
cycle_index->setMaximum(debug_data.records.size() - 1);
@@ -453,6 +517,8 @@ void GraphicsVertexShaderWidget::OnResumed() {
void GraphicsVertexShaderWidget::OnInputAttributeChanged(int index) {
float value = input_data[index]->text().toFloat();
+ input_vertex.attr[index / 4][index % 4] = Pica::float24::FromFloat32(value);
+ // Re-execute shader with updated value
Reload();
}
@@ -492,8 +558,8 @@ void GraphicsVertexShaderWidget::OnCycleIndexChanged(int index) {
instruction_description->setText(text);
- // Scroll to current instruction
- const QModelIndex& instr_index = model->index(record.instruction_offset, 0);
- emit SelectCommand(instr_index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
+ // Emit model update notification and scroll to current instruction
+ QModelIndex instr_index = model->index(record.instruction_offset, 0);
+ emit model->dataChanged(instr_index, model->index(record.instruction_offset, model->columnCount()));
binary_list->scrollTo(instr_index, QAbstractItemView::EnsureVisible);
}
diff --git a/src/citra_qt/debugger/graphics_vertex_shader.h b/src/citra_qt/debugger/graphics_vertex_shader.h
index 1b3f1f7ec..7f06f496a 100644
--- a/src/citra_qt/debugger/graphics_vertex_shader.h
+++ b/src/citra_qt/debugger/graphics_vertex_shader.h
@@ -4,9 +4,9 @@
#pragma once
-#include <QAbstractListModel>
+#include <QAbstractTableModel>
-#include "graphics_breakpoint_observer.h"
+#include "citra_qt/debugger/graphics_breakpoint_observer.h"
#include "nihstro/parser_shbin.h"
@@ -17,14 +17,12 @@ class QSpinBox;
class GraphicsVertexShaderWidget;
-class GraphicsVertexShaderModel : public QAbstractItemModel {
+class GraphicsVertexShaderModel : public QAbstractTableModel {
Q_OBJECT
public:
GraphicsVertexShaderModel(GraphicsVertexShaderWidget* parent);
- QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override;
- QModelIndex parent(const QModelIndex& child) const override;
int columnCount(const QModelIndex& parent = QModelIndex()) const override;
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
@@ -62,11 +60,6 @@ private slots:
*/
void Reload(bool replace_vertex_data = false, void* vertex_data = nullptr);
-
-signals:
- // Call this to change the current command selection in the disassembly view
- void SelectCommand(const QModelIndex&, QItemSelectionModel::SelectionFlags);
-
private:
QLabel* instruction_description;
QTreeView* binary_list;
diff --git a/src/citra_qt/debugger/profiler.cpp b/src/citra_qt/debugger/profiler.cpp
index 5261d4836..4f6ba0e1f 100644
--- a/src/citra_qt/debugger/profiler.cpp
+++ b/src/citra_qt/debugger/profiler.cpp
@@ -6,12 +6,11 @@
#include <QPainter>
#include <QString>
-#include "profiler.h"
-
+#include "citra_qt/debugger/profiler.h"
#include "citra_qt/util/util.h"
-#include "common/profiler_reporting.h"
#include "common/microprofile.h"
+#include "common/profiler_reporting.h"
// Include the implementation of the UI in this file. This isn't in microprofile.cpp because the
// non-Qt frontends don't need it (and don't implement the UI drawing hooks either).
@@ -151,7 +150,7 @@ void ProfilerWidget::setProfilingInfoUpdateEnabled(bool enable)
class MicroProfileWidget : public QWidget {
public:
- MicroProfileWidget(QWidget* parent = 0);
+ MicroProfileWidget(QWidget* parent = nullptr);
protected:
void paintEvent(QPaintEvent* ev) override;
diff --git a/src/citra_qt/debugger/profiler.h b/src/citra_qt/debugger/profiler.h
index 2199eaef1..036054740 100644
--- a/src/citra_qt/debugger/profiler.h
+++ b/src/citra_qt/debugger/profiler.h
@@ -37,7 +37,7 @@ class ProfilerWidget : public QDockWidget
Q_OBJECT
public:
- ProfilerWidget(QWidget* parent = 0);
+ ProfilerWidget(QWidget* parent = nullptr);
private slots:
void setProfilingInfoUpdateEnabled(bool enable);
@@ -53,7 +53,7 @@ class MicroProfileDialog : public QWidget {
Q_OBJECT
public:
- MicroProfileDialog(QWidget* parent = 0);
+ MicroProfileDialog(QWidget* parent = nullptr);
/// Returns a QAction that can be used to toggle visibility of this dialog.
QAction* toggleViewAction();
diff --git a/src/citra_qt/debugger/ramview.cpp b/src/citra_qt/debugger/ramview.cpp
index b6ebc7fc4..02347e83a 100644
--- a/src/citra_qt/debugger/ramview.cpp
+++ b/src/citra_qt/debugger/ramview.cpp
@@ -2,8 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "ramview.h"
-
+#include "citra_qt/debugger/ramview.h"
GRamView::GRamView(QWidget* parent) : QHexEdit(parent)
{
diff --git a/src/citra_qt/debugger/ramview.h b/src/citra_qt/debugger/ramview.h
index 18423036f..0ef74586b 100644
--- a/src/citra_qt/debugger/ramview.h
+++ b/src/citra_qt/debugger/ramview.h
@@ -9,7 +9,7 @@ class GRamView : public QHexEdit
Q_OBJECT
public:
- GRamView(QWidget* parent = NULL);
+ GRamView(QWidget* parent = nullptr);
public slots:
void OnCPUStepped();
diff --git a/src/citra_qt/debugger/registers.cpp b/src/citra_qt/debugger/registers.cpp
index 4174b3945..6100d67c5 100644
--- a/src/citra_qt/debugger/registers.cpp
+++ b/src/citra_qt/debugger/registers.cpp
@@ -2,7 +2,10 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "registers.h"
+#include <QTreeWidgetItem>
+
+#include "citra_qt/debugger/registers.h"
+#include "citra_qt/util/util.h"
#include "core/core.h"
#include "core/arm/arm_interface.h"
@@ -26,9 +29,32 @@ RegistersWidget::RegistersWidget(QWidget* parent) : QDockWidget(parent) {
vfp_registers->addChild(child);
}
+ QFont font = GetMonospaceFont();
+
CreateCPSRChildren();
CreateVFPSystemRegisterChildren();
+ // Set Registers to display in monospace font
+ for (int i = 0; i < core_registers->childCount(); ++i)
+ core_registers->child(i)->setFont(1, font);
+
+ for (int i = 0; i < vfp_registers->childCount(); ++i)
+ vfp_registers->child(i)->setFont(1, font);
+
+ for (int i = 0; i < vfp_system_registers->childCount(); ++i) {
+ vfp_system_registers->child(i)->setFont(1, font);
+ for (int x = 0; x < vfp_system_registers->child(i)->childCount(); ++x) {
+ vfp_system_registers->child(i)->child(x)->setFont(1, font);
+ }
+ }
+ // Set CSPR to display in monospace font
+ cpsr->setFont(1, font);
+ for (int i = 0; i < cpsr->childCount(); ++i) {
+ cpsr->child(i)->setFont(1, font);
+ for (int x = 0; x < cpsr->child(i)->childCount(); ++x) {
+ cpsr->child(i)->child(x)->setFont(1, font);
+ }
+ }
setEnabled(false);
}
diff --git a/src/citra_qt/debugger/registers.h b/src/citra_qt/debugger/registers.h
index 09b830e80..cf27acc1c 100644
--- a/src/citra_qt/debugger/registers.h
+++ b/src/citra_qt/debugger/registers.h
@@ -5,9 +5,9 @@
#include "ui_registers.h"
#include <QDockWidget>
-#include <QTreeWidgetItem>
class QTreeWidget;
+class QTreeWidgetItem;
class EmuThread;
class RegistersWidget : public QDockWidget
@@ -15,7 +15,7 @@ class RegistersWidget : public QDockWidget
Q_OBJECT
public:
- RegistersWidget(QWidget* parent = NULL);
+ RegistersWidget(QWidget* parent = nullptr);
public slots:
void OnDebugModeEntered();
diff --git a/src/citra_qt/hotkeys.cpp b/src/citra_qt/hotkeys.cpp
index 5ed6cf0b1..ed6b12fc4 100644
--- a/src/citra_qt/hotkeys.cpp
+++ b/src/citra_qt/hotkeys.cpp
@@ -8,7 +8,7 @@
#include <QSettings>
#include <QShortcut>
-#include "hotkeys.h"
+#include "citra_qt/hotkeys.h"
struct Hotkey
{
diff --git a/src/citra_qt/hotkeys.h b/src/citra_qt/hotkeys.h
index 2317f8188..2fe635882 100644
--- a/src/citra_qt/hotkeys.h
+++ b/src/citra_qt/hotkeys.h
@@ -47,7 +47,7 @@ class GHotkeysDialog : public QDialog
Q_OBJECT
public:
- GHotkeysDialog(QWidget* parent = NULL);
+ GHotkeysDialog(QWidget* parent = nullptr);
private:
Ui::hotkeys ui;
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index 8dadb44ef..01841b33c 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -4,51 +4,49 @@
#include <thread>
-#include <QtGui>
#include <QDesktopWidget>
+#include <QtGui>
#include <QFileDialog>
#include <QMessageBox>
#include "qhexedit.h"
-#include "main.h"
-#include "common/string_util.h"
-#include "common/logging/text_formatter.h"
-#include "common/logging/log.h"
-#include "common/logging/backend.h"
-#include "common/logging/filter.h"
+#include "citra_qt/bootmanager.h"
+#include "citra_qt/config.h"
+#include "citra_qt/hotkeys.h"
+#include "citra_qt/main.h"
+
+// Debugger
+#include "citra_qt/debugger/callstack.h"
+#include "citra_qt/debugger/disassembler.h"
+#include "citra_qt/debugger/graphics.h"
+#include "citra_qt/debugger/graphics_breakpoints.h"
+#include "citra_qt/debugger/graphics_cmdlists.h"
+#include "citra_qt/debugger/graphics_framebuffer.h"
+#include "citra_qt/debugger/graphics_tracing.h"
+#include "citra_qt/debugger/graphics_vertex_shader.h"
+#include "citra_qt/debugger/profiler.h"
+#include "citra_qt/debugger/ramview.h"
+#include "citra_qt/debugger/registers.h"
+
#include "common/make_unique.h"
#include "common/microprofile.h"
#include "common/platform.h"
#include "common/scm_rev.h"
#include "common/scope_exit.h"
+#include "common/string_util.h"
+#include "common/logging/backend.h"
+#include "common/logging/filter.h"
+#include "common/logging/log.h"
+#include "common/logging/text_formatter.h"
-#include "bootmanager.h"
-#include "hotkeys.h"
-
-//debugger
-#include "debugger/disassembler.h"
-#include "debugger/registers.h"
-#include "debugger/callstack.h"
-#include "debugger/ramview.h"
-#include "debugger/graphics.h"
-#include "debugger/graphics_breakpoints.h"
-#include "debugger/graphics_cmdlists.h"
-#include "debugger/graphics_framebuffer.h"
-#include "debugger/graphics_tracing.h"
-#include "debugger/graphics_vertex_shader.h"
-#include "debugger/profiler.h"
-
+#include "core/core.h"
#include "core/settings.h"
#include "core/system.h"
-#include "core/core.h"
-#include "core/loader/loader.h"
#include "core/arm/disassembler/load_symbol_map.h"
-#include "citra_qt/config.h"
+#include "core/loader/loader.h"
#include "video_core/video_core.h"
-#include "version.h"
-
GMainWindow::GMainWindow() : emu_thread(nullptr)
{
Pica::g_debug_context = Pica::DebugContext::Construct();
@@ -130,11 +128,14 @@ GMainWindow::GMainWindow() : emu_thread(nullptr)
// Restore UI state
QSettings settings;
+
+ settings.beginGroup("UILayout");
restoreGeometry(settings.value("geometry").toByteArray());
restoreState(settings.value("state").toByteArray());
render_window->restoreGeometry(settings.value("geometryRenderWindow").toByteArray());
microProfileDialog->restoreGeometry(settings.value("microProfileDialogGeometry").toByteArray());
microProfileDialog->setVisible(settings.value("microProfileDialogVisible").toBool());
+ settings.endGroup();
ui.action_Use_Hardware_Renderer->setChecked(Settings::values.use_hw_renderer);
SetHardwareRendererEnabled(ui.action_Use_Hardware_Renderer->isChecked());
@@ -301,6 +302,10 @@ void GMainWindow::StoreRecentFile(const QString& filename)
QStringList recent_files = settings.value("recentFiles").toStringList();
recent_files.prepend(filename);
recent_files.removeDuplicates();
+ while (recent_files.size() > max_recent_files_item) {
+ recent_files.removeLast();
+ }
+
settings.setValue("recentFiles", recent_files);
UpdateRecentFiles();
@@ -439,11 +444,15 @@ void GMainWindow::OnConfigure() {
void GMainWindow::closeEvent(QCloseEvent* event) {
// Save window layout
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Citra team", "Citra");
+
+ settings.beginGroup("UILayout");
settings.setValue("geometry", saveGeometry());
settings.setValue("state", saveState());
settings.setValue("geometryRenderWindow", render_window->saveGeometry());
settings.setValue("microProfileDialogGeometry", microProfileDialog->saveGeometry());
settings.setValue("microProfileDialogVisible", microProfileDialog->isVisible());
+ settings.endGroup();
+
settings.setValue("singleWindowMode", ui.action_Single_Window_Mode->isChecked());
settings.setValue("displayTitleBars", ui.actionDisplay_widget_title_bars->isChecked());
settings.setValue("firstStart", false);
diff --git a/src/citra_qt/util/spinbox.cpp b/src/citra_qt/util/spinbox.cpp
index de4060116..415e7fbec 100644
--- a/src/citra_qt/util/spinbox.cpp
+++ b/src/citra_qt/util/spinbox.cpp
@@ -33,8 +33,8 @@
#include <QLineEdit>
#include <QRegExpValidator>
+#include "citra_qt/util/spinbox.h"
#include "common/assert.h"
-#include "spinbox.h"
CSpinBox::CSpinBox(QWidget* parent) : QAbstractSpinBox(parent), min_value(-100), max_value(100), value(0), base(10), num_digits(0)
{
diff --git a/src/citra_qt/util/util.cpp b/src/citra_qt/util/util.cpp
index 2cb939af1..f292046b7 100644
--- a/src/citra_qt/util/util.cpp
+++ b/src/citra_qt/util/util.cpp
@@ -2,7 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "util.h"
+#include "citra_qt/util/util.h"
QFont GetMonospaceFont() {
QFont font("monospace");
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index 2be6fe996..959084cdf 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -32,7 +32,6 @@ set(HEADERS
common_funcs.h
common_paths.h
common_types.h
- debug_interface.h
emu_window.h
file_util.h
hash.h
diff --git a/src/common/break_points.cpp b/src/common/break_points.cpp
index 023a485a4..e7d0d3e43 100644
--- a/src/common/break_points.cpp
+++ b/src/common/break_points.cpp
@@ -2,7 +2,6 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "common/debug_interface.h"
#include "common/break_points.h"
#include "common/logging/log.h"
@@ -101,92 +100,3 @@ void BreakPoints::Clear()
m_BreakPoints.clear();
}
-
-MemChecks::TMemChecksStr MemChecks::GetStrings() const
-{
- TMemChecksStr mcs;
- for (auto memcheck : m_MemChecks)
- {
- std::stringstream mc;
- mc << std::hex << memcheck.StartAddress;
- mc << " " << (memcheck.bRange ? memcheck.EndAddress : memcheck.StartAddress) << " "
- << (memcheck.bRange ? "n" : "")
- << (memcheck.OnRead ? "r" : "")
- << (memcheck.OnWrite ? "w" : "")
- << (memcheck.Log ? "l" : "")
- << (memcheck.Break ? "p" : "");
- mcs.push_back(mc.str());
- }
-
- return mcs;
-}
-
-void MemChecks::AddFromStrings(const TMemChecksStr& mcs)
-{
- for (auto mcs_item : mcs)
- {
- TMemCheck mc;
- std::stringstream mcstr;
- mcstr << std::hex << mcs_item;
- mcstr >> mc.StartAddress;
- mc.bRange = mcs_item.find("n") != mcs_item.npos;
- mc.OnRead = mcs_item.find("r") != mcs_item.npos;
- mc.OnWrite = mcs_item.find("w") != mcs_item.npos;
- mc.Log = mcs_item.find("l") != mcs_item.npos;
- mc.Break = mcs_item.find("p") != mcs_item.npos;
- if (mc.bRange)
- mcstr >> mc.EndAddress;
- else
- mc.EndAddress = mc.StartAddress;
- Add(mc);
- }
-}
-
-void MemChecks::Add(const TMemCheck& rMemoryCheck)
-{
- if (GetMemCheck(rMemoryCheck.StartAddress) == 0)
- m_MemChecks.push_back(rMemoryCheck);
-}
-
-void MemChecks::Remove(u32 Address)
-{
- auto cond = [&Address](const TMemCheck& mc) { return mc.StartAddress == Address; };
- auto it = std::find_if(m_MemChecks.begin(), m_MemChecks.end(), cond);
- if (it != m_MemChecks.end())
- m_MemChecks.erase(it);
-}
-
-TMemCheck *MemChecks::GetMemCheck(u32 address)
-{
- for (auto i = m_MemChecks.begin(); i != m_MemChecks.end(); ++i)
- {
- if (i->bRange)
- {
- if (address >= i->StartAddress && address <= i->EndAddress)
- return &(*i);
- }
- else if (i->StartAddress == address)
- return &(*i);
- }
-
- // none found
- return 0;
-}
-
-void TMemCheck::Action(DebugInterface *debug_interface, u32 iValue, u32 addr,
- bool write, int size, u32 pc)
-{
- if ((write && OnWrite) || (!write && OnRead))
- {
- if (Log)
- {
- LOG_DEBUG(Debug_Breakpoint, "CHK %08x (%s) %s%i %0*x at %08x (%s)",
- pc, debug_interface->getDescription(pc).c_str(),
- write ? "Write" : "Read", size*8, size*2, iValue, addr,
- debug_interface->getDescription(addr).c_str()
- );
- }
- if (Break)
- debug_interface->breakNow();
- }
-}
diff --git a/src/common/break_points.h b/src/common/break_points.h
index f0a55e7b1..b0629df37 100644
--- a/src/common/break_points.h
+++ b/src/common/break_points.h
@@ -18,31 +18,6 @@ struct TBreakPoint
bool bTemporary;
};
-struct TMemCheck
-{
- TMemCheck():
- StartAddress(0), EndAddress(0),
- bRange(false), OnRead(false), OnWrite(false),
- Log(false), Break(false), numHits(0)
- { }
-
- u32 StartAddress;
- u32 EndAddress;
-
- bool bRange;
-
- bool OnRead;
- bool OnWrite;
-
- bool Log;
- bool Break;
-
- u32 numHits;
-
- void Action(DebugInterface *dbg_interface, u32 iValue, u32 addr,
- bool write, int size, u32 pc);
-};
-
// Code breakpoints.
class BreakPoints
{
@@ -73,27 +48,3 @@ private:
TBreakPoints m_BreakPoints;
u32 m_iBreakOnCount;
};
-
-
-// Memory breakpoints
-class MemChecks
-{
-public:
- typedef std::vector<TMemCheck> TMemChecks;
- typedef std::vector<std::string> TMemChecksStr;
-
- TMemChecks m_MemChecks;
-
- const TMemChecks& GetMemChecks() { return m_MemChecks; }
-
- TMemChecksStr GetStrings() const;
- void AddFromStrings(const TMemChecksStr& mcs);
-
- void Add(const TMemCheck& rMemoryCheck);
-
- // memory breakpoint
- TMemCheck *GetMemCheck(u32 address);
- void Remove(u32 _Address);
-
- void Clear() { m_MemChecks.clear(); };
-};
diff --git a/src/common/chunk_file.h b/src/common/chunk_file.h
index 8be0b1109..1e1bcff31 100644
--- a/src/common/chunk_file.h
+++ b/src/common/chunk_file.h
@@ -575,10 +575,10 @@ public:
}
template<class T, LinkedListItem<T>* (*TNew)(), void (*TFree)(LinkedListItem<T>*), void (*TDo)(PointerWrap&, T*)>
- void DoLinkedList(LinkedListItem<T>*& list_start, LinkedListItem<T>** list_end=0)
+ void DoLinkedList(LinkedListItem<T>*& list_start, LinkedListItem<T>** list_end = nullptr)
{
LinkedListItem<T>* list_cur = list_start;
- LinkedListItem<T>* prev = 0;
+ LinkedListItem<T>* prev = nullptr;
while (true)
{
diff --git a/src/common/debug_interface.h b/src/common/debug_interface.h
deleted file mode 100644
index 32f55cb59..000000000
--- a/src/common/debug_interface.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#pragma once
-
-#include <cstring>
-#include <string>
-
-class DebugInterface
-{
-protected:
- virtual ~DebugInterface() {}
-
-public:
- virtual void disasm(unsigned int /*address*/, char *dest, int /*max_size*/) {strcpy(dest, "NODEBUGGER");}
- virtual void getRawMemoryString(int /*memory*/, unsigned int /*address*/, char *dest, int /*max_size*/) {strcpy(dest, "NODEBUGGER");}
- virtual int getInstructionSize(int /*instruction*/) {return 1;}
- virtual bool isAlive() {return true;}
- virtual bool isBreakpoint(unsigned int /*address*/) {return false;}
- virtual void setBreakpoint(unsigned int /*address*/){}
- virtual void clearBreakpoint(unsigned int /*address*/){}
- virtual void clearAllBreakpoints() {}
- virtual void toggleBreakpoint(unsigned int /*address*/){}
- virtual bool isMemCheck(unsigned int /*address*/) {return false;}
- virtual void toggleMemCheck(unsigned int /*address*/){}
- virtual unsigned int readMemory(unsigned int /*address*/){return 0;}
- virtual void writeExtraMemory(int /*memory*/, unsigned int /*value*/, unsigned int /*address*/) {}
- virtual unsigned int readExtraMemory(int /*memory*/, unsigned int /*address*/){return 0;}
- virtual unsigned int readInstruction(unsigned int /*address*/){return 0;}
- virtual unsigned int getPC() {return 0;}
- virtual void setPC(unsigned int /*address*/) {}
- virtual void step() {}
- virtual void runToBreakpoint() {}
- virtual void breakNow() {}
- virtual void insertBLR(unsigned int /*address*/, unsigned int /*value*/) {}
- virtual void showJitResults(unsigned int /*address*/) {};
- virtual int getColor(unsigned int /*address*/){return 0xFFFFFFFF;}
- virtual std::string getDescription(unsigned int /*address*/) = 0;
-};
diff --git a/src/common/memory_util.cpp b/src/common/memory_util.cpp
index 5ef784224..07c7f79c8 100644
--- a/src/common/memory_util.cpp
+++ b/src/common/memory_util.cpp
@@ -28,9 +28,9 @@
void* AllocateExecutableMemory(size_t size, bool low)
{
#if defined(_WIN32)
- void* ptr = VirtualAlloc(0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ void* ptr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
#else
- static char *map_hint = 0;
+ static char* map_hint = nullptr;
#if defined(ARCHITECTURE_X64) && !defined(MAP_32BIT)
// This OS has no flag to enforce allocation below the 4 GB boundary,
// but if we hint that we want a low address it is very likely we will
@@ -49,9 +49,6 @@ void* AllocateExecutableMemory(size_t size, bool low)
, -1, 0);
#endif /* defined(_WIN32) */
- // printf("Mapped executable memory at %p (size %ld)\n", ptr,
- // (unsigned long)size);
-
#ifdef _WIN32
if (ptr == nullptr)
{
@@ -69,7 +66,6 @@ void* AllocateExecutableMemory(size_t size, bool low)
{
map_hint += size;
map_hint = (char*)round_page(map_hint); /* round up to the next page */
- // printf("Next map will (hopefully) be at %p\n", map_hint);
}
}
#endif
@@ -85,18 +81,15 @@ void* AllocateExecutableMemory(size_t size, bool low)
void* AllocateMemoryPages(size_t size)
{
#ifdef _WIN32
- void* ptr = VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
+ void* ptr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE);
#else
- void* ptr = mmap(0, size, PROT_READ | PROT_WRITE,
+ void* ptr = mmap(nullptr, size, PROT_READ | PROT_WRITE,
MAP_ANON | MAP_PRIVATE, -1, 0);
if (ptr == MAP_FAILED)
ptr = nullptr;
#endif
- // printf("Mapped memory at %p (size %ld)\n", ptr,
- // (unsigned long)size);
-
if (ptr == nullptr)
LOG_ERROR(Common_Memory, "Failed to allocate raw memory");
@@ -117,9 +110,6 @@ void* AllocateAlignedMemory(size_t size,size_t alignment)
#endif
#endif
- // printf("Mapped memory at %p (size %ld)\n", ptr,
- // (unsigned long)size);
-
if (ptr == nullptr)
LOG_ERROR(Common_Memory, "Failed to allocate aligned memory");
@@ -131,11 +121,8 @@ void FreeMemoryPages(void* ptr, size_t size)
if (ptr)
{
#ifdef _WIN32
-
if (!VirtualFree(ptr, 0, MEM_RELEASE))
LOG_ERROR(Common_Memory, "FreeMemoryPages failed!\n%s", GetLastErrorMsg());
- ptr = nullptr; // Is this our responsibility?
-
#else
munmap(ptr, size);
#endif
diff --git a/src/common/swap.h b/src/common/swap.h
index b92e5bfa4..a7c37bc44 100644
--- a/src/common/swap.h
+++ b/src/common/swap.h
@@ -148,7 +148,7 @@ struct swap_struct_t {
typedef swap_struct_t<T, F> swapped_t;
protected:
- T value;
+ T value = T();
static T swap(T v) {
return F::swap(v);
@@ -158,7 +158,7 @@ public:
return swap(value);
}
- swap_struct_t() : value((T)0) {}
+ swap_struct_t() = default;
swap_struct_t(const T &v): value(swap(v)) {}
template <typename S>
diff --git a/src/common/synchronized_wrapper.h b/src/common/synchronized_wrapper.h
index ae5e8b1ed..07105a198 100644
--- a/src/common/synchronized_wrapper.h
+++ b/src/common/synchronized_wrapper.h
@@ -55,6 +55,7 @@ public:
SynchronizedRef& operator=(SynchronizedRef&) = delete;
SynchronizedRef& operator=(SynchronizedRef&& o) {
std::swap(wrapper, o.wrapper);
+ return *this;
}
T& operator*() { return wrapper->data; }
diff --git a/src/core/arm/disassembler/arm_disasm.cpp b/src/core/arm/disassembler/arm_disasm.cpp
index 77af10b54..76408e9fa 100644
--- a/src/core/arm/disassembler/arm_disasm.cpp
+++ b/src/core/arm/disassembler/arm_disasm.cpp
@@ -206,7 +206,7 @@ static const char *opcode_names[] = {
"swi",
"tst",
- NULL
+ nullptr
};
// Indexed by the shift type (bits 6-5)
@@ -399,7 +399,7 @@ std::string ARM_Disasm::Disassemble(u32 addr, u32 insn)
default:
return "Error";
}
- return NULL;
+ return nullptr;
}
std::string ARM_Disasm::DisassembleALU(Opcode opcode, u32 insn)
diff --git a/src/core/arm/skyeye_common/vfp/vfpdouble.cpp b/src/core/arm/skyeye_common/vfp/vfpdouble.cpp
index 47a9fe804..857e6ce45 100644
--- a/src/core/arm/skyeye_common/vfp/vfpdouble.cpp
+++ b/src/core/arm/skyeye_common/vfp/vfpdouble.cpp
@@ -299,7 +299,7 @@ static u32 vfp_double_fsqrt(ARMul_State* state, int dd, int unused, int dm, u32
vdp = &vdd;
if (tm & VFP_NAN)
- ret = vfp_propagate_nan(vdp, &vdm, NULL, fpscr);
+ ret = vfp_propagate_nan(vdp, &vdm, nullptr, fpscr);
else if (vdm.sign == 0) {
sqrt_copy:
vdp = &vdm;
@@ -700,26 +700,26 @@ static struct op fops_ext[] = {
{ vfp_double_fabs, 0 }, //0x00000001 - FEXT_FABS
{ vfp_double_fneg, 0 }, //0x00000002 - FEXT_FNEG
{ vfp_double_fsqrt, 0 }, //0x00000003 - FEXT_FSQRT
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
{ vfp_double_fcmp, OP_SCALAR }, //0x00000008 - FEXT_FCMP
{ vfp_double_fcmpe, OP_SCALAR }, //0x00000009 - FEXT_FCMPE
{ vfp_double_fcmpz, OP_SCALAR }, //0x0000000A - FEXT_FCMPZ
{ vfp_double_fcmpez, OP_SCALAR }, //0x0000000B - FEXT_FCMPEZ
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
{ vfp_double_fcvts, OP_SCALAR|OP_DD }, //0x0000000F - FEXT_FCVT
{ vfp_double_fuito, OP_SCALAR|OP_SM }, //0x00000010 - FEXT_FUITO
{ vfp_double_fsito, OP_SCALAR|OP_SM }, //0x00000011 - FEXT_FSITO
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
{ vfp_double_ftoui, OP_SCALAR|OP_SD }, //0x00000018 - FEXT_FTOUI
{ vfp_double_ftouiz, OP_SCALAR|OP_SD }, //0x00000019 - FEXT_FTOUIZ
{ vfp_double_ftosi, OP_SCALAR|OP_SD }, //0x0000001A - FEXT_FTOSI
diff --git a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp
index 0fb3c3bf1..e47ad2760 100644
--- a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp
+++ b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp
@@ -341,7 +341,7 @@ static u32 vfp_single_fsqrt(ARMul_State* state, int sd, int unused, s32 m, u32 f
vsp = &vsd;
if (tm & VFP_NAN)
- ret = vfp_propagate_nan(vsp, &vsm, NULL, fpscr);
+ ret = vfp_propagate_nan(vsp, &vsm, nullptr, fpscr);
else if (vsm.sign == 0) {
sqrt_copy:
vsp = &vsm;
@@ -725,26 +725,26 @@ static struct op fops_ext[] = {
{ vfp_single_fabs, 0 }, //0x00000001 - FEXT_FABS
{ vfp_single_fneg, 0 }, //0x00000002 - FEXT_FNEG
{ vfp_single_fsqrt, 0 }, //0x00000003 - FEXT_FSQRT
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
{ vfp_single_fcmp, OP_SCALAR }, //0x00000008 - FEXT_FCMP
{ vfp_single_fcmpe, OP_SCALAR }, //0x00000009 - FEXT_FCMPE
{ vfp_single_fcmpz, OP_SCALAR }, //0x0000000A - FEXT_FCMPZ
{ vfp_single_fcmpez, OP_SCALAR }, //0x0000000B - FEXT_FCMPEZ
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
{ vfp_single_fcvtd, OP_SCALAR|OP_DD }, //0x0000000F - FEXT_FCVT
{ vfp_single_fuito, OP_SCALAR }, //0x00000010 - FEXT_FUITO
{ vfp_single_fsito, OP_SCALAR }, //0x00000011 - FEXT_FSITO
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
- { NULL, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
+ { nullptr, 0 },
{ vfp_single_ftoui, OP_SCALAR }, //0x00000018 - FEXT_FTOUI
{ vfp_single_ftouiz, OP_SCALAR }, //0x00000019 - FEXT_FTOUIZ
{ vfp_single_ftosi, OP_SCALAR }, //0x0000001A - FEXT_FTOSI
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index 20f2da0fe..56615502c 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -207,7 +207,7 @@ void ScheduleEvent_Threadsafe(s64 cycles_into_future, int event_type, u64 userda
Event* new_event = GetNewTsEvent();
new_event->time = GetTicks() + cycles_into_future;
new_event->type = event_type;
- new_event->next = 0;
+ new_event->next = nullptr;
new_event->userdata = userdata;
if (!ts_first)
ts_first = new_event;
diff --git a/src/core/file_sys/disk_archive.h b/src/core/file_sys/disk_archive.h
index c5da07508..aaac65b17 100644
--- a/src/core/file_sys/disk_archive.h
+++ b/src/core/file_sys/disk_archive.h
@@ -51,7 +51,6 @@ protected:
class DiskFile : public FileBackend {
public:
- DiskFile();
DiskFile(const DiskArchive& archive, const Path& path, const Mode mode);
bool Open() override;
@@ -73,7 +72,6 @@ protected:
class DiskDirectory : public DirectoryBackend {
public:
- DiskDirectory();
DiskDirectory(const DiskArchive& archive, const Path& path);
~DiskDirectory() override {
diff --git a/src/core/hle/kernel/mutex.h b/src/core/hle/kernel/mutex.h
index d6d5328be..1746360e4 100644
--- a/src/core/hle/kernel/mutex.h
+++ b/src/core/hle/kernel/mutex.h
@@ -38,10 +38,9 @@ public:
void Acquire() override;
/**
- * Acquires the specified mutex for the specified thread
- * @param mutex Mutex that is to be acquired
- * @param thread Thread that will acquire the mutex
- */
+ * Acquires the specified mutex for the specified thread
+ * @param thread Thread that will acquire the mutex
+ */
void Acquire(SharedPtr<Thread> thread);
void Release();
diff --git a/src/core/hle/kernel/semaphore.h b/src/core/hle/kernel/semaphore.h
index d8dc1fd78..390f5e495 100644
--- a/src/core/hle/kernel/semaphore.h
+++ b/src/core/hle/kernel/semaphore.h
@@ -17,7 +17,6 @@ class Semaphore final : public WaitObject {
public:
/**
* Creates a semaphore.
- * @param handle Pointer to the handle of the newly created object
* @param initial_count Number of slots reserved for other threads
* @param max_count Maximum number of slots the semaphore can have
* @param name Optional name of semaphore
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 1ff1d9b97..97ba57fc5 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -57,7 +57,6 @@ public:
* @param arg User data to pass to the thread
* @param processor_id The ID(s) of the processors on which the thread is desired to be run
* @param stack_top The address of the thread's stack top
- * @param stack_size The size of the thread's stack
* @return A shared pointer to the newly created thread
*/
static ResultVal<SharedPtr<Thread>> Create(std::string name, VAddr entry_point, s32 priority,
diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h
index f61125953..6f7048710 100644
--- a/src/core/hle/service/fs/archive.h
+++ b/src/core/hle/service/fs/archive.h
@@ -87,7 +87,7 @@ ResultCode CloseArchive(ArchiveHandle handle);
/**
* Registers an Archive type, instances of which can later be opened using its IdCode.
- * @param backend File system backend interface to the archive
+ * @param factory File system backend interface to the archive
* @param id_code Id code used to access this type of archive
*/
ResultCode RegisterArchiveType(std::unique_ptr<FileSys::ArchiveFactory>&& factory, ArchiveIdCode id_code);
diff --git a/src/core/hle/service/soc_u.cpp b/src/core/hle/service/soc_u.cpp
index d768a3fc7..633b66fe2 100644
--- a/src/core/hle/service/soc_u.cpp
+++ b/src/core/hle/service/soc_u.cpp
@@ -485,7 +485,7 @@ static void GetHostId(Service::Interface* self) {
addrinfo* res;
hints.ai_family = AF_INET;
- getaddrinfo(name, NULL, &hints, &res);
+ getaddrinfo(name, nullptr, &hints, &res);
sockaddr_in* sock_addr = reinterpret_cast<sockaddr_in*>(res->ai_addr);
in_addr* addr = &sock_addr->sin_addr;
diff --git a/src/core/hw/y2r.cpp b/src/core/hw/y2r.cpp
index 082a4db82..15f96ced8 100644
--- a/src/core/hw/y2r.cpp
+++ b/src/core/hw/y2r.cpp
@@ -33,7 +33,9 @@ static void ConvertYUVToRGB(InputFormat input_format,
for (unsigned int y = 0; y < height; ++y) {
for (unsigned int x = 0; x < width; ++x) {
- s32 Y, U, V;
+ s32 Y = 0;
+ s32 U = 0;
+ s32 V = 0;
switch (input_format) {
case InputFormat::YUV422_Indiv8:
case InputFormat::YUV422_Indiv16:
@@ -269,7 +271,7 @@ void PerformConversion(ConversionConfiguration& cvt) {
// LUT used to remap writes to a tile. Used to allow linear or swizzled output without
// requiring two different code paths.
- const u8* tile_remap;
+ const u8* tile_remap = nullptr;
switch (cvt.block_alignment) {
case BlockAlignment::Linear:
tile_remap = linear_lut; break;
@@ -323,7 +325,8 @@ void PerformConversion(ConversionConfiguration& cvt) {
u32* output_buffer = reinterpret_cast<u32*>(data_buffer.get());
for (int i = 0; i < num_tiles; ++i) {
- int image_strip_width, output_stride;
+ int image_strip_width = 0;
+ int output_stride = 0;
switch (cvt.rotation) {
case Rotation::None:
diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp
index 062291006..74eb6e871 100644
--- a/src/core/loader/loader.cpp
+++ b/src/core/loader/loader.cpp
@@ -50,7 +50,7 @@ static FileType IdentifyFile(FileUtil::IOFile& file) {
/**
* Guess the type of a bootable file from its extension
- * @param extension String extension of bootable file
+ * @param extension_ String extension of bootable file
* @return FileType of file
*/
static FileType GuessFromExtension(const std::string& extension_) {
diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h
index b4374a476..d875e4cf3 100644
--- a/src/core/loader/ncch.h
+++ b/src/core/loader/ncch.h
@@ -209,7 +209,9 @@ public:
/**
* Get the RomFS of the application
- * @param buffer Reference to buffer to store data
+ * @param romfs_file Reference to buffer to store data
+ * @param offset Offset in the file to the RomFS
+ * @param size Size of the RomFS in bytes
* @return ResultStatus result of function
*/
ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, u64& size) override;
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index cde390b8a..b80795e0c 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -3,6 +3,7 @@
// Refer to the license.txt file included.
#include <array>
+#include <cstring>
#include "common/assert.h"
#include "common/common_types.h"
@@ -95,7 +96,9 @@ template <typename T>
T Read(const VAddr vaddr) {
const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS];
if (page_pointer) {
- return *reinterpret_cast<const T*>(page_pointer + (vaddr & PAGE_MASK));
+ T value;
+ std::memcpy(&value, &page_pointer[vaddr & PAGE_MASK], sizeof(T));
+ return value;
}
PageType type = current_page_table->attributes[vaddr >> PAGE_BITS];
@@ -117,7 +120,7 @@ template <typename T>
void Write(const VAddr vaddr, const T data) {
u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS];
if (page_pointer) {
- *reinterpret_cast<T*>(page_pointer + (vaddr & PAGE_MASK)) = data;
+ std::memcpy(&page_pointer[vaddr & PAGE_MASK], &data, sizeof(T));
return;
}
@@ -183,19 +186,9 @@ void Write64(const VAddr addr, const u64 data) {
}
void WriteBlock(const VAddr addr, const u8* data, const size_t size) {
- u32 offset = 0;
- while (offset < (size & ~3)) {
- Write32(addr + offset, *(u32*)&data[offset]);
- offset += 4;
- }
-
- if (size & 2) {
- Write16(addr + offset, *(u16*)&data[offset]);
- offset += 2;
- }
-
- if (size & 1)
+ for (u32 offset = 0; offset < size; offset++) {
Write8(addr + offset, data[offset]);
+ }
}
PAddr VirtualToPhysicalAddress(const VAddr addr) {
diff --git a/src/core/tracer/recorder.h b/src/core/tracer/recorder.h
index 6e4b70015..a42ccc45f 100644
--- a/src/core/tracer/recorder.h
+++ b/src/core/tracer/recorder.h
@@ -32,8 +32,7 @@ public:
/**
* Recorder constructor
- * @param default_attributes Pointer to an array of 32-bit-aligned 24-bit floating point values.
- * @param vs_float_uniforms Pointer to an array of 32-bit-aligned 24-bit floating point values.
+ * @param initial_state Initial recorder state
*/
Recorder(const InitialState& initial_state);
diff --git a/src/video_core/clipper.cpp b/src/video_core/clipper.cpp
index bb6048cc0..ed99c4f13 100644
--- a/src/video_core/clipper.cpp
+++ b/src/video_core/clipper.cpp
@@ -4,10 +4,10 @@
#include <boost/container/static_vector.hpp>
-#include "clipper.h"
-#include "pica.h"
-#include "rasterizer.h"
-#include "shader/shader_interpreter.h"
+#include "video_core/clipper.h"
+#include "video_core/pica.h"
+#include "video_core/rasterizer.h"
+#include "video_core/shader/shader_interpreter.h"
namespace Pica {
diff --git a/src/video_core/command_processor.cpp b/src/video_core/command_processor.cpp
index 6e9cb2586..47afd8938 100644
--- a/src/video_core/command_processor.cpp
+++ b/src/video_core/command_processor.cpp
@@ -2,25 +2,24 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <cmath>
#include <boost/range/algorithm/fill.hpp>
#include "common/microprofile.h"
#include "common/profiler.h"
+#include "core/settings.h"
#include "core/hle/service/gsp_gpu.h"
#include "core/hw/gpu.h"
-#include "core/settings.h"
-
-#include "debug_utils/debug_utils.h"
-#include "clipper.h"
-#include "command_processor.h"
-#include "math.h"
-#include "pica.h"
-#include "primitive_assembly.h"
-#include "renderer_base.h"
-#include "shader/shader_interpreter.h"
-#include "video_core.h"
+#include "video_core/clipper.h"
+#include "video_core/command_processor.h"
+#include "video_core/pica.h"
+#include "video_core/primitive_assembly.h"
+#include "video_core/renderer_base.h"
+#include "video_core/video_core.h"
+#include "video_core/debug_utils/debug_utils.h"
+#include "video_core/shader/shader_interpreter.h"
namespace Pica {
diff --git a/src/video_core/debug_utils/debug_utils.cpp b/src/video_core/debug_utils/debug_utils.cpp
index 059445f7d..77a4fe272 100644
--- a/src/video_core/debug_utils/debug_utils.cpp
+++ b/src/video_core/debug_utils/debug_utils.cpp
@@ -31,8 +31,7 @@
#include "video_core/renderer_base.h"
#include "video_core/utils.h"
#include "video_core/video_core.h"
-
-#include "debug_utils.h"
+#include "video_core/debug_utils/debug_utils.h"
using nihstro::DVLBHeader;
using nihstro::DVLEHeader;
@@ -298,7 +297,6 @@ void DumpShader(const std::string& filename, const Regs::ShaderConfig& config, c
}
// Write data to file
- static int dump_index = 0;
std::ofstream file(filename, std::ios_base::out | std::ios_base::binary);
for (auto& chunk : writing_queue) {
@@ -695,7 +693,6 @@ void DumpTexture(const Pica::Regs::TextureConfig& texture_config, u8* data) {
for (unsigned y = 0; y < texture_config.height; ++y)
{
u8* row_ptr = (u8*)buf + y * row_stride;
- u8* ptr = row_ptr;
png_write_row(png_ptr, row_ptr);
}
diff --git a/src/video_core/gpu_debugger.h b/src/video_core/gpu_debugger.h
index 48ac269e3..fae5de7d1 100644
--- a/src/video_core/gpu_debugger.h
+++ b/src/video_core/gpu_debugger.h
@@ -10,9 +10,6 @@
#include "core/hle/service/gsp_gpu.h"
-#include "command_processor.h"
-#include "pica.h"
-
class GraphicsDebugger
{
public:
diff --git a/src/video_core/pica.cpp b/src/video_core/pica.cpp
index 61983bc6c..8c528989e 100644
--- a/src/video_core/pica.cpp
+++ b/src/video_core/pica.cpp
@@ -5,8 +5,8 @@
#include <cstring>
#include <unordered_map>
-#include "pica.h"
-#include "shader/shader.h"
+#include "video_core/pica.h"
+#include "video_core/shader/shader.h"
namespace Pica {
diff --git a/src/video_core/pica.h b/src/video_core/pica.h
index c1dca5087..ff81b409d 100644
--- a/src/video_core/pica.h
+++ b/src/video_core/pica.h
@@ -13,8 +13,8 @@
#include "common/bit_field.h"
#include "common/common_funcs.h"
#include "common/common_types.h"
-#include "common/logging/log.h"
#include "common/vector_math.h"
+#include "common/logging/log.h"
namespace Pica {
diff --git a/src/video_core/primitive_assembly.cpp b/src/video_core/primitive_assembly.cpp
index e2b1df44c..44a8dbfe9 100644
--- a/src/video_core/primitive_assembly.cpp
+++ b/src/video_core/primitive_assembly.cpp
@@ -2,12 +2,12 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "pica.h"
-#include "primitive_assembly.h"
-#include "shader/shader_interpreter.h"
-
#include "common/logging/log.h"
+
+#include "video_core/pica.h"
+#include "video_core/primitive_assembly.h"
#include "video_core/debug_utils/debug_utils.h"
+#include "video_core/shader/shader_interpreter.h"
namespace Pica {
diff --git a/src/video_core/primitive_assembly.h b/src/video_core/primitive_assembly.h
index 80432d68a..52d0ec8ff 100644
--- a/src/video_core/primitive_assembly.h
+++ b/src/video_core/primitive_assembly.h
@@ -8,8 +8,6 @@
#include "video_core/pica.h"
-#include "video_core/shader/shader_interpreter.h"
-
namespace Pica {
/*
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index 77eadda9e..a90ff5fef 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -3,6 +3,7 @@
// Refer to the license.txt file included.
#include <algorithm>
+#include <cmath>
#include "common/color.h"
#include "common/common_types.h"
@@ -10,15 +11,14 @@
#include "common/microprofile.h"
#include "common/profiler.h"
-#include "core/hw/gpu.h"
#include "core/memory.h"
+#include "core/hw/gpu.h"
-#include "debug_utils/debug_utils.h"
-#include "math.h"
-#include "pica.h"
-#include "rasterizer.h"
-#include "shader/shader_interpreter.h"
+#include "video_core/pica.h"
+#include "video_core/rasterizer.h"
#include "video_core/utils.h"
+#include "video_core/debug_utils/debug_utils.h"
+#include "video_core/shader/shader_interpreter.h"
namespace Pica {
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 0260a28ce..50eb157a5 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -12,9 +12,9 @@
#include "common/microprofile.h"
#include "common/profiler.h"
-#include "core/hw/gpu.h"
#include "core/memory.h"
#include "core/settings.h"
+#include "core/hw/gpu.h"
#include "video_core/pica.h"
#include "video_core/utils.h"
@@ -212,9 +212,9 @@ void RasterizerOpenGL::Reset() {
void RasterizerOpenGL::AddTriangle(const Pica::Shader::OutputVertex& v0,
const Pica::Shader::OutputVertex& v1,
const Pica::Shader::OutputVertex& v2) {
- vertex_batch.push_back(HardwareVertex(v0));
- vertex_batch.push_back(HardwareVertex(v1));
- vertex_batch.push_back(HardwareVertex(v2));
+ vertex_batch.emplace_back(v0);
+ vertex_batch.emplace_back(v1);
+ vertex_batch.emplace_back(v2);
}
void RasterizerOpenGL::DrawTriangles() {
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 24560d7f8..1fe307846 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -9,11 +9,10 @@
#include "common/common_types.h"
#include "video_core/hwrasterizer_base.h"
+#include "video_core/renderer_opengl/gl_rasterizer_cache.h"
+#include "video_core/renderer_opengl/gl_state.h"
#include "video_core/shader/shader_interpreter.h"
-#include "gl_state.h"
-#include "gl_rasterizer_cache.h"
-
class RasterizerOpenGL : public HWRasterizer {
public:
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index d9ccf2a3f..10d4ab0b6 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -10,9 +10,9 @@
#include "core/memory.h"
+#include "video_core/debug_utils/debug_utils.h"
#include "video_core/renderer_opengl/gl_rasterizer_cache.h"
#include "video_core/renderer_opengl/pica_to_gl.h"
-#include "video_core/debug_utils/debug_utils.h"
RasterizerCacheOpenGL::~RasterizerCacheOpenGL() {
FullFlush();
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index ec56237b5..98a48ffbe 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -4,13 +4,13 @@
#pragma once
-#include "gl_state.h"
-#include "gl_resource_manager.h"
-#include "video_core/debug_utils/debug_utils.h"
-#include "video_core/pica.h"
-
-#include <memory>
#include <map>
+#include <memory>
+
+#include "video_core/pica.h"
+#include "video_core/debug_utils/debug_utils.h"
+#include "video_core/renderer_opengl/gl_resource_manager.h"
+#include "video_core/renderer_opengl/gl_state.h"
class RasterizerCacheOpenGL : NonCopyable {
public:
diff --git a/src/video_core/renderer_opengl/gl_shader_util.cpp b/src/video_core/renderer_opengl/gl_shader_util.cpp
index 42d0e597c..4cf246c06 100644
--- a/src/video_core/renderer_opengl/gl_shader_util.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_util.cpp
@@ -2,11 +2,11 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "gl_shader_util.h"
-#include "common/logging/log.h"
-
-#include <vector>
#include <algorithm>
+#include <vector>
+
+#include "common/logging/log.h"
+#include "video_core/renderer_opengl/gl_shader_util.h"
namespace ShaderUtil {
diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp
index e02c27fbf..77b2816cb 100644
--- a/src/video_core/renderer_opengl/gl_state.cpp
+++ b/src/video_core/renderer_opengl/gl_state.cpp
@@ -2,8 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "video_core/renderer_opengl/gl_state.h"
#include "video_core/pica.h"
+#include "video_core/renderer_opengl/gl_state.h"
OpenGLState OpenGLState::cur_state;
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 067d072ae..22f261c68 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -11,18 +11,18 @@
#include "common/logging/log.h"
#include "common/profiler_reporting.h"
+#include "core/memory.h"
+#include "core/settings.h"
#include "core/hw/gpu.h"
#include "core/hw/hw.h"
#include "core/hw/lcd.h"
-#include "core/memory.h"
-#include "core/settings.h"
#include "video_core/video_core.h"
-#include "video_core/renderer_opengl/renderer_opengl.h"
+#include "video_core/debug_utils/debug_utils.h"
+#include "video_core/renderer_opengl/gl_rasterizer.h"
#include "video_core/renderer_opengl/gl_shader_util.h"
#include "video_core/renderer_opengl/gl_shaders.h"
-
-#include "video_core/debug_utils/debug_utils.h"
+#include "video_core/renderer_opengl/renderer_opengl.h"
/**
* Vertex structure that the drawn screen rectangles are composed of.
diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h
index 4b023dc98..5677e538b 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.h
+++ b/src/video_core/renderer_opengl/renderer_opengl.h
@@ -8,13 +8,10 @@
#include <glad/glad.h>
-#include "common/math_util.h"
-
#include "core/hw/gpu.h"
#include "video_core/renderer_base.h"
#include "video_core/renderer_opengl/gl_state.h"
-#include "video_core/renderer_opengl/gl_rasterizer.h"
class EmuWindow;
@@ -64,9 +61,6 @@ private:
void LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b,
const TextureInfo& texture);
- /// Computes the viewport rectangle
- MathUtil::Rectangle<unsigned> GetViewportExtent();
-
EmuWindow* render_window; ///< Handle to render window
u32 last_mode; ///< Last render mode
diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp
index f89117521..59f54236b 100644
--- a/src/video_core/shader/shader.cpp
+++ b/src/video_core/shader/shader.cpp
@@ -146,7 +146,6 @@ OutputVertex Run(UnitState<false>& state, const InputVertex& input, int num_attr
DebugData<true> ProduceDebugInfo(const InputVertex& input, int num_attributes, const Regs::ShaderConfig& config, const State::ShaderSetup& setup) {
UnitState<true> state;
- const auto& shader_memory = setup.program_code;
state.program_counter = config.main_offset;
state.debug.max_offset = 0;
state.debug.max_opdesc_id = 0;
diff --git a/src/video_core/shader/shader.h b/src/video_core/shader/shader.h
index bac51ddd8..1c6fa592c 100644
--- a/src/video_core/shader/shader.h
+++ b/src/video_core/shader/shader.h
@@ -289,13 +289,13 @@ struct UnitState {
DebugData<Debug> debug;
- static int InputOffset(const SourceRegister& reg) {
+ static size_t InputOffset(const SourceRegister& reg) {
switch (reg.GetRegisterType()) {
case RegisterType::Input:
- return (int)offsetof(UnitState::Registers, input) + reg.GetIndex()*sizeof(Math::Vec4<float24>);
+ return offsetof(UnitState::Registers, input) + reg.GetIndex()*sizeof(Math::Vec4<float24>);
case RegisterType::Temporary:
- return (int)offsetof(UnitState::Registers, temporary) + reg.GetIndex()*sizeof(Math::Vec4<float24>);
+ return offsetof(UnitState::Registers, temporary) + reg.GetIndex()*sizeof(Math::Vec4<float24>);
default:
UNREACHABLE();
@@ -303,13 +303,13 @@ struct UnitState {
}
}
- static int OutputOffset(const DestRegister& reg) {
+ static size_t OutputOffset(const DestRegister& reg) {
switch (reg.GetRegisterType()) {
case RegisterType::Output:
- return (int)offsetof(UnitState::Registers, output) + reg.GetIndex()*sizeof(Math::Vec4<float24>);
+ return offsetof(UnitState::Registers, output) + reg.GetIndex()*sizeof(Math::Vec4<float24>);
case RegisterType::Temporary:
- return (int)offsetof(UnitState::Registers, temporary) + reg.GetIndex()*sizeof(Math::Vec4<float24>);
+ return offsetof(UnitState::Registers, temporary) + reg.GetIndex()*sizeof(Math::Vec4<float24>);
default:
UNREACHABLE();
diff --git a/src/video_core/shader/shader_interpreter.cpp b/src/video_core/shader/shader_interpreter.cpp
index 69e4efa68..7b0c20b74 100644
--- a/src/video_core/shader/shader_interpreter.cpp
+++ b/src/video_core/shader/shader_interpreter.cpp
@@ -7,9 +7,8 @@
#include <nihstro/shader_bytecode.h>
#include "video_core/pica.h"
-
-#include "shader.h"
-#include "shader_interpreter.h"
+#include "video_core/shader/shader.h"
+#include "video_core/shader/shader_interpreter.h"
using nihstro::OpCode;
using nihstro::Instruction;
diff --git a/src/video_core/shader/shader_interpreter.h b/src/video_core/shader/shader_interpreter.h
index 71bcad5ac..294bca50e 100644
--- a/src/video_core/shader/shader_interpreter.h
+++ b/src/video_core/shader/shader_interpreter.h
@@ -4,9 +4,7 @@
#pragma once
-#include "video_core/pica.h"
-
-#include "shader.h"
+#include "video_core/shader/shader.h"
namespace Pica {
diff --git a/src/video_core/shader/shader_jit_x64.cpp b/src/video_core/shader/shader_jit_x64.cpp
index b9a0b19e3..00415e402 100644
--- a/src/video_core/shader/shader_jit_x64.cpp
+++ b/src/video_core/shader/shader_jit_x64.cpp
@@ -144,7 +144,7 @@ static const u8 NO_DEST_REG_MASK = 0xf;
*/
void JitCompiler::Compile_SwizzleSrc(Instruction instr, unsigned src_num, SourceRegister src_reg, X64Reg dest) {
X64Reg src_ptr;
- int src_offset;
+ size_t src_offset;
if (src_reg.GetRegisterType() == RegisterType::FloatUniform) {
src_ptr = UNIFORMS;
@@ -154,6 +154,9 @@ void JitCompiler::Compile_SwizzleSrc(Instruction instr, unsigned src_num, Source
src_offset = UnitState<false>::InputOffset(src_reg);
}
+ int src_offset_disp = (int)src_offset;
+ ASSERT_MSG(src_offset == src_offset_disp, "Source register offset too large for int type");
+
unsigned operand_desc_id;
if (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MAD ||
instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI) {
@@ -163,7 +166,7 @@ void JitCompiler::Compile_SwizzleSrc(Instruction instr, unsigned src_num, Source
operand_desc_id = instr.mad.operand_desc_id;
// Load the source
- MOVAPS(dest, MDisp(src_ptr, src_offset));
+ MOVAPS(dest, MDisp(src_ptr, src_offset_disp));
} else {
operand_desc_id = instr.common.operand_desc_id;
@@ -173,13 +176,13 @@ void JitCompiler::Compile_SwizzleSrc(Instruction instr, unsigned src_num, Source
if (src_num == offset_src && instr.common.address_register_index != 0) {
switch (instr.common.address_register_index) {
case 1: // address offset 1
- MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_0, 1, src_offset));
+ MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_0, SCALE_1, src_offset_disp));
break;
case 2: // address offset 2
- MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_1, 1, src_offset));
+ MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_1, SCALE_1, src_offset_disp));
break;
- case 3: // adddress offet 3
- MOVAPS(dest, MComplex(src_ptr, LOOPCOUNT_REG, 1, src_offset));
+ case 3: // address offset 3
+ MOVAPS(dest, MComplex(src_ptr, LOOPCOUNT_REG, SCALE_1, src_offset_disp));
break;
default:
UNREACHABLE();
@@ -187,7 +190,7 @@ void JitCompiler::Compile_SwizzleSrc(Instruction instr, unsigned src_num, Source
}
} else {
// Load the source
- MOVAPS(dest, MDisp(src_ptr, src_offset));
+ MOVAPS(dest, MDisp(src_ptr, src_offset_disp));
}
}
@@ -224,14 +227,17 @@ void JitCompiler::Compile_DestEnable(Instruction instr,X64Reg src) {
SwizzlePattern swiz = { g_state.vs.swizzle_data[operand_desc_id] };
+ int dest_offset_disp = (int)UnitState<false>::OutputOffset(dest);
+ ASSERT_MSG(dest_offset_disp == UnitState<false>::OutputOffset(dest), "Destinaton offset too large for int type");
+
// If all components are enabled, write the result to the destination register
if (swiz.dest_mask == NO_DEST_REG_MASK) {
// Store dest back to memory
- MOVAPS(MDisp(REGISTERS, UnitState<false>::OutputOffset(dest)), src);
+ MOVAPS(MDisp(REGISTERS, dest_offset_disp), src);
} else {
// Not all components are enabled, so mask the result when storing to the destination register...
- MOVAPS(SCRATCH, MDisp(REGISTERS, UnitState<false>::OutputOffset(dest)));
+ MOVAPS(SCRATCH, MDisp(REGISTERS, dest_offset_disp));
if (Common::GetCPUCaps().sse4_1) {
u8 mask = ((swiz.dest_mask & 1) << 3) | ((swiz.dest_mask & 8) >> 3) | ((swiz.dest_mask & 2) << 1) | ((swiz.dest_mask & 4) >> 1);
@@ -250,7 +256,7 @@ void JitCompiler::Compile_DestEnable(Instruction instr,X64Reg src) {
}
// Store dest back to memory
- MOVAPS(MDisp(REGISTERS, UnitState<false>::OutputOffset(dest)), SCRATCH);
+ MOVAPS(MDisp(REGISTERS, dest_offset_disp), SCRATCH);
}
}
@@ -743,7 +749,6 @@ void JitCompiler::Compile_NextInstr(unsigned* offset) {
CompiledShader* JitCompiler::Compile() {
const u8* start = GetCodePtr();
- const auto& code = g_state.vs.program_code;
unsigned offset = g_state.regs.vs.main_offset;
// The stack pointer is 8 modulo 16 at the entry of a procedure
diff --git a/src/video_core/shader/shader_jit_x64.h b/src/video_core/shader/shader_jit_x64.h
index 8668cfff4..3afbceccf 100644
--- a/src/video_core/shader/shader_jit_x64.h
+++ b/src/video_core/shader/shader_jit_x64.h
@@ -9,8 +9,7 @@
#include "common/x64/emitter.h"
#include "video_core/pica.h"
-
-#include "shader.h"
+#include "video_core/shader/shader.h"
using nihstro::Instruction;
using nihstro::OpCode;
diff --git a/src/video_core/utils.cpp b/src/video_core/utils.cpp
index c7cc93cea..6e1ff5cf4 100644
--- a/src/video_core/utils.cpp
+++ b/src/video_core/utils.cpp
@@ -2,8 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <stdio.h>
-#include <string.h>
+#include <cstdio>
+#include <cstring>
#include "video_core/utils.h"
diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp
index 943fde5ee..eaddda668 100644
--- a/src/video_core/video_core.cpp
+++ b/src/video_core/video_core.cpp
@@ -2,17 +2,16 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "common/logging/log.h"
#include "common/emu_window.h"
+#include "common/logging/log.h"
#include "core/core.h"
#include "core/settings.h"
-#include "video_core.h"
-#include "renderer_base.h"
-#include "renderer_opengl/renderer_opengl.h"
-
-#include "pica.h"
+#include "video_core/pica.h"
+#include "video_core/renderer_base.h"
+#include "video_core/video_core.h"
+#include "video_core/renderer_opengl/renderer_opengl.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// Video Core namespace