mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-08-08 01:00:11 +00:00
d3d12: DMA depth buffer when semaphore write is asked.
This commit is contained in:
parent
b72d435ce8
commit
1228787355
1 changed files with 93 additions and 96 deletions
|
@ -1067,14 +1067,24 @@ void D3D12GSRender::Flip()
|
||||||
|
|
||||||
void D3D12GSRender::WriteDepthBuffer()
|
void D3D12GSRender::WriteDepthBuffer()
|
||||||
{
|
{
|
||||||
if (!Ini.GSDumpDepthBuffer.GetValue())
|
}
|
||||||
return;
|
|
||||||
if (!m_set_context_dma_z)
|
|
||||||
return;
|
|
||||||
|
|
||||||
u32 address = GetAddress(m_surface_offset_z, m_context_dma_z - 0xfeed0000);
|
|
||||||
auto ptr = vm::get_ptr<void>(address);
|
|
||||||
|
|
||||||
|
void D3D12GSRender::semaphorePGRAPHBackendRelease(u32 offset, u32 value)
|
||||||
|
{
|
||||||
|
// Add all buffer write
|
||||||
|
// Cell can't make any assumption about readyness of color/depth buffer
|
||||||
|
// Except when a semaphore is written by RSX
|
||||||
|
|
||||||
|
|
||||||
|
/* if (!Ini.GSDumpDepthBuffer.GetValue())
|
||||||
|
return;*/
|
||||||
|
ID3D12Resource *writeDest;
|
||||||
|
ID3D12GraphicsCommandList *downloadCommandList;
|
||||||
|
size_t rowPitch = RSXThread::m_width * sizeof(float);
|
||||||
|
rowPitch = (rowPitch + 255) & ~255;
|
||||||
|
if (m_set_context_dma_z)
|
||||||
|
{
|
||||||
D3D12_HEAP_PROPERTIES heapProp = {};
|
D3D12_HEAP_PROPERTIES heapProp = {};
|
||||||
heapProp.Type = D3D12_HEAP_TYPE_READBACK;
|
heapProp.Type = D3D12_HEAP_TYPE_READBACK;
|
||||||
D3D12_RESOURCE_DESC resdesc = {};
|
D3D12_RESOURCE_DESC resdesc = {};
|
||||||
|
@ -1086,7 +1096,6 @@ void D3D12GSRender::WriteDepthBuffer()
|
||||||
resdesc.MipLevels = 1;
|
resdesc.MipLevels = 1;
|
||||||
resdesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
|
resdesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
|
||||||
|
|
||||||
ID3D12Resource *writeDest;
|
|
||||||
check(
|
check(
|
||||||
m_device->CreateCommittedResource(
|
m_device->CreateCommittedResource(
|
||||||
&heapProp,
|
&heapProp,
|
||||||
|
@ -1098,7 +1107,6 @@ void D3D12GSRender::WriteDepthBuffer()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
ID3D12GraphicsCommandList *downloadCommandList;
|
|
||||||
check(
|
check(
|
||||||
m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, getCurrentResourceStorage().m_commandAllocator, nullptr, IID_PPV_ARGS(&downloadCommandList))
|
m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, getCurrentResourceStorage().m_commandAllocator, nullptr, IID_PPV_ARGS(&downloadCommandList))
|
||||||
);
|
);
|
||||||
|
@ -1110,9 +1118,6 @@ void D3D12GSRender::WriteDepthBuffer()
|
||||||
barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE;
|
barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE;
|
||||||
downloadCommandList->ResourceBarrier(1, &barrier);
|
downloadCommandList->ResourceBarrier(1, &barrier);
|
||||||
|
|
||||||
size_t rowPitch = RSXThread::m_width * sizeof(float);
|
|
||||||
rowPitch = (rowPitch + 255) & ~255;
|
|
||||||
|
|
||||||
D3D12_TEXTURE_COPY_LOCATION dst = {}, src = {};
|
D3D12_TEXTURE_COPY_LOCATION dst = {}, src = {};
|
||||||
src.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
|
src.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
|
||||||
src.pResource = m_fbo->getDepthStencilTexture();
|
src.pResource = m_fbo->getDepthStencilTexture();
|
||||||
|
@ -1132,6 +1137,7 @@ void D3D12GSRender::WriteDepthBuffer()
|
||||||
|
|
||||||
downloadCommandList->Close();
|
downloadCommandList->Close();
|
||||||
m_commandQueueGraphic->ExecuteCommandLists(1, (ID3D12CommandList**)&downloadCommandList);
|
m_commandQueueGraphic->ExecuteCommandLists(1, (ID3D12CommandList**)&downloadCommandList);
|
||||||
|
}
|
||||||
|
|
||||||
//Wait for result
|
//Wait for result
|
||||||
ID3D12Fence *fence;
|
ID3D12Fence *fence;
|
||||||
|
@ -1141,45 +1147,36 @@ void D3D12GSRender::WriteDepthBuffer()
|
||||||
HANDLE handle = CreateEvent(0, FALSE, FALSE, 0);
|
HANDLE handle = CreateEvent(0, FALSE, FALSE, 0);
|
||||||
fence->SetEventOnCompletion(1, handle);
|
fence->SetEventOnCompletion(1, handle);
|
||||||
m_commandQueueGraphic->Signal(fence, 1);
|
m_commandQueueGraphic->Signal(fence, 1);
|
||||||
WaitForSingleObject(handle, INFINITE);
|
|
||||||
CloseHandle(handle);
|
|
||||||
|
|
||||||
char *ptrAsChar = (char*)ptr;
|
|
||||||
float *writeDestPtr;
|
|
||||||
check(writeDest->Map(0, nullptr, (void**)&writeDestPtr));
|
|
||||||
// TODO : this should be done by the gpu
|
|
||||||
for (unsigned row = 0; row < RSXThread::m_height; row++)
|
|
||||||
{
|
|
||||||
for (unsigned i = 0; i < RSXThread::m_width; i++)
|
|
||||||
{
|
|
||||||
unsigned char c = (unsigned char) (writeDestPtr[row * rowPitch / 4 + i] * 255.);
|
|
||||||
ptrAsChar[4 * (row * RSXThread::m_width + i)] = c;
|
|
||||||
ptrAsChar[4 * (row * RSXThread::m_width + i) + 1] = c;
|
|
||||||
ptrAsChar[4 * (row * RSXThread::m_width + i) + 2] = c;
|
|
||||||
ptrAsChar[4 * (row * RSXThread::m_width + i) + 3] = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeDest->Release();
|
|
||||||
fence->Release();
|
|
||||||
downloadCommandList->Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void D3D12GSRender::semaphorePGRAPHBackendRelease(u32 offset, u32 value)
|
|
||||||
{
|
|
||||||
ID3D12Fence *fence;
|
|
||||||
check(
|
|
||||||
m_device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence))
|
|
||||||
);
|
|
||||||
HANDLE handle = CreateEvent(0, FALSE, FALSE, 0);
|
|
||||||
fence->SetEventOnCompletion(1, handle);
|
|
||||||
m_commandQueueGraphic->Signal(fence, 1);
|
|
||||||
|
|
||||||
std::thread valueChangerThread([=]() {
|
std::thread valueChangerThread([=]() {
|
||||||
WaitForSingleObject(handle, INFINITE);
|
WaitForSingleObject(handle, INFINITE);
|
||||||
CloseHandle(handle);
|
CloseHandle(handle);
|
||||||
fence->Release();
|
fence->Release();
|
||||||
|
|
||||||
|
if (m_set_context_dma_z)
|
||||||
|
{
|
||||||
|
u32 address = GetAddress(m_surface_offset_z, m_context_dma_z - 0xfeed0000);
|
||||||
|
auto ptr = vm::get_ptr<void>(address);
|
||||||
|
char *ptrAsChar = (char*)ptr;
|
||||||
|
float *writeDestPtr;
|
||||||
|
check(writeDest->Map(0, nullptr, (void**)&writeDestPtr));
|
||||||
|
// TODO : this should be done by the gpu
|
||||||
|
for (unsigned row = 0; row < RSXThread::m_height; row++)
|
||||||
|
{
|
||||||
|
for (unsigned i = 0; i < RSXThread::m_width; i++)
|
||||||
|
{
|
||||||
|
unsigned char c = (unsigned char)(writeDestPtr[row * rowPitch / 4 + i] * 255.);
|
||||||
|
ptrAsChar[4 * (row * RSXThread::m_width + i)] = c;
|
||||||
|
ptrAsChar[4 * (row * RSXThread::m_width + i) + 1] = c;
|
||||||
|
ptrAsChar[4 * (row * RSXThread::m_width + i) + 2] = c;
|
||||||
|
ptrAsChar[4 * (row * RSXThread::m_width + i) + 3] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
writeDest->Release();
|
||||||
|
fence->Release();
|
||||||
|
downloadCommandList->Release();
|
||||||
|
}
|
||||||
|
|
||||||
vm::write32(m_label_addr + offset, value);
|
vm::write32(m_label_addr + offset, value);
|
||||||
});
|
});
|
||||||
valueChangerThread.detach();
|
valueChangerThread.detach();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue