diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index 9a4db1b4ab..286663f3aa 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -27,19 +27,20 @@ constexpr bool IsMethodExecutable(u32 method, Tegra::Engines::EngineTypes engine switch (engine_type) { case EngineTypes::Maxwell3D: switch (method) { - case 0x0044: case 0x0045: case 0x0046: case 0x0047: case 0x0049: - case 0x006C: case 0x006D: case 0x00B2: - case 0x035D: case 0x035E: case 0x0378: case 0x03DD: case 0x03DF: - case 0x0485: case 0x0486: case 0x04C0: case 0x054C: case 0x0556: - case 0x0585: case 0x0586: case 0x057A: case 0x057B: - case 0x05F7: case 0x05F8: case 0x05F9: case 0x05FA: case 0x05FB: - case 0x05FC: case 0x05FD: case 0x05FE: - case 0x065C: case 0x0674: case 0x06C0: case 0x08C4: - case 0x08E0: case 0x08E1: case 0x08E2: case 0x08E3: case 0x08E4: - case 0x08E5: case 0x08E6: case 0x08E7: case 0x08E8: case 0x08E9: - case 0x08EA: case 0x08EB: case 0x08EC: case 0x08ED: case 0x08EE: case 0x08EF: - case 0x0900: case 0x0908: case 0x0910: case 0x0918: case 0x0920: - case 0x042B: + case 0x0110: case 0x0114: case 0x0115: case 0x0117: case 0x0124: + case 0x01B0: case 0x01B4: case 0x02C8: + case 0x0D74: case 0x0D75: case 0x0DE0: case 0x0F74: case 0x0F7C: + case 0x108B: case 0x1214: case 0x1218: case 0x1301: + case 0x1530: case 0x1552: case 0x15E8: case 0x15ED: + case 0x1614: case 0x1615: case 0x1970: case 0x19D0: case 0x1B03: + case 0x17CD: case 0x17CE: case 0x17E4: case 0x17E8: case 0x17EC: + case 0x17F0: case 0x17F4: case 0x17F8: + case 0x2304: + case 0x2384: case 0x2385: case 0x2386: case 0x2387: + case 0x2388: case 0x2389: case 0x238A: case 0x238B: + case 0x238C: case 0x238D: case 0x238E: case 0x238F: + case 0x2390: case 0x2391: case 0x2392: case 0x2393: + case 0x2404: case 0x240C: case 0x2414: case 0x241C: case 0x2424: return true; default: return false; diff --git a/src/video_core/engines/engine_upload.cpp b/src/video_core/engines/engine_upload.cpp index ba21eec4c4..ea6ce61090 100644 --- a/src/video_core/engines/engine_upload.cpp +++ b/src/video_core/engines/engine_upload.cpp @@ -33,6 +33,12 @@ void State::ProcessExec(const bool is_linear_) { } void State::ProcessData(const u32 data, const bool is_last_call) { + if (copy_size == 0) [[unlikely]] { + return; + } + if (write_offset >= copy_size) [[unlikely]] { + return; + } const u32 sub_copy_size = (std::min)(4U, copy_size - write_offset); std::memcpy(&inner_buffer[write_offset], &data, sub_copy_size); write_offset += sub_copy_size; @@ -49,6 +55,9 @@ void State::ProcessData(const u32* data, size_t num_data) { void State::ProcessData(std::span read_buffer) { const GPUVAddr address{regs.dest.Address()}; + if (address == 0 || regs.line_count == 0 || regs.line_length_in == 0) [[unlikely]] { + return; + } if (is_linear) { for (size_t line = 0; line < regs.line_count; ++line) { const GPUVAddr dest_line = address + line * regs.dest.pitch;