diff options
Diffstat (limited to 'src')
22 files changed, 114 insertions, 85 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 47418006b..cb9ced5c9 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -606,11 +606,11 @@ endif() | |||
| 606 | create_target_directory_groups(core) | 606 | create_target_directory_groups(core) |
| 607 | 607 | ||
| 608 | target_link_libraries(core PUBLIC common PRIVATE audio_core video_core) | 608 | target_link_libraries(core PUBLIC common PRIVATE audio_core video_core) |
| 609 | target_link_libraries(core PUBLIC Boost::boost PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls Opus::Opus unicorn) | 609 | target_link_libraries(core PUBLIC Boost::boost PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls Opus::Opus unicorn zip) |
| 610 | 610 | ||
| 611 | if (YUZU_ENABLE_BOXCAT) | 611 | if (YUZU_ENABLE_BOXCAT) |
| 612 | target_compile_definitions(core PRIVATE -DYUZU_ENABLE_BOXCAT) | 612 | target_compile_definitions(core PRIVATE -DYUZU_ENABLE_BOXCAT) |
| 613 | target_link_libraries(core PRIVATE httplib nlohmann_json::nlohmann_json zip) | 613 | target_link_libraries(core PRIVATE httplib nlohmann_json::nlohmann_json) |
| 614 | endif() | 614 | endif() |
| 615 | 615 | ||
| 616 | if (ENABLE_WEB_SERVICE) | 616 | if (ENABLE_WEB_SERVICE) |
diff --git a/src/core/file_sys/system_archive/mii_model.cpp b/src/core/file_sys/system_archive/mii_model.cpp index 6a9add87c..61bb67945 100644 --- a/src/core/file_sys/system_archive/mii_model.cpp +++ b/src/core/file_sys/system_archive/mii_model.cpp | |||
| @@ -40,7 +40,7 @@ VirtualDir MiiModel() { | |||
| 40 | out->AddFile(std::make_shared<ArrayVfsFile<MiiModelData::SHAPE_MID.size()>>( | 40 | out->AddFile(std::make_shared<ArrayVfsFile<MiiModelData::SHAPE_MID.size()>>( |
| 41 | MiiModelData::SHAPE_MID, "ShapeMid.dat")); | 41 | MiiModelData::SHAPE_MID, "ShapeMid.dat")); |
| 42 | 42 | ||
| 43 | return std::move(out); | 43 | return out; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | } // namespace FileSys::SystemArchive | 46 | } // namespace FileSys::SystemArchive |
diff --git a/src/core/file_sys/system_archive/shared_font.cpp b/src/core/file_sys/system_archive/shared_font.cpp index 2c05eb42e..c5cdf7d9b 100644 --- a/src/core/file_sys/system_archive/shared_font.cpp +++ b/src/core/file_sys/system_archive/shared_font.cpp | |||
| @@ -23,7 +23,7 @@ VirtualFile PackBFTTF(const std::array<u8, Size>& data, const std::string& name) | |||
| 23 | 23 | ||
| 24 | std::vector<u8> bfttf(Size + sizeof(u64)); | 24 | std::vector<u8> bfttf(Size + sizeof(u64)); |
| 25 | 25 | ||
| 26 | u64 offset = 0; | 26 | size_t offset = 0; |
| 27 | Service::NS::EncryptSharedFont(vec, bfttf, offset); | 27 | Service::NS::EncryptSharedFont(vec, bfttf, offset); |
| 28 | return std::make_shared<VectorVfsFile>(std::move(bfttf), name); | 28 | return std::make_shared<VectorVfsFile>(std::move(bfttf), name); |
| 29 | } | 29 | } |
diff --git a/src/core/hle/kernel/memory/memory_manager.cpp b/src/core/hle/kernel/memory/memory_manager.cpp index 6b432e1b2..616148190 100644 --- a/src/core/hle/kernel/memory/memory_manager.cpp +++ b/src/core/hle/kernel/memory/memory_manager.cpp | |||
| @@ -104,7 +104,7 @@ ResultCode MemoryManager::Allocate(PageLinkedList& page_list, std::size_t num_pa | |||
| 104 | // Ensure that we don't leave anything un-freed | 104 | // Ensure that we don't leave anything un-freed |
| 105 | auto group_guard = detail::ScopeExit([&] { | 105 | auto group_guard = detail::ScopeExit([&] { |
| 106 | for (const auto& it : page_list.Nodes()) { | 106 | for (const auto& it : page_list.Nodes()) { |
| 107 | const auto min_num_pages{std::min( | 107 | const auto min_num_pages{std::min<size_t>( |
| 108 | it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)}; | 108 | it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)}; |
| 109 | chosen_manager.Free(it.GetAddress(), min_num_pages); | 109 | chosen_manager.Free(it.GetAddress(), min_num_pages); |
| 110 | } | 110 | } |
| @@ -165,7 +165,7 @@ ResultCode MemoryManager::Free(PageLinkedList& page_list, std::size_t num_pages, | |||
| 165 | 165 | ||
| 166 | // Free all of the pages | 166 | // Free all of the pages |
| 167 | for (const auto& it : page_list.Nodes()) { | 167 | for (const auto& it : page_list.Nodes()) { |
| 168 | const auto min_num_pages{std::min( | 168 | const auto min_num_pages{std::min<size_t>( |
| 169 | it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)}; | 169 | it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)}; |
| 170 | chosen_manager.Free(it.GetAddress(), min_num_pages); | 170 | chosen_manager.Free(it.GetAddress(), min_num_pages); |
| 171 | } | 171 | } |
diff --git a/src/input_common/keyboard.cpp b/src/input_common/keyboard.cpp index 078374be5..afb8e6612 100644 --- a/src/input_common/keyboard.cpp +++ b/src/input_common/keyboard.cpp | |||
| @@ -76,7 +76,7 @@ std::unique_ptr<Input::ButtonDevice> Keyboard::Create(const Common::ParamPackage | |||
| 76 | int key_code = params.Get("code", 0); | 76 | int key_code = params.Get("code", 0); |
| 77 | std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list); | 77 | std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list); |
| 78 | key_button_list->AddKeyButton(key_code, button.get()); | 78 | key_button_list->AddKeyButton(key_code, button.get()); |
| 79 | return std::move(button); | 79 | return button; |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | void Keyboard::PressKey(int key_code) { | 82 | void Keyboard::PressKey(int key_code) { |
diff --git a/src/input_common/motion_emu.cpp b/src/input_common/motion_emu.cpp index 868251628..d4cdf76a3 100644 --- a/src/input_common/motion_emu.cpp +++ b/src/input_common/motion_emu.cpp | |||
| @@ -145,7 +145,7 @@ std::unique_ptr<Input::MotionDevice> MotionEmu::Create(const Common::ParamPackag | |||
| 145 | // Previously created device is disconnected here. Having two motion devices for 3DS is not | 145 | // Previously created device is disconnected here. Having two motion devices for 3DS is not |
| 146 | // expected. | 146 | // expected. |
| 147 | current_device = device_wrapper->device; | 147 | current_device = device_wrapper->device; |
| 148 | return std::move(device_wrapper); | 148 | return device_wrapper; |
| 149 | } | 149 | } |
| 150 | 150 | ||
| 151 | void MotionEmu::BeginTilt(int x, int y) { | 151 | void MotionEmu::BeginTilt(int x, int y) { |
diff --git a/src/video_core/macro/macro_jit_x64.cpp b/src/video_core/macro/macro_jit_x64.cpp index 9eface47e..30abb66e5 100644 --- a/src/video_core/macro/macro_jit_x64.cpp +++ b/src/video_core/macro/macro_jit_x64.cpp | |||
| @@ -54,7 +54,7 @@ void MacroJITx64Impl::Compile_ALU(Macro::Opcode opcode) { | |||
| 54 | const bool is_a_zero = opcode.src_a == 0; | 54 | const bool is_a_zero = opcode.src_a == 0; |
| 55 | const bool is_b_zero = opcode.src_b == 0; | 55 | const bool is_b_zero = opcode.src_b == 0; |
| 56 | const bool valid_operation = !is_a_zero && !is_b_zero; | 56 | const bool valid_operation = !is_a_zero && !is_b_zero; |
| 57 | const bool is_move_operation = !is_a_zero && is_b_zero; | 57 | [[maybe_unused]] const bool is_move_operation = !is_a_zero && is_b_zero; |
| 58 | const bool has_zero_register = is_a_zero || is_b_zero; | 58 | const bool has_zero_register = is_a_zero || is_b_zero; |
| 59 | const bool no_zero_reg_skip = opcode.alu_operation == Macro::ALUOperation::AddWithCarry || | 59 | const bool no_zero_reg_skip = opcode.alu_operation == Macro::ALUOperation::AddWithCarry || |
| 60 | opcode.alu_operation == Macro::ALUOperation::SubtractWithBorrow; | 60 | opcode.alu_operation == Macro::ALUOperation::SubtractWithBorrow; |
| @@ -73,7 +73,6 @@ void MacroJITx64Impl::Compile_ALU(Macro::Opcode opcode) { | |||
| 73 | src_b = Compile_GetRegister(opcode.src_b, eax); | 73 | src_b = Compile_GetRegister(opcode.src_b, eax); |
| 74 | } | 74 | } |
| 75 | } | 75 | } |
| 76 | Xbyak::Label skip_carry{}; | ||
| 77 | 76 | ||
| 78 | bool has_emitted = false; | 77 | bool has_emitted = false; |
| 79 | 78 | ||
| @@ -240,10 +239,10 @@ void MacroJITx64Impl::Compile_ExtractInsert(Macro::Opcode opcode) { | |||
| 240 | } | 239 | } |
| 241 | 240 | ||
| 242 | void MacroJITx64Impl::Compile_ExtractShiftLeftImmediate(Macro::Opcode opcode) { | 241 | void MacroJITx64Impl::Compile_ExtractShiftLeftImmediate(Macro::Opcode opcode) { |
| 243 | auto dst = Compile_GetRegister(opcode.src_a, eax); | 242 | const auto dst = Compile_GetRegister(opcode.src_a, ecx); |
| 244 | auto src = Compile_GetRegister(opcode.src_b, RESULT); | 243 | const auto src = Compile_GetRegister(opcode.src_b, RESULT); |
| 245 | 244 | ||
| 246 | shr(src, al); | 245 | shr(src, dst.cvt8()); |
| 247 | if (opcode.bf_size != 0 && opcode.bf_size != 31) { | 246 | if (opcode.bf_size != 0 && opcode.bf_size != 31) { |
| 248 | and_(src, opcode.GetBitfieldMask()); | 247 | and_(src, opcode.GetBitfieldMask()); |
| 249 | } else if (opcode.bf_size == 0) { | 248 | } else if (opcode.bf_size == 0) { |
| @@ -259,8 +258,8 @@ void MacroJITx64Impl::Compile_ExtractShiftLeftImmediate(Macro::Opcode opcode) { | |||
| 259 | } | 258 | } |
| 260 | 259 | ||
| 261 | void MacroJITx64Impl::Compile_ExtractShiftLeftRegister(Macro::Opcode opcode) { | 260 | void MacroJITx64Impl::Compile_ExtractShiftLeftRegister(Macro::Opcode opcode) { |
| 262 | auto dst = Compile_GetRegister(opcode.src_a, eax); | 261 | const auto dst = Compile_GetRegister(opcode.src_a, ecx); |
| 263 | auto src = Compile_GetRegister(opcode.src_b, RESULT); | 262 | const auto src = Compile_GetRegister(opcode.src_b, RESULT); |
| 264 | 263 | ||
| 265 | if (opcode.bf_src_bit != 0) { | 264 | if (opcode.bf_src_bit != 0) { |
| 266 | shr(src, opcode.bf_src_bit); | 265 | shr(src, opcode.bf_src_bit); |
| @@ -269,16 +268,9 @@ void MacroJITx64Impl::Compile_ExtractShiftLeftRegister(Macro::Opcode opcode) { | |||
| 269 | if (opcode.bf_size != 31) { | 268 | if (opcode.bf_size != 31) { |
| 270 | and_(src, opcode.GetBitfieldMask()); | 269 | and_(src, opcode.GetBitfieldMask()); |
| 271 | } | 270 | } |
| 272 | shl(src, al); | 271 | shl(src, dst.cvt8()); |
| 273 | Compile_ProcessResult(opcode.result_operation, opcode.dst); | ||
| 274 | } | ||
| 275 | 272 | ||
| 276 | static u32 Read(Engines::Maxwell3D* maxwell3d, u32 method) { | 273 | Compile_ProcessResult(opcode.result_operation, opcode.dst); |
| 277 | return maxwell3d->GetRegisterValue(method); | ||
| 278 | } | ||
| 279 | |||
| 280 | static void Send(Engines::Maxwell3D* maxwell3d, Macro::MethodAddress method_address, u32 value) { | ||
| 281 | maxwell3d->CallMethodFromMME(method_address.address, value); | ||
| 282 | } | 274 | } |
| 283 | 275 | ||
| 284 | void MacroJITx64Impl::Compile_Read(Macro::Opcode opcode) { | 276 | void MacroJITx64Impl::Compile_Read(Macro::Opcode opcode) { |
| @@ -298,15 +290,27 @@ void MacroJITx64Impl::Compile_Read(Macro::Opcode opcode) { | |||
| 298 | sub(result, opcode.immediate * -1); | 290 | sub(result, opcode.immediate * -1); |
| 299 | } | 291 | } |
| 300 | } | 292 | } |
| 301 | Common::X64::ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); | 293 | |
| 302 | mov(Common::X64::ABI_PARAM1, qword[STATE]); | 294 | // Equivalent to Engines::Maxwell3D::GetRegisterValue: |
| 303 | mov(Common::X64::ABI_PARAM2, RESULT); | 295 | if (optimizer.enable_asserts) { |
| 304 | Common::X64::CallFarFunction(*this, &Read); | 296 | Xbyak::Label pass_range_check; |
| 305 | Common::X64::ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); | 297 | cmp(RESULT, static_cast<u32>(Engines::Maxwell3D::Regs::NUM_REGS)); |
| 306 | mov(RESULT, Common::X64::ABI_RETURN.cvt32()); | 298 | jb(pass_range_check); |
| 299 | int3(); | ||
| 300 | L(pass_range_check); | ||
| 301 | } | ||
| 302 | mov(rax, qword[STATE]); | ||
| 303 | mov(RESULT, | ||
| 304 | dword[rax + offsetof(Engines::Maxwell3D, regs) + | ||
| 305 | offsetof(Engines::Maxwell3D::Regs, reg_array) + RESULT.cvt64() * sizeof(u32)]); | ||
| 306 | |||
| 307 | Compile_ProcessResult(opcode.result_operation, opcode.dst); | 307 | Compile_ProcessResult(opcode.result_operation, opcode.dst); |
| 308 | } | 308 | } |
| 309 | 309 | ||
| 310 | static void Send(Engines::Maxwell3D* maxwell3d, Macro::MethodAddress method_address, u32 value) { | ||
| 311 | maxwell3d->CallMethodFromMME(method_address.address, value); | ||
| 312 | } | ||
| 313 | |||
| 310 | void Tegra::MacroJITx64Impl::Compile_Send(Xbyak::Reg32 value) { | 314 | void Tegra::MacroJITx64Impl::Compile_Send(Xbyak::Reg32 value) { |
| 311 | Common::X64::ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); | 315 | Common::X64::ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); |
| 312 | mov(Common::X64::ABI_PARAM1, qword[STATE]); | 316 | mov(Common::X64::ABI_PARAM1, qword[STATE]); |
| @@ -438,6 +442,9 @@ void MacroJITx64Impl::Compile() { | |||
| 438 | // one if our register isn't "dirty" | 442 | // one if our register isn't "dirty" |
| 439 | optimizer.optimize_for_method_move = true; | 443 | optimizer.optimize_for_method_move = true; |
| 440 | 444 | ||
| 445 | // Enable run-time assertions in JITted code | ||
| 446 | optimizer.enable_asserts = false; | ||
| 447 | |||
| 441 | // Check to see if we can skip emitting certain instructions | 448 | // Check to see if we can skip emitting certain instructions |
| 442 | Optimizer_ScanFlags(); | 449 | Optimizer_ScanFlags(); |
| 443 | 450 | ||
diff --git a/src/video_core/macro/macro_jit_x64.h b/src/video_core/macro/macro_jit_x64.h index 51ec090b8..a180e7428 100644 --- a/src/video_core/macro/macro_jit_x64.h +++ b/src/video_core/macro/macro_jit_x64.h | |||
| @@ -76,6 +76,7 @@ private: | |||
| 76 | bool zero_reg_skip{}; | 76 | bool zero_reg_skip{}; |
| 77 | bool skip_dummy_addimmediate{}; | 77 | bool skip_dummy_addimmediate{}; |
| 78 | bool optimize_for_method_move{}; | 78 | bool optimize_for_method_move{}; |
| 79 | bool enable_asserts{}; | ||
| 79 | }; | 80 | }; |
| 80 | OptimizerState optimizer{}; | 81 | OptimizerState optimizer{}; |
| 81 | 82 | ||
diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h index 2f75f8801..e12dab899 100644 --- a/src/video_core/query_cache.h +++ b/src/video_core/query_cache.h | |||
| @@ -220,8 +220,8 @@ private: | |||
| 220 | return cache_begin < addr_end && addr_begin < cache_end; | 220 | return cache_begin < addr_end && addr_begin < cache_end; |
| 221 | }; | 221 | }; |
| 222 | 222 | ||
| 223 | const u64 page_end = addr_end >> PAGE_SHIFT; | 223 | const u64 page_end = addr_end >> PAGE_BITS; |
| 224 | for (u64 page = addr_begin >> PAGE_SHIFT; page <= page_end; ++page) { | 224 | for (u64 page = addr_begin >> PAGE_BITS; page <= page_end; ++page) { |
| 225 | const auto& it = cached_queries.find(page); | 225 | const auto& it = cached_queries.find(page); |
| 226 | if (it == std::end(cached_queries)) { | 226 | if (it == std::end(cached_queries)) { |
| 227 | continue; | 227 | continue; |
| @@ -242,14 +242,14 @@ private: | |||
| 242 | /// Registers the passed parameters as cached and returns a pointer to the stored cached query. | 242 | /// Registers the passed parameters as cached and returns a pointer to the stored cached query. |
| 243 | CachedQuery* Register(VideoCore::QueryType type, VAddr cpu_addr, u8* host_ptr, bool timestamp) { | 243 | CachedQuery* Register(VideoCore::QueryType type, VAddr cpu_addr, u8* host_ptr, bool timestamp) { |
| 244 | rasterizer.UpdatePagesCachedCount(cpu_addr, CachedQuery::SizeInBytes(timestamp), 1); | 244 | rasterizer.UpdatePagesCachedCount(cpu_addr, CachedQuery::SizeInBytes(timestamp), 1); |
| 245 | const u64 page = static_cast<u64>(cpu_addr) >> PAGE_SHIFT; | 245 | const u64 page = static_cast<u64>(cpu_addr) >> PAGE_BITS; |
| 246 | return &cached_queries[page].emplace_back(static_cast<QueryCache&>(*this), type, cpu_addr, | 246 | return &cached_queries[page].emplace_back(static_cast<QueryCache&>(*this), type, cpu_addr, |
| 247 | host_ptr); | 247 | host_ptr); |
| 248 | } | 248 | } |
| 249 | 249 | ||
| 250 | /// Tries to a get a cached query. Returns nullptr on failure. | 250 | /// Tries to a get a cached query. Returns nullptr on failure. |
| 251 | CachedQuery* TryGet(VAddr addr) { | 251 | CachedQuery* TryGet(VAddr addr) { |
| 252 | const u64 page = static_cast<u64>(addr) >> PAGE_SHIFT; | 252 | const u64 page = static_cast<u64>(addr) >> PAGE_BITS; |
| 253 | const auto it = cached_queries.find(page); | 253 | const auto it = cached_queries.find(page); |
| 254 | if (it == std::end(cached_queries)) { | 254 | if (it == std::end(cached_queries)) { |
| 255 | return nullptr; | 255 | return nullptr; |
| @@ -268,7 +268,7 @@ private: | |||
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | static constexpr std::uintptr_t PAGE_SIZE = 4096; | 270 | static constexpr std::uintptr_t PAGE_SIZE = 4096; |
| 271 | static constexpr unsigned PAGE_SHIFT = 12; | 271 | static constexpr unsigned PAGE_BITS = 12; |
| 272 | 272 | ||
| 273 | Core::System& system; | 273 | Core::System& system; |
| 274 | VideoCore::RasterizerInterface& rasterizer; | 274 | VideoCore::RasterizerInterface& rasterizer; |
diff --git a/src/video_core/renderer_opengl/gl_arb_decompiler.cpp b/src/video_core/renderer_opengl/gl_arb_decompiler.cpp index 1e96b0310..eb5158407 100644 --- a/src/video_core/renderer_opengl/gl_arb_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_arb_decompiler.cpp | |||
| @@ -281,14 +281,14 @@ private: | |||
| 281 | 281 | ||
| 282 | template <const std::string_view& op> | 282 | template <const std::string_view& op> |
| 283 | std::string Unary(Operation operation) { | 283 | std::string Unary(Operation operation) { |
| 284 | const std::string temporary = AllocTemporary(); | 284 | std::string temporary = AllocTemporary(); |
| 285 | AddLine("{}{} {}, {};", op, Modifiers(operation), temporary, Visit(operation[0])); | 285 | AddLine("{}{} {}, {};", op, Modifiers(operation), temporary, Visit(operation[0])); |
| 286 | return temporary; | 286 | return temporary; |
| 287 | } | 287 | } |
| 288 | 288 | ||
| 289 | template <const std::string_view& op> | 289 | template <const std::string_view& op> |
| 290 | std::string Binary(Operation operation) { | 290 | std::string Binary(Operation operation) { |
| 291 | const std::string temporary = AllocTemporary(); | 291 | std::string temporary = AllocTemporary(); |
| 292 | AddLine("{}{} {}, {}, {};", op, Modifiers(operation), temporary, Visit(operation[0]), | 292 | AddLine("{}{} {}, {}, {};", op, Modifiers(operation), temporary, Visit(operation[0]), |
| 293 | Visit(operation[1])); | 293 | Visit(operation[1])); |
| 294 | return temporary; | 294 | return temporary; |
| @@ -296,7 +296,7 @@ private: | |||
| 296 | 296 | ||
| 297 | template <const std::string_view& op> | 297 | template <const std::string_view& op> |
| 298 | std::string Trinary(Operation operation) { | 298 | std::string Trinary(Operation operation) { |
| 299 | const std::string temporary = AllocTemporary(); | 299 | std::string temporary = AllocTemporary(); |
| 300 | AddLine("{}{} {}, {}, {}, {};", op, Modifiers(operation), temporary, Visit(operation[0]), | 300 | AddLine("{}{} {}, {}, {}, {};", op, Modifiers(operation), temporary, Visit(operation[0]), |
| 301 | Visit(operation[1]), Visit(operation[2])); | 301 | Visit(operation[1]), Visit(operation[2])); |
| 302 | return temporary; | 302 | return temporary; |
| @@ -304,7 +304,7 @@ private: | |||
| 304 | 304 | ||
| 305 | template <const std::string_view& op, bool unordered> | 305 | template <const std::string_view& op, bool unordered> |
| 306 | std::string FloatComparison(Operation operation) { | 306 | std::string FloatComparison(Operation operation) { |
| 307 | const std::string temporary = AllocTemporary(); | 307 | std::string temporary = AllocTemporary(); |
| 308 | AddLine("TRUNC.U.CC RC.x, {};", Binary<op>(operation)); | 308 | AddLine("TRUNC.U.CC RC.x, {};", Binary<op>(operation)); |
| 309 | AddLine("MOV.S {}, 0;", temporary); | 309 | AddLine("MOV.S {}, 0;", temporary); |
| 310 | AddLine("MOV.S {} (NE.x), -1;", temporary); | 310 | AddLine("MOV.S {} (NE.x), -1;", temporary); |
| @@ -331,7 +331,7 @@ private: | |||
| 331 | 331 | ||
| 332 | template <const std::string_view& op, bool is_nan> | 332 | template <const std::string_view& op, bool is_nan> |
| 333 | std::string HalfComparison(Operation operation) { | 333 | std::string HalfComparison(Operation operation) { |
| 334 | const std::string tmp1 = AllocVectorTemporary(); | 334 | std::string tmp1 = AllocVectorTemporary(); |
| 335 | const std::string tmp2 = AllocVectorTemporary(); | 335 | const std::string tmp2 = AllocVectorTemporary(); |
| 336 | const std::string op_a = Visit(operation[0]); | 336 | const std::string op_a = Visit(operation[0]); |
| 337 | const std::string op_b = Visit(operation[1]); | 337 | const std::string op_b = Visit(operation[1]); |
| @@ -367,15 +367,14 @@ private: | |||
| 367 | AddLine("MOV.F {}.{}, {};", value, Swizzle(i), Visit(meta.values[i])); | 367 | AddLine("MOV.F {}.{}, {};", value, Swizzle(i), Visit(meta.values[i])); |
| 368 | } | 368 | } |
| 369 | 369 | ||
| 370 | const std::string result = coord; | 370 | AddLine("ATOMIM.{}.{} {}.x, {}, {}, image[{}], {};", op, type, coord, value, coord, |
| 371 | AddLine("ATOMIM.{}.{} {}.x, {}, {}, image[{}], {};", op, type, result, value, coord, | ||
| 372 | image_id, ImageType(meta.image.type)); | 371 | image_id, ImageType(meta.image.type)); |
| 373 | return fmt::format("{}.x", result); | 372 | return fmt::format("{}.x", coord); |
| 374 | } | 373 | } |
| 375 | 374 | ||
| 376 | template <const std::string_view& op, const std::string_view& type> | 375 | template <const std::string_view& op, const std::string_view& type> |
| 377 | std::string Atomic(Operation operation) { | 376 | std::string Atomic(Operation operation) { |
| 378 | const std::string temporary = AllocTemporary(); | 377 | std::string temporary = AllocTemporary(); |
| 379 | std::string address; | 378 | std::string address; |
| 380 | std::string_view opname; | 379 | std::string_view opname; |
| 381 | if (const auto gmem = std::get_if<GmemNode>(&*operation[0])) { | 380 | if (const auto gmem = std::get_if<GmemNode>(&*operation[0])) { |
| @@ -396,7 +395,7 @@ private: | |||
| 396 | 395 | ||
| 397 | template <char type> | 396 | template <char type> |
| 398 | std::string Negate(Operation operation) { | 397 | std::string Negate(Operation operation) { |
| 399 | const std::string temporary = AllocTemporary(); | 398 | std::string temporary = AllocTemporary(); |
| 400 | if constexpr (type == 'F') { | 399 | if constexpr (type == 'F') { |
| 401 | AddLine("MOV.F32 {}, -{};", temporary, Visit(operation[0])); | 400 | AddLine("MOV.F32 {}, -{};", temporary, Visit(operation[0])); |
| 402 | } else { | 401 | } else { |
| @@ -407,7 +406,7 @@ private: | |||
| 407 | 406 | ||
| 408 | template <char type> | 407 | template <char type> |
| 409 | std::string Absolute(Operation operation) { | 408 | std::string Absolute(Operation operation) { |
| 410 | const std::string temporary = AllocTemporary(); | 409 | std::string temporary = AllocTemporary(); |
| 411 | AddLine("MOV.{} {}, |{}|;", type, temporary, Visit(operation[0])); | 410 | AddLine("MOV.{} {}, |{}|;", type, temporary, Visit(operation[0])); |
| 412 | return temporary; | 411 | return temporary; |
| 413 | } | 412 | } |
| @@ -1156,20 +1155,20 @@ void ARBDecompiler::VisitAST(const ASTNode& node) { | |||
| 1156 | } | 1155 | } |
| 1157 | 1156 | ||
| 1158 | std::string ARBDecompiler::VisitExpression(const Expr& node) { | 1157 | std::string ARBDecompiler::VisitExpression(const Expr& node) { |
| 1159 | const std::string result = AllocTemporary(); | ||
| 1160 | if (const auto expr = std::get_if<ExprAnd>(&*node)) { | 1158 | if (const auto expr = std::get_if<ExprAnd>(&*node)) { |
| 1159 | std::string result = AllocTemporary(); | ||
| 1161 | AddLine("AND.U {}, {}, {};", result, VisitExpression(expr->operand1), | 1160 | AddLine("AND.U {}, {}, {};", result, VisitExpression(expr->operand1), |
| 1162 | VisitExpression(expr->operand2)); | 1161 | VisitExpression(expr->operand2)); |
| 1163 | return result; | 1162 | return result; |
| 1164 | } | 1163 | } |
| 1165 | if (const auto expr = std::get_if<ExprOr>(&*node)) { | 1164 | if (const auto expr = std::get_if<ExprOr>(&*node)) { |
| 1166 | const std::string result = AllocTemporary(); | 1165 | std::string result = AllocTemporary(); |
| 1167 | AddLine("OR.U {}, {}, {};", result, VisitExpression(expr->operand1), | 1166 | AddLine("OR.U {}, {}, {};", result, VisitExpression(expr->operand1), |
| 1168 | VisitExpression(expr->operand2)); | 1167 | VisitExpression(expr->operand2)); |
| 1169 | return result; | 1168 | return result; |
| 1170 | } | 1169 | } |
| 1171 | if (const auto expr = std::get_if<ExprNot>(&*node)) { | 1170 | if (const auto expr = std::get_if<ExprNot>(&*node)) { |
| 1172 | const std::string result = AllocTemporary(); | 1171 | std::string result = AllocTemporary(); |
| 1173 | AddLine("CMP.S {}, {}, 0, -1;", result, VisitExpression(expr->operand1)); | 1172 | AddLine("CMP.S {}, {}, 0, -1;", result, VisitExpression(expr->operand1)); |
| 1174 | return result; | 1173 | return result; |
| 1175 | } | 1174 | } |
| @@ -1186,7 +1185,7 @@ std::string ARBDecompiler::VisitExpression(const Expr& node) { | |||
| 1186 | return expr->value ? "0xffffffff" : "0"; | 1185 | return expr->value ? "0xffffffff" : "0"; |
| 1187 | } | 1186 | } |
| 1188 | if (const auto expr = std::get_if<ExprGprEqual>(&*node)) { | 1187 | if (const auto expr = std::get_if<ExprGprEqual>(&*node)) { |
| 1189 | const std::string result = AllocTemporary(); | 1188 | std::string result = AllocTemporary(); |
| 1190 | AddLine("SEQ.U {}, R{}.x, {};", result, expr->gpr, expr->value); | 1189 | AddLine("SEQ.U {}, R{}.x, {};", result, expr->gpr, expr->value); |
| 1191 | return result; | 1190 | return result; |
| 1192 | } | 1191 | } |
| @@ -1231,13 +1230,13 @@ std::string ARBDecompiler::Visit(const Node& node) { | |||
| 1231 | } | 1230 | } |
| 1232 | 1231 | ||
| 1233 | if (const auto immediate = std::get_if<ImmediateNode>(&*node)) { | 1232 | if (const auto immediate = std::get_if<ImmediateNode>(&*node)) { |
| 1234 | const std::string temporary = AllocTemporary(); | 1233 | std::string temporary = AllocTemporary(); |
| 1235 | AddLine("MOV.U {}, {};", temporary, immediate->GetValue()); | 1234 | AddLine("MOV.U {}, {};", temporary, immediate->GetValue()); |
| 1236 | return temporary; | 1235 | return temporary; |
| 1237 | } | 1236 | } |
| 1238 | 1237 | ||
| 1239 | if (const auto predicate = std::get_if<PredicateNode>(&*node)) { | 1238 | if (const auto predicate = std::get_if<PredicateNode>(&*node)) { |
| 1240 | const std::string temporary = AllocTemporary(); | 1239 | std::string temporary = AllocTemporary(); |
| 1241 | switch (const auto index = predicate->GetIndex(); index) { | 1240 | switch (const auto index = predicate->GetIndex(); index) { |
| 1242 | case Tegra::Shader::Pred::UnusedIndex: | 1241 | case Tegra::Shader::Pred::UnusedIndex: |
| 1243 | AddLine("MOV.S {}, -1;", temporary); | 1242 | AddLine("MOV.S {}, -1;", temporary); |
| @@ -1333,13 +1332,13 @@ std::string ARBDecompiler::Visit(const Node& node) { | |||
| 1333 | } else { | 1332 | } else { |
| 1334 | offset_string = Visit(offset); | 1333 | offset_string = Visit(offset); |
| 1335 | } | 1334 | } |
| 1336 | const std::string temporary = AllocTemporary(); | 1335 | std::string temporary = AllocTemporary(); |
| 1337 | AddLine("LDC.F32 {}, cbuf{}[{}];", temporary, cbuf->GetIndex(), offset_string); | 1336 | AddLine("LDC.F32 {}, cbuf{}[{}];", temporary, cbuf->GetIndex(), offset_string); |
| 1338 | return temporary; | 1337 | return temporary; |
| 1339 | } | 1338 | } |
| 1340 | 1339 | ||
| 1341 | if (const auto gmem = std::get_if<GmemNode>(&*node)) { | 1340 | if (const auto gmem = std::get_if<GmemNode>(&*node)) { |
| 1342 | const std::string temporary = AllocTemporary(); | 1341 | std::string temporary = AllocTemporary(); |
| 1343 | AddLine("SUB.U {}, {}, {};", temporary, Visit(gmem->GetRealAddress()), | 1342 | AddLine("SUB.U {}, {}, {};", temporary, Visit(gmem->GetRealAddress()), |
| 1344 | Visit(gmem->GetBaseAddress())); | 1343 | Visit(gmem->GetBaseAddress())); |
| 1345 | AddLine("LDB.U32 {}, {}[{}];", temporary, GlobalMemoryName(gmem->GetDescriptor()), | 1344 | AddLine("LDB.U32 {}, {}[{}];", temporary, GlobalMemoryName(gmem->GetDescriptor()), |
| @@ -1348,14 +1347,14 @@ std::string ARBDecompiler::Visit(const Node& node) { | |||
| 1348 | } | 1347 | } |
| 1349 | 1348 | ||
| 1350 | if (const auto lmem = std::get_if<LmemNode>(&*node)) { | 1349 | if (const auto lmem = std::get_if<LmemNode>(&*node)) { |
| 1351 | const std::string temporary = Visit(lmem->GetAddress()); | 1350 | std::string temporary = Visit(lmem->GetAddress()); |
| 1352 | AddLine("SHR.U {}, {}, 2;", temporary, temporary); | 1351 | AddLine("SHR.U {}, {}, 2;", temporary, temporary); |
| 1353 | AddLine("MOV.U {}, lmem[{}].x;", temporary, temporary); | 1352 | AddLine("MOV.U {}, lmem[{}].x;", temporary, temporary); |
| 1354 | return temporary; | 1353 | return temporary; |
| 1355 | } | 1354 | } |
| 1356 | 1355 | ||
| 1357 | if (const auto smem = std::get_if<SmemNode>(&*node)) { | 1356 | if (const auto smem = std::get_if<SmemNode>(&*node)) { |
| 1358 | const std::string temporary = Visit(smem->GetAddress()); | 1357 | std::string temporary = Visit(smem->GetAddress()); |
| 1359 | AddLine("LDS.U32 {}, shared_mem[{}];", temporary, temporary); | 1358 | AddLine("LDS.U32 {}, shared_mem[{}];", temporary, temporary); |
| 1360 | return temporary; | 1359 | return temporary; |
| 1361 | } | 1360 | } |
| @@ -1535,7 +1534,7 @@ std::string ARBDecompiler::Assign(Operation operation) { | |||
| 1535 | } | 1534 | } |
| 1536 | 1535 | ||
| 1537 | std::string ARBDecompiler::Select(Operation operation) { | 1536 | std::string ARBDecompiler::Select(Operation operation) { |
| 1538 | const std::string temporary = AllocTemporary(); | 1537 | std::string temporary = AllocTemporary(); |
| 1539 | AddLine("CMP.S {}, {}, {}, {};", temporary, Visit(operation[0]), Visit(operation[1]), | 1538 | AddLine("CMP.S {}, {}, {}, {};", temporary, Visit(operation[0]), Visit(operation[1]), |
| 1540 | Visit(operation[2])); | 1539 | Visit(operation[2])); |
| 1541 | return temporary; | 1540 | return temporary; |
| @@ -1545,12 +1544,12 @@ std::string ARBDecompiler::FClamp(Operation operation) { | |||
| 1545 | // 1.0f in hex, replace with std::bit_cast on C++20 | 1544 | // 1.0f in hex, replace with std::bit_cast on C++20 |
| 1546 | static constexpr u32 POSITIVE_ONE = 0x3f800000; | 1545 | static constexpr u32 POSITIVE_ONE = 0x3f800000; |
| 1547 | 1546 | ||
| 1548 | const std::string temporary = AllocTemporary(); | 1547 | std::string temporary = AllocTemporary(); |
| 1549 | const Node& value = operation[0]; | 1548 | const Node& value = operation[0]; |
| 1550 | const Node& low = operation[1]; | 1549 | const Node& low = operation[1]; |
| 1551 | const Node& high = operation[2]; | 1550 | const Node& high = operation[2]; |
| 1552 | const auto imm_low = std::get_if<ImmediateNode>(&*low); | 1551 | const auto* const imm_low = std::get_if<ImmediateNode>(&*low); |
| 1553 | const auto imm_high = std::get_if<ImmediateNode>(&*high); | 1552 | const auto* const imm_high = std::get_if<ImmediateNode>(&*high); |
| 1554 | if (imm_low && imm_high && imm_low->GetValue() == 0 && imm_high->GetValue() == POSITIVE_ONE) { | 1553 | if (imm_low && imm_high && imm_low->GetValue() == 0 && imm_high->GetValue() == POSITIVE_ONE) { |
| 1555 | AddLine("MOV.F32.SAT {}, {};", temporary, Visit(value)); | 1554 | AddLine("MOV.F32.SAT {}, {};", temporary, Visit(value)); |
| 1556 | } else { | 1555 | } else { |
| @@ -1574,7 +1573,7 @@ std::string ARBDecompiler::FCastHalf1(Operation operation) { | |||
| 1574 | } | 1573 | } |
| 1575 | 1574 | ||
| 1576 | std::string ARBDecompiler::FSqrt(Operation operation) { | 1575 | std::string ARBDecompiler::FSqrt(Operation operation) { |
| 1577 | const std::string temporary = AllocTemporary(); | 1576 | std::string temporary = AllocTemporary(); |
| 1578 | AddLine("RSQ.F32 {}, {};", temporary, Visit(operation[0])); | 1577 | AddLine("RSQ.F32 {}, {};", temporary, Visit(operation[0])); |
| 1579 | AddLine("RCP.F32 {}, {};", temporary, temporary); | 1578 | AddLine("RCP.F32 {}, {};", temporary, temporary); |
| 1580 | return temporary; | 1579 | return temporary; |
| @@ -1588,7 +1587,7 @@ std::string ARBDecompiler::FSwizzleAdd(Operation operation) { | |||
| 1588 | AddLine("ADD.F {}.x, {}, {};", temporary, Visit(operation[0]), Visit(operation[1])); | 1587 | AddLine("ADD.F {}.x, {}, {};", temporary, Visit(operation[0]), Visit(operation[1])); |
| 1589 | return fmt::format("{}.x", temporary); | 1588 | return fmt::format("{}.x", temporary); |
| 1590 | } | 1589 | } |
| 1591 | const std::string lut = AllocVectorTemporary(); | 1590 | |
| 1592 | AddLine("AND.U {}.z, {}.threadid, 3;", temporary, StageInputName(stage)); | 1591 | AddLine("AND.U {}.z, {}.threadid, 3;", temporary, StageInputName(stage)); |
| 1593 | AddLine("SHL.U {}.z, {}.z, 1;", temporary, temporary); | 1592 | AddLine("SHL.U {}.z, {}.z, 1;", temporary, temporary); |
| 1594 | AddLine("SHR.U {}.z, {}, {}.z;", temporary, Visit(operation[2]), temporary); | 1593 | AddLine("SHR.U {}.z, {}, {}.z;", temporary, Visit(operation[2]), temporary); |
| @@ -1766,21 +1765,21 @@ std::string ARBDecompiler::LogicalAssign(Operation operation) { | |||
| 1766 | } | 1765 | } |
| 1767 | 1766 | ||
| 1768 | std::string ARBDecompiler::LogicalPick2(Operation operation) { | 1767 | std::string ARBDecompiler::LogicalPick2(Operation operation) { |
| 1769 | const std::string temporary = AllocTemporary(); | 1768 | std::string temporary = AllocTemporary(); |
| 1770 | const u32 index = std::get<ImmediateNode>(*operation[1]).GetValue(); | 1769 | const u32 index = std::get<ImmediateNode>(*operation[1]).GetValue(); |
| 1771 | AddLine("MOV.U {}, {}.{};", temporary, Visit(operation[0]), Swizzle(index)); | 1770 | AddLine("MOV.U {}, {}.{};", temporary, Visit(operation[0]), Swizzle(index)); |
| 1772 | return temporary; | 1771 | return temporary; |
| 1773 | } | 1772 | } |
| 1774 | 1773 | ||
| 1775 | std::string ARBDecompiler::LogicalAnd2(Operation operation) { | 1774 | std::string ARBDecompiler::LogicalAnd2(Operation operation) { |
| 1776 | const std::string temporary = AllocTemporary(); | 1775 | std::string temporary = AllocTemporary(); |
| 1777 | const std::string op = Visit(operation[0]); | 1776 | const std::string op = Visit(operation[0]); |
| 1778 | AddLine("AND.U {}, {}.x, {}.y;", temporary, op, op); | 1777 | AddLine("AND.U {}, {}.x, {}.y;", temporary, op, op); |
| 1779 | return temporary; | 1778 | return temporary; |
| 1780 | } | 1779 | } |
| 1781 | 1780 | ||
| 1782 | std::string ARBDecompiler::FloatOrdered(Operation operation) { | 1781 | std::string ARBDecompiler::FloatOrdered(Operation operation) { |
| 1783 | const std::string temporary = AllocTemporary(); | 1782 | std::string temporary = AllocTemporary(); |
| 1784 | AddLine("MOVC.F32 RC.x, {};", Visit(operation[0])); | 1783 | AddLine("MOVC.F32 RC.x, {};", Visit(operation[0])); |
| 1785 | AddLine("MOVC.F32 RC.y, {};", Visit(operation[1])); | 1784 | AddLine("MOVC.F32 RC.y, {};", Visit(operation[1])); |
| 1786 | AddLine("MOV.S {}, -1;", temporary); | 1785 | AddLine("MOV.S {}, -1;", temporary); |
| @@ -1790,7 +1789,7 @@ std::string ARBDecompiler::FloatOrdered(Operation operation) { | |||
| 1790 | } | 1789 | } |
| 1791 | 1790 | ||
| 1792 | std::string ARBDecompiler::FloatUnordered(Operation operation) { | 1791 | std::string ARBDecompiler::FloatUnordered(Operation operation) { |
| 1793 | const std::string temporary = AllocTemporary(); | 1792 | std::string temporary = AllocTemporary(); |
| 1794 | AddLine("MOVC.F32 RC.x, {};", Visit(operation[0])); | 1793 | AddLine("MOVC.F32 RC.x, {};", Visit(operation[0])); |
| 1795 | AddLine("MOVC.F32 RC.y, {};", Visit(operation[1])); | 1794 | AddLine("MOVC.F32 RC.y, {};", Visit(operation[1])); |
| 1796 | AddLine("MOV.S {}, 0;", temporary); | 1795 | AddLine("MOV.S {}, 0;", temporary); |
| @@ -1800,7 +1799,7 @@ std::string ARBDecompiler::FloatUnordered(Operation operation) { | |||
| 1800 | } | 1799 | } |
| 1801 | 1800 | ||
| 1802 | std::string ARBDecompiler::LogicalAddCarry(Operation operation) { | 1801 | std::string ARBDecompiler::LogicalAddCarry(Operation operation) { |
| 1803 | const std::string temporary = AllocTemporary(); | 1802 | std::string temporary = AllocTemporary(); |
| 1804 | AddLine("ADDC.U RC, {}, {};", Visit(operation[0]), Visit(operation[1])); | 1803 | AddLine("ADDC.U RC, {}, {};", Visit(operation[0]), Visit(operation[1])); |
| 1805 | AddLine("MOV.S {}, 0;", temporary); | 1804 | AddLine("MOV.S {}, 0;", temporary); |
| 1806 | AddLine("IF CF.x;"); | 1805 | AddLine("IF CF.x;"); |
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 59b441943..cd9673d1f 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <fmt/format.h> | 13 | #include <fmt/format.h> |
| 14 | 14 | ||
| 15 | #include "common/dynamic_library.h" | 15 | #include "common/dynamic_library.h" |
| 16 | #include "common/file_util.h" | ||
| 16 | #include "common/logging/log.h" | 17 | #include "common/logging/log.h" |
| 17 | #include "common/telemetry.h" | 18 | #include "common/telemetry.h" |
| 18 | #include "core/core.h" | 19 | #include "core/core.h" |
| @@ -76,7 +77,8 @@ Common::DynamicLibrary OpenVulkanLibrary() { | |||
| 76 | char* libvulkan_env = getenv("LIBVULKAN_PATH"); | 77 | char* libvulkan_env = getenv("LIBVULKAN_PATH"); |
| 77 | if (!libvulkan_env || !library.Open(libvulkan_env)) { | 78 | if (!libvulkan_env || !library.Open(libvulkan_env)) { |
| 78 | // Use the libvulkan.dylib from the application bundle. | 79 | // Use the libvulkan.dylib from the application bundle. |
| 79 | std::string filename = File::GetBundleDirectory() + "/Contents/Frameworks/libvulkan.dylib"; | 80 | const std::string filename = |
| 81 | FileUtil::GetBundleDirectory() + "/Contents/Frameworks/libvulkan.dylib"; | ||
| 80 | library.Open(filename.c_str()); | 82 | library.Open(filename.c_str()); |
| 81 | } | 83 | } |
| 82 | #else | 84 | #else |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 184b2238a..a77fa35c3 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -870,7 +870,7 @@ void RasterizerVulkan::BeginTransformFeedback() { | |||
| 870 | UNIMPLEMENTED_IF(binding.buffer_offset != 0); | 870 | UNIMPLEMENTED_IF(binding.buffer_offset != 0); |
| 871 | 871 | ||
| 872 | const GPUVAddr gpu_addr = binding.Address(); | 872 | const GPUVAddr gpu_addr = binding.Address(); |
| 873 | const std::size_t size = binding.buffer_size; | 873 | const auto size = static_cast<VkDeviceSize>(binding.buffer_size); |
| 874 | const auto [buffer, offset] = buffer_cache.UploadMemory(gpu_addr, size, 4, true); | 874 | const auto [buffer, offset] = buffer_cache.UploadMemory(gpu_addr, size, 4, true); |
| 875 | 875 | ||
| 876 | scheduler.Record([buffer = buffer, offset = offset, size](vk::CommandBuffer cmdbuf) { | 876 | scheduler.Record([buffer = buffer, offset = offset, size](vk::CommandBuffer cmdbuf) { |
diff --git a/src/video_core/renderer_vulkan/wrapper.cpp b/src/video_core/renderer_vulkan/wrapper.cpp index 2ce9b0626..42eff85d3 100644 --- a/src/video_core/renderer_vulkan/wrapper.cpp +++ b/src/video_core/renderer_vulkan/wrapper.cpp | |||
| @@ -725,8 +725,7 @@ bool PhysicalDevice::GetSurfaceSupportKHR(u32 queue_family_index, VkSurfaceKHR s | |||
| 725 | return supported == VK_TRUE; | 725 | return supported == VK_TRUE; |
| 726 | } | 726 | } |
| 727 | 727 | ||
| 728 | VkSurfaceCapabilitiesKHR PhysicalDevice::GetSurfaceCapabilitiesKHR(VkSurfaceKHR surface) const | 728 | VkSurfaceCapabilitiesKHR PhysicalDevice::GetSurfaceCapabilitiesKHR(VkSurfaceKHR surface) const { |
| 729 | noexcept { | ||
| 730 | VkSurfaceCapabilitiesKHR capabilities; | 729 | VkSurfaceCapabilitiesKHR capabilities; |
| 731 | Check(dld->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device, surface, &capabilities)); | 730 | Check(dld->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device, surface, &capabilities)); |
| 732 | return capabilities; | 731 | return capabilities; |
diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h index 98937a77a..da42ca88e 100644 --- a/src/video_core/renderer_vulkan/wrapper.h +++ b/src/video_core/renderer_vulkan/wrapper.h | |||
| @@ -779,7 +779,7 @@ public: | |||
| 779 | 779 | ||
| 780 | bool GetSurfaceSupportKHR(u32 queue_family_index, VkSurfaceKHR) const; | 780 | bool GetSurfaceSupportKHR(u32 queue_family_index, VkSurfaceKHR) const; |
| 781 | 781 | ||
| 782 | VkSurfaceCapabilitiesKHR GetSurfaceCapabilitiesKHR(VkSurfaceKHR) const noexcept; | 782 | VkSurfaceCapabilitiesKHR GetSurfaceCapabilitiesKHR(VkSurfaceKHR) const; |
| 783 | 783 | ||
| 784 | std::vector<VkSurfaceFormatKHR> GetSurfaceFormatsKHR(VkSurfaceKHR) const; | 784 | std::vector<VkSurfaceFormatKHR> GetSurfaceFormatsKHR(VkSurfaceKHR) const; |
| 785 | 785 | ||
diff --git a/src/video_core/shader/memory_util.cpp b/src/video_core/shader/memory_util.cpp index 074f21691..5071c83ca 100644 --- a/src/video_core/shader/memory_util.cpp +++ b/src/video_core/shader/memory_util.cpp | |||
| @@ -66,12 +66,12 @@ ProgramCode GetShaderCode(Tegra::MemoryManager& memory_manager, GPUVAddr gpu_add | |||
| 66 | 66 | ||
| 67 | u64 GetUniqueIdentifier(Tegra::Engines::ShaderType shader_type, bool is_a, const ProgramCode& code, | 67 | u64 GetUniqueIdentifier(Tegra::Engines::ShaderType shader_type, bool is_a, const ProgramCode& code, |
| 68 | const ProgramCode& code_b) { | 68 | const ProgramCode& code_b) { |
| 69 | u64 unique_identifier = boost::hash_value(code); | 69 | size_t unique_identifier = boost::hash_value(code); |
| 70 | if (is_a) { | 70 | if (is_a) { |
| 71 | // VertexA programs include two programs | 71 | // VertexA programs include two programs |
| 72 | boost::hash_combine(unique_identifier, boost::hash_value(code_b)); | 72 | boost::hash_combine(unique_identifier, boost::hash_value(code_b)); |
| 73 | } | 73 | } |
| 74 | return unique_identifier; | 74 | return static_cast<u64>(unique_identifier); |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | } // namespace VideoCommon::Shader | 77 | } // namespace VideoCommon::Shader |
diff --git a/src/video_core/shader_cache.h b/src/video_core/shader_cache.h index a23c23886..2dd270e99 100644 --- a/src/video_core/shader_cache.h +++ b/src/video_core/shader_cache.h | |||
| @@ -19,7 +19,7 @@ namespace VideoCommon { | |||
| 19 | 19 | ||
| 20 | template <class T> | 20 | template <class T> |
| 21 | class ShaderCache { | 21 | class ShaderCache { |
| 22 | static constexpr u64 PAGE_SHIFT = 14; | 22 | static constexpr u64 PAGE_BITS = 14; |
| 23 | 23 | ||
| 24 | struct Entry { | 24 | struct Entry { |
| 25 | VAddr addr_start; | 25 | VAddr addr_start; |
| @@ -87,8 +87,8 @@ protected: | |||
| 87 | const VAddr addr_end = addr + size; | 87 | const VAddr addr_end = addr + size; |
| 88 | Entry* const entry = NewEntry(addr, addr_end, data.get()); | 88 | Entry* const entry = NewEntry(addr, addr_end, data.get()); |
| 89 | 89 | ||
| 90 | const u64 page_end = addr_end >> PAGE_SHIFT; | 90 | const u64 page_end = addr_end >> PAGE_BITS; |
| 91 | for (u64 page = addr >> PAGE_SHIFT; page <= page_end; ++page) { | 91 | for (u64 page = addr >> PAGE_BITS; page <= page_end; ++page) { |
| 92 | invalidation_cache[page].push_back(entry); | 92 | invalidation_cache[page].push_back(entry); |
| 93 | } | 93 | } |
| 94 | 94 | ||
| @@ -108,8 +108,8 @@ private: | |||
| 108 | /// @pre invalidation_mutex is locked | 108 | /// @pre invalidation_mutex is locked |
| 109 | void InvalidatePagesInRegion(VAddr addr, std::size_t size) { | 109 | void InvalidatePagesInRegion(VAddr addr, std::size_t size) { |
| 110 | const VAddr addr_end = addr + size; | 110 | const VAddr addr_end = addr + size; |
| 111 | const u64 page_end = addr_end >> PAGE_SHIFT; | 111 | const u64 page_end = addr_end >> PAGE_BITS; |
| 112 | for (u64 page = addr >> PAGE_SHIFT; page <= page_end; ++page) { | 112 | for (u64 page = addr >> PAGE_BITS; page <= page_end; ++page) { |
| 113 | const auto it = invalidation_cache.find(page); | 113 | const auto it = invalidation_cache.find(page); |
| 114 | if (it == invalidation_cache.end()) { | 114 | if (it == invalidation_cache.end()) { |
| 115 | continue; | 115 | continue; |
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 8b9404718..75c27e39e 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt | |||
| @@ -208,6 +208,10 @@ if (MSVC) | |||
| 208 | copy_yuzu_unicorn_deps(yuzu) | 208 | copy_yuzu_unicorn_deps(yuzu) |
| 209 | endif() | 209 | endif() |
| 210 | 210 | ||
| 211 | if (NOT APPLE) | ||
| 212 | target_compile_definitions(yuzu PRIVATE HAS_OPENGL) | ||
| 213 | endif() | ||
| 214 | |||
| 211 | if (ENABLE_VULKAN) | 215 | if (ENABLE_VULKAN) |
| 212 | target_include_directories(yuzu PRIVATE ../../externals/Vulkan-Headers/include) | 216 | target_include_directories(yuzu PRIVATE ../../externals/Vulkan-Headers/include) |
| 213 | target_compile_definitions(yuzu PRIVATE HAS_VULKAN) | 217 | target_compile_definitions(yuzu PRIVATE HAS_VULKAN) |
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 1f5e43043..696da2137 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp | |||
| @@ -8,13 +8,16 @@ | |||
| 8 | #include <QHBoxLayout> | 8 | #include <QHBoxLayout> |
| 9 | #include <QKeyEvent> | 9 | #include <QKeyEvent> |
| 10 | #include <QMessageBox> | 10 | #include <QMessageBox> |
| 11 | #include <QOffscreenSurface> | ||
| 12 | #include <QOpenGLContext> | ||
| 13 | #include <QPainter> | 11 | #include <QPainter> |
| 14 | #include <QScreen> | 12 | #include <QScreen> |
| 15 | #include <QStringList> | 13 | #include <QStringList> |
| 16 | #include <QWindow> | 14 | #include <QWindow> |
| 17 | 15 | ||
| 16 | #ifdef HAS_OPENGL | ||
| 17 | #include <QOffscreenSurface> | ||
| 18 | #include <QOpenGLContext> | ||
| 19 | #endif | ||
| 20 | |||
| 18 | #if !defined(WIN32) && HAS_VULKAN | 21 | #if !defined(WIN32) && HAS_VULKAN |
| 19 | #include <qpa/qplatformnativeinterface.h> | 22 | #include <qpa/qplatformnativeinterface.h> |
| 20 | #endif | 23 | #endif |
| @@ -98,6 +101,7 @@ void EmuThread::run() { | |||
| 98 | #endif | 101 | #endif |
| 99 | } | 102 | } |
| 100 | 103 | ||
| 104 | #ifdef HAS_OPENGL | ||
| 101 | class OpenGLSharedContext : public Core::Frontend::GraphicsContext { | 105 | class OpenGLSharedContext : public Core::Frontend::GraphicsContext { |
| 102 | public: | 106 | public: |
| 103 | /// Create the original context that should be shared from | 107 | /// Create the original context that should be shared from |
| @@ -183,6 +187,7 @@ private: | |||
| 183 | std::unique_ptr<QOffscreenSurface> offscreen_surface{}; | 187 | std::unique_ptr<QOffscreenSurface> offscreen_surface{}; |
| 184 | QSurface* surface; | 188 | QSurface* surface; |
| 185 | }; | 189 | }; |
| 190 | #endif | ||
| 186 | 191 | ||
| 187 | class DummyContext : public Core::Frontend::GraphicsContext {}; | 192 | class DummyContext : public Core::Frontend::GraphicsContext {}; |
| 188 | 193 | ||
| @@ -473,6 +478,7 @@ void GRenderWindow::resizeEvent(QResizeEvent* event) { | |||
| 473 | } | 478 | } |
| 474 | 479 | ||
| 475 | std::unique_ptr<Core::Frontend::GraphicsContext> GRenderWindow::CreateSharedContext() const { | 480 | std::unique_ptr<Core::Frontend::GraphicsContext> GRenderWindow::CreateSharedContext() const { |
| 481 | #ifdef HAS_OPENGL | ||
| 476 | if (Settings::values.renderer_backend == Settings::RendererBackend::OpenGL) { | 482 | if (Settings::values.renderer_backend == Settings::RendererBackend::OpenGL) { |
| 477 | auto c = static_cast<OpenGLSharedContext*>(main_context.get()); | 483 | auto c = static_cast<OpenGLSharedContext*>(main_context.get()); |
| 478 | // Bind the shared contexts to the main surface in case the backend wants to take over | 484 | // Bind the shared contexts to the main surface in case the backend wants to take over |
| @@ -480,6 +486,7 @@ std::unique_ptr<Core::Frontend::GraphicsContext> GRenderWindow::CreateSharedCont | |||
| 480 | return std::make_unique<OpenGLSharedContext>(c->GetShareContext(), | 486 | return std::make_unique<OpenGLSharedContext>(c->GetShareContext(), |
| 481 | child_widget->windowHandle()); | 487 | child_widget->windowHandle()); |
| 482 | } | 488 | } |
| 489 | #endif | ||
| 483 | return std::make_unique<DummyContext>(); | 490 | return std::make_unique<DummyContext>(); |
| 484 | } | 491 | } |
| 485 | 492 | ||
| @@ -560,6 +567,7 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(std::pair<u32, u32> minimal | |||
| 560 | } | 567 | } |
| 561 | 568 | ||
| 562 | bool GRenderWindow::InitializeOpenGL() { | 569 | bool GRenderWindow::InitializeOpenGL() { |
| 570 | #ifdef HAS_OPENGL | ||
| 563 | // TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground, | 571 | // TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground, |
| 564 | // WA_DontShowOnScreen, WA_DeleteOnClose | 572 | // WA_DontShowOnScreen, WA_DeleteOnClose |
| 565 | auto child = new OpenGLRenderWidget(this); | 573 | auto child = new OpenGLRenderWidget(this); |
| @@ -571,6 +579,11 @@ bool GRenderWindow::InitializeOpenGL() { | |||
| 571 | std::make_unique<OpenGLSharedContext>(context->GetShareContext(), child->windowHandle())); | 579 | std::make_unique<OpenGLSharedContext>(context->GetShareContext(), child->windowHandle())); |
| 572 | 580 | ||
| 573 | return true; | 581 | return true; |
| 582 | #else | ||
| 583 | QMessageBox::warning(this, tr("OpenGL not available!"), | ||
| 584 | tr("yuzu has not been compiled with OpenGL support.")); | ||
| 585 | return false; | ||
| 586 | #endif | ||
| 574 | } | 587 | } |
| 575 | 588 | ||
| 576 | bool GRenderWindow::InitializeVulkan() { | 589 | bool GRenderWindow::InitializeVulkan() { |
diff --git a/src/yuzu/configuration/configure_service.cpp b/src/yuzu/configuration/configure_service.cpp index 06566e981..0de7a4f0b 100644 --- a/src/yuzu/configuration/configure_service.cpp +++ b/src/yuzu/configuration/configure_service.cpp | |||
| @@ -68,6 +68,7 @@ void ConfigureService::SetConfiguration() { | |||
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | std::pair<QString, QString> ConfigureService::BCATDownloadEvents() { | 70 | std::pair<QString, QString> ConfigureService::BCATDownloadEvents() { |
| 71 | #ifdef YUZU_ENABLE_BOXCAT | ||
| 71 | std::optional<std::string> global; | 72 | std::optional<std::string> global; |
| 72 | std::map<std::string, Service::BCAT::EventStatus> map; | 73 | std::map<std::string, Service::BCAT::EventStatus> map; |
| 73 | const auto res = Service::BCAT::Boxcat::GetStatus(global, map); | 74 | const auto res = Service::BCAT::Boxcat::GetStatus(global, map); |
| @@ -105,7 +106,10 @@ std::pair<QString, QString> ConfigureService::BCATDownloadEvents() { | |||
| 105 | .arg(QString::fromStdString(key)) | 106 | .arg(QString::fromStdString(key)) |
| 106 | .arg(FormatEventStatusString(value)); | 107 | .arg(FormatEventStatusString(value)); |
| 107 | } | 108 | } |
| 108 | return {QStringLiteral("Current Boxcat Events"), std::move(out)}; | 109 | return {tr("Current Boxcat Events"), std::move(out)}; |
| 110 | #else | ||
| 111 | return {tr("Current Boxcat Events"), tr("There are currently no events on boxcat.")}; | ||
| 112 | #endif | ||
| 109 | } | 113 | } |
| 110 | 114 | ||
| 111 | void ConfigureService::OnBCATImplChanged() { | 115 | void ConfigureService::OnBCATImplChanged() { |
diff --git a/src/yuzu/yuzu.rc b/src/yuzu/yuzu.rc index 1b253653f..4a3645a71 100644 --- a/src/yuzu/yuzu.rc +++ b/src/yuzu/yuzu.rc | |||
| @@ -16,4 +16,4 @@ IDI_ICON1 ICON "../../dist/yuzu.ico" | |||
| 16 | // RT_MANIFEST | 16 | // RT_MANIFEST |
| 17 | // | 17 | // |
| 18 | 18 | ||
| 19 | 1 RT_MANIFEST "../../dist/yuzu.manifest" | 19 | 0 RT_MANIFEST "../../dist/yuzu.manifest" |
diff --git a/src/yuzu_cmd/yuzu.rc b/src/yuzu_cmd/yuzu.rc index 7de8ef3d9..0cde75e2f 100644 --- a/src/yuzu_cmd/yuzu.rc +++ b/src/yuzu_cmd/yuzu.rc | |||
| @@ -14,4 +14,4 @@ YUZU_ICON ICON "../../dist/yuzu.ico" | |||
| 14 | // RT_MANIFEST | 14 | // RT_MANIFEST |
| 15 | // | 15 | // |
| 16 | 16 | ||
| 17 | 1 RT_MANIFEST "../../dist/yuzu.manifest" | 17 | 0 RT_MANIFEST "../../dist/yuzu.manifest" |
diff --git a/src/yuzu_tester/yuzu.rc b/src/yuzu_tester/yuzu.rc index 7de8ef3d9..0cde75e2f 100644 --- a/src/yuzu_tester/yuzu.rc +++ b/src/yuzu_tester/yuzu.rc | |||
| @@ -14,4 +14,4 @@ YUZU_ICON ICON "../../dist/yuzu.ico" | |||
| 14 | // RT_MANIFEST | 14 | // RT_MANIFEST |
| 15 | // | 15 | // |
| 16 | 16 | ||
| 17 | 1 RT_MANIFEST "../../dist/yuzu.manifest" | 17 | 0 RT_MANIFEST "../../dist/yuzu.manifest" |