1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-02 04:29:14 +01:00

[d3d11] Allocate predicate buffer for predicates

This commit is contained in:
Philip Rebohle 2019-03-23 23:33:01 +01:00
parent 7e16c4cda1
commit d81146e3d2
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 43 additions and 3 deletions

View File

@ -45,6 +45,7 @@ namespace dxvk {
m_uavCounters = CreateUAVCounterBuffer(); m_uavCounters = CreateUAVCounterBuffer();
m_xfbCounters = CreateXFBCounterBuffer(); m_xfbCounters = CreateXFBCounterBuffer();
m_predicates = CreatePredicateBuffer();
} }
@ -986,7 +987,7 @@ namespace dxvk {
return S_FALSE; return S_FALSE;
try { try {
*ppPredicate = ref(new D3D11Query(this, *pPredicateDesc)); *ppPredicate = ref(new D3D11Query(this, *pPredicateDesc, AllocPredicateSlice()));
return S_OK; return S_OK;
} catch (const DxvkError& e) { } catch (const DxvkError& e) {
Logger::err(e.message()); Logger::err(e.message());
@ -1475,6 +1476,21 @@ namespace dxvk {
} }
Rc<D3D11CounterBuffer> D3D11Device::CreatePredicateBuffer() {
DxvkBufferCreateInfo predCounterInfo;
predCounterInfo.size = 4096 * sizeof(uint32_t);
predCounterInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT
| VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;
predCounterInfo.stages = VK_PIPELINE_STAGE_TRANSFER_BIT
| VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT;
predCounterInfo.access = VK_ACCESS_TRANSFER_WRITE_BIT
| VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT;
return new D3D11CounterBuffer(m_dxvkDevice,
predCounterInfo, sizeof(uint32_t));
}
HRESULT D3D11Device::CreateShaderModule( HRESULT D3D11Device::CreateShaderModule(
D3D11CommonShader* pShaderModule, D3D11CommonShader* pShaderModule,
DxvkShaderKey ShaderKey, DxvkShaderKey ShaderKey,

View File

@ -326,9 +326,11 @@ namespace dxvk {
DxvkBufferSlice AllocUavCounterSlice() { return m_uavCounters->AllocSlice(); } DxvkBufferSlice AllocUavCounterSlice() { return m_uavCounters->AllocSlice(); }
DxvkBufferSlice AllocXfbCounterSlice() { return m_xfbCounters->AllocSlice(); } DxvkBufferSlice AllocXfbCounterSlice() { return m_xfbCounters->AllocSlice(); }
DxvkBufferSlice AllocPredicateSlice () { return m_predicates ->AllocSlice(); }
void FreeUavCounterSlice(const DxvkBufferSlice& Slice) { m_uavCounters->FreeSlice(Slice); } void FreeUavCounterSlice(const DxvkBufferSlice& Slice) { m_uavCounters->FreeSlice(Slice); }
void FreeXfbCounterSlice(const DxvkBufferSlice& Slice) { m_xfbCounters->FreeSlice(Slice); } void FreeXfbCounterSlice(const DxvkBufferSlice& Slice) { m_xfbCounters->FreeSlice(Slice); }
void FreePredicateSlice (const DxvkBufferSlice& Slice) { m_predicates ->FreeSlice(Slice); }
static bool CheckFeatureLevelSupport( static bool CheckFeatureLevelSupport(
const Rc<DxvkAdapter>& adapter, const Rc<DxvkAdapter>& adapter,
@ -360,6 +362,7 @@ namespace dxvk {
Rc<D3D11CounterBuffer> m_uavCounters; Rc<D3D11CounterBuffer> m_uavCounters;
Rc<D3D11CounterBuffer> m_xfbCounters; Rc<D3D11CounterBuffer> m_xfbCounters;
Rc<D3D11CounterBuffer> m_predicates;
D3D11StateObjectSet<D3D11BlendState> m_bsStateObjects; D3D11StateObjectSet<D3D11BlendState> m_bsStateObjects;
D3D11StateObjectSet<D3D11DepthStencilState> m_dsStateObjects; D3D11StateObjectSet<D3D11DepthStencilState> m_dsStateObjects;
@ -369,6 +372,7 @@ namespace dxvk {
Rc<D3D11CounterBuffer> CreateUAVCounterBuffer(); Rc<D3D11CounterBuffer> CreateUAVCounterBuffer();
Rc<D3D11CounterBuffer> CreateXFBCounterBuffer(); Rc<D3D11CounterBuffer> CreateXFBCounterBuffer();
Rc<D3D11CounterBuffer> CreatePredicateBuffer();
HRESULT CreateShaderModule( HRESULT CreateShaderModule(
D3D11CommonShader* pShaderModule, D3D11CommonShader* pShaderModule,

View File

@ -6,7 +6,16 @@ namespace dxvk {
D3D11Query::D3D11Query( D3D11Query::D3D11Query(
D3D11Device* device, D3D11Device* device,
const D3D11_QUERY_DESC& desc) const D3D11_QUERY_DESC& desc)
: m_device(device), m_desc(desc), : D3D11Query(device, desc, DxvkBufferSlice()) {
}
D3D11Query::D3D11Query(
D3D11Device* device,
const D3D11_QUERY_DESC& desc,
const DxvkBufferSlice& predicate)
: m_device(device), m_desc(desc), m_predicate(predicate),
m_d3d10(this, device->GetD3D10Interface()) { m_d3d10(this, device->GetD3D10Interface()) {
Rc<DxvkDevice> dxvkDevice = m_device->GetDXVKDevice(); Rc<DxvkDevice> dxvkDevice = m_device->GetDXVKDevice();
@ -75,7 +84,8 @@ namespace dxvk {
D3D11Query::~D3D11Query() { D3D11Query::~D3D11Query() {
if (m_predicate.defined())
m_device->FreePredicateSlice(m_predicate);
} }
@ -198,6 +208,9 @@ namespace dxvk {
default: default:
ctx->endQuery(m_query); ctx->endQuery(m_query);
} }
if (m_predicate.defined())
ctx->writePredicate(m_predicate, m_query);
} }

View File

@ -17,6 +17,11 @@ namespace dxvk {
D3D11Device* device, D3D11Device* device,
const D3D11_QUERY_DESC& desc); const D3D11_QUERY_DESC& desc);
D3D11Query(
D3D11Device* device,
const D3D11_QUERY_DESC& desc,
const DxvkBufferSlice& predicate);
~D3D11Query(); ~D3D11Query();
HRESULT STDMETHODCALLTYPE QueryInterface( HRESULT STDMETHODCALLTYPE QueryInterface(
@ -51,6 +56,8 @@ namespace dxvk {
Rc<DxvkGpuQuery> m_query = nullptr; Rc<DxvkGpuQuery> m_query = nullptr;
Rc<DxvkGpuEvent> m_event = nullptr; Rc<DxvkGpuEvent> m_event = nullptr;
DxvkBufferSlice m_predicate;
D3D10Query m_d3d10; D3D10Query m_d3d10;
UINT64 GetTimestampQueryFrequency() const; UINT64 GetTimestampQueryFrequency() const;