From 39039f9ac8f2e5b1cdc9b741ab71b225c3247f50 Mon Sep 17 00:00:00 2001 From: Robin Kertels Date: Sun, 14 Nov 2021 14:09:28 +0100 Subject: [PATCH] [dxso+d3d9] Clean up texture slots --- src/d3d9/d3d9_caps.h | 3 +++ src/d3d9/d3d9_device.cpp | 4 ++-- src/d3d9/d3d9_shader.cpp | 3 ++- src/d3d9/d3d9_state.h | 2 +- src/d3d9/d3d9_stateblock.cpp | 5 +++-- src/d3d9/d3d9_util.h | 11 ++++++----- src/dxso/dxso_util.h | 8 +++++--- 7 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/d3d9/d3d9_caps.h b/src/d3d9/d3d9_caps.h index 0b008757..a894de17 100644 --- a/src/d3d9/d3d9_caps.h +++ b/src/d3d9/d3d9_caps.h @@ -29,4 +29,7 @@ namespace dxvk::caps { constexpr uint32_t MaxEnabledLights = 8; + constexpr uint32_t MaxTexturesVS = 4; + constexpr uint32_t MaxTexturesPS = 16; + } \ No newline at end of file diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index bbd5d113..63696628 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -3721,7 +3721,7 @@ namespace dxvk { // We need to check our ops and disable respective stages. // Given we have transition from a null resource to // a valid resource or vice versa. - if (StateSampler < 16) { + if (StateSampler < caps::MaxTexturesPS) { const uint32_t offset = StateSampler * 2; const uint32_t textureType = newTexture != nullptr ? uint32_t(newTexture->GetType() - D3DRTYPE_TEXTURE) @@ -6101,7 +6101,7 @@ namespace dxvk { if (likely(UseProgrammablePS())) { UploadConstants(); - const uint32_t psTextureMask = usedTextureMask & ((1u << 16u) - 1u); + const uint32_t psTextureMask = usedTextureMask & ((1u << caps::MaxTexturesPS) - 1u); const uint32_t fetch4 = m_fetch4 & psTextureMask; const uint32_t projected = m_projectionBitfield & psTextureMask; diff --git a/src/d3d9/d3d9_shader.cpp b/src/d3d9/d3d9_shader.cpp index 91f58091..85bd033b 100644 --- a/src/d3d9/d3d9_shader.cpp +++ b/src/d3d9/d3d9_shader.cpp @@ -1,5 +1,6 @@ #include "d3d9_shader.h" +#include "d3d9_caps.h" #include "d3d9_device.h" #include "d3d9_util.h" @@ -63,7 +64,7 @@ namespace dxvk { // do an or per-draw in the device. // We shift by 17 because 16 ps samplers + 1 dmap (tess) if (ShaderStage == VK_SHADER_STAGE_VERTEX_BIT) - m_usedSamplers <<= 17; + m_usedSamplers <<= caps::MaxTexturesPS + 1; m_usedRTs = pModule->usedRTs(); diff --git a/src/d3d9/d3d9_state.h b/src/d3d9/d3d9_state.h index e895f5db..90154b37 100644 --- a/src/d3d9/d3d9_state.h +++ b/src/d3d9/d3d9_state.h @@ -18,7 +18,7 @@ namespace dxvk { static constexpr uint32_t RenderStateCount = 256; static constexpr uint32_t SamplerStateCount = D3DSAMP_DMAPOFFSET + 1; - static constexpr uint32_t SamplerCount = 21; + static constexpr uint32_t SamplerCount = caps::MaxTexturesPS + caps::MaxTexturesVS + 1; static constexpr uint32_t TextureStageStateCount = DXVK_TSS_COUNT; namespace hacks::PointSize { diff --git a/src/d3d9/d3d9_stateblock.cpp b/src/d3d9/d3d9_stateblock.cpp index 9cbf92f9..9ad2a590 100644 --- a/src/d3d9/d3d9_stateblock.cpp +++ b/src/d3d9/d3d9_stateblock.cpp @@ -1,5 +1,6 @@ #include "d3d9_stateblock.h" +#include "d3d9_caps.h" #include "d3d9_device.h" #include "d3d9_vertex_declaration.h" #include "d3d9_buffer.h" @@ -375,7 +376,7 @@ namespace dxvk { void D3D9StateBlock::CapturePixelSamplerStates() { m_captures.flags.set(D3D9CapturedStateFlag::SamplerStates); - for (uint32_t i = 0; i < 17; i++) { + for (uint32_t i = 0; i < caps::MaxTexturesPS + 1; i++) { m_captures.samplers.set(i, true); m_captures.samplerStates[i].set(D3DSAMP_ADDRESSU, true); @@ -458,7 +459,7 @@ namespace dxvk { void D3D9StateBlock::CaptureVertexSamplerStates() { m_captures.flags.set(D3D9CapturedStateFlag::SamplerStates); - for (uint32_t i = 17; i < SamplerCount; i++) { + for (uint32_t i = caps::MaxTexturesPS + 1; i < SamplerCount; i++) { m_captures.samplers.set(i, true); m_captures.samplerStates[i].set(D3DSAMP_DMAPOFFSET, true); } diff --git a/src/d3d9/d3d9_util.h b/src/d3d9/d3d9_util.h index 83f3c8ba..e5bc4166 100644 --- a/src/d3d9/d3d9_util.h +++ b/src/d3d9/d3d9_util.h @@ -1,6 +1,7 @@ #pragma once #include "d3d9_include.h" +#include "d3d9_caps.h" #include "d3d9_format.h" @@ -46,25 +47,25 @@ namespace dxvk { } inline bool InvalidSampler(DWORD Sampler) { - if (Sampler > 15 && Sampler < D3DDMAPSAMPLER) + if (Sampler >= caps::MaxTexturesPS && Sampler < D3DDMAPSAMPLER) return true; if (Sampler > D3DVERTEXTEXTURESAMPLER3) return true; - + return false; } inline DWORD RemapSamplerState(DWORD Sampler) { if (Sampler >= D3DDMAPSAMPLER) - Sampler = 16 + (Sampler - D3DDMAPSAMPLER); + Sampler = caps::MaxTexturesPS + (Sampler - D3DDMAPSAMPLER); return Sampler; } inline std::pair RemapStateSamplerShader(DWORD Sampler) { - if (Sampler >= 17) - return std::make_pair(DxsoProgramTypes::VertexShader, Sampler - 17); + if (Sampler >= caps::MaxTexturesPS + 1) + return std::make_pair(DxsoProgramTypes::VertexShader, Sampler - caps::MaxTexturesPS - 1); return std::make_pair(DxsoProgramTypes::PixelShader, Sampler); } diff --git a/src/dxso/dxso_util.h b/src/dxso/dxso_util.h index 1503672f..3a94acfb 100644 --- a/src/dxso/dxso_util.h +++ b/src/dxso/dxso_util.h @@ -5,6 +5,8 @@ #include "dxso_common.h" #include "dxso_decoder.h" +#include "../d3d9/d3d9_caps.h" + namespace dxvk { enum class DxsoBindingType : uint32_t { @@ -38,17 +40,17 @@ namespace dxvk { DxsoProgramType shaderStage, DxsoBindingType bindingType, uint32_t bindingIndex) { - const uint32_t stageOffset = (VSCount + 4) * uint32_t(shaderStage); + const uint32_t stageOffset = (DxsoConstantBuffers::VSCount + caps::MaxTexturesVS) * uint32_t(shaderStage); if (bindingType == DxsoBindingType::ConstantBuffer) return bindingIndex + stageOffset; else // if (bindingType == DxsoBindingType::Image) - return bindingIndex + stageOffset + (shaderStage == DxsoProgramType::PixelShader ? PSCount : VSCount); + return bindingIndex + stageOffset + (shaderStage == DxsoProgramType::PixelShader ? DxsoConstantBuffers::PSCount : DxsoConstantBuffers::VSCount); } // TODO: Intergrate into compute resource slot ID/refactor all of this? constexpr uint32_t getSWVPBufferSlot() { - return 27; // From last pixel shader slot, above. + return DxsoConstantBuffers::VSCount + caps::MaxTexturesVS + DxsoConstantBuffers::PSCount + caps::MaxTexturesPS + 1; // From last pixel shader slot, above. } uint32_t RegisterLinkerSlot(DxsoSemantic semantic);