Browse Source

Fix CONST_A for different component sizes in MaxwellDMA Launch

pull/3211/head
MaranBr 1 month ago
committed by crueter
parent
commit
c67764d7fe
  1. 35
      src/video_core/engines/maxwell_dma.cpp

35
src/video_core/engines/maxwell_dma.cpp

@ -96,15 +96,32 @@ void MaxwellDMA::Launch() {
auto& accelerate = rasterizer->AccessAccelerateDMA();
const bool is_const_a_dst = regs.remap_const.dst_x == RemapConst::Swizzle::CONST_A;
if (regs.launch_dma.remap_enable != 0 && is_const_a_dst) {
ASSERT(regs.remap_const.component_size_minus_one == 3);
accelerate.BufferClear(regs.offset_out, regs.line_length_in,
regs.remap_const.remap_consta_value);
read_buffer.resize_destructive(regs.line_length_in * sizeof(u32));
std::span<u32> span(reinterpret_cast<u32*>(read_buffer.data()), regs.line_length_in);
std::ranges::fill(span, regs.remap_const.remap_consta_value);
memory_manager.WriteBlockUnsafe(regs.offset_out,
reinterpret_cast<u8*>(read_buffer.data()),
regs.line_length_in * sizeof(u32));
const u32 component_size = regs.remap_const.component_size_minus_one + 1;
const u32 line_length = regs.line_length_in;
read_buffer.resize_destructive(line_length * component_size);
u8* buf = read_buffer.data();
switch (component_size) {
case 1: {
std::span<u8> span(buf, line_length);
std::ranges::fill(span, static_cast<u8>(regs.remap_const.remap_consta_value & 0xFF));
break;
}
case 2: {
std::span<u16> span(reinterpret_cast<u16*>(buf), line_length);
std::ranges::fill(span, static_cast<u16>(regs.remap_const.remap_consta_value & 0xFFFF));
break;
}
case 4: {
std::span<u32> span(reinterpret_cast<u32*>(buf), line_length);
std::ranges::fill(span, regs.remap_const.remap_consta_value);
break;
}
default:
LOG_WARNING(Render_OpenGL, "Remap CONST_A with unsupported component size {} bytes", component_size);
break;
}
memory_manager.WriteBlockUnsafe(regs.offset_out, buf, line_length * component_size);
accelerate.BufferClear(regs.offset_out, line_length, regs.remap_const.remap_consta_value);
} else {
memory_manager.FlushCaching();
const auto convert_linear_2_blocklinear_addr = [](u64 address) {

Loading…
Cancel
Save