mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-04 22:11:26 +12:00
d3d12: Use address instead of context_dma value to determine whether to write buffers
Fixed depth read test when write color buffer is enabled
This commit is contained in:
parent
115255c162
commit
f3dd9596cf
1 changed files with 28 additions and 11 deletions
|
@ -444,6 +444,24 @@ void D3D12GSRender::copy_render_target_to_dma_location()
|
||||||
};
|
};
|
||||||
u32 m_context_dma_z = rsx::method_registers[NV4097_SET_CONTEXT_DMA_ZETA];
|
u32 m_context_dma_z = rsx::method_registers[NV4097_SET_CONTEXT_DMA_ZETA];
|
||||||
|
|
||||||
|
u32 offset_color[] =
|
||||||
|
{
|
||||||
|
rsx::method_registers[NV4097_SET_SURFACE_COLOR_AOFFSET],
|
||||||
|
rsx::method_registers[NV4097_SET_SURFACE_COLOR_BOFFSET],
|
||||||
|
rsx::method_registers[NV4097_SET_SURFACE_COLOR_COFFSET],
|
||||||
|
rsx::method_registers[NV4097_SET_SURFACE_COLOR_DOFFSET]
|
||||||
|
};
|
||||||
|
u32 offset_zeta = rsx::method_registers[NV4097_SET_SURFACE_ZETA_OFFSET];
|
||||||
|
|
||||||
|
u32 address_color[] =
|
||||||
|
{
|
||||||
|
rsx::get_address(offset_color[0], context_dma_color[0]),
|
||||||
|
rsx::get_address(offset_color[1], context_dma_color[1]),
|
||||||
|
rsx::get_address(offset_color[2], context_dma_color[2]),
|
||||||
|
rsx::get_address(offset_color[3], context_dma_color[3]),
|
||||||
|
};
|
||||||
|
u32 address_z = rsx::get_address(offset_zeta, m_context_dma_z);
|
||||||
|
|
||||||
bool need_transfer = false;
|
bool need_transfer = false;
|
||||||
|
|
||||||
if (m_context_dma_z && rpcs3::state.config.rsx.opengl.write_depth_buffer)
|
if (m_context_dma_z && rpcs3::state.config.rsx.opengl.write_depth_buffer)
|
||||||
|
@ -499,7 +517,7 @@ void D3D12GSRender::copy_render_target_to_dma_location()
|
||||||
get_current_resource_storage().command_list->CopyTextureRegion(&CD3DX12_TEXTURE_COPY_LOCATION(m_readback_resources.m_heap, { depth_buffer_offset_in_heap,{ DXGI_FORMAT_R8_UNORM, (UINT)clip_w, (UINT)clip_h, 1, (UINT)depth_row_pitch } }), 0, 0, 0,
|
get_current_resource_storage().command_list->CopyTextureRegion(&CD3DX12_TEXTURE_COPY_LOCATION(m_readback_resources.m_heap, { depth_buffer_offset_in_heap,{ DXGI_FORMAT_R8_UNORM, (UINT)clip_w, (UINT)clip_h, 1, (UINT)depth_row_pitch } }), 0, 0, 0,
|
||||||
&CD3DX12_TEXTURE_COPY_LOCATION(depth_format_conversion_buffer.Get(), 0), nullptr);
|
&CD3DX12_TEXTURE_COPY_LOCATION(depth_format_conversion_buffer.Get(), 0), nullptr);
|
||||||
|
|
||||||
invalidate_address(rsx::get_address(rsx::method_registers[NV4097_SET_SURFACE_ZETA_OFFSET], m_context_dma_z - 0xfeed0000));
|
invalidate_address(address_z);
|
||||||
|
|
||||||
need_transfer = true;
|
need_transfer = true;
|
||||||
}
|
}
|
||||||
|
@ -509,10 +527,10 @@ void D3D12GSRender::copy_render_target_to_dma_location()
|
||||||
{
|
{
|
||||||
for (u8 i : get_rtt_indexes(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET]))
|
for (u8 i : get_rtt_indexes(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET]))
|
||||||
{
|
{
|
||||||
if (!context_dma_color[i])
|
if (!address_color[i])
|
||||||
continue;
|
continue;
|
||||||
color_buffer_offset_in_heap[i] = download_to_readback_buffer(m_device.Get(), get_current_resource_storage().command_list.Get(), m_readback_resources, m_rtts.bound_render_targets[i], m_surface.color_format);
|
color_buffer_offset_in_heap[i] = download_to_readback_buffer(m_device.Get(), get_current_resource_storage().command_list.Get(), m_readback_resources, m_rtts.bound_render_targets[i], m_surface.color_format);
|
||||||
invalidate_address(rsx::get_address(rsx::method_registers[NV4097_SET_SURFACE_COLOR_AOFFSET], context_dma_color[i] - 0xfeed0000));
|
invalidate_address(address_color[i]);
|
||||||
need_transfer = true;
|
need_transfer = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -526,10 +544,9 @@ void D3D12GSRender::copy_render_target_to_dma_location()
|
||||||
//Wait for result
|
//Wait for result
|
||||||
wait_for_command_queue(m_device.Get(), m_command_queue.Get());
|
wait_for_command_queue(m_device.Get(), m_command_queue.Get());
|
||||||
|
|
||||||
if (m_context_dma_z && rpcs3::state.config.rsx.opengl.write_depth_buffer)
|
if (address_z && rpcs3::state.config.rsx.opengl.write_depth_buffer)
|
||||||
{
|
{
|
||||||
u32 address = rsx::get_address(rsx::method_registers[NV4097_SET_SURFACE_ZETA_OFFSET], m_context_dma_z - 0xfeed0000);
|
auto ptr = vm::base(address_z);
|
||||||
auto ptr = vm::base(address);
|
|
||||||
char *depth_buffer = (char*)ptr;
|
char *depth_buffer = (char*)ptr;
|
||||||
void *buffer;
|
void *buffer;
|
||||||
// TODO: Use exact range
|
// TODO: Use exact range
|
||||||
|
@ -567,15 +584,15 @@ void D3D12GSRender::copy_render_target_to_dma_location()
|
||||||
{
|
{
|
||||||
void *dest_buffer[] =
|
void *dest_buffer[] =
|
||||||
{
|
{
|
||||||
vm::base(rsx::get_address(rsx::method_registers[NV4097_SET_SURFACE_COLOR_AOFFSET], context_dma_color[0] - 0xfeed0000)),
|
vm::base(address_color[0]),
|
||||||
vm::base(rsx::get_address(rsx::method_registers[NV4097_SET_SURFACE_COLOR_AOFFSET], context_dma_color[1] - 0xfeed0000)),
|
vm::base(address_color[1]),
|
||||||
vm::base(rsx::get_address(rsx::method_registers[NV4097_SET_SURFACE_COLOR_AOFFSET], context_dma_color[2] - 0xfeed0000)),
|
vm::base(address_color[2]),
|
||||||
vm::base(rsx::get_address(rsx::method_registers[NV4097_SET_SURFACE_COLOR_AOFFSET], context_dma_color[3] - 0xfeed0000))
|
vm::base(address_color[3]),
|
||||||
};
|
};
|
||||||
|
|
||||||
for (u8 i : get_rtt_indexes(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET]))
|
for (u8 i : get_rtt_indexes(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET]))
|
||||||
{
|
{
|
||||||
if (!context_dma_color[i])
|
if (!address_color[i])
|
||||||
continue;
|
continue;
|
||||||
copy_readback_buffer_to_dest(dest_buffer[i], m_readback_resources, color_buffer_offset_in_heap[i], srcPitch, dstPitch, clip_h);
|
copy_readback_buffer_to_dest(dest_buffer[i], m_readback_resources, color_buffer_offset_in_heap[i], srcPitch, dstPitch, clip_h);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue