mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-14 18:23:52 +01:00
77c032da5c
We can get rid of the immediate context overload as well since we can just directly call FlushImplicit here.
158 lines
4.9 KiB
C++
158 lines
4.9 KiB
C++
#pragma once
|
|
|
|
#include "../util/util_time.h"
|
|
|
|
#include "../util/sync/sync_signal.h"
|
|
|
|
#include "d3d11_context_common.h"
|
|
#include "d3d11_state_object.h"
|
|
#include "d3d11_video.h"
|
|
|
|
namespace dxvk {
|
|
|
|
class D3D11Buffer;
|
|
class D3D11CommonTexture;
|
|
|
|
class D3D11ImmediateContext : public D3D11CommonContext<D3D11ImmediateContext> {
|
|
template<typename T>
|
|
friend class D3D11CommonContext;
|
|
friend class D3D11SwapChain;
|
|
friend class D3D11VideoContext;
|
|
public:
|
|
|
|
D3D11ImmediateContext(
|
|
D3D11Device* pParent,
|
|
const Rc<DxvkDevice>& Device);
|
|
~D3D11ImmediateContext();
|
|
|
|
HRESULT STDMETHODCALLTYPE QueryInterface(
|
|
REFIID riid,
|
|
void** ppvObject);
|
|
|
|
D3D11_DEVICE_CONTEXT_TYPE STDMETHODCALLTYPE GetType();
|
|
|
|
UINT STDMETHODCALLTYPE GetContextFlags();
|
|
|
|
HRESULT STDMETHODCALLTYPE GetData(
|
|
ID3D11Asynchronous* pAsync,
|
|
void* pData,
|
|
UINT DataSize,
|
|
UINT GetDataFlags);
|
|
|
|
void STDMETHODCALLTYPE Begin(
|
|
ID3D11Asynchronous* pAsync);
|
|
|
|
void STDMETHODCALLTYPE End(
|
|
ID3D11Asynchronous* pAsync);
|
|
|
|
void STDMETHODCALLTYPE Flush();
|
|
|
|
void STDMETHODCALLTYPE Flush1(
|
|
D3D11_CONTEXT_TYPE ContextType,
|
|
HANDLE hEvent);
|
|
|
|
HRESULT STDMETHODCALLTYPE Signal(
|
|
ID3D11Fence* pFence,
|
|
UINT64 Value);
|
|
|
|
HRESULT STDMETHODCALLTYPE Wait(
|
|
ID3D11Fence* pFence,
|
|
UINT64 Value);
|
|
|
|
void STDMETHODCALLTYPE ExecuteCommandList(
|
|
ID3D11CommandList* pCommandList,
|
|
BOOL RestoreContextState);
|
|
|
|
HRESULT STDMETHODCALLTYPE FinishCommandList(
|
|
BOOL RestoreDeferredContextState,
|
|
ID3D11CommandList **ppCommandList);
|
|
|
|
HRESULT STDMETHODCALLTYPE Map(
|
|
ID3D11Resource* pResource,
|
|
UINT Subresource,
|
|
D3D11_MAP MapType,
|
|
UINT MapFlags,
|
|
D3D11_MAPPED_SUBRESOURCE* pMappedResource);
|
|
|
|
void STDMETHODCALLTYPE Unmap(
|
|
ID3D11Resource* pResource,
|
|
UINT Subresource);
|
|
|
|
void STDMETHODCALLTYPE SwapDeviceContextState(
|
|
ID3DDeviceContextState* pState,
|
|
ID3DDeviceContextState** ppPreviousState);
|
|
|
|
void SynchronizeCsThread(
|
|
uint64_t SequenceNumber);
|
|
|
|
private:
|
|
|
|
DxvkCsThread m_csThread;
|
|
uint64_t m_csSeqNum = 0ull;
|
|
bool m_csIsBusy = false;
|
|
|
|
Rc<sync::CallbackFence> m_eventSignal;
|
|
uint64_t m_eventCount = 0ull;
|
|
uint32_t m_mappedImageCount = 0u;
|
|
|
|
VkDeviceSize m_maxImplicitDiscardSize = 0ull;
|
|
|
|
dxvk::high_resolution_clock::time_point m_lastFlush
|
|
= dxvk::high_resolution_clock::now();
|
|
|
|
D3D11VideoContext m_videoContext;
|
|
Com<D3D11DeviceContextState> m_stateObject;
|
|
|
|
HRESULT MapBuffer(
|
|
D3D11Buffer* pResource,
|
|
D3D11_MAP MapType,
|
|
UINT MapFlags,
|
|
D3D11_MAPPED_SUBRESOURCE* pMappedResource);
|
|
|
|
HRESULT MapImage(
|
|
D3D11CommonTexture* pResource,
|
|
UINT Subresource,
|
|
D3D11_MAP MapType,
|
|
UINT MapFlags,
|
|
D3D11_MAPPED_SUBRESOURCE* pMappedResource);
|
|
|
|
void UnmapImage(
|
|
D3D11CommonTexture* pResource,
|
|
UINT Subresource);
|
|
|
|
void UpdateMappedBuffer(
|
|
D3D11Buffer* pDstBuffer,
|
|
UINT Offset,
|
|
UINT Length,
|
|
const void* pSrcData,
|
|
UINT CopyFlags);
|
|
|
|
void SynchronizeDevice();
|
|
|
|
void EndFrame();
|
|
|
|
bool WaitForResource(
|
|
const Rc<DxvkResource>& Resource,
|
|
uint64_t SequenceNumber,
|
|
D3D11_MAP MapType,
|
|
UINT MapFlags);
|
|
|
|
void EmitCsChunk(DxvkCsChunkRef&& chunk);
|
|
|
|
void TrackTextureSequenceNumber(
|
|
D3D11CommonTexture* pResource,
|
|
UINT Subresource);
|
|
|
|
void TrackBufferSequenceNumber(
|
|
D3D11Buffer* pResource);
|
|
|
|
uint64_t GetCurrentSequenceNumber();
|
|
|
|
void FlushImplicit(BOOL StrongHint);
|
|
|
|
void SignalEvent(HANDLE hEvent);
|
|
|
|
};
|
|
|
|
}
|