1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-25 16:54:15 +01:00

[dxvk/d3d11] Refactored resource binding

Slightly reduces overhead of D3D11 *SetShaderResources methods.
This commit is contained in:
Philip Rebohle 2018-03-10 11:16:52 +01:00
parent b72f11a0bf
commit 5ef0f31c66
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
6 changed files with 119 additions and 136 deletions

View File

@ -1166,7 +1166,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumBuffers,
ID3D11Buffer* const* ppConstantBuffers) {
this->BindConstantBuffers(
this->SetConstantBuffers(
DxbcProgramType::VertexShader,
m_state.vs.constantBuffers,
StartSlot, NumBuffers,
@ -1178,7 +1178,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumViews,
ID3D11ShaderResourceView* const* ppShaderResourceViews) {
this->BindShaderResources(
this->SetShaderResources(
DxbcProgramType::VertexShader,
m_state.vs.shaderResources,
StartSlot, NumViews,
@ -1190,7 +1190,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumSamplers,
ID3D11SamplerState* const* ppSamplers) {
this->BindSamplers(
this->SetSamplers(
DxbcProgramType::VertexShader,
m_state.vs.samplers,
StartSlot, NumSamplers,
@ -1257,7 +1257,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumViews,
ID3D11ShaderResourceView* const* ppShaderResourceViews) {
this->BindShaderResources(
this->SetShaderResources(
DxbcProgramType::HullShader,
m_state.hs.shaderResources,
StartSlot, NumViews,
@ -1269,7 +1269,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumBuffers,
ID3D11Buffer* const* ppConstantBuffers) {
this->BindConstantBuffers(
this->SetConstantBuffers(
DxbcProgramType::HullShader,
m_state.hs.constantBuffers,
StartSlot, NumBuffers,
@ -1281,7 +1281,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumSamplers,
ID3D11SamplerState* const* ppSamplers) {
this->BindSamplers(
this->SetSamplers(
DxbcProgramType::HullShader,
m_state.hs.samplers,
StartSlot, NumSamplers,
@ -1348,7 +1348,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumViews,
ID3D11ShaderResourceView* const* ppShaderResourceViews) {
this->BindShaderResources(
this->SetShaderResources(
DxbcProgramType::DomainShader,
m_state.ds.shaderResources,
StartSlot, NumViews,
@ -1360,7 +1360,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumBuffers,
ID3D11Buffer* const* ppConstantBuffers) {
this->BindConstantBuffers(
this->SetConstantBuffers(
DxbcProgramType::DomainShader,
m_state.ds.constantBuffers,
StartSlot, NumBuffers,
@ -1372,7 +1372,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumSamplers,
ID3D11SamplerState* const* ppSamplers) {
this->BindSamplers(
this->SetSamplers(
DxbcProgramType::DomainShader,
m_state.ds.samplers,
StartSlot, NumSamplers,
@ -1439,7 +1439,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumBuffers,
ID3D11Buffer* const* ppConstantBuffers) {
this->BindConstantBuffers(
this->SetConstantBuffers(
DxbcProgramType::GeometryShader,
m_state.gs.constantBuffers,
StartSlot, NumBuffers,
@ -1451,7 +1451,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumViews,
ID3D11ShaderResourceView* const* ppShaderResourceViews) {
this->BindShaderResources(
this->SetShaderResources(
DxbcProgramType::GeometryShader,
m_state.gs.shaderResources,
StartSlot, NumViews,
@ -1463,7 +1463,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumSamplers,
ID3D11SamplerState* const* ppSamplers) {
this->BindSamplers(
this->SetSamplers(
DxbcProgramType::GeometryShader,
m_state.gs.samplers,
StartSlot, NumSamplers,
@ -1530,7 +1530,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumBuffers,
ID3D11Buffer* const* ppConstantBuffers) {
this->BindConstantBuffers(
this->SetConstantBuffers(
DxbcProgramType::PixelShader,
m_state.ps.constantBuffers,
StartSlot, NumBuffers,
@ -1542,7 +1542,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumViews,
ID3D11ShaderResourceView* const* ppShaderResourceViews) {
this->BindShaderResources(
this->SetShaderResources(
DxbcProgramType::PixelShader,
m_state.ps.shaderResources,
StartSlot, NumViews,
@ -1554,7 +1554,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumSamplers,
ID3D11SamplerState* const* ppSamplers) {
this->BindSamplers(
this->SetSamplers(
DxbcProgramType::PixelShader,
m_state.ps.samplers,
StartSlot, NumSamplers,
@ -1621,7 +1621,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumBuffers,
ID3D11Buffer* const* ppConstantBuffers) {
this->BindConstantBuffers(
this->SetConstantBuffers(
DxbcProgramType::ComputeShader,
m_state.cs.constantBuffers,
StartSlot, NumBuffers,
@ -1633,7 +1633,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumViews,
ID3D11ShaderResourceView* const* ppShaderResourceViews) {
this->BindShaderResources(
this->SetShaderResources(
DxbcProgramType::ComputeShader,
m_state.cs.shaderResources,
StartSlot, NumViews,
@ -1645,7 +1645,7 @@ namespace dxvk {
UINT StartSlot,
UINT NumSamplers,
ID3D11SamplerState* const* ppSamplers) {
this->BindSamplers(
this->SetSamplers(
DxbcProgramType::ComputeShader,
m_state.cs.samplers,
StartSlot, NumSamplers,
@ -1658,7 +1658,7 @@ namespace dxvk {
UINT NumUAVs,
ID3D11UnorderedAccessView* const* ppUnorderedAccessViews,
const UINT* pUAVInitialCounts) {
this->BindUnorderedAccessViews(
this->SetUnorderedAccessViews(
DxbcProgramType::ComputeShader,
m_state.cs.unorderedAccessViews,
StartSlot, NumUAVs,
@ -1762,7 +1762,7 @@ namespace dxvk {
// the graphics pipeline even though this code may
// suggest that they are limited to the pixel shader.
// This behaviour is only required for FL_11_1.
BindUnorderedAccessViews(
SetUnorderedAccessViews(
DxbcProgramType::PixelShader,
m_state.ps.unorderedAccessViews,
UAVStartSlot, NumUAVs,
@ -2098,7 +2098,61 @@ namespace dxvk {
}
void D3D11DeviceContext::BindConstantBuffers(
void D3D11DeviceContext::BindConstantBuffer(
UINT Slot,
D3D11Buffer* pBuffer) {
EmitCs([
cSlotId = Slot,
cBufferSlice = pBuffer != nullptr ? pBuffer->GetBufferSlice() : DxvkBufferSlice()
] (DxvkContext* ctx) {
ctx->bindResourceBuffer(cSlotId, cBufferSlice);
});
}
void D3D11DeviceContext::BindSampler(
UINT Slot,
D3D11SamplerState* pSampler) {
EmitCs([
cSlotId = Slot,
cSampler = pSampler != nullptr ? pSampler->GetDXVKSampler() : nullptr
] (DxvkContext* ctx) {
ctx->bindResourceSampler(cSlotId, cSampler);
});
}
void D3D11DeviceContext::BindShaderResource(
UINT Slot,
D3D11ShaderResourceView* pResource) {
EmitCs([
cSlotId = Slot,
cImageView = pResource != nullptr ? pResource->GetImageView() : nullptr,
cBufferView = pResource != nullptr ? pResource->GetBufferView() : nullptr
] (DxvkContext* ctx) {
ctx->bindResourceView(cSlotId, cImageView, cBufferView);
});
}
void D3D11DeviceContext::BindUnorderedAccessView(
UINT UavSlot,
UINT CtrSlot,
D3D11UnorderedAccessView* pUav) {
EmitCs([
cUavSlotId = UavSlot,
cCtrSlotId = CtrSlot,
cImageView = pUav != nullptr ? pUav->GetImageView() : nullptr,
cBufferView = pUav != nullptr ? pUav->GetBufferView() : nullptr,
cCounterSlice = pUav != nullptr ? pUav->GetCounterSlice() : DxvkBufferSlice()
] (DxvkContext* ctx) {
ctx->bindResourceView (cUavSlotId, cImageView, cBufferView);
ctx->bindResourceBuffer (cCtrSlotId, cCounterSlice);
});
}
void D3D11DeviceContext::SetConstantBuffers(
DxbcProgramType ShaderStage,
D3D11ConstantBufferBindings& Bindings,
UINT StartSlot,
@ -2113,21 +2167,13 @@ namespace dxvk {
if (Bindings[StartSlot + i] != newBuffer) {
Bindings[StartSlot + i] = newBuffer;
EmitCs([
cSlotId = slotId + i,
cSlice = newBuffer != nullptr
? newBuffer->GetBufferSlice()
: DxvkBufferSlice()
] (DxvkContext* ctx) {
ctx->bindResourceBuffer(cSlotId, cSlice);
});
BindConstantBuffer(slotId + i, newBuffer);
}
}
}
void D3D11DeviceContext::BindSamplers(
void D3D11DeviceContext::SetSamplers(
DxbcProgramType ShaderStage,
D3D11SamplerBindings& Bindings,
UINT StartSlot,
@ -2142,21 +2188,13 @@ namespace dxvk {
if (Bindings[StartSlot + i] != sampler) {
Bindings[StartSlot + i] = sampler;
EmitCs([
cSlotId = slotId + i,
cSampler = sampler != nullptr
? sampler->GetDXVKSampler()
: nullptr
] (DxvkContext* ctx) {
ctx->bindResourceSampler(cSlotId, cSampler);
});
BindSampler(slotId + i, sampler);
}
}
}
void D3D11DeviceContext::BindShaderResources(
void D3D11DeviceContext::SetShaderResources(
DxbcProgramType ShaderStage,
D3D11ShaderResourceBindings& Bindings,
UINT StartSlot,
@ -2171,34 +2209,13 @@ namespace dxvk {
if (Bindings[StartSlot + i] != resView) {
Bindings[StartSlot + i] = resView;
if (resView != nullptr) {
// Figure out what we have to bind based on the resource type
if (resView->GetResourceType() == D3D11_RESOURCE_DIMENSION_BUFFER) {
EmitCs([cSlotId = slotId + i, cView = resView->GetBufferView()]
(DxvkContext* ctx) {
ctx->bindResourceTexelBuffer(cSlotId, cView);
});
} else {
EmitCs([cSlotId = slotId + i, cView = resView->GetImageView()]
(DxvkContext* ctx) {
ctx->bindResourceImage(cSlotId, cView);
});
}
} else {
// When unbinding a resource, it doesn't really matter if
// the resource type is correct, so we'll just bind a null
// image to the given resource slot
EmitCs([cSlotId = slotId + i] (DxvkContext* ctx) {
ctx->bindResourceImage(cSlotId, nullptr);
});
}
BindShaderResource(slotId + i, resView);
}
}
}
void D3D11DeviceContext::BindUnorderedAccessViews(
void D3D11DeviceContext::SetUnorderedAccessViews(
DxbcProgramType ShaderStage,
D3D11UnorderedAccessBindings& Bindings,
UINT StartSlot,
@ -2217,35 +2234,7 @@ namespace dxvk {
if (Bindings[StartSlot + i] != uav) {
Bindings[StartSlot + i] = uav;
if (uav != nullptr) {
// Figure out what we have to bind based on the resource type
if (uav->GetResourceType() == D3D11_RESOURCE_DIMENSION_BUFFER) {
EmitCs([
cUavSlotId = uavSlotId + i,
cCtrSlotId = ctrSlotId + i,
cUavBuffer = uav->GetBufferView(),
cCtrBuffer = uav->GetCounterSlice()
] (DxvkContext* ctx) {
ctx->bindResourceTexelBuffer(cUavSlotId, cUavBuffer);
ctx->bindResourceBuffer (cCtrSlotId, cCtrBuffer);
});
} else {
EmitCs([cUavSlotId = uavSlotId + i, cUavImage = uav->GetImageView()]
(DxvkContext* ctx) {
ctx->bindResourceImage(cUavSlotId, cUavImage);
});
}
} else {
// When unbinding a resource, it doesn't really matter if
// the resource type is correct, so we'll just bind a null
// image to the given resource slot
EmitCs([cUavSlotId = uavSlotId + i, cCtrSlotId = ctrSlotId + i]
(DxvkContext* ctx) {
ctx->bindResourceTexelBuffer(cUavSlotId, nullptr);
ctx->bindResourceBuffer (cCtrSlotId, DxvkBufferSlice());
});
}
BindUnorderedAccessView(uavSlotId + i, ctrSlotId + i, uav);
}
}
}

View File

@ -552,28 +552,45 @@ namespace dxvk {
UINT Offset,
DXGI_FORMAT Format);
void BindConstantBuffers(
void BindConstantBuffer(
UINT Slot,
D3D11Buffer* pBuffer);
void BindSampler(
UINT Slot,
D3D11SamplerState* pSampler);
void BindShaderResource(
UINT Slot,
D3D11ShaderResourceView* pResource);
void BindUnorderedAccessView(
UINT UavSlot,
UINT CtrSlot,
D3D11UnorderedAccessView* pUav);
void SetConstantBuffers(
DxbcProgramType ShaderStage,
D3D11ConstantBufferBindings& Bindings,
UINT StartSlot,
UINT NumBuffers,
ID3D11Buffer* const* ppConstantBuffers);
void BindSamplers(
void SetSamplers(
DxbcProgramType ShaderStage,
D3D11SamplerBindings& Bindings,
UINT StartSlot,
UINT NumSamplers,
ID3D11SamplerState* const* ppSamplers);
void BindShaderResources(
void SetShaderResources(
DxbcProgramType ShaderStage,
D3D11ShaderResourceBindings& Bindings,
UINT StartSlot,
UINT NumResources,
ID3D11ShaderResourceView* const* ppResources);
void BindUnorderedAccessViews(
void SetUnorderedAccessViews(
DxbcProgramType ShaderStage,
D3D11UnorderedAccessBindings& Bindings,
UINT StartSlot,

View File

@ -205,14 +205,14 @@ namespace dxvk {
m_blendMode.enableBlending = VK_FALSE;
m_context->setBlendMode(0, m_blendMode);
m_context->bindResourceImage(BindingIds::Texture, m_backBufferView);
m_context->bindResourceView(BindingIds::Texture, m_backBufferView, nullptr);
m_context->draw(4, 1, 0, 0);
if (m_hud != nullptr) {
m_blendMode.enableBlending = VK_TRUE;
m_context->setBlendMode(0, m_blendMode);
m_context->bindResourceImage(BindingIds::Texture, m_hud->texture());
m_context->bindResourceView(BindingIds::Texture, m_hud->texture(), nullptr);
m_context->draw(4, 1, 0, 0);
}

View File

@ -135,12 +135,14 @@ namespace dxvk {
}
void DxvkContext::bindResourceTexelBuffer(
void DxvkContext::bindResourceView(
uint32_t slot,
const Rc<DxvkImageView>& imageView,
const Rc<DxvkBufferView>& bufferView) {
if (m_rc[slot].bufferView != bufferView) {
if (m_rc[slot].imageView != imageView
|| m_rc[slot].bufferView != bufferView) {
m_rc[slot].sampler = nullptr;
m_rc[slot].imageView = nullptr;
m_rc[slot].imageView = imageView;
m_rc[slot].bufferView = bufferView;
m_rc[slot].bufferSlice = DxvkBufferSlice();
@ -151,22 +153,6 @@ namespace dxvk {
}
void DxvkContext::bindResourceImage(
uint32_t slot,
const Rc<DxvkImageView>& image) {
if (m_rc[slot].imageView != image) {
m_rc[slot].sampler = nullptr;
m_rc[slot].imageView = image;
m_rc[slot].bufferView = nullptr;
m_rc[slot].bufferSlice = DxvkBufferSlice();
m_flags.set(
DxvkContextFlag::CpDirtyResources,
DxvkContextFlag::GpDirtyResources);
}
}
void DxvkContext::bindResourceSampler(
uint32_t slot,
const Rc<DxvkSampler>& sampler) {

View File

@ -96,28 +96,19 @@ namespace dxvk {
const DxvkBufferSlice& buffer);
/**
* \brief Binds texel buffer view
* \brief Binds image or buffer view
*
* Can be used for both uniform texel
* buffers and storage texel buffers.
* \param [in] slot Resource binding slot
* \param [in] bufferView Buffer view to bind
*/
void bindResourceTexelBuffer(
uint32_t slot,
const Rc<DxvkBufferView>& bufferView);
/**
* \brief Binds image view
*
* Can be used for sampled images with a
* dedicated sampler and storage images.
* Can be used for sampled images with a dedicated
* sampler and for storage images, as well as for
* uniform texel buffers and storage texel buffers.
* \param [in] slot Resource binding slot
* \param [in] imageView Image view to bind
* \param [in] bufferView Buffer view to bind
*/
void bindResourceImage(
void bindResourceView(
uint32_t slot,
const Rc<DxvkImageView>& image);
const Rc<DxvkImageView>& imageView,
const Rc<DxvkBufferView>& bufferView);
/**
* \brief Binds image sampler

View File

@ -55,7 +55,7 @@ namespace dxvk::hud {
sizeof(HudTextVertex));
context->bindResourceSampler(1, m_fontSampler);
context->bindResourceImage (2, m_fontView);
context->bindResourceView (2, m_fontView, nullptr);
m_vertexIndex = 0;
}