diff options
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 22 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 41 | ||||
| -rw-r--r-- | src/core/hle/service/prepo/prepo.cpp | 66 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 5 |
8 files changed, 105 insertions, 51 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 83decf6cf..a419f9602 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -338,6 +338,28 @@ std::size_t HLERequestContext::GetWriteBufferSize(std::size_t buffer_index) cons | |||
| 338 | return 0; | 338 | return 0; |
| 339 | } | 339 | } |
| 340 | 340 | ||
| 341 | bool HLERequestContext::CanReadBuffer(std::size_t buffer_index) const { | ||
| 342 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && | ||
| 343 | BufferDescriptorA()[buffer_index].Size()}; | ||
| 344 | |||
| 345 | if (is_buffer_a) { | ||
| 346 | return BufferDescriptorA().size() > buffer_index; | ||
| 347 | } else { | ||
| 348 | return BufferDescriptorX().size() > buffer_index; | ||
| 349 | } | ||
| 350 | } | ||
| 351 | |||
| 352 | bool HLERequestContext::CanWriteBuffer(std::size_t buffer_index) const { | ||
| 353 | const bool is_buffer_b{BufferDescriptorB().size() > buffer_index && | ||
| 354 | BufferDescriptorB()[buffer_index].Size()}; | ||
| 355 | |||
| 356 | if (is_buffer_b) { | ||
| 357 | return BufferDescriptorB().size() > buffer_index; | ||
| 358 | } else { | ||
| 359 | return BufferDescriptorC().size() > buffer_index; | ||
| 360 | } | ||
| 361 | } | ||
| 362 | |||
| 341 | std::string HLERequestContext::Description() const { | 363 | std::string HLERequestContext::Description() const { |
| 342 | if (!command_header) { | 364 | if (!command_header) { |
| 343 | return "No command header available"; | 365 | return "No command header available"; |
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index b112e1ebd..698f607e6 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -207,6 +207,12 @@ public: | |||
| 207 | /// Helper function to get the size of the output buffer | 207 | /// Helper function to get the size of the output buffer |
| 208 | std::size_t GetWriteBufferSize(std::size_t buffer_index = 0) const; | 208 | std::size_t GetWriteBufferSize(std::size_t buffer_index = 0) const; |
| 209 | 209 | ||
| 210 | /// Helper function to test whether the input buffer at buffer_index can be read | ||
| 211 | bool CanReadBuffer(std::size_t buffer_index = 0) const; | ||
| 212 | |||
| 213 | /// Helper function to test whether the output buffer at buffer_index can be written | ||
| 214 | bool CanWriteBuffer(std::size_t buffer_index = 0) const; | ||
| 215 | |||
| 210 | template <typename T> | 216 | template <typename T> |
| 211 | std::shared_ptr<T> GetCopyObject(std::size_t index) { | 217 | std::shared_ptr<T> GetCopyObject(std::size_t index) { |
| 212 | return DynamicObjectCast<T>(copy_objects.at(index)); | 218 | return DynamicObjectCast<T>(copy_objects.at(index)); |
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 265c986e2..0c227b135 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -946,20 +946,19 @@ void Controller_NPad::SetSixAxisEnabled(bool six_axis_status) { | |||
| 946 | sixaxis_sensors_enabled = six_axis_status; | 946 | sixaxis_sensors_enabled = six_axis_status; |
| 947 | } | 947 | } |
| 948 | 948 | ||
| 949 | void Controller_NPad::SetSixAxisFusionParameters(const DeviceHandle& handle, f32 parameter1, | 949 | void Controller_NPad::SetSixAxisFusionParameters(f32 parameter1, f32 parameter2) { |
| 950 | f32 parameter2) { | ||
| 951 | sixaxis_fusion_parameter1 = parameter1; | 950 | sixaxis_fusion_parameter1 = parameter1; |
| 952 | sixaxis_fusion_parameter2 = parameter2; | 951 | sixaxis_fusion_parameter2 = parameter2; |
| 953 | } | 952 | } |
| 954 | 953 | ||
| 955 | std::pair<f32, f32> Controller_NPad::GetSixAxisFusionParameters(const DeviceHandle& handle) { | 954 | std::pair<f32, f32> Controller_NPad::GetSixAxisFusionParameters() { |
| 956 | return { | 955 | return { |
| 957 | sixaxis_fusion_parameter1, | 956 | sixaxis_fusion_parameter1, |
| 958 | sixaxis_fusion_parameter2, | 957 | sixaxis_fusion_parameter2, |
| 959 | }; | 958 | }; |
| 960 | } | 959 | } |
| 961 | 960 | ||
| 962 | void Controller_NPad::ResetSixAxisFusionParameters(const DeviceHandle& handle) { | 961 | void Controller_NPad::ResetSixAxisFusionParameters() { |
| 963 | sixaxis_fusion_parameter1 = 0.0f; | 962 | sixaxis_fusion_parameter1 = 0.0f; |
| 964 | sixaxis_fusion_parameter2 = 0.0f; | 963 | sixaxis_fusion_parameter2 = 0.0f; |
| 965 | } | 964 | } |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index bfd06372a..2e13922b9 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -202,9 +202,9 @@ public: | |||
| 202 | GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode() const; | 202 | GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode() const; |
| 203 | bool IsSixAxisSensorAtRest() const; | 203 | bool IsSixAxisSensorAtRest() const; |
| 204 | void SetSixAxisEnabled(bool six_axis_status); | 204 | void SetSixAxisEnabled(bool six_axis_status); |
| 205 | void SetSixAxisFusionParameters(const DeviceHandle& handle, f32 parameter1, f32 parameter2); | 205 | void SetSixAxisFusionParameters(f32 parameter1, f32 parameter2); |
| 206 | std::pair<f32, f32> GetSixAxisFusionParameters(const DeviceHandle& handle); | 206 | std::pair<f32, f32> GetSixAxisFusionParameters(); |
| 207 | void ResetSixAxisFusionParameters(const DeviceHandle& handle); | 207 | void ResetSixAxisFusionParameters(); |
| 208 | LedPattern GetLedPattern(u32 npad_id); | 208 | LedPattern GetLedPattern(u32 npad_id); |
| 209 | bool IsUnintendedHomeButtonInputProtectionEnabled(u32 npad_id) const; | 209 | bool IsUnintendedHomeButtonInputProtectionEnabled(u32 npad_id) const; |
| 210 | void SetUnintendedHomeButtonInputProtectionEnabled(bool is_protection_enabled, u32 npad_id); | 210 | void SetUnintendedHomeButtonInputProtectionEnabled(bool is_protection_enabled, u32 npad_id); |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 7fd3161e8..5efc1237e 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -520,6 +520,7 @@ void Hid::EnableSixAxisSensorFusion(Kernel::HLERequestContext& ctx) { | |||
| 520 | Controller_NPad::DeviceHandle sixaxis_handle; | 520 | Controller_NPad::DeviceHandle sixaxis_handle; |
| 521 | u64 applet_resource_user_id; | 521 | u64 applet_resource_user_id; |
| 522 | }; | 522 | }; |
| 523 | static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); | ||
| 523 | 524 | ||
| 524 | const auto parameters{rp.PopRaw<Parameters>()}; | 525 | const auto parameters{rp.PopRaw<Parameters>()}; |
| 525 | 526 | ||
| @@ -542,19 +543,19 @@ void Hid::SetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) { | |||
| 542 | f32 parameter2; | 543 | f32 parameter2; |
| 543 | u64 applet_resource_user_id; | 544 | u64 applet_resource_user_id; |
| 544 | }; | 545 | }; |
| 546 | static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size."); | ||
| 545 | 547 | ||
| 546 | const auto parameters{rp.PopRaw<Parameters>()}; | 548 | const auto parameters{rp.PopRaw<Parameters>()}; |
| 547 | 549 | ||
| 548 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 550 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 549 | .SetSixAxisFusionParameters(parameters.sixaxis_handle, parameters.parameter1, | 551 | .SetSixAxisFusionParameters(parameters.parameter1, parameters.parameter2); |
| 550 | parameters.parameter2); | ||
| 551 | 552 | ||
| 552 | LOG_WARNING(Service_HID, | 553 | LOG_WARNING(Service_HID, |
| 553 | "(STUBBED) called, float1={}, float2={}, npad_type={}, npad_id={}, " | 554 | "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, parameter1={}, " |
| 554 | "device_index={}, applet_resource_user_id={}", | 555 | "parameter2={}, applet_resource_user_id={}", |
| 555 | parameters.parameter1, parameters.parameter2, parameters.sixaxis_handle.npad_type, | 556 | parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id, |
| 556 | parameters.sixaxis_handle.npad_id, parameters.sixaxis_handle.device_index, | 557 | parameters.sixaxis_handle.device_index, parameters.parameter1, |
| 557 | parameters.applet_resource_user_id); | 558 | parameters.parameter2, parameters.applet_resource_user_id); |
| 558 | 559 | ||
| 559 | IPC::ResponseBuilder rb{ctx, 2}; | 560 | IPC::ResponseBuilder rb{ctx, 2}; |
| 560 | rb.Push(RESULT_SUCCESS); | 561 | rb.Push(RESULT_SUCCESS); |
| @@ -566,6 +567,7 @@ void Hid::GetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) { | |||
| 566 | Controller_NPad::DeviceHandle sixaxis_handle; | 567 | Controller_NPad::DeviceHandle sixaxis_handle; |
| 567 | u64 applet_resource_user_id; | 568 | u64 applet_resource_user_id; |
| 568 | }; | 569 | }; |
| 570 | static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); | ||
| 569 | 571 | ||
| 570 | f32 parameter1 = 0; | 572 | f32 parameter1 = 0; |
| 571 | f32 parameter2 = 0; | 573 | f32 parameter2 = 0; |
| @@ -573,13 +575,13 @@ void Hid::GetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) { | |||
| 573 | 575 | ||
| 574 | std::tie(parameter1, parameter2) = | 576 | std::tie(parameter1, parameter2) = |
| 575 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 577 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 576 | .GetSixAxisFusionParameters(parameters.sixaxis_handle); | 578 | .GetSixAxisFusionParameters(); |
| 577 | 579 | ||
| 578 | LOG_WARNING(Service_HID, | 580 | LOG_WARNING( |
| 579 | "(STUBBED) called, npad_type={}, npad_id={}, " | 581 | Service_HID, |
| 580 | "device_index={}, applet_resource_user_id={}", | 582 | "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}", |
| 581 | parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id, | 583 | parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id, |
| 582 | parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id); | 584 | parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id); |
| 583 | 585 | ||
| 584 | IPC::ResponseBuilder rb{ctx, 4}; | 586 | IPC::ResponseBuilder rb{ctx, 4}; |
| 585 | rb.Push(RESULT_SUCCESS); | 587 | rb.Push(RESULT_SUCCESS); |
| @@ -593,17 +595,18 @@ void Hid::ResetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) { | |||
| 593 | Controller_NPad::DeviceHandle sixaxis_handle; | 595 | Controller_NPad::DeviceHandle sixaxis_handle; |
| 594 | u64 applet_resource_user_id; | 596 | u64 applet_resource_user_id; |
| 595 | }; | 597 | }; |
| 598 | static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); | ||
| 596 | 599 | ||
| 597 | const auto parameters{rp.PopRaw<Parameters>()}; | 600 | const auto parameters{rp.PopRaw<Parameters>()}; |
| 598 | 601 | ||
| 599 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 602 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 600 | .ResetSixAxisFusionParameters(parameters.sixaxis_handle); | 603 | .ResetSixAxisFusionParameters(); |
| 601 | 604 | ||
| 602 | LOG_WARNING(Service_HID, | 605 | LOG_WARNING( |
| 603 | "(STUBBED) called, npad_type={}, npad_id={}, " | 606 | Service_HID, |
| 604 | "device_index={}, applet_resource_user_id={}", | 607 | "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}", |
| 605 | parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id, | 608 | parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id, |
| 606 | parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id); | 609 | parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id); |
| 607 | 610 | ||
| 608 | IPC::ResponseBuilder rb{ctx, 2}; | 611 | IPC::ResponseBuilder rb{ctx, 2}; |
| 609 | rb.Push(RESULT_SUCCESS); | 612 | rb.Push(RESULT_SUCCESS); |
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index b417624c9..6edd45455 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp | |||
| @@ -23,8 +23,8 @@ public: | |||
| 23 | {10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"}, | 23 | {10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"}, |
| 24 | {10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"}, | 24 | {10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"}, |
| 25 | {10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"}, | 25 | {10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"}, |
| 26 | {10104, nullptr, "SaveReport"}, | 26 | {10104, &PlayReport::SaveReport<Core::Reporter::PlayReportType::New>, "SaveReport"}, |
| 27 | {10105, nullptr, "SaveReportWithUser"}, | 27 | {10105, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::New>, "SaveReportWithUser"}, |
| 28 | {10200, nullptr, "RequestImmediateTransmission"}, | 28 | {10200, nullptr, "RequestImmediateTransmission"}, |
| 29 | {10300, nullptr, "GetTransmissionStatus"}, | 29 | {10300, nullptr, "GetTransmissionStatus"}, |
| 30 | {10400, nullptr, "GetSystemSessionId"}, | 30 | {10400, nullptr, "GetSystemSessionId"}, |
| @@ -59,16 +59,22 @@ private: | |||
| 59 | IPC::RequestParser rp{ctx}; | 59 | IPC::RequestParser rp{ctx}; |
| 60 | const auto process_id = rp.PopRaw<u64>(); | 60 | const auto process_id = rp.PopRaw<u64>(); |
| 61 | 61 | ||
| 62 | std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)}; | 62 | const auto data1 = ctx.ReadBuffer(0); |
| 63 | if constexpr (Type == Core::Reporter::PlayReportType::Old2) { | 63 | const auto data2 = [ctx] { |
| 64 | data.emplace_back(ctx.ReadBuffer(1)); | 64 | if (ctx.CanReadBuffer(1)) { |
| 65 | } | 65 | return ctx.ReadBuffer(1); |
| 66 | } | ||
| 67 | |||
| 68 | return std::vector<u8>{}; | ||
| 69 | }(); | ||
| 66 | 70 | ||
| 67 | LOG_DEBUG(Service_PREPO, "called, type={:02X}, process_id={:016X}, data1_size={:016X}", | 71 | LOG_DEBUG(Service_PREPO, |
| 68 | Type, process_id, data[0].size()); | 72 | "called, type={:02X}, process_id={:016X}, data1_size={:016X}, data2_size={:016X}", |
| 73 | Type, process_id, data1.size(), data2.size()); | ||
| 69 | 74 | ||
| 70 | const auto& reporter{system.GetReporter()}; | 75 | const auto& reporter{system.GetReporter()}; |
| 71 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id); | 76 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2}, |
| 77 | process_id); | ||
| 72 | 78 | ||
| 73 | IPC::ResponseBuilder rb{ctx, 2}; | 79 | IPC::ResponseBuilder rb{ctx, 2}; |
| 74 | rb.Push(RESULT_SUCCESS); | 80 | rb.Push(RESULT_SUCCESS); |
| @@ -79,24 +85,24 @@ private: | |||
| 79 | IPC::RequestParser rp{ctx}; | 85 | IPC::RequestParser rp{ctx}; |
| 80 | const auto user_id = rp.PopRaw<u128>(); | 86 | const auto user_id = rp.PopRaw<u128>(); |
| 81 | const auto process_id = rp.PopRaw<u64>(); | 87 | const auto process_id = rp.PopRaw<u64>(); |
| 82 | std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)}; | ||
| 83 | 88 | ||
| 84 | if constexpr (Type == Core::Reporter::PlayReportType::Old2) { | 89 | const auto data1 = ctx.ReadBuffer(0); |
| 85 | const auto read_buffer_count = | 90 | const auto data2 = [ctx] { |
| 86 | ctx.BufferDescriptorX().size() + ctx.BufferDescriptorA().size(); | 91 | if (ctx.CanReadBuffer(1)) { |
| 87 | if (read_buffer_count > 1) { | 92 | return ctx.ReadBuffer(1); |
| 88 | data.emplace_back(ctx.ReadBuffer(1)); | ||
| 89 | } | 93 | } |
| 90 | } | ||
| 91 | 94 | ||
| 92 | LOG_DEBUG( | 95 | return std::vector<u8>{}; |
| 93 | Service_PREPO, | 96 | }(); |
| 94 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, data1_size={:016X}", | 97 | |
| 95 | Type, user_id[1], user_id[0], process_id, data[0].size()); | 98 | LOG_DEBUG(Service_PREPO, |
| 99 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, " | ||
| 100 | "data1_size={:016X}, data2_size={:016X}", | ||
| 101 | Type, user_id[1], user_id[0], process_id, data1.size(), data2.size()); | ||
| 96 | 102 | ||
| 97 | const auto& reporter{system.GetReporter()}; | 103 | const auto& reporter{system.GetReporter()}; |
| 98 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id, | 104 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2}, |
| 99 | user_id); | 105 | process_id, user_id); |
| 100 | 106 | ||
| 101 | IPC::ResponseBuilder rb{ctx, 2}; | 107 | IPC::ResponseBuilder rb{ctx, 2}; |
| 102 | rb.Push(RESULT_SUCCESS); | 108 | rb.Push(RESULT_SUCCESS); |
| @@ -107,7 +113,13 @@ private: | |||
| 107 | const auto title_id = rp.PopRaw<u64>(); | 113 | const auto title_id = rp.PopRaw<u64>(); |
| 108 | 114 | ||
| 109 | const auto data1 = ctx.ReadBuffer(0); | 115 | const auto data1 = ctx.ReadBuffer(0); |
| 110 | const auto data2 = ctx.ReadBuffer(1); | 116 | const auto data2 = [ctx] { |
| 117 | if (ctx.CanReadBuffer(1)) { | ||
| 118 | return ctx.ReadBuffer(1); | ||
| 119 | } | ||
| 120 | |||
| 121 | return std::vector<u8>{}; | ||
| 122 | }(); | ||
| 111 | 123 | ||
| 112 | LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", | 124 | LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", |
| 113 | title_id, data1.size(), data2.size()); | 125 | title_id, data1.size(), data2.size()); |
| @@ -125,7 +137,13 @@ private: | |||
| 125 | const auto title_id = rp.PopRaw<u64>(); | 137 | const auto title_id = rp.PopRaw<u64>(); |
| 126 | 138 | ||
| 127 | const auto data1 = ctx.ReadBuffer(0); | 139 | const auto data1 = ctx.ReadBuffer(0); |
| 128 | const auto data2 = ctx.ReadBuffer(1); | 140 | const auto data2 = [ctx] { |
| 141 | if (ctx.CanReadBuffer(1)) { | ||
| 142 | return ctx.ReadBuffer(1); | ||
| 143 | } | ||
| 144 | |||
| 145 | return std::vector<u8>{}; | ||
| 146 | }(); | ||
| 129 | 147 | ||
| 130 | LOG_DEBUG(Service_PREPO, | 148 | LOG_DEBUG(Service_PREPO, |
| 131 | "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, " | 149 | "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, " |
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 2e1fa252d..c35b71b6b 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include "common/alignment.h" | 14 | #include "common/alignment.h" |
| 15 | #include "common/assert.h" | 15 | #include "common/assert.h" |
| 16 | #include "common/common_types.h" | 16 | #include "common/common_types.h" |
| 17 | #include "common/div_ceil.h" | ||
| 17 | #include "common/logging/log.h" | 18 | #include "common/logging/log.h" |
| 18 | #include "video_core/engines/maxwell_3d.h" | 19 | #include "video_core/engines/maxwell_3d.h" |
| 19 | #include "video_core/engines/shader_type.h" | 20 | #include "video_core/engines/shader_type.h" |
| @@ -877,7 +878,7 @@ private: | |||
| 877 | 878 | ||
| 878 | u32 binding = device.GetBaseBindings(stage).uniform_buffer; | 879 | u32 binding = device.GetBaseBindings(stage).uniform_buffer; |
| 879 | for (const auto& [index, info] : ir.GetConstantBuffers()) { | 880 | for (const auto& [index, info] : ir.GetConstantBuffers()) { |
| 880 | const u32 num_elements = Common::AlignUp(info.GetSize(), 4) / 4; | 881 | const u32 num_elements = Common::DivCeil(info.GetSize(), 4 * sizeof(u32)); |
| 881 | const u32 size = info.IsIndirect() ? MAX_CONSTBUFFER_ELEMENTS : num_elements; | 882 | const u32 size = info.IsIndirect() ? MAX_CONSTBUFFER_ELEMENTS : num_elements; |
| 882 | code.AddLine("layout (std140, binding = {}) uniform {} {{", binding++, | 883 | code.AddLine("layout (std140, binding = {}) uniform {} {{", binding++, |
| 883 | GetConstBufferBlock(index)); | 884 | GetConstBufferBlock(index)); |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 5b4209c72..51f53bc39 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -421,6 +421,11 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 421 | "Blacklisting RADV for VK_EXT_extended_dynamic state, likely due to a bug in yuzu"); | 421 | "Blacklisting RADV for VK_EXT_extended_dynamic state, likely due to a bug in yuzu"); |
| 422 | ext_extended_dynamic_state = false; | 422 | ext_extended_dynamic_state = false; |
| 423 | } | 423 | } |
| 424 | if (is_float16_supported && driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) { | ||
| 425 | // Intel's compiler crashes when using fp16 on Astral Chain, disable it for the time being. | ||
| 426 | LOG_WARNING(Render_Vulkan, "Blacklisting Intel proprietary from float16 math"); | ||
| 427 | is_float16_supported = false; | ||
| 428 | } | ||
| 424 | 429 | ||
| 425 | graphics_queue = logical.GetQueue(graphics_family); | 430 | graphics_queue = logical.GetQueue(graphics_family); |
| 426 | present_queue = logical.GetQueue(present_family); | 431 | present_queue = logical.GetQueue(present_family); |