mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 04:29:15 +01:00
[d3d11] Optimized command submission
This commit is contained in:
parent
96a97aa0c4
commit
ac1fe7c2b0
@ -165,6 +165,7 @@ namespace dxvk {
|
||||
|
||||
void STDMETHODCALLTYPE D3D11DeviceContext::Flush() {
|
||||
if (m_type == D3D11_DEVICE_CONTEXT_IMMEDIATE) {
|
||||
m_parent->FlushInitContext();
|
||||
m_executedDrawCalls = 0;
|
||||
|
||||
m_device->submitCommandList(
|
||||
@ -1553,8 +1554,8 @@ namespace dxvk {
|
||||
// number of draw calls since the last explicit flush, flush
|
||||
// the context in order to keep the GPU busy. We'll do this
|
||||
// here because we are going to start a new render pass anyway.
|
||||
if (m_executedDrawCalls >= 500)
|
||||
this->Flush();
|
||||
// if (m_executedDrawCalls >= 500)
|
||||
// this->Flush();
|
||||
|
||||
for (UINT i = 0; i < m_state.om.renderTargetViews.size(); i++) {
|
||||
D3D11RenderTargetView* view = nullptr;
|
||||
|
@ -36,7 +36,10 @@ namespace dxvk {
|
||||
m_presentDevice->SetDeviceLayer(this);
|
||||
|
||||
m_context = new D3D11DeviceContext(this, m_dxvkDevice);
|
||||
|
||||
m_resourceInitContext = m_dxvkDevice->createContext();
|
||||
m_resourceInitContext->beginRecording(
|
||||
m_dxvkDevice->createCommandList());
|
||||
|
||||
CreateCounterBuffer();
|
||||
}
|
||||
@ -1309,6 +1312,22 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void D3D11Device::FlushInitContext() {
|
||||
auto lock = LockResourceInitContext();
|
||||
|
||||
if (m_resourceInitUsed) {
|
||||
m_dxvkDevice->submitCommandList(
|
||||
m_resourceInitContext->endRecording(),
|
||||
nullptr, nullptr);
|
||||
|
||||
m_resourceInitContext->beginRecording(
|
||||
m_dxvkDevice->createCommandList());
|
||||
|
||||
m_resourceInitUsed = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VkPipelineStageFlags D3D11Device::GetEnabledShaderStages() const {
|
||||
VkPipelineStageFlags enabledShaderPipelineStages
|
||||
= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
|
||||
@ -1427,17 +1446,13 @@ namespace dxvk {
|
||||
= pBuffer->GetBufferSlice();
|
||||
|
||||
if (pInitialData != nullptr) {
|
||||
std::lock_guard<std::mutex> lock(m_resourceInitMutex);;
|
||||
m_resourceInitContext->beginRecording(
|
||||
m_dxvkDevice->createCommandList());
|
||||
auto lock = LockResourceInitContext();
|
||||
|
||||
m_resourceInitContext->updateBuffer(
|
||||
bufferSlice.buffer(),
|
||||
bufferSlice.offset(),
|
||||
bufferSlice.length(),
|
||||
pInitialData->pSysMem);
|
||||
m_dxvkDevice->submitCommandList(
|
||||
m_resourceInitContext->endRecording(),
|
||||
nullptr, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1445,9 +1460,7 @@ namespace dxvk {
|
||||
void D3D11Device::InitTexture(
|
||||
const Rc<DxvkImage>& image,
|
||||
const D3D11_SUBRESOURCE_DATA* pInitialData) {
|
||||
std::lock_guard<std::mutex> lock(m_resourceInitMutex);;
|
||||
m_resourceInitContext->beginRecording(
|
||||
m_dxvkDevice->createCommandList());
|
||||
auto lock = LockResourceInitContext();
|
||||
|
||||
const DxvkFormatInfo* formatInfo = imageFormatInfo(image->info().format);
|
||||
|
||||
@ -1504,10 +1517,6 @@ namespace dxvk {
|
||||
image, value, subresources);
|
||||
}
|
||||
}
|
||||
|
||||
m_dxvkDevice->submitCommandList(
|
||||
m_resourceInitContext->endRecording(),
|
||||
nullptr, nullptr);
|
||||
}
|
||||
|
||||
|
||||
|
@ -238,6 +238,8 @@ namespace dxvk {
|
||||
|
||||
void FreeCounterSlice(const DxvkBufferSlice& Slice);
|
||||
|
||||
void FlushInitContext();
|
||||
|
||||
VkPipelineStageFlags GetEnabledShaderStages() const;
|
||||
|
||||
DxgiFormatInfo STDMETHODCALLTYPE LookupFormat(
|
||||
@ -274,6 +276,7 @@ namespace dxvk {
|
||||
|
||||
std::mutex m_resourceInitMutex;
|
||||
Rc<DxvkContext> m_resourceInitContext;
|
||||
bool m_resourceInitUsed = false;
|
||||
|
||||
D3D11StateObjectSet<D3D11BlendState> m_bsStateObjects;
|
||||
D3D11StateObjectSet<D3D11DepthStencilState> m_dsStateObjects;
|
||||
@ -316,6 +319,12 @@ namespace dxvk {
|
||||
|
||||
void CreateCounterBuffer();
|
||||
|
||||
std::unique_lock<std::mutex> LockResourceInitContext() {
|
||||
auto lock = std::unique_lock<std::mutex>(m_resourceInitMutex);
|
||||
m_resourceInitUsed = true;
|
||||
return lock;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user