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

[d3d9] Batch texture unbinding

This commit is contained in:
Joshua Ashton 2021-08-16 16:50:00 +01:00 committed by Joshie
parent a346949304
commit c6a4c41d20
2 changed files with 52 additions and 23 deletions

View File

@ -5811,9 +5811,7 @@ namespace dxvk {
// For all our pixel shader textures // For all our pixel shader textures
if (likely(StateSampler < 16)) { if (likely(StateSampler < 16)) {
const uint32_t offset = StateSampler * 2; const uint32_t offset = StateSampler * 2;
const uint32_t textureType = commonTex != nullptr const uint32_t textureType = uint32_t(commonTex->GetType() - D3DRTYPE_TEXTURE);
? uint32_t(commonTex->GetType() - D3DRTYPE_TEXTURE)
: 0;
const uint32_t textureBitMask = 0b11u << offset; const uint32_t textureBitMask = 0b11u << offset;
const uint32_t textureBits = textureType << offset; const uint32_t textureBits = textureType << offset;
@ -5825,20 +5823,43 @@ namespace dxvk {
} }
} }
if (commonTex != nullptr) { EmitCs([
EmitCs([ cSlot = slot,
cSlot = slot, cImageView = commonTex->GetSampleView(srgb)
cImageView = commonTex->GetSampleView(srgb) ](DxvkContext* ctx) {
](DxvkContext* ctx) { ctx->bindResourceView(cSlot, cImageView, nullptr);
ctx->bindResourceView(cSlot, cImageView, nullptr); });
}); }
} else {
EmitCs([
cSlot = slot void D3D9DeviceEx::UnbindTextures(uint32_t mask) {
](DxvkContext* ctx) { // For all our pixel shader textures
ctx->bindResourceView(cSlot, nullptr, nullptr); const uint32_t pixelShaderMask = (1u << 16u) - 1;
});
// Update the sampler type bitfield to 0 for the
// unbound textures.
uint32_t typeMask = 0;
for (uint32_t i : bit::BitMask(mask & pixelShaderMask))
typeMask |= 0b11u << (i * 2u);
if ((m_samplerTypeBitfield & typeMask) != 0) {
m_flags.set(D3D9DeviceFlag::DirtyFFPixelShader);
m_samplerTypeBitfield &= ~typeMask;
} }
EmitCs([
cMask = mask
](DxvkContext* ctx) {
for (uint32_t i : bit::BitMask(cMask)) {
auto shaderSampler = RemapStateSamplerShader(i);
uint32_t slot = computeResourceSlotId(shaderSampler.first,
DxsoBindingType::Image, uint32_t(shaderSampler.second));
ctx->bindResourceView(slot, nullptr, nullptr);
}
});
} }
@ -5850,11 +5871,17 @@ namespace dxvk {
} }
void D3D9DeviceEx::UndirtyTextures(uint32_t mask) { void D3D9DeviceEx::UndirtyTextures(uint32_t usedMask) {
for (uint32_t i : bit::BitMask(mask)) const uint32_t activeMask = usedMask & m_activeTextures;
const uint32_t inactiveMask = usedMask & ~m_activeTextures;
for (uint32_t i : bit::BitMask(activeMask))
BindTexture(i); BindTexture(i);
m_dirtyTextures &= ~mask; if (inactiveMask)
UnbindTextures(inactiveMask);
m_dirtyTextures &= ~usedMask;
} }
void D3D9DeviceEx::MarkTextureBindingDirty(IDirect3DBaseTexture9* texture) { void D3D9DeviceEx::MarkTextureBindingDirty(IDirect3DBaseTexture9* texture) {
@ -5933,9 +5960,9 @@ namespace dxvk {
if (activeDirtySamplers) if (activeDirtySamplers)
UndirtySamplers(activeDirtySamplers); UndirtySamplers(activeDirtySamplers);
const uint32_t activeDirtyTextures = m_dirtyTextures & usedSamplerMask; const uint32_t usedDirtyTextures = m_dirtyTextures & usedSamplerMask;
if (activeDirtyTextures) if (usedDirtyTextures)
UndirtyTextures(activeDirtyTextures); UndirtyTextures(usedDirtyTextures);
if (m_flags.test(D3D9DeviceFlag::DirtyBlendState)) if (m_flags.test(D3D9DeviceFlag::DirtyBlendState))
BindBlendState(); BindBlendState();

View File

@ -835,9 +835,11 @@ namespace dxvk {
void BindTexture(DWORD SamplerSampler); void BindTexture(DWORD SamplerSampler);
void UnbindTextures(uint32_t mask);
void UndirtySamplers(uint32_t mask); void UndirtySamplers(uint32_t mask);
void UndirtyTextures(uint32_t mask); void UndirtyTextures(uint32_t usedMask);
void MarkTextureBindingDirty(IDirect3DBaseTexture9* texture); void MarkTextureBindingDirty(IDirect3DBaseTexture9* texture);