mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-11-30 22:24:15 +01:00
[d3d11] Temporary fix for Presenter <-> CS thread sync issue
This commit is contained in:
parent
51e89f00be
commit
3118012ada
@ -42,14 +42,13 @@ namespace dxvk {
|
||||
ID3D11Resource* pResource,
|
||||
UINT Subresource) final;
|
||||
|
||||
void Synchronize();
|
||||
void SynchronizeCs();
|
||||
|
||||
private:
|
||||
|
||||
DxvkCsThread m_csThread;
|
||||
|
||||
void Synchronize();
|
||||
void SynchronizeCs();
|
||||
|
||||
void EmitCsChunk();
|
||||
|
||||
};
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include "d3d11_context_imm.h"
|
||||
#include "d3d11_device.h"
|
||||
#include "d3d11_present.h"
|
||||
|
||||
@ -54,10 +55,12 @@ namespace dxvk {
|
||||
|
||||
|
||||
HRESULT STDMETHODCALLTYPE D3D11PresentDevice::FlushRenderingCommands() {
|
||||
Com<ID3D11DeviceContext> deviceContext = nullptr;
|
||||
m_device->GetImmediateContext(&deviceContext);
|
||||
Com<ID3D11DeviceContext> ctx = nullptr;
|
||||
m_device->GetImmediateContext(&ctx);
|
||||
|
||||
deviceContext->Flush();
|
||||
auto immediateContext = static_cast<D3D11ImmediateContext*>(ctx.ptr());
|
||||
immediateContext->Flush();
|
||||
immediateContext->SynchronizeCs();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -23,33 +23,33 @@ namespace dxvk {
|
||||
|
||||
|
||||
DxvkPhysicalBufferSlice DxvkBuffer::allocPhysicalSlice() {
|
||||
if (m_physSliceId >= m_physBuffers[m_physBufferId]->sliceCount()) {
|
||||
m_physBufferId = (m_physBufferId + 1) % m_physBuffers.size();
|
||||
m_physSliceId = 0;
|
||||
|
||||
if ((m_physBuffers[m_physBufferId] == nullptr)
|
||||
|| (m_physBuffers[m_physBufferId]->sliceCount() < m_physSliceCount)) {
|
||||
// Make sure that all buffers have the same size. If we don't do this,
|
||||
// one of the physical buffers may grow indefinitely while the others
|
||||
// remain small, depending on the usage pattern of the application.
|
||||
m_physBuffers[m_physBufferId] = this->allocPhysicalBuffer(m_physSliceCount);
|
||||
} else if (m_physBuffers[m_physBufferId]->isInUse()) {
|
||||
// Allocate a new physical buffer if the current one is still in use.
|
||||
// This also indicates that the buffer gets updated frequently, so we
|
||||
// will double the size of the physical buffers to accomodate for it.
|
||||
if (m_physBufferId == 0)
|
||||
m_physSliceCount *= 2;
|
||||
|
||||
m_physBuffers[m_physBufferId] = this->allocPhysicalBuffer(m_physSliceCount);
|
||||
}
|
||||
}
|
||||
|
||||
return m_physBuffers[m_physBufferId]->slice(m_physSliceId++);
|
||||
// if (m_physSliceId >= m_physBuffers[m_physBufferId]->sliceCount()) {
|
||||
// m_physBufferId = (m_physBufferId + 1) % m_physBuffers.size();
|
||||
// m_physSliceId = 0;
|
||||
//
|
||||
// if ((m_physBuffers[m_physBufferId] == nullptr)
|
||||
// || (m_physBuffers[m_physBufferId]->sliceCount() < m_physSliceCount)) {
|
||||
// // Make sure that all buffers have the same size. If we don't do this,
|
||||
// // one of the physical buffers may grow indefinitely while the others
|
||||
// // remain small, depending on the usage pattern of the application.
|
||||
// m_physBuffers[m_physBufferId] = this->allocPhysicalBuffer(m_physSliceCount);
|
||||
// } else if (m_physBuffers[m_physBufferId]->isInUse()) {
|
||||
// // Allocate a new physical buffer if the current one is still in use.
|
||||
// // This also indicates that the buffer gets updated frequently, so we
|
||||
// // will double the size of the physical buffers to accomodate for it.
|
||||
// if (m_physBufferId == 0)
|
||||
// m_physSliceCount *= 2;
|
||||
//
|
||||
// m_physBuffers[m_physBufferId] = this->allocPhysicalBuffer(m_physSliceCount);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return m_physBuffers[m_physBufferId]->slice(m_physSliceId++);
|
||||
return allocPhysicalBuffer(1)->slice(0);
|
||||
}
|
||||
|
||||
|
||||
Rc<DxvkPhysicalBuffer> DxvkBuffer::allocPhysicalBuffer(VkDeviceSize sliceCount) const {
|
||||
TRACE(this, sliceCount);
|
||||
return m_device->allocPhysicalBuffer(m_info, sliceCount, m_memFlags);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user