mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-22 22:00:39 -06:00
I think clean up DX11 code a bit. Used "smart" pointers to avoid need to manually AddRef/Release in many places. Eliminated the D3DBlob class (replaced with just D3D10CreateBlob). Eliminated some Init/Shutdown functions (moved stuff into ctors/dtors). This should not affect behavior at all, only code maintainability.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7421 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -19,9 +19,7 @@
|
||||
|
||||
#include <stack>
|
||||
|
||||
struct ID3D11BlendState;
|
||||
struct ID3D11DepthStencilState;
|
||||
struct ID3D11RasterizerState;
|
||||
#include "D3DUtil.h"
|
||||
|
||||
namespace DX11
|
||||
{
|
||||
@ -29,37 +27,35 @@ namespace DX11
|
||||
namespace D3D
|
||||
{
|
||||
|
||||
template<typename T> class AutoState
|
||||
{
|
||||
public:
|
||||
AutoState(const T* object);
|
||||
AutoState(const AutoState<T> &source);
|
||||
~AutoState();
|
||||
|
||||
const inline T* GetPtr() const { return state; }
|
||||
|
||||
private:
|
||||
const T* state;
|
||||
};
|
||||
|
||||
typedef AutoState<ID3D11BlendState> AutoBlendState;
|
||||
typedef AutoState<ID3D11DepthStencilState> AutoDepthStencilState;
|
||||
typedef AutoState<ID3D11RasterizerState> AutoRasterizerState;
|
||||
typedef SharedPtr<ID3D11BlendState> AutoBlendState;
|
||||
typedef SharedPtr<ID3D11DepthStencilState> AutoDepthStencilState;
|
||||
typedef SharedPtr<ID3D11RasterizerState> AutoRasterizerState;
|
||||
|
||||
class StateManager
|
||||
{
|
||||
public:
|
||||
StateManager();
|
||||
|
||||
// call any of these to change the affected states
|
||||
void PushBlendState(const ID3D11BlendState* state);
|
||||
void PushDepthState(const ID3D11DepthStencilState* state);
|
||||
void PushRasterizerState(const ID3D11RasterizerState* state);
|
||||
void PushBlendState(const AutoBlendState& state)
|
||||
{
|
||||
blendstates.push(state);
|
||||
}
|
||||
|
||||
void PushDepthState(ID3D11DepthStencilState* state)
|
||||
{
|
||||
state->AddRef();
|
||||
depthstates.push(AutoDepthStencilState::FromPtr(state));
|
||||
}
|
||||
|
||||
void PushRasterizerState(ID3D11RasterizerState* state)
|
||||
{
|
||||
state->AddRef();
|
||||
raststates.push(AutoRasterizerState::FromPtr(state));
|
||||
}
|
||||
|
||||
// call these after drawing
|
||||
void PopBlendState();
|
||||
void PopDepthState();
|
||||
void PopRasterizerState();
|
||||
void PopBlendState() { blendstates.pop(); }
|
||||
void PopDepthState() { depthstates.pop(); }
|
||||
void PopRasterizerState() { raststates.pop(); }
|
||||
|
||||
// call this before any drawing operation if states could have changed meanwhile
|
||||
void Apply();
|
||||
@ -68,12 +64,9 @@ private:
|
||||
std::stack<AutoBlendState> blendstates;
|
||||
std::stack<AutoDepthStencilState> depthstates;
|
||||
std::stack<AutoRasterizerState> raststates;
|
||||
ID3D11BlendState* cur_blendstate;
|
||||
ID3D11DepthStencilState* cur_depthstate;
|
||||
ID3D11RasterizerState* cur_raststate;
|
||||
};
|
||||
|
||||
extern StateManager* stateman;
|
||||
extern std::unique_ptr<StateManager> stateman;
|
||||
|
||||
} // namespace
|
||||
|
||||
|
Reference in New Issue
Block a user