mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-04-09 18:45:40 +00:00
D3D: Make state cache part of Renderer and not static
This commit is contained in:
parent
73a67aa413
commit
798ec96e14
@ -263,6 +263,21 @@ void StateManager::SetTextureByMask(u32 textureSlotMask, ID3D11ShaderResourceVie
|
|||||||
|
|
||||||
} // namespace D3D
|
} // namespace D3D
|
||||||
|
|
||||||
|
StateCache::~StateCache()
|
||||||
|
{
|
||||||
|
for (auto& it : m_depth)
|
||||||
|
SAFE_RELEASE(it.second);
|
||||||
|
|
||||||
|
for (auto& it : m_raster)
|
||||||
|
SAFE_RELEASE(it.second);
|
||||||
|
|
||||||
|
for (auto& it : m_blend)
|
||||||
|
SAFE_RELEASE(it.second);
|
||||||
|
|
||||||
|
for (auto& it : m_sampler)
|
||||||
|
SAFE_RELEASE(it.second);
|
||||||
|
}
|
||||||
|
|
||||||
ID3D11SamplerState* StateCache::Get(SamplerState state)
|
ID3D11SamplerState* StateCache::Get(SamplerState state)
|
||||||
{
|
{
|
||||||
auto it = m_sampler.find(state.hex);
|
auto it = m_sampler.find(state.hex);
|
||||||
@ -471,33 +486,6 @@ ID3D11DepthStencilState* StateCache::Get(DepthState state)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StateCache::Clear()
|
|
||||||
{
|
|
||||||
for (auto it : m_depth)
|
|
||||||
{
|
|
||||||
SAFE_RELEASE(it.second);
|
|
||||||
}
|
|
||||||
m_depth.clear();
|
|
||||||
|
|
||||||
for (auto it : m_raster)
|
|
||||||
{
|
|
||||||
SAFE_RELEASE(it.second);
|
|
||||||
}
|
|
||||||
m_raster.clear();
|
|
||||||
|
|
||||||
for (auto it : m_blend)
|
|
||||||
{
|
|
||||||
SAFE_RELEASE(it.second);
|
|
||||||
}
|
|
||||||
m_blend.clear();
|
|
||||||
|
|
||||||
for (auto it : m_sampler)
|
|
||||||
{
|
|
||||||
SAFE_RELEASE(it.second);
|
|
||||||
}
|
|
||||||
m_sampler.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
D3D11_PRIMITIVE_TOPOLOGY StateCache::GetPrimitiveTopology(PrimitiveType primitive)
|
D3D11_PRIMITIVE_TOPOLOGY StateCache::GetPrimitiveTopology(PrimitiveType primitive)
|
||||||
{
|
{
|
||||||
static constexpr std::array<D3D11_PRIMITIVE_TOPOLOGY, 4> primitives = {
|
static constexpr std::array<D3D11_PRIMITIVE_TOPOLOGY, 4> primitives = {
|
||||||
|
@ -23,6 +23,8 @@ namespace DX11
|
|||||||
class StateCache
|
class StateCache
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
~StateCache();
|
||||||
|
|
||||||
// Get existing or create new render state.
|
// Get existing or create new render state.
|
||||||
// Returned objects is owned by the cache and does not need to be released.
|
// Returned objects is owned by the cache and does not need to be released.
|
||||||
ID3D11SamplerState* Get(SamplerState state);
|
ID3D11SamplerState* Get(SamplerState state);
|
||||||
@ -30,9 +32,6 @@ public:
|
|||||||
ID3D11RasterizerState* Get(RasterizationState state);
|
ID3D11RasterizerState* Get(RasterizationState state);
|
||||||
ID3D11DepthStencilState* Get(DepthState state);
|
ID3D11DepthStencilState* Get(DepthState state);
|
||||||
|
|
||||||
// Release all cached states and clear hash tables.
|
|
||||||
void Clear();
|
|
||||||
|
|
||||||
// Convert RasterState primitive type to D3D11 primitive topology.
|
// Convert RasterState primitive type to D3D11 primitive topology.
|
||||||
static D3D11_PRIMITIVE_TOPOLOGY GetPrimitiveTopology(PrimitiveType primitive);
|
static D3D11_PRIMITIVE_TOPOLOGY GetPrimitiveTopology(PrimitiveType primitive);
|
||||||
|
|
||||||
|
@ -53,14 +53,6 @@ typedef struct _Nv_Stereo_Image_Header
|
|||||||
|
|
||||||
#define NVSTEREO_IMAGE_SIGNATURE 0x4433564e
|
#define NVSTEREO_IMAGE_SIGNATURE 0x4433564e
|
||||||
|
|
||||||
struct GXPipelineState
|
|
||||||
{
|
|
||||||
std::array<SamplerState, 8> samplers;
|
|
||||||
BlendingState blend;
|
|
||||||
DepthState zmode;
|
|
||||||
RasterizationState raster;
|
|
||||||
};
|
|
||||||
|
|
||||||
static u32 s_last_multisamples = 1;
|
static u32 s_last_multisamples = 1;
|
||||||
static bool s_last_stereo_mode = false;
|
static bool s_last_stereo_mode = false;
|
||||||
static bool s_last_fullscreen_mode = false;
|
static bool s_last_fullscreen_mode = false;
|
||||||
@ -74,9 +66,6 @@ static ID3D11RasterizerState* s_reset_rast_state = nullptr;
|
|||||||
static ID3D11Texture2D* s_screenshot_texture = nullptr;
|
static ID3D11Texture2D* s_screenshot_texture = nullptr;
|
||||||
static D3DTexture2D* s_3d_vision_texture = nullptr;
|
static D3DTexture2D* s_3d_vision_texture = nullptr;
|
||||||
|
|
||||||
static GXPipelineState s_gx_state;
|
|
||||||
static StateCache s_gx_state_cache;
|
|
||||||
|
|
||||||
static void SetupDeviceObjects()
|
static void SetupDeviceObjects()
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
@ -173,8 +162,6 @@ static void TeardownDeviceObjects()
|
|||||||
SAFE_RELEASE(s_reset_rast_state);
|
SAFE_RELEASE(s_reset_rast_state);
|
||||||
SAFE_RELEASE(s_screenshot_texture);
|
SAFE_RELEASE(s_screenshot_texture);
|
||||||
SAFE_RELEASE(s_3d_vision_texture);
|
SAFE_RELEASE(s_3d_vision_texture);
|
||||||
|
|
||||||
s_gx_state_cache.Clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Create3DVisionTexture(int width, int height)
|
static void Create3DVisionTexture(int width, int height)
|
||||||
@ -212,13 +199,13 @@ Renderer::Renderer() : ::Renderer(D3D::GetBackBufferWidth(), D3D::GetBackBufferH
|
|||||||
SetupDeviceObjects();
|
SetupDeviceObjects();
|
||||||
|
|
||||||
// Setup GX pipeline state
|
// Setup GX pipeline state
|
||||||
for (auto& sampler : s_gx_state.samplers)
|
for (auto& sampler : m_gx_state.samplers)
|
||||||
sampler.hex = RenderState::GetPointSamplerState().hex;
|
sampler.hex = RenderState::GetPointSamplerState().hex;
|
||||||
|
|
||||||
s_gx_state.zmode.testenable = false;
|
m_gx_state.zmode.testenable = false;
|
||||||
s_gx_state.zmode.updateenable = false;
|
m_gx_state.zmode.updateenable = false;
|
||||||
s_gx_state.zmode.func = ZMode::NEVER;
|
m_gx_state.zmode.func = ZMode::NEVER;
|
||||||
s_gx_state.raster.cullmode = GenMode::CULL_NONE;
|
m_gx_state.raster.cullmode = GenMode::CULL_NONE;
|
||||||
|
|
||||||
// Clear EFB textures
|
// Clear EFB textures
|
||||||
constexpr std::array<float, 4> clear_color{{0.f, 0.f, 0.f, 1.f}};
|
constexpr std::array<float, 4> clear_color{{0.f, 0.f, 0.f, 1.f}};
|
||||||
@ -600,7 +587,7 @@ void Renderer::ReinterpretPixelData(unsigned int convtype)
|
|||||||
|
|
||||||
void Renderer::SetBlendingState(const BlendingState& state)
|
void Renderer::SetBlendingState(const BlendingState& state)
|
||||||
{
|
{
|
||||||
s_gx_state.blend.hex = state.hex;
|
m_gx_state.blend.hex = state.hex;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function has the final picture. We adjust the aspect ratio here.
|
// This function has the final picture. We adjust the aspect ratio here.
|
||||||
@ -719,15 +706,15 @@ void Renderer::RestoreAPIState()
|
|||||||
|
|
||||||
void Renderer::ApplyState()
|
void Renderer::ApplyState()
|
||||||
{
|
{
|
||||||
D3D::stateman->PushBlendState(s_gx_state_cache.Get(s_gx_state.blend));
|
D3D::stateman->PushBlendState(m_state_cache.Get(m_gx_state.blend));
|
||||||
D3D::stateman->PushDepthState(s_gx_state_cache.Get(s_gx_state.zmode));
|
D3D::stateman->PushDepthState(m_state_cache.Get(m_gx_state.zmode));
|
||||||
D3D::stateman->PushRasterizerState(s_gx_state_cache.Get(s_gx_state.raster));
|
D3D::stateman->PushRasterizerState(m_state_cache.Get(m_gx_state.raster));
|
||||||
D3D::stateman->SetPrimitiveTopology(
|
D3D::stateman->SetPrimitiveTopology(
|
||||||
StateCache::GetPrimitiveTopology(s_gx_state.raster.primitive));
|
StateCache::GetPrimitiveTopology(m_gx_state.raster.primitive));
|
||||||
FramebufferManager::SetIntegerEFBRenderTarget(s_gx_state.blend.logicopenable);
|
FramebufferManager::SetIntegerEFBRenderTarget(m_gx_state.blend.logicopenable);
|
||||||
|
|
||||||
for (u32 stage = 0; stage < static_cast<u32>(s_gx_state.samplers.size()); stage++)
|
for (u32 stage = 0; stage < static_cast<u32>(m_gx_state.samplers.size()); stage++)
|
||||||
D3D::stateman->SetSampler(stage, s_gx_state_cache.Get(s_gx_state.samplers[stage]));
|
D3D::stateman->SetSampler(stage, m_state_cache.Get(m_gx_state.samplers[stage]));
|
||||||
|
|
||||||
ID3D11Buffer* vertexConstants = VertexShaderCache::GetConstantBuffer();
|
ID3D11Buffer* vertexConstants = VertexShaderCache::GetConstantBuffer();
|
||||||
|
|
||||||
@ -746,17 +733,17 @@ void Renderer::RestoreState()
|
|||||||
|
|
||||||
void Renderer::SetRasterizationState(const RasterizationState& state)
|
void Renderer::SetRasterizationState(const RasterizationState& state)
|
||||||
{
|
{
|
||||||
s_gx_state.raster.hex = state.hex;
|
m_gx_state.raster.hex = state.hex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::SetDepthState(const DepthState& state)
|
void Renderer::SetDepthState(const DepthState& state)
|
||||||
{
|
{
|
||||||
s_gx_state.zmode.hex = state.hex;
|
m_gx_state.zmode.hex = state.hex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::SetSamplerState(u32 index, const SamplerState& state)
|
void Renderer::SetSamplerState(u32 index, const SamplerState& state)
|
||||||
{
|
{
|
||||||
s_gx_state.samplers[index].hex = state.hex;
|
m_gx_state.samplers[index].hex = state.hex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::SetInterlacingMode()
|
void Renderer::SetInterlacingMode()
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "VideoBackends/D3D/D3DState.h"
|
||||||
#include "VideoCommon/RenderBase.h"
|
#include "VideoCommon/RenderBase.h"
|
||||||
|
|
||||||
enum class EFBAccessType;
|
enum class EFBAccessType;
|
||||||
@ -19,6 +20,7 @@ public:
|
|||||||
Renderer();
|
Renderer();
|
||||||
~Renderer() override;
|
~Renderer() override;
|
||||||
|
|
||||||
|
StateCache& GetStateCache() { return m_state_cache; }
|
||||||
void SetBlendingState(const BlendingState& state) override;
|
void SetBlendingState(const BlendingState& state) override;
|
||||||
void SetScissorRect(const EFBRectangle& rc) override;
|
void SetScissorRect(const EFBRectangle& rc) override;
|
||||||
void SetRasterizationState(const RasterizationState& state) override;
|
void SetRasterizationState(const RasterizationState& state) override;
|
||||||
@ -56,7 +58,18 @@ public:
|
|||||||
bool CheckForResize();
|
bool CheckForResize();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct GXPipelineState
|
||||||
|
{
|
||||||
|
std::array<SamplerState, 8> samplers;
|
||||||
|
BlendingState blend;
|
||||||
|
DepthState zmode;
|
||||||
|
RasterizationState raster;
|
||||||
|
};
|
||||||
|
|
||||||
void BlitScreen(TargetRectangle src, TargetRectangle dst, D3DTexture2D* src_texture,
|
void BlitScreen(TargetRectangle src, TargetRectangle dst, D3DTexture2D* src_texture,
|
||||||
u32 src_width, u32 src_height, float Gamma);
|
u32 src_width, u32 src_height, float Gamma);
|
||||||
|
|
||||||
|
StateCache m_state_cache;
|
||||||
|
GXPipelineState m_gx_state;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user