mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-08-09 09:39:44 +00:00
d3d12: Copy vertexbuffer in vram for output scaling pass.
This commit is contained in:
parent
de5a3451cd
commit
506fdec6df
3 changed files with 56 additions and 28 deletions
|
@ -280,7 +280,7 @@ D3D12GSRender::D3D12GSRender()
|
||||||
m_perFrameStorage[1].Reset();
|
m_perFrameStorage[1].Reset();
|
||||||
|
|
||||||
initConvertShader();
|
initConvertShader();
|
||||||
m_outputScalingPass.Init(m_device.Get());
|
m_outputScalingPass.Init(m_device.Get(), m_commandQueueGraphic.Get());
|
||||||
|
|
||||||
ThrowIfFailed(
|
ThrowIfFailed(
|
||||||
m_device->CreateCommittedResource(
|
m_device->CreateCommittedResource(
|
||||||
|
|
|
@ -251,7 +251,7 @@ private:
|
||||||
ID3D12Resource *m_vertexBuffer;
|
ID3D12Resource *m_vertexBuffer;
|
||||||
ID3D12DescriptorHeap *m_textureDescriptorHeap;
|
ID3D12DescriptorHeap *m_textureDescriptorHeap;
|
||||||
ID3D12DescriptorHeap *m_samplerDescriptorHeap;
|
ID3D12DescriptorHeap *m_samplerDescriptorHeap;
|
||||||
void Init(ID3D12Device *device);
|
void Init(ID3D12Device *device, ID3D12CommandQueue *gfxcommandqueue);
|
||||||
void Release();
|
void Release();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ std::pair<ID3DBlob *, ID3DBlob *> compileF32toU8CS()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void D3D12GSRender::Shader::Init(ID3D12Device *device)
|
void D3D12GSRender::Shader::Init(ID3D12Device *device, ID3D12CommandQueue *gfxcommandqueue)
|
||||||
{
|
{
|
||||||
const char *fsCode = STRINGIFY(
|
const char *fsCode = STRINGIFY(
|
||||||
Texture2D InputTexture : register(t0); \n
|
Texture2D InputTexture : register(t0); \n
|
||||||
|
@ -188,31 +188,6 @@ void D3D12GSRender::Shader::Init(ID3D12Device *device)
|
||||||
|
|
||||||
ThrowIfFailed(device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_PSO)));
|
ThrowIfFailed(device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_PSO)));
|
||||||
|
|
||||||
|
|
||||||
float quadVertex[16] = {
|
|
||||||
-1., -1., 0., 1.,
|
|
||||||
-1., 1., 0., 0.,
|
|
||||||
1., -1., 1., 1.,
|
|
||||||
1., 1., 1., 0.,
|
|
||||||
};
|
|
||||||
|
|
||||||
D3D12_HEAP_PROPERTIES heapProp = {};
|
|
||||||
heapProp.Type = D3D12_HEAP_TYPE_UPLOAD;
|
|
||||||
ThrowIfFailed(
|
|
||||||
device->CreateCommittedResource(
|
|
||||||
&heapProp,
|
|
||||||
D3D12_HEAP_FLAG_NONE,
|
|
||||||
&CD3DX12_RESOURCE_DESC::Buffer(16 * sizeof(float)),
|
|
||||||
D3D12_RESOURCE_STATE_GENERIC_READ,
|
|
||||||
nullptr,
|
|
||||||
IID_PPV_ARGS(&m_vertexBuffer)
|
|
||||||
));
|
|
||||||
|
|
||||||
void *tmp;
|
|
||||||
m_vertexBuffer->Map(0, nullptr, &tmp);
|
|
||||||
memcpy(tmp, quadVertex, 16 * sizeof(float));
|
|
||||||
m_vertexBuffer->Unmap(0, nullptr);
|
|
||||||
|
|
||||||
D3D12_DESCRIPTOR_HEAP_DESC textureHeapDesc = { D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV , 2, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE };
|
D3D12_DESCRIPTOR_HEAP_DESC textureHeapDesc = { D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV , 2, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE };
|
||||||
ThrowIfFailed(
|
ThrowIfFailed(
|
||||||
device->CreateDescriptorHeap(&textureHeapDesc, IID_PPV_ARGS(&m_textureDescriptorHeap))
|
device->CreateDescriptorHeap(&textureHeapDesc, IID_PPV_ARGS(&m_textureDescriptorHeap))
|
||||||
|
@ -221,6 +196,59 @@ void D3D12GSRender::Shader::Init(ID3D12Device *device)
|
||||||
ThrowIfFailed(
|
ThrowIfFailed(
|
||||||
device->CreateDescriptorHeap(&samplerHeapDesc, IID_PPV_ARGS(&m_samplerDescriptorHeap))
|
device->CreateDescriptorHeap(&samplerHeapDesc, IID_PPV_ARGS(&m_samplerDescriptorHeap))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ComPtr<ID3D12Fence> fence;
|
||||||
|
ThrowIfFailed(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(fence.GetAddressOf())));
|
||||||
|
HANDLE handle = CreateEventEx(nullptr, FALSE, FALSE, EVENT_ALL_ACCESS);
|
||||||
|
fence->SetEventOnCompletion(1, handle);
|
||||||
|
|
||||||
|
float quadVertex[16] = {
|
||||||
|
-1., -1., 0., 1.,
|
||||||
|
-1., 1., 0., 0.,
|
||||||
|
1., -1., 1., 1.,
|
||||||
|
1., 1., 1., 0.,
|
||||||
|
};
|
||||||
|
|
||||||
|
ComPtr<ID3D12CommandAllocator> cmdlistAllocator;
|
||||||
|
ThrowIfFailed(
|
||||||
|
device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(cmdlistAllocator.GetAddressOf()))
|
||||||
|
);
|
||||||
|
ComPtr<ID3D12GraphicsCommandList> cmdList;
|
||||||
|
ThrowIfFailed(
|
||||||
|
device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, cmdlistAllocator.Get(),nullptr, IID_PPV_ARGS(cmdList.GetAddressOf()))
|
||||||
|
);
|
||||||
|
ComPtr<ID3D12Resource> intermediateBuffer;
|
||||||
|
ThrowIfFailed(device->CreateCommittedResource(
|
||||||
|
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
|
||||||
|
D3D12_HEAP_FLAG_NONE,
|
||||||
|
&CD3DX12_RESOURCE_DESC::Buffer(16 * sizeof(float)),
|
||||||
|
D3D12_RESOURCE_STATE_GENERIC_READ,
|
||||||
|
nullptr,
|
||||||
|
IID_PPV_ARGS(intermediateBuffer.GetAddressOf())
|
||||||
|
));
|
||||||
|
|
||||||
|
ThrowIfFailed(
|
||||||
|
device->CreateCommittedResource(
|
||||||
|
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
|
||||||
|
D3D12_HEAP_FLAG_NONE,
|
||||||
|
&CD3DX12_RESOURCE_DESC::Buffer(16 * sizeof(float)),
|
||||||
|
D3D12_RESOURCE_STATE_COPY_DEST,
|
||||||
|
nullptr,
|
||||||
|
IID_PPV_ARGS(&m_vertexBuffer)
|
||||||
|
));
|
||||||
|
|
||||||
|
D3D12_SUBRESOURCE_DATA vertexData = { reinterpret_cast<BYTE*>(quadVertex), 16 * sizeof(float), 1 };
|
||||||
|
|
||||||
|
UpdateSubresources(cmdList.Get(), m_vertexBuffer, intermediateBuffer.Get(), 0, 0, 1, &vertexData);
|
||||||
|
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_vertexBuffer, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER));
|
||||||
|
ThrowIfFailed(cmdList->Close());
|
||||||
|
|
||||||
|
gfxcommandqueue->ExecuteCommandLists(1, CommandListCast(cmdList.GetAddressOf()));
|
||||||
|
|
||||||
|
// Now wait until upload has completed
|
||||||
|
gfxcommandqueue->Signal(fence.Get(), 1);
|
||||||
|
WaitForSingleObjectEx(handle, INFINITE, FALSE);
|
||||||
|
CloseHandle(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3D12GSRender::initConvertShader()
|
void D3D12GSRender::initConvertShader()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue