mirror of
https://github.com/gnif/LookingGlass.git
synced 2025-04-30 02:26:28 +00:00
[idd] driver: make indirectCopy functional
This commit is contained in:
parent
6a4edfc6b6
commit
15eff234ec
@ -14,7 +14,9 @@ void CFrameBufferPool::Reset()
|
|||||||
m_buffers[i].Reset();
|
m_buffers[i].Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
CFrameBufferResource * CFrameBufferPool::Get(const CIndirectDeviceContext::PreparedFrameBuffer& buffer, size_t minSize)
|
CFrameBufferResource * CFrameBufferPool::Get(
|
||||||
|
const CIndirectDeviceContext::PreparedFrameBuffer& buffer,
|
||||||
|
size_t minSize)
|
||||||
{
|
{
|
||||||
if (buffer.frameIndex > ARRAYSIZE(m_buffers) - 1)
|
if (buffer.frameIndex > ARRAYSIZE(m_buffers) - 1)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -16,5 +16,7 @@ class CFrameBufferPool
|
|||||||
void Init(CSwapChainProcessor * swapChain);
|
void Init(CSwapChainProcessor * swapChain);
|
||||||
void Reset();
|
void Reset();
|
||||||
|
|
||||||
CFrameBufferResource* CFrameBufferPool::Get(const CIndirectDeviceContext::PreparedFrameBuffer& buffer, size_t minSize);
|
CFrameBufferResource* CFrameBufferPool::Get(
|
||||||
|
const CIndirectDeviceContext::PreparedFrameBuffer& buffer,
|
||||||
|
size_t minSize);
|
||||||
};
|
};
|
@ -50,6 +50,17 @@ bool CFrameBufferResource::Init(CSwapChainProcessor * swapChain, uint8_t * base,
|
|||||||
IID_PPV_ARGS(&m_res)
|
IID_PPV_ARGS(&m_res)
|
||||||
);
|
);
|
||||||
resName = L"STAGING";
|
resName = L"STAGING";
|
||||||
|
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
D3D12_RANGE range = {0, 0};
|
||||||
|
hr = m_res->Map(0, &range, &m_map);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
DEBUG_ERROR_HR(hr, "Failed to map the resource");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -84,6 +95,12 @@ bool CFrameBufferResource::Init(CSwapChainProcessor * swapChain, uint8_t * base,
|
|||||||
|
|
||||||
void CFrameBufferResource::Reset()
|
void CFrameBufferResource::Reset()
|
||||||
{
|
{
|
||||||
|
if (m_map)
|
||||||
|
{
|
||||||
|
m_res->Unmap(0, NULL);
|
||||||
|
m_map = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
m_base = nullptr;
|
m_base = nullptr;
|
||||||
m_size = 0;
|
m_size = 0;
|
||||||
m_res.Reset();
|
m_res.Reset();
|
||||||
|
@ -17,6 +17,7 @@ class CFrameBufferResource
|
|||||||
uint8_t * m_base;
|
uint8_t * m_base;
|
||||||
size_t m_size;
|
size_t m_size;
|
||||||
ComPtr<ID3D12Resource> m_res;
|
ComPtr<ID3D12Resource> m_res;
|
||||||
|
void * m_map;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool Init(CSwapChainProcessor * swapChain, uint8_t * base, size_t size);
|
bool Init(CSwapChainProcessor * swapChain, uint8_t * base, size_t size);
|
||||||
@ -25,6 +26,7 @@ class CFrameBufferResource
|
|||||||
bool IsValid() { return m_valid; }
|
bool IsValid() { return m_valid; }
|
||||||
uint8_t * GetBase() { return m_base; }
|
uint8_t * GetBase() { return m_base; }
|
||||||
size_t GetSize() { return m_size; }
|
size_t GetSize() { return m_size; }
|
||||||
|
void * GetMap() { return m_map; }
|
||||||
|
|
||||||
ComPtr<ID3D12Resource> Get() { return m_res; }
|
ComPtr<ID3D12Resource> Get() { return m_res; }
|
||||||
};
|
};
|
||||||
|
@ -490,11 +490,22 @@ CIndirectDeviceContext::PreparedFrameBuffer CIndirectDeviceContext::PrepareFrame
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CIndirectDeviceContext::WriteFrameBuffer(void* src, size_t offset, size_t len, bool setWritePos)
|
||||||
|
{
|
||||||
|
KVMFRFrame * fi = (KVMFRFrame*)lgmpHostMemPtr(m_frameMemory[m_frameIndex]);
|
||||||
|
FrameBuffer * fb = (FrameBuffer*)(((uint8_t*)fi) + fi->offset);
|
||||||
|
|
||||||
|
memcpy(
|
||||||
|
(void *)((uintptr_t)fb->data + offset),
|
||||||
|
(void *)((uintptr_t)src + offset),
|
||||||
|
len);
|
||||||
|
|
||||||
|
if (setWritePos)
|
||||||
|
fb->wp = (uint32_t)(offset + len);
|
||||||
|
}
|
||||||
|
|
||||||
void CIndirectDeviceContext::FinalizeFrameBuffer()
|
void CIndirectDeviceContext::FinalizeFrameBuffer()
|
||||||
{
|
{
|
||||||
if (!m_lgmp || !m_frameQueue)
|
|
||||||
return;
|
|
||||||
|
|
||||||
KVMFRFrame * fi = (KVMFRFrame*)lgmpHostMemPtr(m_frameMemory[m_frameIndex]);
|
KVMFRFrame * fi = (KVMFRFrame*)lgmpHostMemPtr(m_frameMemory[m_frameIndex]);
|
||||||
FrameBuffer * fb = (FrameBuffer *)(((uint8_t*)fi) + fi->offset);
|
FrameBuffer * fb = (FrameBuffer *)(((uint8_t*)fi) + fi->offset);
|
||||||
fb->wp = m_height * m_pitch;
|
fb->wp = m_height * m_pitch;
|
||||||
|
@ -95,6 +95,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
PreparedFrameBuffer PrepareFrameBuffer(int width, int height, int pitch, DXGI_FORMAT format);
|
PreparedFrameBuffer PrepareFrameBuffer(int width, int height, int pitch, DXGI_FORMAT format);
|
||||||
|
void WriteFrameBuffer(void* src, size_t offset, size_t len, bool setWritePos);
|
||||||
void FinalizeFrameBuffer();
|
void FinalizeFrameBuffer();
|
||||||
|
|
||||||
void SendCursor(const IDARG_OUT_QUERY_HWCURSOR & info, const BYTE * data);
|
void SendCursor(const IDARG_OUT_QUERY_HWCURSOR & info, const BYTE * data);
|
||||||
|
@ -216,5 +216,8 @@ void CSwapChainProcessor::SwapChainNewFrame(ComPtr<IDXGIResource> acquiredBuffer
|
|||||||
m_dx12Device->GetCopyQueue().Wait();
|
m_dx12Device->GetCopyQueue().Wait();
|
||||||
m_dx12Device->GetCopyQueue().Reset();
|
m_dx12Device->GetCopyQueue().Reset();
|
||||||
|
|
||||||
|
if (m_dx12Device->IsIndirectCopy())
|
||||||
|
m_devContext->WriteFrameBuffer(fbRes->GetMap(), 0, fbRes->GetSize(), true);
|
||||||
|
else
|
||||||
m_devContext->FinalizeFrameBuffer();
|
m_devContext->FinalizeFrameBuffer();
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user