VideoBackends: Use m_system in vertex managers

This commit is contained in:
Dentomologist 2025-09-22 13:33:56 -07:00
parent d8cd227ac2
commit be20ca2287
18 changed files with 94 additions and 59 deletions

View File

@ -162,7 +162,7 @@ bool VideoBackend::Initialize(Core::System& system, const WindowSystemInfo& wsi)
}
auto gfx = std::make_unique<DX11::Gfx>(std::move(swap_chain), wsi.render_surface_scale);
auto vertex_manager = std::make_unique<VertexManager>();
auto vertex_manager = std::make_unique<VertexManager>(system);
auto perf_query = std::make_unique<PerfQuery>();
auto bounding_box = std::make_unique<D3DBoundingBox>();

View File

@ -67,7 +67,9 @@ CreateTexelBufferView(ID3D11Buffer* buffer, TexelBufferFormat format, DXGI_FORMA
return srv;
}
VertexManager::VertexManager() = default;
VertexManager::VertexManager(Core::System& system) : m_system(system)
{
}
VertexManager::~VertexManager() = default;
@ -262,9 +264,7 @@ void VertexManager::CommitBuffer(u32 num_vertices, u32 vertex_stride, u32 num_in
void VertexManager::UploadUniforms()
{
auto& system = Core::System::GetInstance();
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& vertex_shader_manager = m_system.GetVertexShaderManager();
if (vertex_shader_manager.dirty)
{
UpdateConstantBuffer(m_vertex_constant_buffer.Get(), &vertex_shader_manager.constants,
@ -272,7 +272,7 @@ void VertexManager::UploadUniforms()
vertex_shader_manager.dirty = false;
}
auto& geometry_shader_manager = system.GetGeometryShaderManager();
auto& geometry_shader_manager = m_system.GetGeometryShaderManager();
if (geometry_shader_manager.dirty)
{
UpdateConstantBuffer(m_geometry_constant_buffer.Get(), &geometry_shader_manager.constants,
@ -280,7 +280,7 @@ void VertexManager::UploadUniforms()
geometry_shader_manager.dirty = false;
}
auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& pixel_shader_manager = m_system.GetPixelShaderManager();
if (pixel_shader_manager.dirty)
{
UpdateConstantBuffer(m_pixel_constant_buffer.Get(), &pixel_shader_manager.constants,

View File

@ -14,6 +14,11 @@
enum class ShaderAttrib : u32;
namespace Core
{
class System;
}
namespace DX11
{
class D3DVertexFormat : public NativeVertexFormat
@ -35,7 +40,7 @@ private:
class VertexManager : public VertexManagerBase
{
public:
VertexManager();
VertexManager(Core::System& system);
~VertexManager() override;
bool Initialize() override;
@ -74,6 +79,8 @@ private:
ComPtr<ID3D11Buffer> m_texel_buffer = nullptr;
std::array<ComPtr<ID3D11ShaderResourceView>, NUM_TEXEL_BUFFER_FORMATS> m_texel_buffer_views;
u32 m_texel_buffer_offset = 0;
Core::System& m_system;
};
} // namespace DX11

View File

@ -24,7 +24,9 @@
namespace DX12
{
VertexManager::VertexManager() = default;
VertexManager::VertexManager(Core::System& system) : m_system(system)
{
}
VertexManager::~VertexManager() = default;
@ -146,8 +148,7 @@ void VertexManager::UploadUniforms()
void VertexManager::UpdateVertexShaderConstants()
{
auto& system = Core::System::GetInstance();
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& vertex_shader_manager = m_system.GetVertexShaderManager();
if (!vertex_shader_manager.dirty || !ReserveConstantStorage())
return;
@ -162,8 +163,7 @@ void VertexManager::UpdateVertexShaderConstants()
void VertexManager::UpdateGeometryShaderConstants()
{
auto& system = Core::System::GetInstance();
auto& geometry_shader_manager = system.GetGeometryShaderManager();
auto& geometry_shader_manager = m_system.GetGeometryShaderManager();
if (!geometry_shader_manager.dirty || !ReserveConstantStorage())
return;
@ -178,8 +178,7 @@ void VertexManager::UpdateGeometryShaderConstants()
void VertexManager::UpdatePixelShaderConstants()
{
auto& system = Core::System::GetInstance();
auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& pixel_shader_manager = m_system.GetPixelShaderManager();
if (!ReserveConstantStorage())
return;
@ -197,8 +196,7 @@ void VertexManager::UpdatePixelShaderConstants()
void VertexManager::UpdateCustomShaderConstants()
{
auto& system = Core::System::GetInstance();
auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& pixel_shader_manager = m_system.GetPixelShaderManager();
if (!ReserveConstantStorage())
return;
@ -217,8 +215,7 @@ void VertexManager::UpdateCustomShaderConstants()
bool VertexManager::ReserveConstantStorage()
{
auto& system = Core::System::GetInstance();
auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& pixel_shader_manager = m_system.GetPixelShaderManager();
static constexpr u32 reserve_size =
static_cast<u32>(std::max({sizeof(PixelShaderConstants), sizeof(VertexShaderConstants),
@ -242,8 +239,7 @@ bool VertexManager::ReserveConstantStorage()
void VertexManager::UploadAllConstants()
{
auto& system = Core::System::GetInstance();
auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& pixel_shader_manager = m_system.GetPixelShaderManager();
// We are free to re-use parts of the buffer now since we're uploading all constants.
const u32 pixel_constants_offset = 0;
@ -278,8 +274,8 @@ void VertexManager::UploadAllConstants()
Gfx::GetInstance()->SetConstantBuffer(3, m_uniform_stream_buffer.GetCurrentGPUPointer() +
geometry_constants_offset);
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& geometry_shader_manager = system.GetGeometryShaderManager();
auto& vertex_shader_manager = m_system.GetVertexShaderManager();
auto& geometry_shader_manager = m_system.GetGeometryShaderManager();
// Copy the actual data in
std::memcpy(m_uniform_stream_buffer.GetCurrentHostPointer() + pixel_constants_offset,

View File

@ -9,12 +9,17 @@
#include "VideoBackends/D3D12/DescriptorHeapManager.h"
#include "VideoCommon/VertexManagerBase.h"
namespace Core
{
class System;
}
namespace DX12
{
class VertexManager final : public VertexManagerBase
{
public:
VertexManager();
VertexManager(Core::System& system);
~VertexManager() override;
bool Initialize() override;
@ -49,6 +54,7 @@ protected:
StreamBuffer m_texel_stream_buffer;
std::array<DescriptorHandle, NUM_TEXEL_BUFFER_FORMATS> m_texel_buffer_views = {};
DescriptorHandle m_vertex_srv = {};
Core::System& m_system;
};
} // namespace DX12

View File

@ -139,7 +139,7 @@ bool VideoBackend::Initialize(Core::System& system, const WindowSystemInfo& wsi)
// Create main wrapper instances.
auto gfx = std::make_unique<DX12::Gfx>(std::move(swap_chain), wsi.render_surface_scale);
auto vertex_manager = std::make_unique<DX12::VertexManager>();
auto vertex_manager = std::make_unique<DX12::VertexManager>(system);
auto perf_query = std::make_unique<DX12::PerfQuery>();
auto bounding_box = std::make_unique<DX12::D3D12BoundingBox>();

View File

@ -131,7 +131,7 @@ bool Metal::VideoBackend::Initialize(Core::System& system, const WindowSystemInf
g_state_tracker = std::make_unique<StateTracker>();
return InitializeShared(system, std::make_unique<Metal::Gfx>(std::move(layer)),
std::make_unique<Metal::VertexManager>(),
std::make_unique<Metal::VertexManager>(system),
std::make_unique<Metal::PerfQuery>(),
std::make_unique<Metal::BoundingBox>());
}

View File

@ -6,12 +6,17 @@
#include "VideoBackends/Metal/MTLUtil.h"
#include "VideoCommon/VertexManagerBase.h"
namespace Core
{
class System;
};
namespace Metal
{
class VertexManager final : public VertexManagerBase
{
public:
VertexManager();
VertexManager(Core::System& system);
~VertexManager() override;
void UploadUtilityUniforms(const void* uniforms, u32 uniforms_size) override;
@ -30,5 +35,6 @@ protected:
private:
u32 m_vertex_offset;
u32 m_base_vertex;
Core::System& m_system;
};
} // namespace Metal

View File

@ -12,7 +12,7 @@
#include "VideoCommon/Statistics.h"
#include "VideoCommon/VertexShaderManager.h"
Metal::VertexManager::VertexManager()
Metal::VertexManager::VertexManager(Core::System& system) : m_system(system)
{
}
@ -91,10 +91,9 @@ void Metal::VertexManager::CommitBuffer(u32 num_vertices, u32 vertex_stride, u32
void Metal::VertexManager::UploadUniforms()
{
auto& system = Core::System::GetInstance();
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& geometry_shader_manager = system.GetGeometryShaderManager();
auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& vertex_shader_manager = m_system.GetVertexShaderManager();
auto& geometry_shader_manager = m_system.GetGeometryShaderManager();
auto& pixel_shader_manager = m_system.GetPixelShaderManager();
g_state_tracker->InvalidateUniforms(vertex_shader_manager.dirty, geometry_shader_manager.dirty,
pixel_shader_manager.dirty);
vertex_shader_manager.dirty = false;

View File

@ -213,7 +213,7 @@ bool VideoBackend::Initialize(Core::System& system, const WindowSystemInfo& wsi)
ProgramShaderCache::Init();
g_sampler_cache = std::make_unique<SamplerCache>();
auto vertex_manager = std::make_unique<VertexManager>();
auto vertex_manager = std::make_unique<VertexManager>(system);
auto perf_query = GetPerfQuery(gfx->IsGLES());
auto bounding_box = std::make_unique<OGLBoundingBox>();

View File

@ -22,6 +22,11 @@
#include "VideoCommon/VertexLoaderManager.h"
#include "VideoCommon/VideoConfig.h"
namespace Core
{
class System;
}
namespace OGL
{
static void CheckBufferBinding()
@ -34,7 +39,9 @@ static void CheckBufferBinding()
}
}
VertexManager::VertexManager() = default;
VertexManager::VertexManager(Core::System& system) : m_system(system)
{
}
VertexManager::~VertexManager()
{

View File

@ -11,6 +11,11 @@
#include "VideoCommon/NativeVertexFormat.h"
#include "VideoCommon/VertexManagerBase.h"
namespace Core
{
class System;
}
namespace OGL
{
class StreamBuffer;
@ -28,7 +33,7 @@ public:
class VertexManager final : public VertexManagerBase
{
public:
VertexManager();
VertexManager(Core::System& system);
~VertexManager() override;
bool Initialize() override;
@ -54,5 +59,6 @@ private:
std::unique_ptr<StreamBuffer> m_index_buffer;
std::unique_ptr<StreamBuffer> m_texel_buffer;
std::array<GLuint, NUM_TEXEL_BUFFER_FORMATS> m_texel_buffer_views{};
Core::System& m_system;
};
} // namespace OGL

View File

@ -30,7 +30,9 @@
#include "VideoCommon/VideoConfig.h"
#include "VideoCommon/XFMemory.h"
SWVertexLoader::SWVertexLoader() = default;
SWVertexLoader::SWVertexLoader(Core::System& system) : m_system(system)
{
}
SWVertexLoader::~SWVertexLoader() = default;
@ -208,24 +210,21 @@ void SWVertexLoader::ParseVertex(const PortableVertexDeclaration& vdec, int inde
}
if (!vdec.normals[0].enable)
{
auto& system = Core::System::GetInstance();
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& vertex_shader_manager = m_system.GetVertexShaderManager();
m_vertex.normal[0].x = vertex_shader_manager.constants.cached_normal[0];
m_vertex.normal[0].y = vertex_shader_manager.constants.cached_normal[1];
m_vertex.normal[0].z = vertex_shader_manager.constants.cached_normal[2];
}
if (!vdec.normals[1].enable)
{
auto& system = Core::System::GetInstance();
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& vertex_shader_manager = m_system.GetVertexShaderManager();
m_vertex.normal[1].x = vertex_shader_manager.constants.cached_tangent[0];
m_vertex.normal[1].y = vertex_shader_manager.constants.cached_tangent[1];
m_vertex.normal[1].z = vertex_shader_manager.constants.cached_tangent[2];
}
if (!vdec.normals[2].enable)
{
auto& system = Core::System::GetInstance();
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& vertex_shader_manager = m_system.GetVertexShaderManager();
m_vertex.normal[2].x = vertex_shader_manager.constants.cached_binormal[0];
m_vertex.normal[2].y = vertex_shader_manager.constants.cached_binormal[1];
m_vertex.normal[2].z = vertex_shader_manager.constants.cached_binormal[2];

View File

@ -13,10 +13,15 @@
#include "VideoCommon/VertexManagerBase.h"
namespace Core
{
class system;
}
class SWVertexLoader final : public VertexManagerBase
{
public:
SWVertexLoader();
SWVertexLoader(Core::System& system);
~SWVertexLoader() override;
DataReader PrepareForAdditionalData(OpcodeDecoder::Primitive primitive, u32 count, u32 stride,
@ -30,4 +35,5 @@ protected:
InputVertexData m_vertex{};
SetupUnit m_setup_unit;
Core::System& m_system;
};

View File

@ -105,7 +105,7 @@ bool VideoSoftware::Initialize(Core::System& system, const WindowSystemInfo& wsi
Rasterizer::Init();
return InitializeShared(system, std::make_unique<SWGfx>(std::move(window)),
std::make_unique<SWVertexLoader>(), std::make_unique<PerfQuery>(),
std::make_unique<SWVertexLoader>(system), std::make_unique<PerfQuery>(),
std::make_unique<SWBoundingBox>(), std::make_unique<SWEFBInterface>(),
std::make_unique<TextureCache>());
}

View File

@ -233,7 +233,7 @@ bool VideoBackend::Initialize(Core::System& system, const WindowSystemInfo& wsi)
}
auto gfx = std::make_unique<VKGfx>(std::move(swap_chain), wsi.render_surface_scale);
auto vertex_manager = std::make_unique<VertexManager>();
auto vertex_manager = std::make_unique<VertexManager>(system);
auto perf_query = std::make_unique<PerfQuery>();
auto bounding_box = std::make_unique<VKBoundingBox>();

View File

@ -53,7 +53,9 @@ static VkBufferView CreateTexelBufferView(VkBuffer buffer, VkFormat vk_format)
return view;
}
VertexManager::VertexManager() = default;
VertexManager::VertexManager(Core::System& system) : m_system(system)
{
}
VertexManager::~VertexManager()
{
@ -204,8 +206,7 @@ void VertexManager::UploadUniforms()
void VertexManager::UpdateVertexShaderConstants()
{
auto& system = Core::System::GetInstance();
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& vertex_shader_manager = m_system.GetVertexShaderManager();
if (!vertex_shader_manager.dirty || !ReserveConstantStorage())
return;
@ -222,8 +223,7 @@ void VertexManager::UpdateVertexShaderConstants()
void VertexManager::UpdateGeometryShaderConstants()
{
auto& system = Core::System::GetInstance();
auto& geometry_shader_manager = system.GetGeometryShaderManager();
auto& geometry_shader_manager = m_system.GetGeometryShaderManager();
if (!geometry_shader_manager.dirty || !ReserveConstantStorage())
return;
@ -240,8 +240,7 @@ void VertexManager::UpdateGeometryShaderConstants()
void VertexManager::UpdatePixelShaderConstants()
{
auto& system = Core::System::GetInstance();
auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& pixel_shader_manager = m_system.GetPixelShaderManager();
if (!ReserveConstantStorage())
return;
@ -275,8 +274,7 @@ void VertexManager::UpdatePixelShaderConstants()
bool VertexManager::ReserveConstantStorage()
{
auto& system = Core::System::GetInstance();
auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& pixel_shader_manager = m_system.GetPixelShaderManager();
const u32 custom_constants_size = static_cast<u32>(pixel_shader_manager.custom_constants.size());
if (m_uniform_stream_buffer->ReserveMemory(m_uniform_buffer_reserve_size + custom_constants_size,
@ -297,8 +295,7 @@ bool VertexManager::ReserveConstantStorage()
void VertexManager::UploadAllConstants()
{
auto& system = Core::System::GetInstance();
auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& pixel_shader_manager = m_system.GetPixelShaderManager();
const u32 custom_constants_size = static_cast<u32>(pixel_shader_manager.custom_constants.size());
@ -321,8 +318,8 @@ void VertexManager::UploadAllConstants()
return;
}
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& geometry_shader_manager = system.GetGeometryShaderManager();
auto& vertex_shader_manager = m_system.GetVertexShaderManager();
auto& geometry_shader_manager = m_system.GetGeometryShaderManager();
// Update bindings
StateTracker::GetInstance()->SetGXUniformBuffer(

View File

@ -10,6 +10,11 @@
#include "VideoBackends/Vulkan/VulkanLoader.h"
#include "VideoCommon/VertexManagerBase.h"
namespace Core
{
class System;
}
namespace Vulkan
{
class StreamBuffer;
@ -17,7 +22,7 @@ class StreamBuffer;
class VertexManager : public VertexManagerBase
{
public:
VertexManager();
VertexManager(Core::System& system);
~VertexManager() override;
bool Initialize() override;
@ -53,5 +58,6 @@ protected:
std::unique_ptr<StreamBuffer> m_texel_stream_buffer;
std::array<VkBufferView, NUM_TEXEL_BUFFER_FORMATS> m_texel_buffer_views = {};
u32 m_uniform_buffer_reserve_size = 0;
Core::System& m_system;
};
} // namespace Vulkan