Merge branch 'shadps4-emu:main' into main
This commit is contained in:
commit
e014ec0714
|
@ -10,7 +10,6 @@ on:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -19,8 +18,8 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Fetch submodules
|
with:
|
||||||
run: git submodule update --init --recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Install misc packages
|
- name: Install misc packages
|
||||||
run: >
|
run: >
|
||||||
|
|
|
@ -8,10 +8,8 @@ on:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
|
@ -8,10 +8,8 @@ on:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -36,10 +34,11 @@ jobs:
|
||||||
- name: Setup Qt
|
- name: Setup Qt
|
||||||
uses: jurplel/install-qt-action@v4
|
uses: jurplel/install-qt-action@v4
|
||||||
with:
|
with:
|
||||||
|
version: 6.7.2
|
||||||
host: mac
|
host: mac
|
||||||
target: desktop
|
target: desktop
|
||||||
arch: clang_64
|
arch: clang_64
|
||||||
version: 6.7.2
|
archives: qtbase
|
||||||
|
|
||||||
- name: Configure CMake
|
- name: Configure CMake
|
||||||
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_OSX_ARCHITECTURES=x86_64 -DENABLE_QT_GUI=ON
|
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_OSX_ARCHITECTURES=x86_64 -DENABLE_QT_GUI=ON
|
||||||
|
|
|
@ -8,10 +8,8 @@ on:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
|
@ -10,12 +10,8 @@ on:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
@ -35,12 +31,9 @@ jobs:
|
||||||
archives: qtbase
|
archives: qtbase
|
||||||
|
|
||||||
- name: Configure CMake
|
- name: Configure CMake
|
||||||
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
|
||||||
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
|
|
||||||
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -T ClangCL -DENABLE_QT_GUI=ON
|
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -T ClangCL -DENABLE_QT_GUI=ON
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
# Build your program with the given configuration
|
|
||||||
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
||||||
|
|
||||||
- name: Deploy
|
- name: Deploy
|
||||||
|
|
|
@ -10,12 +10,8 @@ on:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
@ -25,16 +21,14 @@ jobs:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Configure CMake
|
- name: Configure CMake
|
||||||
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
|
||||||
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
|
|
||||||
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -T ClangCL
|
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -T ClangCL
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
# Build your program with the given configuration
|
|
||||||
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
||||||
- name: Upload a Build Artifact
|
|
||||||
|
- name: Upload executable
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: shadps4-win64
|
name: shadps4-win64
|
||||||
# A file, directory or wildcard pattern that describes what to upload
|
|
||||||
path: |
|
path: |
|
||||||
${{github.workspace}}/build/Release/shadPS4.exe
|
${{github.workspace}}/build/Release/shadPS4.exe
|
||||||
|
|
|
@ -59,7 +59,14 @@ endif()
|
||||||
|
|
||||||
# SDL3
|
# SDL3
|
||||||
if (NOT TARGET SDL3::SDL3)
|
if (NOT TARGET SDL3::SDL3)
|
||||||
|
set(SDL_DIRECTX OFF)
|
||||||
|
set(SDL_MMX OFF)
|
||||||
|
set(SDL_OPENGL OFF)
|
||||||
|
set(SDL_OPENGLES OFF)
|
||||||
set(SDL_PIPEWIRE OFF)
|
set(SDL_PIPEWIRE OFF)
|
||||||
|
set(SDL_RENDER_D3D OFF)
|
||||||
|
set(SDL_WASAPI OFF)
|
||||||
|
set(SDL_XINPUT OFF)
|
||||||
add_subdirectory(sdl3)
|
add_subdirectory(sdl3)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -51,8 +51,8 @@ bool MainWindow::Init() {
|
||||||
this->setStatusBar(statusBar.data());
|
this->setStatusBar(statusBar.data());
|
||||||
// Update status bar
|
// Update status bar
|
||||||
int numGames = m_game_info->m_games.size();
|
int numGames = m_game_info->m_games.size();
|
||||||
QString statusMessage = "Games: " + QString::number(numGames) + " (" +
|
QString statusMessage =
|
||||||
QString::number(duration.count()) + "ms). Ready.";
|
"Games: " + QString::number(numGames) + " (" + QString::number(duration.count()) + "ms)";
|
||||||
statusBar->showMessage(statusMessage);
|
statusBar->showMessage(statusMessage);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -72,8 +72,8 @@ void MainWindow::CreateActions() {
|
||||||
|
|
||||||
// create action group for themes
|
// create action group for themes
|
||||||
m_theme_act_group = new QActionGroup(this);
|
m_theme_act_group = new QActionGroup(this);
|
||||||
m_theme_act_group->addAction(ui->setThemeLight);
|
|
||||||
m_theme_act_group->addAction(ui->setThemeDark);
|
m_theme_act_group->addAction(ui->setThemeDark);
|
||||||
|
m_theme_act_group->addAction(ui->setThemeLight);
|
||||||
m_theme_act_group->addAction(ui->setThemeGreen);
|
m_theme_act_group->addAction(ui->setThemeGreen);
|
||||||
m_theme_act_group->addAction(ui->setThemeBlue);
|
m_theme_act_group->addAction(ui->setThemeBlue);
|
||||||
m_theme_act_group->addAction(ui->setThemeViolet);
|
m_theme_act_group->addAction(ui->setThemeViolet);
|
||||||
|
@ -322,14 +322,6 @@ void MainWindow::CreateConnects() {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Themes
|
// Themes
|
||||||
connect(ui->setThemeLight, &QAction::triggered, &m_window_themes, [this]() {
|
|
||||||
m_window_themes.SetWindowTheme(Theme::Light, ui->mw_searchbar);
|
|
||||||
Config::setMainWindowTheme(static_cast<int>(Theme::Light));
|
|
||||||
if (!isIconBlack) {
|
|
||||||
SetUiIcons(true);
|
|
||||||
isIconBlack = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
connect(ui->setThemeDark, &QAction::triggered, &m_window_themes, [this]() {
|
connect(ui->setThemeDark, &QAction::triggered, &m_window_themes, [this]() {
|
||||||
m_window_themes.SetWindowTheme(Theme::Dark, ui->mw_searchbar);
|
m_window_themes.SetWindowTheme(Theme::Dark, ui->mw_searchbar);
|
||||||
Config::setMainWindowTheme(static_cast<int>(Theme::Dark));
|
Config::setMainWindowTheme(static_cast<int>(Theme::Dark));
|
||||||
|
@ -338,6 +330,14 @@ void MainWindow::CreateConnects() {
|
||||||
isIconBlack = false;
|
isIconBlack = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
connect(ui->setThemeLight, &QAction::triggered, &m_window_themes, [this]() {
|
||||||
|
m_window_themes.SetWindowTheme(Theme::Light, ui->mw_searchbar);
|
||||||
|
Config::setMainWindowTheme(static_cast<int>(Theme::Light));
|
||||||
|
if (!isIconBlack) {
|
||||||
|
SetUiIcons(true);
|
||||||
|
isIconBlack = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
connect(ui->setThemeGreen, &QAction::triggered, &m_window_themes, [this]() {
|
connect(ui->setThemeGreen, &QAction::triggered, &m_window_themes, [this]() {
|
||||||
m_window_themes.SetWindowTheme(Theme::Green, ui->mw_searchbar);
|
m_window_themes.SetWindowTheme(Theme::Green, ui->mw_searchbar);
|
||||||
Config::setMainWindowTheme(static_cast<int>(Theme::Green));
|
Config::setMainWindowTheme(static_cast<int>(Theme::Green));
|
||||||
|
@ -420,7 +420,7 @@ void MainWindow::RefreshGameTable() {
|
||||||
m_game_grid_frame->PopulateGameGrid(m_game_info->m_games, false);
|
m_game_grid_frame->PopulateGameGrid(m_game_info->m_games, false);
|
||||||
statusBar->clearMessage();
|
statusBar->clearMessage();
|
||||||
int numGames = m_game_info->m_games.size();
|
int numGames = m_game_info->m_games.size();
|
||||||
QString statusMessage = "Games: " + QString::number(numGames) + ". Ready.";
|
QString statusMessage = "Games: " + QString::number(numGames);
|
||||||
statusBar->showMessage(statusMessage);
|
statusBar->showMessage(statusMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -297,7 +297,7 @@ public:
|
||||||
menuRecent->setTitle(QCoreApplication::translate("MainWindow", "Recent Games", nullptr));
|
menuRecent->setTitle(QCoreApplication::translate("MainWindow", "Recent Games", nullptr));
|
||||||
exitAct->setText(QCoreApplication::translate("MainWindow", "Exit", nullptr));
|
exitAct->setText(QCoreApplication::translate("MainWindow", "Exit", nullptr));
|
||||||
#if QT_CONFIG(tooltip)
|
#if QT_CONFIG(tooltip)
|
||||||
exitAct->setToolTip(QCoreApplication::translate("MainWindow", "Exit Shadps4", nullptr));
|
exitAct->setToolTip(QCoreApplication::translate("MainWindow", "Exit shadPS4", nullptr));
|
||||||
#endif // QT_CONFIG(tooltip)
|
#endif // QT_CONFIG(tooltip)
|
||||||
#if QT_CONFIG(statustip)
|
#if QT_CONFIG(statustip)
|
||||||
exitAct->setStatusTip(
|
exitAct->setStatusTip(
|
||||||
|
|
|
@ -129,7 +129,7 @@ Id EmitReadConst(EmitContext& ctx) {
|
||||||
Id EmitReadConstBuffer(EmitContext& ctx, u32 handle, Id index) {
|
Id EmitReadConstBuffer(EmitContext& ctx, u32 handle, Id index) {
|
||||||
auto& buffer = ctx.buffers[handle];
|
auto& buffer = ctx.buffers[handle];
|
||||||
if (!Sirit::ValidId(buffer.offset)) {
|
if (!Sirit::ValidId(buffer.offset)) {
|
||||||
buffer.offset = ctx.GetBufferOffset(handle);
|
buffer.offset = ctx.GetBufferOffset(buffer.global_binding);
|
||||||
}
|
}
|
||||||
const Id offset_dwords{ctx.OpShiftRightLogical(ctx.U32[1], buffer.offset, ctx.ConstU32(2U))};
|
const Id offset_dwords{ctx.OpShiftRightLogical(ctx.U32[1], buffer.offset, ctx.ConstU32(2U))};
|
||||||
index = ctx.OpIAdd(ctx.U32[1], index, offset_dwords);
|
index = ctx.OpIAdd(ctx.U32[1], index, offset_dwords);
|
||||||
|
@ -230,7 +230,7 @@ template <u32 N>
|
||||||
static Id EmitLoadBufferF32xN(EmitContext& ctx, u32 handle, Id address) {
|
static Id EmitLoadBufferF32xN(EmitContext& ctx, u32 handle, Id address) {
|
||||||
auto& buffer = ctx.buffers[handle];
|
auto& buffer = ctx.buffers[handle];
|
||||||
if (!Sirit::ValidId(buffer.offset)) {
|
if (!Sirit::ValidId(buffer.offset)) {
|
||||||
buffer.offset = ctx.GetBufferOffset(handle);
|
buffer.offset = ctx.GetBufferOffset(buffer.global_binding);
|
||||||
}
|
}
|
||||||
address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset);
|
address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset);
|
||||||
const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u));
|
const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u));
|
||||||
|
@ -412,7 +412,7 @@ template <u32 N>
|
||||||
static Id EmitLoadBufferFormatF32xN(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
static Id EmitLoadBufferFormatF32xN(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||||
auto& buffer = ctx.buffers[handle];
|
auto& buffer = ctx.buffers[handle];
|
||||||
if (!Sirit::ValidId(buffer.offset)) {
|
if (!Sirit::ValidId(buffer.offset)) {
|
||||||
buffer.offset = ctx.GetBufferOffset(handle);
|
buffer.offset = ctx.GetBufferOffset(buffer.global_binding);
|
||||||
}
|
}
|
||||||
address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset);
|
address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset);
|
||||||
if constexpr (N == 1) {
|
if constexpr (N == 1) {
|
||||||
|
@ -446,7 +446,7 @@ template <u32 N>
|
||||||
static void EmitStoreBufferF32xN(EmitContext& ctx, u32 handle, Id address, Id value) {
|
static void EmitStoreBufferF32xN(EmitContext& ctx, u32 handle, Id address, Id value) {
|
||||||
auto& buffer = ctx.buffers[handle];
|
auto& buffer = ctx.buffers[handle];
|
||||||
if (!Sirit::ValidId(buffer.offset)) {
|
if (!Sirit::ValidId(buffer.offset)) {
|
||||||
buffer.offset = ctx.GetBufferOffset(handle);
|
buffer.offset = ctx.GetBufferOffset(buffer.global_binding);
|
||||||
}
|
}
|
||||||
address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset);
|
address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset);
|
||||||
const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u));
|
const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u));
|
||||||
|
|
|
@ -352,9 +352,9 @@ void EmitContext::DefineBuffers() {
|
||||||
Decorate(id, spv::Decoration::DescriptorSet, 0U);
|
Decorate(id, spv::Decoration::DescriptorSet, 0U);
|
||||||
Name(id, fmt::format("{}_{}", buffer.is_storage ? "ssbo" : "cbuf", buffer.sgpr_base));
|
Name(id, fmt::format("{}_{}", buffer.is_storage ? "ssbo" : "cbuf", buffer.sgpr_base));
|
||||||
|
|
||||||
binding++;
|
|
||||||
buffers.push_back({
|
buffers.push_back({
|
||||||
.id = id,
|
.id = id,
|
||||||
|
.global_binding = binding++,
|
||||||
.data_types = data_types,
|
.data_types = data_types,
|
||||||
.pointer_type = pointer_type,
|
.pointer_type = pointer_type,
|
||||||
.buffer = buffer.GetVsharp(info),
|
.buffer = buffer.GetVsharp(info),
|
||||||
|
|
|
@ -203,6 +203,7 @@ public:
|
||||||
struct BufferDefinition {
|
struct BufferDefinition {
|
||||||
Id id;
|
Id id;
|
||||||
Id offset;
|
Id offset;
|
||||||
|
u32 global_binding;
|
||||||
const VectorIds* data_types;
|
const VectorIds* data_types;
|
||||||
Id pointer_type;
|
Id pointer_type;
|
||||||
AmdGpu::Buffer buffer;
|
AmdGpu::Buffer buffer;
|
||||||
|
|
|
@ -125,7 +125,7 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache,
|
||||||
const u32 adjust = offset - offset_aligned;
|
const u32 adjust = offset - offset_aligned;
|
||||||
if (adjust != 0) {
|
if (adjust != 0) {
|
||||||
ASSERT(adjust % 4 == 0);
|
ASSERT(adjust % 4 == 0);
|
||||||
push_data.AddOffset(i, adjust);
|
push_data.AddOffset(binding, adjust);
|
||||||
}
|
}
|
||||||
buffer_infos.emplace_back(vk_buffer->Handle(), offset_aligned, size + adjust);
|
buffer_infos.emplace_back(vk_buffer->Handle(), offset_aligned, size + adjust);
|
||||||
set_writes.push_back({
|
set_writes.push_back({
|
||||||
|
|
|
@ -343,7 +343,7 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
|
||||||
push_data.step0 = regs.vgt_instance_step_rate_0;
|
push_data.step0 = regs.vgt_instance_step_rate_0;
|
||||||
push_data.step1 = regs.vgt_instance_step_rate_1;
|
push_data.step1 = regs.vgt_instance_step_rate_1;
|
||||||
}
|
}
|
||||||
for (u32 i = 0; const auto& buffer : stage.buffers) {
|
for (const auto& buffer : stage.buffers) {
|
||||||
const auto vsharp = buffer.GetVsharp(stage);
|
const auto vsharp = buffer.GetVsharp(stage);
|
||||||
if (vsharp) {
|
if (vsharp) {
|
||||||
const VAddr address = vsharp.base_address;
|
const VAddr address = vsharp.base_address;
|
||||||
|
@ -359,7 +359,7 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
|
||||||
const u32 adjust = offset - offset_aligned;
|
const u32 adjust = offset - offset_aligned;
|
||||||
if (adjust != 0) {
|
if (adjust != 0) {
|
||||||
ASSERT(adjust % 4 == 0);
|
ASSERT(adjust % 4 == 0);
|
||||||
push_data.AddOffset(i, adjust);
|
push_data.AddOffset(binding, adjust);
|
||||||
}
|
}
|
||||||
buffer_infos.emplace_back(vk_buffer->Handle(), offset_aligned, size + adjust);
|
buffer_infos.emplace_back(vk_buffer->Handle(), offset_aligned, size + adjust);
|
||||||
} else {
|
} else {
|
||||||
|
@ -374,7 +374,6 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
|
||||||
: vk::DescriptorType::eUniformBuffer,
|
: vk::DescriptorType::eUniformBuffer,
|
||||||
.pBufferInfo = &buffer_infos.back(),
|
.pBufferInfo = &buffer_infos.back(),
|
||||||
});
|
});
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::container::static_vector<AmdGpu::Image, 16> tsharps;
|
boost::container::static_vector<AmdGpu::Image, 16> tsharps;
|
||||||
|
|
Loading…
Reference in New Issue