Browse Source

[video_core, dma] Recalculating engine entries to dma based on previous initialization method

pull/3296/head
CamilleLaVey 3 weeks ago
committed by lizzie
parent
commit
0a2e35eb9c
  1. 27
      src/video_core/dma_pusher.cpp
  2. 9
      src/video_core/engines/engine_upload.cpp

27
src/video_core/dma_pusher.cpp

@ -27,19 +27,20 @@ constexpr bool IsMethodExecutable(u32 method, Tegra::Engines::EngineTypes engine
switch (engine_type) { switch (engine_type) {
case EngineTypes::Maxwell3D: case EngineTypes::Maxwell3D:
switch (method) { 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; return true;
default: default:
return false; return false;

9
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) { 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); const u32 sub_copy_size = (std::min)(4U, copy_size - write_offset);
std::memcpy(&inner_buffer[write_offset], &data, sub_copy_size); std::memcpy(&inner_buffer[write_offset], &data, sub_copy_size);
write_offset += 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<const u8> read_buffer) { void State::ProcessData(std::span<const u8> read_buffer) {
const GPUVAddr address{regs.dest.Address()}; const GPUVAddr address{regs.dest.Address()};
if (address == 0 || regs.line_count == 0 || regs.line_length_in == 0) [[unlikely]] {
return;
}
if (is_linear) { if (is_linear) {
for (size_t line = 0; line < regs.line_count; ++line) { for (size_t line = 0; line < regs.line_count; ++line) {
const GPUVAddr dest_line = address + line * regs.dest.pitch; const GPUVAddr dest_line = address + line * regs.dest.pitch;

Loading…
Cancel
Save