diff --git a/.ci/clang-format.sh b/.ci/clang-format.sh index a357de5a..0ccd4062 100755 --- a/.ci/clang-format.sh +++ b/.ci/clang-format.sh @@ -10,7 +10,7 @@ if grep -nrI '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .ci* dis fi # Default clang-format points to default 3.5 version one -CLANG_FORMAT=clang-format-15 +CLANG_FORMAT=clang-format-17 $CLANG_FORMAT --version if [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 4664b81a..70b23832 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -17,7 +17,11 @@ jobs: with: fetch-depth: 0 - name: Install - run: sudo apt-get install clang-format-15 + run: | + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main' + sudo apt update + sudo apt install clang-format-17 - name: Build env: COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 4380fca6..3a7f732e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,7 @@ endfunction() # against all the src files. This should be used before making a pull request. # ======================================================================= -set(CLANG_FORMAT_POSTFIX "-15") +set(CLANG_FORMAT_POSTFIX "-17") find_program(CLANG_FORMAT NAMES clang-format${CLANG_FORMAT_POSTFIX} clang-format diff --git a/src/common/config.cpp b/src/common/config.cpp index 99de5256..f43d5ef4 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -12,7 +12,7 @@ namespace Config { bool isNeo = false; u32 screenWidth = 1280; u32 screenHeight = 720; -u32 gpuId = 0; // Vulkan physical device no +s32 gpuId = -1; // Vulkan physical device index. Set to negative for auto select std::string logFilter; std::string logType = "sync"; bool isDebugDump = false; @@ -33,7 +33,7 @@ u32 getScreenHeight() { return screenHeight; } -u32 getGpuId() { +s32 getGpuId() { return gpuId; } diff --git a/src/common/config.h b/src/common/config.h index 529fc230..96b2a957 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -16,7 +16,7 @@ std::string getLogType(); u32 getScreenWidth(); u32 getScreenHeight(); -u32 getGpuId(); +s32 getGpuId(); bool debugDump(); bool isLleLibc(); diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 1d68055d..365fcb5d 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include #include @@ -39,16 +40,34 @@ Instance::Instance(bool enable_validation, bool dump_command_buffers) dump_command_buffers)}, physical_devices{instance->enumeratePhysicalDevices()} {} -Instance::Instance(Frontend::WindowSDL& window, u32 physical_device_index) +Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index) : instance{CreateInstance(dl, window.getWindowInfo().type, true, false)}, - debug_callback{CreateDebugCallback(*instance)}, physical_devices{ - instance->enumeratePhysicalDevices()} { + debug_callback{CreateDebugCallback(*instance)}, + physical_devices{instance->enumeratePhysicalDevices()} { const std::size_t num_physical_devices = static_cast(physical_devices.size()); - ASSERT_MSG(physical_device_index < num_physical_devices, - "Invalid physical device index {} provided when only {} devices exist", - physical_device_index, num_physical_devices); + ASSERT_MSG(num_physical_devices > 0, "No physical devices found"); + + if (physical_device_index < 0) { + std::vector> properties2{}; + for (auto const& physical : physical_devices) { + properties2.emplace_back(properties2.size(), physical.getProperties2()); + } + std::sort(properties2.begin(), properties2.end(), [](const auto& left, const auto& right) { + if (std::get<1>(left).properties.deviceType == + std::get<1>(right).properties.deviceType) { + return true; + } + return std::get<1>(left).properties.deviceType == vk::PhysicalDeviceType::eDiscreteGpu; + }); + physical_device = physical_devices[std::get<0>(properties2[0])]; + } else { + ASSERT_MSG(physical_device_index < num_physical_devices, + "Invalid physical device index {} provided when only {} devices exist", + physical_device_index, num_physical_devices); + + physical_device = physical_devices[physical_device_index]; + } - physical_device = physical_devices[physical_device_index]; available_extensions = GetSupportedExtensions(physical_device); properties = physical_device.getProperties(); if (properties.apiVersion < TargetVulkanApiVersion) { diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 59be14d4..5e1be6ce 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -18,7 +18,7 @@ namespace Vulkan { class Instance { public: explicit Instance(bool validation = false, bool dump_command_buffers = false); - explicit Instance(Frontend::WindowSDL& window, u32 physical_device_index); + explicit Instance(Frontend::WindowSDL& window, s32 physical_device_index); ~Instance(); /// Returns a formatted string for the driver version