diff --git a/Source/Core/Core/Src/PowerPC/CPUCoreBase.h b/Source/Core/Core/Src/PowerPC/CPUCoreBase.h
index efd8a29059..5163d2034b 100644
--- a/Source/Core/Core/Src/PowerPC/CPUCoreBase.h
+++ b/Source/Core/Core/Src/PowerPC/CPUCoreBase.h
@@ -1,32 +1,32 @@
-// Copyright (C) 2010 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#ifndef _CPUCOREBASE_H
-#define _CPUCOREBASE_H
-
-class CPUCoreBase
-{
-public:
- virtual void Init() = 0;
- virtual void Shutdown() = 0;
- virtual void ClearCache() = 0;
- virtual void Run() = 0;
- virtual void SingleStep() = 0;
- virtual const char *GetName() = 0;
-};
-
-#endif
+// Copyright (C) 2010 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#ifndef _CPUCOREBASE_H
+#define _CPUCOREBASE_H
+
+class CPUCoreBase
+{
+public:
+ virtual void Init() = 0;
+ virtual void Shutdown() = 0;
+ virtual void ClearCache() = 0;
+ virtual void Run() = 0;
+ virtual void SingleStep() = 0;
+ virtual const char *GetName() = 0;
+};
+
+#endif
diff --git a/Source/Core/VideoCommon/Src/VertexManagerBase.cpp b/Source/Core/VideoCommon/Src/VertexManagerBase.cpp
index 642978dcf5..2c1f3ce26b 100644
--- a/Source/Core/VideoCommon/Src/VertexManagerBase.cpp
+++ b/Source/Core/VideoCommon/Src/VertexManagerBase.cpp
@@ -1,158 +1,158 @@
-
-#include "Common.h"
-
-#include "Statistics.h"
-#include "OpcodeDecoding.h"
-#include "IndexGenerator.h"
-
-#include "VertexManagerBase.h"
-
-VertexManager *g_vertex_manager;
-
-u8 *VertexManager::s_pCurBufferPointer;
-u8 *VertexManager::s_pBaseBufferPointer;
-
-u8 *VertexManager::LocalVBuffer;
-u16 *VertexManager::TIBuffer;
-u16 *VertexManager::LIBuffer;
-u16 *VertexManager::PIBuffer;
-
-bool VertexManager::Flushed;
-
-VertexManager::VertexManager()
-{
- Flushed = false;
-
- LocalVBuffer = new u8[MAXVBUFFERSIZE];
- s_pCurBufferPointer = s_pBaseBufferPointer = LocalVBuffer;
-
- TIBuffer = new u16[MAXIBUFFERSIZE];
- LIBuffer = new u16[MAXIBUFFERSIZE];
- PIBuffer = new u16[MAXIBUFFERSIZE];
-
- IndexGenerator::Start(TIBuffer, LIBuffer, PIBuffer);
-}
-
-void VertexManager::ResetBuffer()
-{
- s_pCurBufferPointer = LocalVBuffer;
-}
-
-VertexManager::~VertexManager()
-{
- delete[] LocalVBuffer;
-
- delete[] TIBuffer;
- delete[] LIBuffer;
- delete[] PIBuffer;
-
- // TODO: necessary??
- ResetBuffer();
-}
-
-void VertexManager::AddIndices(int primitive, int numVertices)
-{
- //switch (primitive)
- //{
- //case GX_DRAW_QUADS: IndexGenerator::AddQuads(numVertices); break;
- //case GX_DRAW_TRIANGLES: IndexGenerator::AddList(numVertices); break;
- //case GX_DRAW_TRIANGLE_STRIP: IndexGenerator::AddStrip(numVertices); break;
- //case GX_DRAW_TRIANGLE_FAN: IndexGenerator::AddFan(numVertices); break;
- //case GX_DRAW_LINES: IndexGenerator::AddLineList(numVertices); break;
- //case GX_DRAW_LINE_STRIP: IndexGenerator::AddLineStrip(numVertices); break;
- //case GX_DRAW_POINTS: IndexGenerator::AddPoints(numVertices); break;
- //}
-
- static void (*const primitive_table[])(int) =
- {
- IndexGenerator::AddQuads,
- NULL,
- IndexGenerator::AddList,
- IndexGenerator::AddStrip,
- IndexGenerator::AddFan,
- IndexGenerator::AddLineList,
- IndexGenerator::AddLineStrip,
- IndexGenerator::AddPoints,
- };
-
- primitive_table[primitive](numVertices);
-}
-
-int VertexManager::GetRemainingSize()
-{
- return MAXVBUFFERSIZE - (int)(s_pCurBufferPointer - LocalVBuffer);
-}
-
-int VertexManager::GetRemainingVertices(int primitive)
-{
- switch (primitive)
- {
- case GX_DRAW_QUADS:
- case GX_DRAW_TRIANGLES:
- case GX_DRAW_TRIANGLE_STRIP:
- case GX_DRAW_TRIANGLE_FAN:
- return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen()) / 3;
- break;
-
- case GX_DRAW_LINES:
- case GX_DRAW_LINE_STRIP:
- return (MAXIBUFFERSIZE - IndexGenerator::GetLineindexLen()) / 2;
- break;
-
- case GX_DRAW_POINTS:
- return (MAXIBUFFERSIZE - IndexGenerator::GetPointindexLen());
- break;
-
- default:
- return 0;
- break;
- }
-}
-
-void VertexManager::AddVertices(int primitive, int numVertices)
-{
- if (numVertices <= 0)
- return;
-
- switch (primitive)
- {
- case GX_DRAW_QUADS:
- case GX_DRAW_TRIANGLES:
- case GX_DRAW_TRIANGLE_STRIP:
- case GX_DRAW_TRIANGLE_FAN:
- if (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen() < 3 * numVertices)
- Flush();
- break;
-
- case GX_DRAW_LINES:
- case GX_DRAW_LINE_STRIP:
- if (MAXIBUFFERSIZE - IndexGenerator::GetLineindexLen() < 2 * numVertices)
- Flush();
- break;
-
- case GX_DRAW_POINTS:
- if (MAXIBUFFERSIZE - IndexGenerator::GetPointindexLen() < numVertices)
- Flush();
- break;
-
- default:
- return;
- break;
- }
-
- if (Flushed)
- {
- IndexGenerator::Start(TIBuffer, LIBuffer, PIBuffer);
- Flushed = false;
- }
-
- ADDSTAT(stats.thisFrame.numPrims, numVertices);
- INCSTAT(stats.thisFrame.numPrimitiveJoins);
- AddIndices(primitive, numVertices);
-}
-
-// TODO: merge this func, (need to merge TextureCache)
-void VertexManager::Flush()
-{
- g_vertex_manager->vFlush();
-}
+
+#include "Common.h"
+
+#include "Statistics.h"
+#include "OpcodeDecoding.h"
+#include "IndexGenerator.h"
+
+#include "VertexManagerBase.h"
+
+VertexManager *g_vertex_manager;
+
+u8 *VertexManager::s_pCurBufferPointer;
+u8 *VertexManager::s_pBaseBufferPointer;
+
+u8 *VertexManager::LocalVBuffer;
+u16 *VertexManager::TIBuffer;
+u16 *VertexManager::LIBuffer;
+u16 *VertexManager::PIBuffer;
+
+bool VertexManager::Flushed;
+
+VertexManager::VertexManager()
+{
+ Flushed = false;
+
+ LocalVBuffer = new u8[MAXVBUFFERSIZE];
+ s_pCurBufferPointer = s_pBaseBufferPointer = LocalVBuffer;
+
+ TIBuffer = new u16[MAXIBUFFERSIZE];
+ LIBuffer = new u16[MAXIBUFFERSIZE];
+ PIBuffer = new u16[MAXIBUFFERSIZE];
+
+ IndexGenerator::Start(TIBuffer, LIBuffer, PIBuffer);
+}
+
+void VertexManager::ResetBuffer()
+{
+ s_pCurBufferPointer = LocalVBuffer;
+}
+
+VertexManager::~VertexManager()
+{
+ delete[] LocalVBuffer;
+
+ delete[] TIBuffer;
+ delete[] LIBuffer;
+ delete[] PIBuffer;
+
+ // TODO: necessary??
+ ResetBuffer();
+}
+
+void VertexManager::AddIndices(int primitive, int numVertices)
+{
+ //switch (primitive)
+ //{
+ //case GX_DRAW_QUADS: IndexGenerator::AddQuads(numVertices); break;
+ //case GX_DRAW_TRIANGLES: IndexGenerator::AddList(numVertices); break;
+ //case GX_DRAW_TRIANGLE_STRIP: IndexGenerator::AddStrip(numVertices); break;
+ //case GX_DRAW_TRIANGLE_FAN: IndexGenerator::AddFan(numVertices); break;
+ //case GX_DRAW_LINES: IndexGenerator::AddLineList(numVertices); break;
+ //case GX_DRAW_LINE_STRIP: IndexGenerator::AddLineStrip(numVertices); break;
+ //case GX_DRAW_POINTS: IndexGenerator::AddPoints(numVertices); break;
+ //}
+
+ static void (*const primitive_table[])(int) =
+ {
+ IndexGenerator::AddQuads,
+ NULL,
+ IndexGenerator::AddList,
+ IndexGenerator::AddStrip,
+ IndexGenerator::AddFan,
+ IndexGenerator::AddLineList,
+ IndexGenerator::AddLineStrip,
+ IndexGenerator::AddPoints,
+ };
+
+ primitive_table[primitive](numVertices);
+}
+
+int VertexManager::GetRemainingSize()
+{
+ return MAXVBUFFERSIZE - (int)(s_pCurBufferPointer - LocalVBuffer);
+}
+
+int VertexManager::GetRemainingVertices(int primitive)
+{
+ switch (primitive)
+ {
+ case GX_DRAW_QUADS:
+ case GX_DRAW_TRIANGLES:
+ case GX_DRAW_TRIANGLE_STRIP:
+ case GX_DRAW_TRIANGLE_FAN:
+ return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen()) / 3;
+ break;
+
+ case GX_DRAW_LINES:
+ case GX_DRAW_LINE_STRIP:
+ return (MAXIBUFFERSIZE - IndexGenerator::GetLineindexLen()) / 2;
+ break;
+
+ case GX_DRAW_POINTS:
+ return (MAXIBUFFERSIZE - IndexGenerator::GetPointindexLen());
+ break;
+
+ default:
+ return 0;
+ break;
+ }
+}
+
+void VertexManager::AddVertices(int primitive, int numVertices)
+{
+ if (numVertices <= 0)
+ return;
+
+ switch (primitive)
+ {
+ case GX_DRAW_QUADS:
+ case GX_DRAW_TRIANGLES:
+ case GX_DRAW_TRIANGLE_STRIP:
+ case GX_DRAW_TRIANGLE_FAN:
+ if (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen() < 3 * numVertices)
+ Flush();
+ break;
+
+ case GX_DRAW_LINES:
+ case GX_DRAW_LINE_STRIP:
+ if (MAXIBUFFERSIZE - IndexGenerator::GetLineindexLen() < 2 * numVertices)
+ Flush();
+ break;
+
+ case GX_DRAW_POINTS:
+ if (MAXIBUFFERSIZE - IndexGenerator::GetPointindexLen() < numVertices)
+ Flush();
+ break;
+
+ default:
+ return;
+ break;
+ }
+
+ if (Flushed)
+ {
+ IndexGenerator::Start(TIBuffer, LIBuffer, PIBuffer);
+ Flushed = false;
+ }
+
+ ADDSTAT(stats.thisFrame.numPrims, numVertices);
+ INCSTAT(stats.thisFrame.numPrimitiveJoins);
+ AddIndices(primitive, numVertices);
+}
+
+// TODO: merge this func, (need to merge TextureCache)
+void VertexManager::Flush()
+{
+ g_vertex_manager->vFlush();
+}
diff --git a/Source/Core/VideoCommon/Src/VertexManagerBase.h b/Source/Core/VideoCommon/Src/VertexManagerBase.h
index c73730d705..e1982e5d06 100644
--- a/Source/Core/VideoCommon/Src/VertexManagerBase.h
+++ b/Source/Core/VideoCommon/Src/VertexManagerBase.h
@@ -1,57 +1,57 @@
-
-#ifndef _VERTEXMANAGERBASE_H
-#define _VERTEXMANAGERBASE_H
-
-class VertexManager
-{
-public:
-
- enum
- {
- // values from OGL plugin
- //MAXVBUFFERSIZE = 0x1FFFF,
- //MAXIBUFFERSIZE = 0xFFFF,
-
- // values from DX9 plugin
- //MAXVBUFFERSIZE = 0x50000,
- //MAXIBUFFERSIZE = 0xFFFF,
-
- // values from DX11 plugin
- MAXVBUFFERSIZE = 0x50000,
- MAXIBUFFERSIZE = 0x10000,
- };
-
- VertexManager();
- virtual ~VertexManager(); // needs to be virtual for DX11's dtor
-
- static void AddVertices(int _primitive, int _numVertices);
-
- // TODO: protected?
- static u8 *s_pCurBufferPointer;
- static u8 *s_pBaseBufferPointer;
-
- static int GetRemainingSize();
- static int GetRemainingVertices(int primitive);
-
- static void Flush();
-
-protected:
- // TODO: make private after Flush() is merged
- static void ResetBuffer();
-
- static u8 *LocalVBuffer;
- static u16 *TIBuffer;
- static u16 *LIBuffer;
- static u16 *PIBuffer;
-
- static bool Flushed;
-
-private:
- static void AddIndices(int primitive, int numVertices);
- // temporary
- virtual void vFlush() = 0;
-};
-
-extern VertexManager *g_vertex_manager;
-
-#endif
+
+#ifndef _VERTEXMANAGERBASE_H
+#define _VERTEXMANAGERBASE_H
+
+class VertexManager
+{
+public:
+
+ enum
+ {
+ // values from OGL plugin
+ //MAXVBUFFERSIZE = 0x1FFFF,
+ //MAXIBUFFERSIZE = 0xFFFF,
+
+ // values from DX9 plugin
+ //MAXVBUFFERSIZE = 0x50000,
+ //MAXIBUFFERSIZE = 0xFFFF,
+
+ // values from DX11 plugin
+ MAXVBUFFERSIZE = 0x50000,
+ MAXIBUFFERSIZE = 0x10000,
+ };
+
+ VertexManager();
+ virtual ~VertexManager(); // needs to be virtual for DX11's dtor
+
+ static void AddVertices(int _primitive, int _numVertices);
+
+ // TODO: protected?
+ static u8 *s_pCurBufferPointer;
+ static u8 *s_pBaseBufferPointer;
+
+ static int GetRemainingSize();
+ static int GetRemainingVertices(int primitive);
+
+ static void Flush();
+
+protected:
+ // TODO: make private after Flush() is merged
+ static void ResetBuffer();
+
+ static u8 *LocalVBuffer;
+ static u16 *TIBuffer;
+ static u16 *LIBuffer;
+ static u16 *PIBuffer;
+
+ static bool Flushed;
+
+private:
+ static void AddIndices(int primitive, int numVertices);
+ // temporary
+ virtual void vFlush() = 0;
+};
+
+extern VertexManager *g_vertex_manager;
+
+#endif
diff --git a/Source/Plugins/Plugin_VideoMerge/Plugin_VideoMerge.vcproj b/Source/Plugins/Plugin_VideoMerge/Plugin_VideoMerge.vcproj
index ea965c71ce..96b9d3dd6f 100644
--- a/Source/Plugins/Plugin_VideoMerge/Plugin_VideoMerge.vcproj
+++ b/Source/Plugins/Plugin_VideoMerge/Plugin_VideoMerge.vcproj
@@ -1,808 +1,808 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/BPFunctions.cpp b/Source/Plugins/Plugin_VideoMerge/Src/BPFunctions.cpp
index 1c16a8d285..9092ccfba8 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/BPFunctions.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/BPFunctions.cpp
@@ -1,144 +1,144 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-// Common
-#include "Common.h"
-
-// VideoCommon
-#include "VideoConfig.h"
-#include "BPFunctions.h"
-#include "Renderer.h"
-#include "VertexShaderManager.h"
-#include "VertexManager.h"
-
-#include "Main.h"
-
-namespace BPFunctions
-{
-
-void FlushPipeline()
-{
- g_vertex_manager->Flush();
-}
-
-void SetGenerationMode(const BPCmd &bp)
-{
- g_renderer->SetGenerationMode();
-}
-
-void SetScissor(const BPCmd &bp)
-{
- g_renderer->SetScissorRect();
-}
-
-void SetLineWidth(const BPCmd &bp)
-{
- g_renderer->SetLineWidth();
-}
-
-void SetDepthMode(const BPCmd &bp)
-{
- g_renderer->SetDepthMode();
-}
-
-void SetBlendMode(const BPCmd &bp)
-{
- g_renderer->SetBlendMode(false);
-}
-
-void SetDitherMode(const BPCmd &bp)
-{
- g_renderer->SetDitherMode();
-}
-
-void SetLogicOpMode(const BPCmd &bp)
-{
- g_renderer->SetLogicOpMode();
-}
-
-void SetColorMask(const BPCmd &bp)
-{
- g_renderer->SetColorMask();
-}
-
-void CopyEFB(const BPCmd &bp, const EFBRectangle &rc, const u32 &address, const bool &fromZBuffer, const bool &isIntensityFmt, const u32 ©fmt, const int &scaleByHalf)
-{
- if (!g_ActiveConfig.bEFBCopyDisable)
- {
-// if (g_ActiveConfig.bCopyEFBToTexture)
-// {
- g_texture_cache->CopyRenderTargetToTexture(address, fromZBuffer, isIntensityFmt, copyfmt, !!scaleByHalf, rc);
-// }
-// else
-// {
-// PanicAlert("TODO: Implement EFB copying to RAM %s %d\n", __FILE__, __LINE__);
-// }
- }
-}
-
-void ClearScreen(const BPCmd &bp, const EFBRectangle &rc)
-{
- bool colorEnable = bpmem.blendmode.colorupdate;
- bool alphaEnable = (bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24 && bpmem.blendmode.alphaupdate);
- bool zEnable = bpmem.zmode.updateenable;
-
- if (colorEnable || alphaEnable || zEnable)
- {
- u32 color = (bpmem.clearcolorAR << 16) | bpmem.clearcolorGB;
- u32 z = bpmem.clearZValue;
-
- g_renderer->ClearScreen(rc, colorEnable, alphaEnable, zEnable, color, z);
- }
-}
-
-void RestoreRenderState(const BPCmd &bp)
-{
- g_renderer->RestoreAPIState();
-}
-
-bool GetConfig(const int &type)
-{
- switch (type)
- {
- case CONFIG_ISWII:
- return g_VideoInitialize.bWii;
- case CONFIG_DISABLEFOG:
- return g_ActiveConfig.bDisableFog;
- case CONFIG_SHOWEFBREGIONS:
- return false;
- default:
- PanicAlert("GetConfig Error: Unknown Config Type!");
- return false;
- }
-}
-
-u8 *GetPointer(const u32 &address)
-{
- return g_VideoInitialize.pGetMemoryPointer(address);
-}
-
-void SetTextureMode(const BPCmd &bp)
-{
- g_renderer->SetSamplerState(bp.address & 3, (bp.address & 0xE0) == 0xA0);
-}
-
-void SetInterlacingMode(const BPCmd &bp)
-{
- // TODO
-}
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+// Common
+#include "Common.h"
+
+// VideoCommon
+#include "VideoConfig.h"
+#include "BPFunctions.h"
+#include "Renderer.h"
+#include "VertexShaderManager.h"
+#include "VertexManager.h"
+
+#include "Main.h"
+
+namespace BPFunctions
+{
+
+void FlushPipeline()
+{
+ g_vertex_manager->Flush();
+}
+
+void SetGenerationMode(const BPCmd &bp)
+{
+ g_renderer->SetGenerationMode();
+}
+
+void SetScissor(const BPCmd &bp)
+{
+ g_renderer->SetScissorRect();
+}
+
+void SetLineWidth(const BPCmd &bp)
+{
+ g_renderer->SetLineWidth();
+}
+
+void SetDepthMode(const BPCmd &bp)
+{
+ g_renderer->SetDepthMode();
+}
+
+void SetBlendMode(const BPCmd &bp)
+{
+ g_renderer->SetBlendMode(false);
+}
+
+void SetDitherMode(const BPCmd &bp)
+{
+ g_renderer->SetDitherMode();
+}
+
+void SetLogicOpMode(const BPCmd &bp)
+{
+ g_renderer->SetLogicOpMode();
+}
+
+void SetColorMask(const BPCmd &bp)
+{
+ g_renderer->SetColorMask();
+}
+
+void CopyEFB(const BPCmd &bp, const EFBRectangle &rc, const u32 &address, const bool &fromZBuffer, const bool &isIntensityFmt, const u32 ©fmt, const int &scaleByHalf)
+{
+ if (!g_ActiveConfig.bEFBCopyDisable)
+ {
+// if (g_ActiveConfig.bCopyEFBToTexture)
+// {
+ g_texture_cache->CopyRenderTargetToTexture(address, fromZBuffer, isIntensityFmt, copyfmt, !!scaleByHalf, rc);
+// }
+// else
+// {
+// PanicAlert("TODO: Implement EFB copying to RAM %s %d\n", __FILE__, __LINE__);
+// }
+ }
+}
+
+void ClearScreen(const BPCmd &bp, const EFBRectangle &rc)
+{
+ bool colorEnable = bpmem.blendmode.colorupdate;
+ bool alphaEnable = (bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24 && bpmem.blendmode.alphaupdate);
+ bool zEnable = bpmem.zmode.updateenable;
+
+ if (colorEnable || alphaEnable || zEnable)
+ {
+ u32 color = (bpmem.clearcolorAR << 16) | bpmem.clearcolorGB;
+ u32 z = bpmem.clearZValue;
+
+ g_renderer->ClearScreen(rc, colorEnable, alphaEnable, zEnable, color, z);
+ }
+}
+
+void RestoreRenderState(const BPCmd &bp)
+{
+ g_renderer->RestoreAPIState();
+}
+
+bool GetConfig(const int &type)
+{
+ switch (type)
+ {
+ case CONFIG_ISWII:
+ return g_VideoInitialize.bWii;
+ case CONFIG_DISABLEFOG:
+ return g_ActiveConfig.bDisableFog;
+ case CONFIG_SHOWEFBREGIONS:
+ return false;
+ default:
+ PanicAlert("GetConfig Error: Unknown Config Type!");
+ return false;
+ }
+}
+
+u8 *GetPointer(const u32 &address)
+{
+ return g_VideoInitialize.pGetMemoryPointer(address);
+}
+
+void SetTextureMode(const BPCmd &bp)
+{
+ g_renderer->SetSamplerState(bp.address & 3, (bp.address & 0xE0) == 0xA0);
+}
+
+void SetInterlacingMode(const BPCmd &bp)
+{
+ // TODO
+}
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBase.cpp b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBase.cpp
index 4d83237ec4..6d56534a0b 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBase.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBase.cpp
@@ -1,338 +1,338 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-// Common
-#include "StringUtil.h"
-
-// VideoCommon
-#include "VideoConfig.h"
-#include "XFStructs.h"
-
-// DX11
-#include "DX11_D3DBase.h"
-#include "DX11_D3DTexture.h"
-#include "DX11_D3DShader.h"
-#include "DX11_Render.h"
-
-#include
-
-#pragma comment(lib, "dxguid.lib")
-#pragma comment(lib, "d3d11.lib")
-#pragma comment(lib, "dxgi.lib")
-
-namespace DX11
-{
-
-HINSTANCE hD3DXDll = NULL;
-D3DX11COMPILEFROMMEMORYTYPE PD3DX11CompileFromMemory = NULL;
-D3DX11FILTERTEXTURETYPE PD3DX11FilterTexture = NULL;
-D3DX11SAVETEXTURETOFILEATYPE PD3DX11SaveTextureToFileA = NULL;
-D3DX11SAVETEXTURETOFILEWTYPE PD3DX11SaveTextureToFileW = NULL;
-
-namespace D3D
-{
-
-ID3D11Device* device = NULL;
-ID3D11DeviceContext* context = NULL;
-IDXGISwapChain* swapchain = NULL;
-D3D_FEATURE_LEVEL featlevel;
-D3DTexture2D* backbuf = NULL;
-HWND hWnd;
-
-bool bgra_textures_supported;
-
-#define NUM_SUPPORTED_FEATURE_LEVELS 3
-const D3D_FEATURE_LEVEL supported_feature_levels[NUM_SUPPORTED_FEATURE_LEVELS] = {
- D3D_FEATURE_LEVEL_11_0,
- D3D_FEATURE_LEVEL_10_1,
- D3D_FEATURE_LEVEL_10_0
-};
-
-unsigned int xres, yres;
-
-bool bFrameInProgress = false;
-
-HRESULT Create(HWND wnd)
-{
- hWnd = wnd;
- HRESULT hr;
-
- RECT client;
- GetClientRect(hWnd, &client);
- xres = client.right - client.left;
- yres = client.bottom - client.top;
-
- // try to load D3DX11 first to check whether we have proper runtime support
- // try to use the dll the plugin was compiled against first - don't bother about debug runtimes
- hD3DXDll = LoadLibraryA(StringFromFormat("d3dx11_%d.dll", D3DX11_SDK_VERSION).c_str());
- if (!hD3DXDll)
- {
- // if that fails, use the dll which should be available in every SDK which officially supports DX11.
- hD3DXDll = LoadLibraryA("d3dx11_42.dll");
- if (!hD3DXDll)
- {
- MessageBoxA(NULL, "Failed to load d3dx11_42.dll, update your DX11 runtime, please", "Critical error", MB_OK | MB_ICONERROR);
- return E_FAIL;
- }
- else
- {
- NOTICE_LOG(VIDEO, "Successfully loaded d3dx11_42.dll. If you're having trouble, try updating your DX runtime first.");
- }
- }
- else
- {
- NOTICE_LOG(VIDEO, "Successfully loaded %s.", StringFromFormat("d3dx11_%d.dll", D3DX11_SDK_VERSION).c_str());
- }
-
- PD3DX11CompileFromMemory = (D3DX11COMPILEFROMMEMORYTYPE)GetProcAddress(hD3DXDll, "D3DX11CompileFromMemory");
- if (PD3DX11CompileFromMemory == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11CompileFromMemory!", "Critical error", MB_OK | MB_ICONERROR);
-
- PD3DX11FilterTexture = (D3DX11FILTERTEXTURETYPE)GetProcAddress(hD3DXDll, "D3DX11FilterTexture");
- if (PD3DX11FilterTexture == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11FilterTexture!", "Critical error", MB_OK | MB_ICONERROR);
-
- PD3DX11SaveTextureToFileA = (D3DX11SAVETEXTURETOFILEATYPE)GetProcAddress(hD3DXDll, "D3DX11SaveTextureToFileA");
- if (PD3DX11SaveTextureToFileA == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11SaveTextureToFileA!", "Critical error", MB_OK | MB_ICONERROR);
-
- PD3DX11SaveTextureToFileW = (D3DX11SAVETEXTURETOFILEWTYPE)GetProcAddress(hD3DXDll, "D3DX11SaveTextureToFileW");
- if (PD3DX11SaveTextureToFileW == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11SaveTextureToFileW!", "Critical error", MB_OK | MB_ICONERROR);
-
- // D3DX11 is fine, initialize D3D11
- IDXGIFactory* factory;
- IDXGIAdapter* adapter;
- IDXGIOutput* output;
- hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&factory);
- if (FAILED(hr)) MessageBox(wnd, _T("Failed to create IDXGIFactory object"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
-
- hr = factory->EnumAdapters(g_ActiveConfig.iAdapter, &adapter);
- if (FAILED(hr))
- {
- // try using the first one
- hr = factory->EnumAdapters(0, &adapter);
- if (FAILED(hr)) MessageBox(wnd, _T("Failed to enumerate adapters"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
- }
-
- // TODO: Make this configurable
- hr = adapter->EnumOutputs(0, &output);
- if (FAILED(hr))
- {
- // try using the first one
- hr = adapter->EnumOutputs(0, &output);
- if (FAILED(hr)) MessageBox(wnd, _T("Failed to enumerate outputs"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
- }
-
- // this will need to be changed once multisampling gets implemented
- DXGI_SWAP_CHAIN_DESC swap_chain_desc;
- memset(&swap_chain_desc, 0, sizeof(swap_chain_desc));
- swap_chain_desc.BufferCount = 1;
- swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
- swap_chain_desc.OutputWindow = wnd;
- swap_chain_desc.SampleDesc.Count = 1;
- swap_chain_desc.SampleDesc.Quality = 0;
- swap_chain_desc.Windowed = TRUE;
-
- DXGI_MODE_DESC mode_desc;
- memset(&mode_desc, 0, sizeof(mode_desc));
- mode_desc.Width = xres;
- mode_desc.Height = yres;
- mode_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- mode_desc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
- hr = output->FindClosestMatchingMode(&mode_desc, &swap_chain_desc.BufferDesc, NULL);
- if (FAILED(hr))
- MessageBox(wnd, _T("Failed to find a supported video mode"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
-
- // forcing buffer resolution to xres and yres.. TODO: The new video mode might not actually be supported!
- swap_chain_desc.BufferDesc.Width = xres;
- swap_chain_desc.BufferDesc.Height = yres;
-
-#if defined(_DEBUG) || defined(DEBUGFAST)
- D3D11_CREATE_DEVICE_FLAG device_flags = (D3D11_CREATE_DEVICE_FLAG)(D3D11_CREATE_DEVICE_DEBUG|D3D11_CREATE_DEVICE_SINGLETHREADED);
-#else
- D3D11_CREATE_DEVICE_FLAG device_flags = D3D11_CREATE_DEVICE_SINGLETHREADED;
-#endif
- hr = D3D11CreateDeviceAndSwapChain(adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, device_flags,
- supported_feature_levels, NUM_SUPPORTED_FEATURE_LEVELS,
- D3D11_SDK_VERSION, &swap_chain_desc, &swapchain, &device,
- &featlevel, &context);
- if (FAILED(hr) || !device || !context || !swapchain)
- {
- MessageBox(wnd, _T("Failed to initialize Direct3D.\nMake sure your video card supports at least D3D 10.0"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
- SAFE_RELEASE(device);
- SAFE_RELEASE(context);
- SAFE_RELEASE(swapchain);
- return E_FAIL;
- }
- SetDebugObjectName((ID3D11DeviceChild*)context, "device context");
- SAFE_RELEASE(factory);
- SAFE_RELEASE(output);
- SAFE_RELEASE(adapter);
-
- ID3D11Texture2D* buf;
- hr = swapchain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&buf);
- if (FAILED(hr))
- {
- MessageBox(wnd, _T("Failed to get swapchain buffer"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
- SAFE_RELEASE(device);
- SAFE_RELEASE(context);
- SAFE_RELEASE(swapchain);
- return E_FAIL;
- }
- backbuf = new D3DTexture2D(buf, D3D11_BIND_RENDER_TARGET);
- SAFE_RELEASE(buf);
- CHECK(backbuf!=NULL, "Create back buffer texture");
- SetDebugObjectName((ID3D11DeviceChild*)backbuf->GetTex(), "backbuffer texture");
- SetDebugObjectName((ID3D11DeviceChild*)backbuf->GetRTV(), "backbuffer render target view");
-
- context->OMSetRenderTargets(1, &backbuf->GetRTV(), NULL);
-
- // BGRA textures are easier to deal with in TextureCache, but might not be supported by the hardware
- UINT format_support;
- device->CheckFormatSupport(DXGI_FORMAT_B8G8R8A8_UNORM, &format_support);
- bgra_textures_supported = (format_support & D3D11_FORMAT_SUPPORT_TEXTURE2D) != 0;
-
- gfxstate = new EmuGfxState;
- stateman = new StateManager;
- return S_OK;
-}
-
-void Close()
-{
- // unload D3DX11
- FreeLibrary(hD3DXDll);
- PD3DX11FilterTexture = NULL;
- PD3DX11SaveTextureToFileA = NULL;
- PD3DX11SaveTextureToFileW = NULL;
-
- // release all bound resources
- context->ClearState();
- SAFE_RELEASE(backbuf);
- SAFE_RELEASE(swapchain);
- SAFE_DELETE(gfxstate);
- SAFE_DELETE(stateman);
- context->Flush(); // immediately destroy device objects
-
- SAFE_RELEASE(context);
- ULONG references = device->Release();
- if (references)
- {
- ERROR_LOG(VIDEO, "Unreleased references: %i.", references);
- }
- else
- {
- NOTICE_LOG(VIDEO, "Successfully released all device references!");
- }
- device = NULL;
-}
-
-/* just returning the 4_0 ones here */
-const char* VertexShaderVersionString() { return "vs_4_0"; }
-const char* PixelShaderVersionString() { return "ps_4_0"; }
-
-D3DTexture2D* &GetBackBuffer() { return backbuf; }
-unsigned int GetBackBufferWidth() { return xres; }
-unsigned int GetBackBufferHeight() { return yres; }
-
-bool BGRATexturesSupported() { return bgra_textures_supported; }
-
-// Returns the maximum width/height of a texture. This value only depends upon the feature level in DX11
-unsigned int GetMaxTextureSize()
-{
- switch (featlevel)
- {
- case D3D_FEATURE_LEVEL_11_0:
- return 16384;
- break;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return 8192;
- break;
-
- case D3D_FEATURE_LEVEL_9_3:
- return 4096;
- break;
-
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 2048;
- break;
-
- default:
- return 0;
- break;
- }
-}
-
-void Reset()
-{
- // release all back buffer references
- SAFE_RELEASE(backbuf);
-
- // resize swapchain buffers
- RECT client;
- GetClientRect(hWnd, &client);
- xres = client.right - client.left;
- yres = client.bottom - client.top;
- D3D::swapchain->ResizeBuffers(1, xres, yres, DXGI_FORMAT_R8G8B8A8_UNORM, 0);
-
- // recreate back buffer texture
- ID3D11Texture2D* buf;
- HRESULT hr = swapchain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&buf);
- if (FAILED(hr))
- {
- MessageBox(hWnd, _T("Failed to get swapchain buffer"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
- SAFE_RELEASE(device);
- SAFE_RELEASE(context);
- SAFE_RELEASE(swapchain);
- return;
- }
- backbuf = new D3DTexture2D(buf, D3D11_BIND_RENDER_TARGET);
- SAFE_RELEASE(buf);
- CHECK(backbuf!=NULL, "Create back buffer texture");
- SetDebugObjectName((ID3D11DeviceChild*)backbuf->GetTex(), "backbuffer texture");
- SetDebugObjectName((ID3D11DeviceChild*)backbuf->GetRTV(), "backbuffer render target view");
-}
-
-bool BeginFrame()
-{
- if (bFrameInProgress)
- {
- PanicAlert("BeginFrame called although a frame is already in progress");
- return false;
- }
- bFrameInProgress = true;
- return (device != NULL);
-}
-
-void EndFrame()
-{
- if (!bFrameInProgress)
- {
- PanicAlert("EndFrame called although no frame is in progress");
- return;
- }
- bFrameInProgress = false;
-}
-
-void Present()
-{
- // TODO: Is 1 the correct value for vsyncing?
- swapchain->Present((UINT)g_ActiveConfig.bVSync, 0);
-}
-
-} // namespace
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+// Common
+#include "StringUtil.h"
+
+// VideoCommon
+#include "VideoConfig.h"
+#include "XFStructs.h"
+
+// DX11
+#include "DX11_D3DBase.h"
+#include "DX11_D3DTexture.h"
+#include "DX11_D3DShader.h"
+#include "DX11_Render.h"
+
+#include
+
+#pragma comment(lib, "dxguid.lib")
+#pragma comment(lib, "d3d11.lib")
+#pragma comment(lib, "dxgi.lib")
+
+namespace DX11
+{
+
+HINSTANCE hD3DXDll = NULL;
+D3DX11COMPILEFROMMEMORYTYPE PD3DX11CompileFromMemory = NULL;
+D3DX11FILTERTEXTURETYPE PD3DX11FilterTexture = NULL;
+D3DX11SAVETEXTURETOFILEATYPE PD3DX11SaveTextureToFileA = NULL;
+D3DX11SAVETEXTURETOFILEWTYPE PD3DX11SaveTextureToFileW = NULL;
+
+namespace D3D
+{
+
+ID3D11Device* device = NULL;
+ID3D11DeviceContext* context = NULL;
+IDXGISwapChain* swapchain = NULL;
+D3D_FEATURE_LEVEL featlevel;
+D3DTexture2D* backbuf = NULL;
+HWND hWnd;
+
+bool bgra_textures_supported;
+
+#define NUM_SUPPORTED_FEATURE_LEVELS 3
+const D3D_FEATURE_LEVEL supported_feature_levels[NUM_SUPPORTED_FEATURE_LEVELS] = {
+ D3D_FEATURE_LEVEL_11_0,
+ D3D_FEATURE_LEVEL_10_1,
+ D3D_FEATURE_LEVEL_10_0
+};
+
+unsigned int xres, yres;
+
+bool bFrameInProgress = false;
+
+HRESULT Create(HWND wnd)
+{
+ hWnd = wnd;
+ HRESULT hr;
+
+ RECT client;
+ GetClientRect(hWnd, &client);
+ xres = client.right - client.left;
+ yres = client.bottom - client.top;
+
+ // try to load D3DX11 first to check whether we have proper runtime support
+ // try to use the dll the plugin was compiled against first - don't bother about debug runtimes
+ hD3DXDll = LoadLibraryA(StringFromFormat("d3dx11_%d.dll", D3DX11_SDK_VERSION).c_str());
+ if (!hD3DXDll)
+ {
+ // if that fails, use the dll which should be available in every SDK which officially supports DX11.
+ hD3DXDll = LoadLibraryA("d3dx11_42.dll");
+ if (!hD3DXDll)
+ {
+ MessageBoxA(NULL, "Failed to load d3dx11_42.dll, update your DX11 runtime, please", "Critical error", MB_OK | MB_ICONERROR);
+ return E_FAIL;
+ }
+ else
+ {
+ NOTICE_LOG(VIDEO, "Successfully loaded d3dx11_42.dll. If you're having trouble, try updating your DX runtime first.");
+ }
+ }
+ else
+ {
+ NOTICE_LOG(VIDEO, "Successfully loaded %s.", StringFromFormat("d3dx11_%d.dll", D3DX11_SDK_VERSION).c_str());
+ }
+
+ PD3DX11CompileFromMemory = (D3DX11COMPILEFROMMEMORYTYPE)GetProcAddress(hD3DXDll, "D3DX11CompileFromMemory");
+ if (PD3DX11CompileFromMemory == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11CompileFromMemory!", "Critical error", MB_OK | MB_ICONERROR);
+
+ PD3DX11FilterTexture = (D3DX11FILTERTEXTURETYPE)GetProcAddress(hD3DXDll, "D3DX11FilterTexture");
+ if (PD3DX11FilterTexture == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11FilterTexture!", "Critical error", MB_OK | MB_ICONERROR);
+
+ PD3DX11SaveTextureToFileA = (D3DX11SAVETEXTURETOFILEATYPE)GetProcAddress(hD3DXDll, "D3DX11SaveTextureToFileA");
+ if (PD3DX11SaveTextureToFileA == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11SaveTextureToFileA!", "Critical error", MB_OK | MB_ICONERROR);
+
+ PD3DX11SaveTextureToFileW = (D3DX11SAVETEXTURETOFILEWTYPE)GetProcAddress(hD3DXDll, "D3DX11SaveTextureToFileW");
+ if (PD3DX11SaveTextureToFileW == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11SaveTextureToFileW!", "Critical error", MB_OK | MB_ICONERROR);
+
+ // D3DX11 is fine, initialize D3D11
+ IDXGIFactory* factory;
+ IDXGIAdapter* adapter;
+ IDXGIOutput* output;
+ hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&factory);
+ if (FAILED(hr)) MessageBox(wnd, _T("Failed to create IDXGIFactory object"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
+
+ hr = factory->EnumAdapters(g_ActiveConfig.iAdapter, &adapter);
+ if (FAILED(hr))
+ {
+ // try using the first one
+ hr = factory->EnumAdapters(0, &adapter);
+ if (FAILED(hr)) MessageBox(wnd, _T("Failed to enumerate adapters"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
+ }
+
+ // TODO: Make this configurable
+ hr = adapter->EnumOutputs(0, &output);
+ if (FAILED(hr))
+ {
+ // try using the first one
+ hr = adapter->EnumOutputs(0, &output);
+ if (FAILED(hr)) MessageBox(wnd, _T("Failed to enumerate outputs"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
+ }
+
+ // this will need to be changed once multisampling gets implemented
+ DXGI_SWAP_CHAIN_DESC swap_chain_desc;
+ memset(&swap_chain_desc, 0, sizeof(swap_chain_desc));
+ swap_chain_desc.BufferCount = 1;
+ swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ swap_chain_desc.OutputWindow = wnd;
+ swap_chain_desc.SampleDesc.Count = 1;
+ swap_chain_desc.SampleDesc.Quality = 0;
+ swap_chain_desc.Windowed = TRUE;
+
+ DXGI_MODE_DESC mode_desc;
+ memset(&mode_desc, 0, sizeof(mode_desc));
+ mode_desc.Width = xres;
+ mode_desc.Height = yres;
+ mode_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ mode_desc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
+ hr = output->FindClosestMatchingMode(&mode_desc, &swap_chain_desc.BufferDesc, NULL);
+ if (FAILED(hr))
+ MessageBox(wnd, _T("Failed to find a supported video mode"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
+
+ // forcing buffer resolution to xres and yres.. TODO: The new video mode might not actually be supported!
+ swap_chain_desc.BufferDesc.Width = xres;
+ swap_chain_desc.BufferDesc.Height = yres;
+
+#if defined(_DEBUG) || defined(DEBUGFAST)
+ D3D11_CREATE_DEVICE_FLAG device_flags = (D3D11_CREATE_DEVICE_FLAG)(D3D11_CREATE_DEVICE_DEBUG|D3D11_CREATE_DEVICE_SINGLETHREADED);
+#else
+ D3D11_CREATE_DEVICE_FLAG device_flags = D3D11_CREATE_DEVICE_SINGLETHREADED;
+#endif
+ hr = D3D11CreateDeviceAndSwapChain(adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, device_flags,
+ supported_feature_levels, NUM_SUPPORTED_FEATURE_LEVELS,
+ D3D11_SDK_VERSION, &swap_chain_desc, &swapchain, &device,
+ &featlevel, &context);
+ if (FAILED(hr) || !device || !context || !swapchain)
+ {
+ MessageBox(wnd, _T("Failed to initialize Direct3D.\nMake sure your video card supports at least D3D 10.0"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
+ SAFE_RELEASE(device);
+ SAFE_RELEASE(context);
+ SAFE_RELEASE(swapchain);
+ return E_FAIL;
+ }
+ SetDebugObjectName((ID3D11DeviceChild*)context, "device context");
+ SAFE_RELEASE(factory);
+ SAFE_RELEASE(output);
+ SAFE_RELEASE(adapter);
+
+ ID3D11Texture2D* buf;
+ hr = swapchain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&buf);
+ if (FAILED(hr))
+ {
+ MessageBox(wnd, _T("Failed to get swapchain buffer"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
+ SAFE_RELEASE(device);
+ SAFE_RELEASE(context);
+ SAFE_RELEASE(swapchain);
+ return E_FAIL;
+ }
+ backbuf = new D3DTexture2D(buf, D3D11_BIND_RENDER_TARGET);
+ SAFE_RELEASE(buf);
+ CHECK(backbuf!=NULL, "Create back buffer texture");
+ SetDebugObjectName((ID3D11DeviceChild*)backbuf->GetTex(), "backbuffer texture");
+ SetDebugObjectName((ID3D11DeviceChild*)backbuf->GetRTV(), "backbuffer render target view");
+
+ context->OMSetRenderTargets(1, &backbuf->GetRTV(), NULL);
+
+ // BGRA textures are easier to deal with in TextureCache, but might not be supported by the hardware
+ UINT format_support;
+ device->CheckFormatSupport(DXGI_FORMAT_B8G8R8A8_UNORM, &format_support);
+ bgra_textures_supported = (format_support & D3D11_FORMAT_SUPPORT_TEXTURE2D) != 0;
+
+ gfxstate = new EmuGfxState;
+ stateman = new StateManager;
+ return S_OK;
+}
+
+void Close()
+{
+ // unload D3DX11
+ FreeLibrary(hD3DXDll);
+ PD3DX11FilterTexture = NULL;
+ PD3DX11SaveTextureToFileA = NULL;
+ PD3DX11SaveTextureToFileW = NULL;
+
+ // release all bound resources
+ context->ClearState();
+ SAFE_RELEASE(backbuf);
+ SAFE_RELEASE(swapchain);
+ SAFE_DELETE(gfxstate);
+ SAFE_DELETE(stateman);
+ context->Flush(); // immediately destroy device objects
+
+ SAFE_RELEASE(context);
+ ULONG references = device->Release();
+ if (references)
+ {
+ ERROR_LOG(VIDEO, "Unreleased references: %i.", references);
+ }
+ else
+ {
+ NOTICE_LOG(VIDEO, "Successfully released all device references!");
+ }
+ device = NULL;
+}
+
+/* just returning the 4_0 ones here */
+const char* VertexShaderVersionString() { return "vs_4_0"; }
+const char* PixelShaderVersionString() { return "ps_4_0"; }
+
+D3DTexture2D* &GetBackBuffer() { return backbuf; }
+unsigned int GetBackBufferWidth() { return xres; }
+unsigned int GetBackBufferHeight() { return yres; }
+
+bool BGRATexturesSupported() { return bgra_textures_supported; }
+
+// Returns the maximum width/height of a texture. This value only depends upon the feature level in DX11
+unsigned int GetMaxTextureSize()
+{
+ switch (featlevel)
+ {
+ case D3D_FEATURE_LEVEL_11_0:
+ return 16384;
+ break;
+
+ case D3D_FEATURE_LEVEL_10_1:
+ case D3D_FEATURE_LEVEL_10_0:
+ return 8192;
+ break;
+
+ case D3D_FEATURE_LEVEL_9_3:
+ return 4096;
+ break;
+
+ case D3D_FEATURE_LEVEL_9_2:
+ case D3D_FEATURE_LEVEL_9_1:
+ return 2048;
+ break;
+
+ default:
+ return 0;
+ break;
+ }
+}
+
+void Reset()
+{
+ // release all back buffer references
+ SAFE_RELEASE(backbuf);
+
+ // resize swapchain buffers
+ RECT client;
+ GetClientRect(hWnd, &client);
+ xres = client.right - client.left;
+ yres = client.bottom - client.top;
+ D3D::swapchain->ResizeBuffers(1, xres, yres, DXGI_FORMAT_R8G8B8A8_UNORM, 0);
+
+ // recreate back buffer texture
+ ID3D11Texture2D* buf;
+ HRESULT hr = swapchain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&buf);
+ if (FAILED(hr))
+ {
+ MessageBox(hWnd, _T("Failed to get swapchain buffer"), _T("Dolphin Direct3D 11 plugin"), MB_OK | MB_ICONERROR);
+ SAFE_RELEASE(device);
+ SAFE_RELEASE(context);
+ SAFE_RELEASE(swapchain);
+ return;
+ }
+ backbuf = new D3DTexture2D(buf, D3D11_BIND_RENDER_TARGET);
+ SAFE_RELEASE(buf);
+ CHECK(backbuf!=NULL, "Create back buffer texture");
+ SetDebugObjectName((ID3D11DeviceChild*)backbuf->GetTex(), "backbuffer texture");
+ SetDebugObjectName((ID3D11DeviceChild*)backbuf->GetRTV(), "backbuffer render target view");
+}
+
+bool BeginFrame()
+{
+ if (bFrameInProgress)
+ {
+ PanicAlert("BeginFrame called although a frame is already in progress");
+ return false;
+ }
+ bFrameInProgress = true;
+ return (device != NULL);
+}
+
+void EndFrame()
+{
+ if (!bFrameInProgress)
+ {
+ PanicAlert("EndFrame called although no frame is in progress");
+ return;
+ }
+ bFrameInProgress = false;
+}
+
+void Present()
+{
+ // TODO: Is 1 the correct value for vsyncing?
+ swapchain->Present((UINT)g_ActiveConfig.bVSync, 0);
+}
+
+} // namespace
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBase.h b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBase.h
index 8e86a55b8e..63587f89ac 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBase.h
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBase.h
@@ -1,96 +1,96 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#pragma once
-
-// Common
-#include "Common.h"
-
-// DX11
-#include
-#include "DX11_GfxState.h"
-#include "DX11_D3DBlob.h"
-
-namespace DX11
-{
-
-#define SAFE_RELEASE(x) { if (x) (x)->Release(); (x) = NULL; }
-#define SAFE_DELETE(x) { delete (x); (x) = NULL; }
-#define SAFE_DELETE_ARRAY(x) { delete[] (x); (x) = NULL; }
-#define CHECK(cond, Message, ...) if (!(cond)) { PanicAlert(__FUNCTION__ "Failed in %s at line %d: " Message, __FILE__, __LINE__, __VA_ARGS__); }
-
-class D3DTexture2D;
-namespace D3D
-{
-
-HRESULT Create(HWND wnd);
-void Close();
-
-extern ID3D11Device* device;
-extern ID3D11DeviceContext* context;
-extern IDXGISwapChain* swapchain;
-extern bool bFrameInProgress;
-
-void Reset();
-bool BeginFrame();
-void EndFrame();
-void Present();
-
-unsigned int GetBackBufferWidth();
-unsigned int GetBackBufferHeight();
-D3DTexture2D* &GetBackBuffer();
-const char* PixelShaderVersionString();
-const char* VertexShaderVersionString();
-bool BGRATexturesSupported();
-
-unsigned int GetMaxTextureSize();
-
-// Ihis function will assign a name to the given resource.
-// The DirectX debug layer will make it easier to identify resources that way,
-// e.g. when listing up all resources who have unreleased references.
-inline void SetDebugObjectName(ID3D11DeviceChild* resource, const char* name)
-{
-#if defined(_DEBUG) || defined(DEBUGFAST)
- resource->SetPrivateData( WKPDID_D3DDebugObjectName, (UINT)strlen(name), name);
-#endif
-}
-
-} // namespace
-
-
-// Used to not require the SDK and runtime versions to match:
-// Linking with d3dx11.lib makes the most recent d3dx11_xx.dll of the
-// compiler's SDK a requirement, but this plugin works with DX11 runtimes
-// back to August 2009 even if the plugin was built with June 2010.
-// Add any d3dx11 functions which you want to use here and load them in Create()
-typedef HRESULT (WINAPI* D3DX11COMPILEFROMMEMORYTYPE)(LPCSTR, SIZE_T, LPCSTR, const D3D10_SHADER_MACRO*, LPD3D10INCLUDE, LPCSTR, LPCSTR, UINT, UINT, ID3DX11ThreadPump*, ID3D10Blob**, ID3D10Blob**, HRESULT*);
-typedef HRESULT (WINAPI* D3DX11FILTERTEXTURETYPE)(ID3D11DeviceContext*, ID3D11Resource*, UINT, UINT);
-typedef HRESULT (WINAPI* D3DX11SAVETEXTURETOFILEATYPE)(ID3D11DeviceContext*, ID3D11Resource*, D3DX11_IMAGE_FILE_FORMAT, LPCSTR);
-typedef HRESULT (WINAPI* D3DX11SAVETEXTURETOFILEWTYPE)(ID3D11DeviceContext*, ID3D11Resource*, D3DX11_IMAGE_FILE_FORMAT, LPCWSTR);
-
-extern D3DX11COMPILEFROMMEMORYTYPE PD3DX11CompileFromMemory;
-extern D3DX11FILTERTEXTURETYPE PD3DX11FilterTexture;
-extern D3DX11SAVETEXTURETOFILEATYPE PD3DX11SaveTextureToFileA;
-extern D3DX11SAVETEXTURETOFILEWTYPE PD3DX11SaveTextureToFileW;
-
-#ifdef UNICODE
-#define PD3DX11SaveTextureToFile PD3DX11SaveTextureToFileW
-#else
-#define PD3DX11SaveTextureToFile PD3DX11SaveTextureToFileA
-#endif
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#pragma once
+
+// Common
+#include "Common.h"
+
+// DX11
+#include
+#include "DX11_GfxState.h"
+#include "DX11_D3DBlob.h"
+
+namespace DX11
+{
+
+#define SAFE_RELEASE(x) { if (x) (x)->Release(); (x) = NULL; }
+#define SAFE_DELETE(x) { delete (x); (x) = NULL; }
+#define SAFE_DELETE_ARRAY(x) { delete[] (x); (x) = NULL; }
+#define CHECK(cond, Message, ...) if (!(cond)) { PanicAlert(__FUNCTION__ "Failed in %s at line %d: " Message, __FILE__, __LINE__, __VA_ARGS__); }
+
+class D3DTexture2D;
+namespace D3D
+{
+
+HRESULT Create(HWND wnd);
+void Close();
+
+extern ID3D11Device* device;
+extern ID3D11DeviceContext* context;
+extern IDXGISwapChain* swapchain;
+extern bool bFrameInProgress;
+
+void Reset();
+bool BeginFrame();
+void EndFrame();
+void Present();
+
+unsigned int GetBackBufferWidth();
+unsigned int GetBackBufferHeight();
+D3DTexture2D* &GetBackBuffer();
+const char* PixelShaderVersionString();
+const char* VertexShaderVersionString();
+bool BGRATexturesSupported();
+
+unsigned int GetMaxTextureSize();
+
+// Ihis function will assign a name to the given resource.
+// The DirectX debug layer will make it easier to identify resources that way,
+// e.g. when listing up all resources who have unreleased references.
+inline void SetDebugObjectName(ID3D11DeviceChild* resource, const char* name)
+{
+#if defined(_DEBUG) || defined(DEBUGFAST)
+ resource->SetPrivateData( WKPDID_D3DDebugObjectName, (UINT)strlen(name), name);
+#endif
+}
+
+} // namespace
+
+
+// Used to not require the SDK and runtime versions to match:
+// Linking with d3dx11.lib makes the most recent d3dx11_xx.dll of the
+// compiler's SDK a requirement, but this plugin works with DX11 runtimes
+// back to August 2009 even if the plugin was built with June 2010.
+// Add any d3dx11 functions which you want to use here and load them in Create()
+typedef HRESULT (WINAPI* D3DX11COMPILEFROMMEMORYTYPE)(LPCSTR, SIZE_T, LPCSTR, const D3D10_SHADER_MACRO*, LPD3D10INCLUDE, LPCSTR, LPCSTR, UINT, UINT, ID3DX11ThreadPump*, ID3D10Blob**, ID3D10Blob**, HRESULT*);
+typedef HRESULT (WINAPI* D3DX11FILTERTEXTURETYPE)(ID3D11DeviceContext*, ID3D11Resource*, UINT, UINT);
+typedef HRESULT (WINAPI* D3DX11SAVETEXTURETOFILEATYPE)(ID3D11DeviceContext*, ID3D11Resource*, D3DX11_IMAGE_FILE_FORMAT, LPCSTR);
+typedef HRESULT (WINAPI* D3DX11SAVETEXTURETOFILEWTYPE)(ID3D11DeviceContext*, ID3D11Resource*, D3DX11_IMAGE_FILE_FORMAT, LPCWSTR);
+
+extern D3DX11COMPILEFROMMEMORYTYPE PD3DX11CompileFromMemory;
+extern D3DX11FILTERTEXTURETYPE PD3DX11FilterTexture;
+extern D3DX11SAVETEXTURETOFILEATYPE PD3DX11SaveTextureToFileA;
+extern D3DX11SAVETEXTURETOFILEWTYPE PD3DX11SaveTextureToFileW;
+
+#ifdef UNICODE
+#define PD3DX11SaveTextureToFile PD3DX11SaveTextureToFileW
+#else
+#define PD3DX11SaveTextureToFile PD3DX11SaveTextureToFileA
+#endif
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBlob.cpp b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBlob.cpp
index 553bb76435..2709248063 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBlob.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBlob.cpp
@@ -1,68 +1,68 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#include "DX11_D3DBlob.h"
-
-namespace DX11
-{
-
-D3DBlob::D3DBlob(unsigned int blob_size, const u8* init_data) : ref(1), size(blob_size), blob(NULL)
-{
- data = new u8[blob_size];
- if (init_data) memcpy(data, init_data, size);
-}
-
-D3DBlob::D3DBlob(ID3D10Blob* d3dblob) : ref(1)
-{
- blob = d3dblob;
- data = (u8*)blob->GetBufferPointer();
- size = blob->GetBufferSize();
- d3dblob->AddRef();
-}
-
-D3DBlob::~D3DBlob()
-{
- if (blob) blob->Release();
- else delete[] data;
-}
-
-void D3DBlob::AddRef()
-{
- ++ref;
-}
-
-unsigned int D3DBlob::Release()
-{
- if (--ref == 0)
- {
- delete this;
- return 0;
- }
- return ref;
-}
-
-unsigned int D3DBlob::Size()
-{
- return size;
-}
-
-u8* D3DBlob::Data()
-{
- return data;
-}
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include "DX11_D3DBlob.h"
+
+namespace DX11
+{
+
+D3DBlob::D3DBlob(unsigned int blob_size, const u8* init_data) : ref(1), size(blob_size), blob(NULL)
+{
+ data = new u8[blob_size];
+ if (init_data) memcpy(data, init_data, size);
+}
+
+D3DBlob::D3DBlob(ID3D10Blob* d3dblob) : ref(1)
+{
+ blob = d3dblob;
+ data = (u8*)blob->GetBufferPointer();
+ size = blob->GetBufferSize();
+ d3dblob->AddRef();
+}
+
+D3DBlob::~D3DBlob()
+{
+ if (blob) blob->Release();
+ else delete[] data;
+}
+
+void D3DBlob::AddRef()
+{
+ ++ref;
+}
+
+unsigned int D3DBlob::Release()
+{
+ if (--ref == 0)
+ {
+ delete this;
+ return 0;
+ }
+ return ref;
+}
+
+unsigned int D3DBlob::Size()
+{
+ return size;
+}
+
+u8* D3DBlob::Data()
+{
+ return data;
+}
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBlob.h b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBlob.h
index 01bbc38f17..1a559db83e 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBlob.h
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DBlob.h
@@ -1,52 +1,52 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#pragma once
-
-#include "Common.h"
-#include
-
-namespace DX11
-{
-
-// use this class instead ID3D10Blob or ID3D11Blob whenever possible
-class D3DBlob
-{
-public:
- // memory will be copied into an own buffer
- D3DBlob(unsigned int blob_size, const u8* init_data = NULL);
-
- // d3dblob will be AddRef'd
- D3DBlob(ID3D10Blob* d3dblob);
-
- void AddRef();
- unsigned int Release();
-
- unsigned int Size();
- u8* Data();
-
-private:
- ~D3DBlob();
-
- unsigned int ref;
- unsigned int size;
-
- u8* data;
- ID3D10Blob* blob;
-};
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#pragma once
+
+#include "Common.h"
+#include
+
+namespace DX11
+{
+
+// use this class instead ID3D10Blob or ID3D11Blob whenever possible
+class D3DBlob
+{
+public:
+ // memory will be copied into an own buffer
+ D3DBlob(unsigned int blob_size, const u8* init_data = NULL);
+
+ // d3dblob will be AddRef'd
+ D3DBlob(ID3D10Blob* d3dblob);
+
+ void AddRef();
+ unsigned int Release();
+
+ unsigned int Size();
+ u8* Data();
+
+private:
+ ~D3DBlob();
+
+ unsigned int ref;
+ unsigned int size;
+
+ u8* data;
+ ID3D10Blob* blob;
+};
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DShader.cpp b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DShader.cpp
index 9523ed72a6..c8ecf99d11 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DShader.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DShader.cpp
@@ -1,150 +1,150 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#include
-#include
-#include
-
-#include "VideoConfig.h"
-#include "DX11_D3DShader.h"
-
-namespace DX11
-{
-
-namespace D3D
-{
-
-// bytecode->shader
-ID3D11VertexShader* CreateVertexShaderFromByteCode(void* bytecode, unsigned int len)
-{
- ID3D11VertexShader* v_shader;
- HRESULT hr = D3D::device->CreateVertexShader(bytecode, len, NULL, &v_shader);
- if (FAILED(hr))
- {
- PanicAlert("CreateVertexShaderFromByteCode failed from %p (size %d) at %s %d\n", bytecode, len, __FILE__, __LINE__);
- v_shader = NULL;
- }
- return v_shader;
-}
-
-// code->bytecode
-bool CompileVertexShader(const char* code, unsigned int len, D3DBlob** blob)
-{
- ID3D10Blob* shaderBuffer = NULL;
- ID3D10Blob* errorBuffer = NULL;
-
-#if defined(_DEBUG) || defined(DEBUGFAST)
- UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY|D3D10_SHADER_DEBUG|D3D10_SHADER_WARNINGS_ARE_ERRORS;
-#else
- UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY|D3D10_SHADER_OPTIMIZATION_LEVEL3|D3D10_SHADER_SKIP_VALIDATION;
-#endif
- HRESULT hr = PD3DX11CompileFromMemory(code, len, NULL, NULL, NULL, "main", D3D::VertexShaderVersionString(),
- flags, 0, NULL, &shaderBuffer, &errorBuffer, NULL);
-
- if (FAILED(hr) || errorBuffer)
- {
- std::string msg = (char*)errorBuffer->GetBufferPointer();
- msg += "\n\n";
- msg += code;
- MessageBoxA(0, msg.c_str(), "Error compiling pixel shader", MB_ICONERROR);
-
- *blob = NULL;
- errorBuffer->Release();
- }
- else
- {
- *blob = new D3DBlob(shaderBuffer);
- shaderBuffer->Release();
- }
- return SUCCEEDED(hr);
-}
-
-// bytecode->shader
-ID3D11PixelShader* CreatePixelShaderFromByteCode(void* bytecode, unsigned int len)
-{
- ID3D11PixelShader* p_shader;
- HRESULT hr = D3D::device->CreatePixelShader(bytecode, len, NULL, &p_shader);
- if (FAILED(hr))
- {
- PanicAlert("CreatePixelShaderFromByteCode failed at %s %d\n", __FILE__, __LINE__);
- p_shader = NULL;
- }
- return p_shader;
-}
-
-// code->bytecode
-bool CompilePixelShader(const char* code, unsigned int len, D3DBlob** blob)
-{
- ID3D10Blob* shaderBuffer = NULL;
- ID3D10Blob* errorBuffer = NULL;
-
-#if defined(_DEBUG) || defined(DEBUGFAST)
- UINT flags = D3D10_SHADER_DEBUG|D3D10_SHADER_WARNINGS_ARE_ERRORS;
-#else
- UINT flags = D3D10_SHADER_OPTIMIZATION_LEVEL3;
-#endif
- HRESULT hr = PD3DX11CompileFromMemory(code, len, NULL, NULL, NULL, "main", D3D::PixelShaderVersionString(),
- flags, 0, NULL, &shaderBuffer, &errorBuffer, NULL);
-
- if (FAILED(hr) || errorBuffer)
- {
- std::string msg = (char*)errorBuffer->GetBufferPointer();
- msg += "\n\n";
- msg += code;
- MessageBoxA(0, msg.c_str(), "Error compiling pixel shader", MB_ICONERROR);
-
- *blob = NULL;
- errorBuffer->Release();
- }
- else
- {
- *blob = new D3DBlob(shaderBuffer);
- shaderBuffer->Release();
- }
- return SUCCEEDED(hr);
-}
-
-ID3D11VertexShader* CompileAndCreateVertexShader(const char* code, unsigned int len)
-{
- D3DBlob* blob = NULL;
- if (CompileVertexShader(code, len, &blob))
- {
- ID3D11VertexShader* v_shader = CreateVertexShaderFromByteCode(blob);
- blob->Release();
- return v_shader;
- }
- PanicAlert("Failed to compile and create vertex shader from %p (size %d) at %s %d\n", code, len, __FILE__, __LINE__);
- return NULL;
-}
-
-ID3D11PixelShader* CompileAndCreatePixelShader(const char* code, unsigned int len)
-{
- D3DBlob* blob = NULL;
- CompilePixelShader(code, len, &blob);
- if (blob)
- {
- ID3D11PixelShader* p_shader = CreatePixelShaderFromByteCode(blob);
- blob->Release();
- return p_shader;
- }
- PanicAlert("Failed to compile and create pixel shader, %s %d\n", __FILE__, __LINE__);
- return NULL;
-}
-
-} // namespace
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include
+#include
+#include
+
+#include "VideoConfig.h"
+#include "DX11_D3DShader.h"
+
+namespace DX11
+{
+
+namespace D3D
+{
+
+// bytecode->shader
+ID3D11VertexShader* CreateVertexShaderFromByteCode(void* bytecode, unsigned int len)
+{
+ ID3D11VertexShader* v_shader;
+ HRESULT hr = D3D::device->CreateVertexShader(bytecode, len, NULL, &v_shader);
+ if (FAILED(hr))
+ {
+ PanicAlert("CreateVertexShaderFromByteCode failed from %p (size %d) at %s %d\n", bytecode, len, __FILE__, __LINE__);
+ v_shader = NULL;
+ }
+ return v_shader;
+}
+
+// code->bytecode
+bool CompileVertexShader(const char* code, unsigned int len, D3DBlob** blob)
+{
+ ID3D10Blob* shaderBuffer = NULL;
+ ID3D10Blob* errorBuffer = NULL;
+
+#if defined(_DEBUG) || defined(DEBUGFAST)
+ UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY|D3D10_SHADER_DEBUG|D3D10_SHADER_WARNINGS_ARE_ERRORS;
+#else
+ UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY|D3D10_SHADER_OPTIMIZATION_LEVEL3|D3D10_SHADER_SKIP_VALIDATION;
+#endif
+ HRESULT hr = PD3DX11CompileFromMemory(code, len, NULL, NULL, NULL, "main", D3D::VertexShaderVersionString(),
+ flags, 0, NULL, &shaderBuffer, &errorBuffer, NULL);
+
+ if (FAILED(hr) || errorBuffer)
+ {
+ std::string msg = (char*)errorBuffer->GetBufferPointer();
+ msg += "\n\n";
+ msg += code;
+ MessageBoxA(0, msg.c_str(), "Error compiling pixel shader", MB_ICONERROR);
+
+ *blob = NULL;
+ errorBuffer->Release();
+ }
+ else
+ {
+ *blob = new D3DBlob(shaderBuffer);
+ shaderBuffer->Release();
+ }
+ return SUCCEEDED(hr);
+}
+
+// bytecode->shader
+ID3D11PixelShader* CreatePixelShaderFromByteCode(void* bytecode, unsigned int len)
+{
+ ID3D11PixelShader* p_shader;
+ HRESULT hr = D3D::device->CreatePixelShader(bytecode, len, NULL, &p_shader);
+ if (FAILED(hr))
+ {
+ PanicAlert("CreatePixelShaderFromByteCode failed at %s %d\n", __FILE__, __LINE__);
+ p_shader = NULL;
+ }
+ return p_shader;
+}
+
+// code->bytecode
+bool CompilePixelShader(const char* code, unsigned int len, D3DBlob** blob)
+{
+ ID3D10Blob* shaderBuffer = NULL;
+ ID3D10Blob* errorBuffer = NULL;
+
+#if defined(_DEBUG) || defined(DEBUGFAST)
+ UINT flags = D3D10_SHADER_DEBUG|D3D10_SHADER_WARNINGS_ARE_ERRORS;
+#else
+ UINT flags = D3D10_SHADER_OPTIMIZATION_LEVEL3;
+#endif
+ HRESULT hr = PD3DX11CompileFromMemory(code, len, NULL, NULL, NULL, "main", D3D::PixelShaderVersionString(),
+ flags, 0, NULL, &shaderBuffer, &errorBuffer, NULL);
+
+ if (FAILED(hr) || errorBuffer)
+ {
+ std::string msg = (char*)errorBuffer->GetBufferPointer();
+ msg += "\n\n";
+ msg += code;
+ MessageBoxA(0, msg.c_str(), "Error compiling pixel shader", MB_ICONERROR);
+
+ *blob = NULL;
+ errorBuffer->Release();
+ }
+ else
+ {
+ *blob = new D3DBlob(shaderBuffer);
+ shaderBuffer->Release();
+ }
+ return SUCCEEDED(hr);
+}
+
+ID3D11VertexShader* CompileAndCreateVertexShader(const char* code, unsigned int len)
+{
+ D3DBlob* blob = NULL;
+ if (CompileVertexShader(code, len, &blob))
+ {
+ ID3D11VertexShader* v_shader = CreateVertexShaderFromByteCode(blob);
+ blob->Release();
+ return v_shader;
+ }
+ PanicAlert("Failed to compile and create vertex shader from %p (size %d) at %s %d\n", code, len, __FILE__, __LINE__);
+ return NULL;
+}
+
+ID3D11PixelShader* CompileAndCreatePixelShader(const char* code, unsigned int len)
+{
+ D3DBlob* blob = NULL;
+ CompilePixelShader(code, len, &blob);
+ if (blob)
+ {
+ ID3D11PixelShader* p_shader = CreatePixelShaderFromByteCode(blob);
+ blob->Release();
+ return p_shader;
+ }
+ PanicAlert("Failed to compile and create pixel shader, %s %d\n", __FILE__, __LINE__);
+ return NULL;
+}
+
+} // namespace
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DShader.h b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DShader.h
index ee34c3a4a0..50b10126fd 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DShader.h
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DShader.h
@@ -1,44 +1,44 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#pragma once
-
-#include "DX11_D3DBase.h"
-
-namespace DX11
-{
-
-namespace D3D
-{
- ID3D11VertexShader* CreateVertexShaderFromByteCode(void* bytecode, unsigned int len);
- ID3D11PixelShader* CreatePixelShaderFromByteCode(void* bytecode, unsigned int len);
-
- // The returned bytecode buffers should be Release()d.
- bool CompileVertexShader(const char* code, unsigned int len, D3DBlob** blob);
- bool CompilePixelShader(const char* code, unsigned int len, D3DBlob** blob);
-
- // Utility functions
- ID3D11VertexShader* CompileAndCreateVertexShader(const char* code, unsigned int len);
- ID3D11PixelShader* CompileAndCreatePixelShader(const char* code, unsigned int len);
-
- inline ID3D11VertexShader* CreateVertexShaderFromByteCode(D3DBlob* bytecode) { return CreateVertexShaderFromByteCode(bytecode->Data(), bytecode->Size()); }
- inline ID3D11PixelShader* CreatePixelShaderFromByteCode(D3DBlob* bytecode) { return CreatePixelShaderFromByteCode(bytecode->Data(), bytecode->Size()); }
- inline ID3D11VertexShader* CompileAndCreateVertexShader(D3DBlob* code) { return CompileAndCreateVertexShader((const char*)code->Data(), code->Size()); }
- inline ID3D11PixelShader* CompileAndCreatePixelShader(D3DBlob* code) { return CompileAndCreatePixelShader((const char*)code->Data(), code->Size()); }
-}
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#pragma once
+
+#include "DX11_D3DBase.h"
+
+namespace DX11
+{
+
+namespace D3D
+{
+ ID3D11VertexShader* CreateVertexShaderFromByteCode(void* bytecode, unsigned int len);
+ ID3D11PixelShader* CreatePixelShaderFromByteCode(void* bytecode, unsigned int len);
+
+ // The returned bytecode buffers should be Release()d.
+ bool CompileVertexShader(const char* code, unsigned int len, D3DBlob** blob);
+ bool CompilePixelShader(const char* code, unsigned int len, D3DBlob** blob);
+
+ // Utility functions
+ ID3D11VertexShader* CompileAndCreateVertexShader(const char* code, unsigned int len);
+ ID3D11PixelShader* CompileAndCreatePixelShader(const char* code, unsigned int len);
+
+ inline ID3D11VertexShader* CreateVertexShaderFromByteCode(D3DBlob* bytecode) { return CreateVertexShaderFromByteCode(bytecode->Data(), bytecode->Size()); }
+ inline ID3D11PixelShader* CreatePixelShaderFromByteCode(D3DBlob* bytecode) { return CreatePixelShaderFromByteCode(bytecode->Data(), bytecode->Size()); }
+ inline ID3D11VertexShader* CompileAndCreateVertexShader(D3DBlob* code) { return CompileAndCreateVertexShader((const char*)code->Data(), code->Size()); }
+ inline ID3D11PixelShader* CompileAndCreatePixelShader(D3DBlob* code) { return CompileAndCreatePixelShader((const char*)code->Data(), code->Size()); }
+}
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DTexture.cpp b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DTexture.cpp
index 8fda3a23ea..408cf4ed2b 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DTexture.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DTexture.cpp
@@ -1,125 +1,125 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#include
-#include "DX11_D3DBase.h"
-#include "DX11_D3DTexture.h"
-
-namespace DX11
-{
-
-namespace D3D
-{
-
-void ReplaceRGBATexture2D(ID3D11Texture2D* pTexture, const u8* buffer, unsigned int width, unsigned int height, unsigned int pitch, unsigned int level, D3D11_USAGE usage)
-{
- if (usage == D3D11_USAGE_DYNAMIC)
- {
- D3D11_MAPPED_SUBRESOURCE map;
- HRESULT hr = D3D::context->Map(pTexture, level, D3D11_MAP_WRITE_DISCARD, 0, &map);
- CHECK(SUCCEEDED(hr), "ID3D11DeviceContext::Map failed! (%x)", hr);
- if (4 * pitch == map.RowPitch)
- {
- memcpy(map.pData, buffer, map.RowPitch * height);
- }
- else
- {
- for (unsigned int y = 0; y < height; ++y)
- memcpy((u8*)map.pData + y * map.RowPitch, (u32*)buffer + y * pitch, map.RowPitch);
- }
- D3D::context->Unmap(pTexture, level);
- }
- else
- {
- D3D11_BOX dest_region = CD3D11_BOX(0, 0, 0, width, height, 1);
- D3D::context->UpdateSubresource(pTexture, level, &dest_region, buffer, 4*pitch, 4*pitch*height);
- }
-}
-
-} // namespace
-
-D3DTexture2D* D3DTexture2D::Create(unsigned int width, unsigned int height, D3D11_BIND_FLAG bind, D3D11_USAGE usage, DXGI_FORMAT fmt, unsigned int levels)
-{
- ID3D11Texture2D* pTexture = NULL;
- HRESULT hr;
-
- D3D11_CPU_ACCESS_FLAG cpuflags;
- if (usage == D3D11_USAGE_STAGING)
- cpuflags = (D3D11_CPU_ACCESS_FLAG)((int)D3D11_CPU_ACCESS_WRITE|(int)D3D11_CPU_ACCESS_READ);
- else if (usage == D3D11_USAGE_DYNAMIC)
- cpuflags = D3D11_CPU_ACCESS_WRITE;
- else
- cpuflags = (D3D11_CPU_ACCESS_FLAG)0;
-
- D3D11_TEXTURE2D_DESC texdesc = CD3D11_TEXTURE2D_DESC(fmt, width, height, 1, levels, bind, usage, cpuflags);
- hr = D3D::device->CreateTexture2D(&texdesc, NULL, &pTexture);
- if (FAILED(hr))
- {
- PanicAlert("Failed to create texture at %s, line %d: hr=%#x\n", __FILE__, __LINE__, hr);
- return NULL;
- }
-
- D3DTexture2D* ret = new D3DTexture2D(pTexture, bind);
- SAFE_RELEASE(pTexture);
- return ret;
-}
-
-void D3DTexture2D::AddRef()
-{
- ++ref;
-}
-
-UINT D3DTexture2D::Release()
-{
- --ref;
- if (ref == 0)
- {
- delete this;
- return 0;
- }
- return ref;
-}
-
-D3DTexture2D::D3DTexture2D(ID3D11Texture2D* texptr, D3D11_BIND_FLAG bind,
- DXGI_FORMAT srv_format, DXGI_FORMAT dsv_format, DXGI_FORMAT rtv_format)
- : ref(1), tex(texptr), srv(NULL), rtv(NULL), dsv(NULL)
-{
- D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = CD3D11_SHADER_RESOURCE_VIEW_DESC(D3D11_SRV_DIMENSION_TEXTURE2D, srv_format);
- D3D11_DEPTH_STENCIL_VIEW_DESC dsv_desc = CD3D11_DEPTH_STENCIL_VIEW_DESC(D3D11_DSV_DIMENSION_TEXTURE2D, dsv_format);
- D3D11_RENDER_TARGET_VIEW_DESC rtv_desc = CD3D11_RENDER_TARGET_VIEW_DESC(D3D11_RTV_DIMENSION_TEXTURE2D, rtv_format);
-
- if (bind & D3D11_BIND_SHADER_RESOURCE)
- D3D::device->CreateShaderResourceView(tex, &srv_desc, &srv);
-
- if (bind & D3D11_BIND_RENDER_TARGET)
- D3D::device->CreateRenderTargetView(tex, &rtv_desc, &rtv);
-
- if (bind & D3D11_BIND_DEPTH_STENCIL)
- D3D::device->CreateDepthStencilView(tex, &dsv_desc, &dsv);
-
- tex->AddRef();
-}
-
-D3DTexture2D::~D3DTexture2D()
-{
- SAFE_RELEASE(srv);
- SAFE_RELEASE(rtv);
- SAFE_RELEASE(dsv);
- SAFE_RELEASE(tex);
-}
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include
+#include "DX11_D3DBase.h"
+#include "DX11_D3DTexture.h"
+
+namespace DX11
+{
+
+namespace D3D
+{
+
+void ReplaceRGBATexture2D(ID3D11Texture2D* pTexture, const u8* buffer, unsigned int width, unsigned int height, unsigned int pitch, unsigned int level, D3D11_USAGE usage)
+{
+ if (usage == D3D11_USAGE_DYNAMIC)
+ {
+ D3D11_MAPPED_SUBRESOURCE map;
+ HRESULT hr = D3D::context->Map(pTexture, level, D3D11_MAP_WRITE_DISCARD, 0, &map);
+ CHECK(SUCCEEDED(hr), "ID3D11DeviceContext::Map failed! (%x)", hr);
+ if (4 * pitch == map.RowPitch)
+ {
+ memcpy(map.pData, buffer, map.RowPitch * height);
+ }
+ else
+ {
+ for (unsigned int y = 0; y < height; ++y)
+ memcpy((u8*)map.pData + y * map.RowPitch, (u32*)buffer + y * pitch, map.RowPitch);
+ }
+ D3D::context->Unmap(pTexture, level);
+ }
+ else
+ {
+ D3D11_BOX dest_region = CD3D11_BOX(0, 0, 0, width, height, 1);
+ D3D::context->UpdateSubresource(pTexture, level, &dest_region, buffer, 4*pitch, 4*pitch*height);
+ }
+}
+
+} // namespace
+
+D3DTexture2D* D3DTexture2D::Create(unsigned int width, unsigned int height, D3D11_BIND_FLAG bind, D3D11_USAGE usage, DXGI_FORMAT fmt, unsigned int levels)
+{
+ ID3D11Texture2D* pTexture = NULL;
+ HRESULT hr;
+
+ D3D11_CPU_ACCESS_FLAG cpuflags;
+ if (usage == D3D11_USAGE_STAGING)
+ cpuflags = (D3D11_CPU_ACCESS_FLAG)((int)D3D11_CPU_ACCESS_WRITE|(int)D3D11_CPU_ACCESS_READ);
+ else if (usage == D3D11_USAGE_DYNAMIC)
+ cpuflags = D3D11_CPU_ACCESS_WRITE;
+ else
+ cpuflags = (D3D11_CPU_ACCESS_FLAG)0;
+
+ D3D11_TEXTURE2D_DESC texdesc = CD3D11_TEXTURE2D_DESC(fmt, width, height, 1, levels, bind, usage, cpuflags);
+ hr = D3D::device->CreateTexture2D(&texdesc, NULL, &pTexture);
+ if (FAILED(hr))
+ {
+ PanicAlert("Failed to create texture at %s, line %d: hr=%#x\n", __FILE__, __LINE__, hr);
+ return NULL;
+ }
+
+ D3DTexture2D* ret = new D3DTexture2D(pTexture, bind);
+ SAFE_RELEASE(pTexture);
+ return ret;
+}
+
+void D3DTexture2D::AddRef()
+{
+ ++ref;
+}
+
+UINT D3DTexture2D::Release()
+{
+ --ref;
+ if (ref == 0)
+ {
+ delete this;
+ return 0;
+ }
+ return ref;
+}
+
+D3DTexture2D::D3DTexture2D(ID3D11Texture2D* texptr, D3D11_BIND_FLAG bind,
+ DXGI_FORMAT srv_format, DXGI_FORMAT dsv_format, DXGI_FORMAT rtv_format)
+ : ref(1), tex(texptr), srv(NULL), rtv(NULL), dsv(NULL)
+{
+ D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = CD3D11_SHADER_RESOURCE_VIEW_DESC(D3D11_SRV_DIMENSION_TEXTURE2D, srv_format);
+ D3D11_DEPTH_STENCIL_VIEW_DESC dsv_desc = CD3D11_DEPTH_STENCIL_VIEW_DESC(D3D11_DSV_DIMENSION_TEXTURE2D, dsv_format);
+ D3D11_RENDER_TARGET_VIEW_DESC rtv_desc = CD3D11_RENDER_TARGET_VIEW_DESC(D3D11_RTV_DIMENSION_TEXTURE2D, rtv_format);
+
+ if (bind & D3D11_BIND_SHADER_RESOURCE)
+ D3D::device->CreateShaderResourceView(tex, &srv_desc, &srv);
+
+ if (bind & D3D11_BIND_RENDER_TARGET)
+ D3D::device->CreateRenderTargetView(tex, &rtv_desc, &rtv);
+
+ if (bind & D3D11_BIND_DEPTH_STENCIL)
+ D3D::device->CreateDepthStencilView(tex, &dsv_desc, &dsv);
+
+ tex->AddRef();
+}
+
+D3DTexture2D::~D3DTexture2D()
+{
+ SAFE_RELEASE(srv);
+ SAFE_RELEASE(rtv);
+ SAFE_RELEASE(dsv);
+ SAFE_RELEASE(tex);
+}
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DTexture.h b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DTexture.h
index 722848da2a..1b6166d2fb 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DTexture.h
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DTexture.h
@@ -1,60 +1,60 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#pragma once
-
-#include "DX11_D3DBase.h"
-
-namespace DX11
-{
-
-namespace D3D
-{
- void ReplaceRGBATexture2D(ID3D11Texture2D* pTexture, const u8* buffer, unsigned int width, unsigned int height, unsigned int pitch, unsigned int level, D3D11_USAGE usage);
-}
-
-class D3DTexture2D
-{
-public:
- // there are two ways to create a D3DTexture2D object:
- // either create an ID3D11Texture2D object, pass it to the constructor and specify what views to create
- // or let the texture automatically be created by D3DTexture2D::Create
-
- D3DTexture2D(ID3D11Texture2D* texptr, D3D11_BIND_FLAG bind, DXGI_FORMAT srv_format = DXGI_FORMAT_UNKNOWN, DXGI_FORMAT dsv_format = DXGI_FORMAT_UNKNOWN, DXGI_FORMAT rtv_format = DXGI_FORMAT_UNKNOWN);
- static D3DTexture2D* Create(unsigned int width, unsigned int height, D3D11_BIND_FLAG bind, D3D11_USAGE usage, DXGI_FORMAT, unsigned int levels = 1);
-
- // reference counting, use AddRef() when creating a new reference and Release() it when you don't need it anymore
- void AddRef();
- UINT Release();
-
- ID3D11Texture2D* &GetTex() { return tex; }
- ID3D11ShaderResourceView* &GetSRV() { return srv; }
- ID3D11RenderTargetView* &GetRTV() { return rtv; }
- ID3D11DepthStencilView* &GetDSV() { return dsv; }
-
-private:
- ~D3DTexture2D();
-
- ID3D11Texture2D* tex;
- ID3D11ShaderResourceView* srv;
- ID3D11RenderTargetView* rtv;
- ID3D11DepthStencilView* dsv;
- D3D11_BIND_FLAG bindflags;
- UINT ref;
-};
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#pragma once
+
+#include "DX11_D3DBase.h"
+
+namespace DX11
+{
+
+namespace D3D
+{
+ void ReplaceRGBATexture2D(ID3D11Texture2D* pTexture, const u8* buffer, unsigned int width, unsigned int height, unsigned int pitch, unsigned int level, D3D11_USAGE usage);
+}
+
+class D3DTexture2D
+{
+public:
+ // there are two ways to create a D3DTexture2D object:
+ // either create an ID3D11Texture2D object, pass it to the constructor and specify what views to create
+ // or let the texture automatically be created by D3DTexture2D::Create
+
+ D3DTexture2D(ID3D11Texture2D* texptr, D3D11_BIND_FLAG bind, DXGI_FORMAT srv_format = DXGI_FORMAT_UNKNOWN, DXGI_FORMAT dsv_format = DXGI_FORMAT_UNKNOWN, DXGI_FORMAT rtv_format = DXGI_FORMAT_UNKNOWN);
+ static D3DTexture2D* Create(unsigned int width, unsigned int height, D3D11_BIND_FLAG bind, D3D11_USAGE usage, DXGI_FORMAT, unsigned int levels = 1);
+
+ // reference counting, use AddRef() when creating a new reference and Release() it when you don't need it anymore
+ void AddRef();
+ UINT Release();
+
+ ID3D11Texture2D* &GetTex() { return tex; }
+ ID3D11ShaderResourceView* &GetSRV() { return srv; }
+ ID3D11RenderTargetView* &GetRTV() { return rtv; }
+ ID3D11DepthStencilView* &GetDSV() { return dsv; }
+
+private:
+ ~D3DTexture2D();
+
+ ID3D11Texture2D* tex;
+ ID3D11ShaderResourceView* srv;
+ ID3D11RenderTargetView* rtv;
+ ID3D11DepthStencilView* dsv;
+ D3D11_BIND_FLAG bindflags;
+ UINT ref;
+};
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DUtil.cpp b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DUtil.cpp
index 42987652e5..4a7afd6313 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DUtil.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DUtil.cpp
@@ -1,651 +1,651 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-// Common
-#include "Common.h"
-
-// DX11
-#include "DX11_Render.h"
-#include "DX11_D3DBase.h"
-#include "DX11_D3DUtil.h"
-#include "DX11_D3DTexture.h"
-#include "DX11_PixelShaderCache.h"
-#include "DX11_VertexShaderCache.h"
-#include "DX11_D3DShader.h"
-
-namespace DX11
-{
-
-namespace D3D
-{
-
-CD3DFont font;
-
-#define MAX_NUM_VERTICES 300
-struct FONT2DVERTEX {
- float x,y,z;
- float col[4];
- float tu, tv;
-};
-
-inline FONT2DVERTEX InitFont2DVertex(float x, float y, u32 color, float tu, float tv)
-{
- FONT2DVERTEX v; v.x=x; v.y=y; v.z=0; v.tu = tu; v.tv = tv;
- v.col[0] = ((float)((color >> 16) & 0xFF)) / 255.f;
- v.col[1] = ((float)((color >> 8) & 0xFF)) / 255.f;
- v.col[2] = ((float)((color >> 0) & 0xFF)) / 255.f;
- v.col[3] = ((float)((color >> 24) & 0xFF)) / 255.f;
- return v;
-}
-
-CD3DFont::CD3DFont() : m_dwTexWidth(512), m_dwTexHeight(512)
-{
- m_pTexture = NULL;
- m_pVB = NULL;
- m_InputLayout = NULL;
- m_pshader = NULL;
- m_vshader = NULL;
-}
-
-const char fontpixshader[] = {
- "Texture2D tex2D;\n"
- "SamplerState linearSampler\n"
- "{\n"
- " Filter = MIN_MAG_MIP_LINEAR;\n"
- " AddressU = D3D11_TEXTURE_ADDRESS_BORDER;\n"
- " AddressV = D3D11_TEXTURE_ADDRESS_BORDER;\n"
- " BorderColor = float4(0.f, 0.f, 0.f, 0.f);\n"
- "};\n"
- "struct PS_INPUT\n"
- "{\n"
- " float4 pos : SV_POSITION;\n"
- " float4 col : COLOR;\n"
- " float2 tex : TEXCOORD;\n"
- "};\n"
- "float4 main( PS_INPUT input ) : SV_Target\n"
- "{\n"
- " return tex2D.Sample( linearSampler, input.tex ) * input.col;\n"
- "};\n"
-};
-
-const char fontvertshader[] = {
- "struct VS_INPUT\n"
- "{\n"
- " float4 pos : POSITION;\n"
- " float4 col : COLOR;\n"
- " float2 tex : TEXCOORD;\n"
- "};\n"
- "struct PS_INPUT\n"
- "{\n"
- " float4 pos : SV_POSITION;\n"
- " float4 col : COLOR;\n"
- " float2 tex : TEXCOORD;\n"
- "};\n"
- "PS_INPUT main( VS_INPUT input )\n"
- "{\n"
- " PS_INPUT output;\n"
- " output.pos = input.pos;\n"
- " output.col = input.col;\n"
- " output.tex = input.tex;\n"
- " return output;\n"
- "};\n"
-};
-
-int CD3DFont::Init()
-{
- HRESULT hr;
-
- // prepare to create a bitmap
- unsigned int* pBitmapBits;
- BITMAPINFO bmi;
- ZeroMemory(&bmi.bmiHeader, sizeof(BITMAPINFOHEADER));
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biWidth = (int)m_dwTexWidth;
- bmi.bmiHeader.biHeight = -(int)m_dwTexHeight;
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biCompression = BI_RGB;
- bmi.bmiHeader.biBitCount = 32;
-
- // create a DC and a bitmap for the font
- HDC hDC = CreateCompatibleDC(NULL);
- HBITMAP hbmBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&pBitmapBits, NULL, 0);
- SetMapMode(hDC, MM_TEXT);
-
- // create a GDI font
- HFONT hFont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE,
- FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
- CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
- VARIABLE_PITCH, _T("Tahoma"));
- if (NULL == hFont) return E_FAIL;
-
- HGDIOBJ hOldbmBitmap = SelectObject(hDC, hbmBitmap);
- HGDIOBJ hOldFont = SelectObject(hDC, hFont);
-
- // set text properties
- SetTextColor(hDC, 0xFFFFFF);
- SetBkColor (hDC, 0);
- SetTextAlign(hDC, TA_TOP);
-
- TEXTMETRICW tm;
- GetTextMetricsW(hDC, &tm);
- m_LineHeight = tm.tmHeight;
-
- // loop through all printable characters and output them to the bitmap
- // meanwhile, keep track of the corresponding tex coords for each character.
- int x = 0, y = 0;
- char str[2] = "\0";
- for (int c = 0; c < 127 - 32; c++)
- {
- str[0] = c + 32;
- SIZE size;
- GetTextExtentPoint32A(hDC, str, 1, &size);
- if ((int)(x+size.cx+1) > m_dwTexWidth)
- {
- x = 0;
- y += m_LineHeight;
- }
-
- ExtTextOutA(hDC, x+1, y+0, ETO_OPAQUE | ETO_CLIPPED, NULL, str, 1, NULL);
- m_fTexCoords[c][0] = (float) x /m_dwTexWidth;
- m_fTexCoords[c][1] = (float) y /m_dwTexHeight;
- m_fTexCoords[c][2] = (float)(x+size.cx)/m_dwTexWidth;
- m_fTexCoords[c][3] = (float)(y+size.cy)/m_dwTexHeight;
-
- x += size.cx + 3; // 3 to work around annoying ij conflict (part of the j ends up with the i)
- }
-
- // create a new texture for the font
- // possible optimization: store the converted data in a buffer and fill the texture on creation.
- // That way, we can use a static texture
- ID3D11Texture2D* buftex;
- D3D11_TEXTURE2D_DESC texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8G8B8A8_UNORM, m_dwTexWidth, m_dwTexHeight,
- 1, 1, D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DYNAMIC,
- D3D11_CPU_ACCESS_WRITE);
- hr = device->CreateTexture2D(&texdesc, NULL, &buftex);
- if (FAILED(hr))
- {
- PanicAlert("Failed to create font texture");
- return hr;
- }
- D3D::SetDebugObjectName((ID3D11DeviceChild*)buftex, "texture of a CD3DFont object");
-
- // lock the surface and write the alpha values for the set pixels
- D3D11_MAPPED_SUBRESOURCE texmap;
- hr = context->Map(buftex, 0, D3D11_MAP_WRITE_DISCARD, 0, &texmap);
- if (FAILED(hr)) PanicAlert("Failed to map a texture at %s %d\n", __FILE__, __LINE__);
-
- for (y = 0; y < m_dwTexHeight; y++)
- {
- u32* pDst32 = (u32*)((u8*)texmap.pData + y * texmap.RowPitch);
- for (x = 0; x < m_dwTexWidth; x++)
- {
- const u8 bAlpha = (pBitmapBits[m_dwTexWidth * y + x] & 0xff);
- *pDst32++ = (((bAlpha << 4) | bAlpha) << 24) | 0xFFFFFF;
- }
- }
-
- // clean up
- context->Unmap(buftex, 0);
- hr = D3D::device->CreateShaderResourceView(buftex, NULL, &m_pTexture);
- if (FAILED(hr)) PanicAlert("Failed to create shader resource view at %s %d\n", __FILE__, __LINE__);
- SAFE_RELEASE(buftex);
-
- SelectObject(hDC, hOldbmBitmap);
- DeleteObject(hbmBitmap);
-
- SelectObject(hDC, hOldFont);
- DeleteObject(hFont);
-
- // setup device objects for drawing
- m_pshader = D3D::CompileAndCreatePixelShader(fontpixshader, sizeof(fontpixshader));
- if (m_pshader == NULL) PanicAlert("Failed to create pixel shader, %s %d\n", __FILE__, __LINE__);
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_pshader, "pixel shader of a CD3DFont object");
-
- D3DBlob* vsbytecode;
- D3D::CompileVertexShader(fontvertshader, sizeof(fontvertshader), &vsbytecode);
- if (vsbytecode == NULL) PanicAlert("Failed to compile vertex shader, %s %d\n", __FILE__, __LINE__);
- m_vshader = D3D::CreateVertexShaderFromByteCode(vsbytecode);
- if (m_vshader == NULL) PanicAlert("Failed to create vertex shader, %s %d\n", __FILE__, __LINE__);
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_vshader, "vertex shader of a CD3DFont object");
-
- const D3D11_INPUT_ELEMENT_DESC desc[] =
- {
- { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
- { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
- { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 },
- };
- hr = D3D::device->CreateInputLayout(desc, 3, vsbytecode->Data(), vsbytecode->Size(), &m_InputLayout);
- if (FAILED(hr)) PanicAlert("Failed to create input layout, %s %d\n", __FILE__, __LINE__);
- SAFE_RELEASE(vsbytecode);
-
- D3D11_BLEND_DESC blenddesc;
- blenddesc.AlphaToCoverageEnable = FALSE;
- blenddesc.IndependentBlendEnable = FALSE;
- blenddesc.RenderTarget[0].BlendEnable = TRUE;
- blenddesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
- blenddesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
- blenddesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
- blenddesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
- blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
- blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
- blenddesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
- hr = D3D::device->CreateBlendState(&blenddesc, &m_blendstate);
- CHECK(hr==S_OK, "Create font blend state");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_blendstate, "blend state of a CD3DFont object");
-
- // this might need to be changed when adding multisampling support
- D3D11_RASTERIZER_DESC rastdesc = CD3D11_RASTERIZER_DESC(D3D11_FILL_SOLID, D3D11_CULL_NONE, false, 0, 0.f, 0.f, false, false, false, false);
- hr = D3D::device->CreateRasterizerState(&rastdesc, &m_raststate);
- CHECK(hr==S_OK, "Create font rasterizer state");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_raststate, "rasterizer state of a CD3DFont object");
-
- D3D11_BUFFER_DESC vbdesc = CD3D11_BUFFER_DESC(MAX_NUM_VERTICES*sizeof(FONT2DVERTEX), D3D11_BIND_VERTEX_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE);
- if (FAILED(hr = device->CreateBuffer(&vbdesc, NULL, &m_pVB)))
- {
- PanicAlert("Failed to create font vertex buffer at %s, line %d\n", __FILE__, __LINE__);
- return hr;
- }
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_pVB, "vertex buffer of a CD3DFont object");
- return S_OK;
-}
-
-int CD3DFont::Shutdown()
-{
- SAFE_RELEASE(m_pVB);
- SAFE_RELEASE(m_pTexture);
- SAFE_RELEASE(m_InputLayout);
- SAFE_RELEASE(m_pshader);
- SAFE_RELEASE(m_vshader);
-
- SAFE_RELEASE(m_blendstate);
- SAFE_RELEASE(m_raststate);
-
- return S_OK;
-}
-
-int CD3DFont::DrawTextScaled(float x, float y, float size, float spacing, u32 dwColor, const char* strText, bool center)
-{
- if (!m_pVB) return 0;
-
- UINT stride = sizeof(FONT2DVERTEX);
- UINT bufoffset = 0;
-
- float scalex = 1 / (float)D3D::GetBackBufferWidth() * 2.f;
- float scaley = 1 / (float)D3D::GetBackBufferHeight() * 2.f;
- float sizeratio = size / (float)m_LineHeight;
-
- // translate starting positions
- float sx = x * scalex - 1.f;
- float sy = 1.f - y * scaley;
- char c;
-
- // fill vertex buffer
- FONT2DVERTEX* pVertices;
- int dwNumTriangles = 0L;
-
- D3D11_MAPPED_SUBRESOURCE vbmap;
- HRESULT hr = context->Map(m_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vbmap);
- if (FAILED(hr)) PanicAlert("Mapping vertex buffer failed, %s %d\n", __FILE__, __LINE__);
- pVertices = (D3D::FONT2DVERTEX*)vbmap.pData;
-
- // if center was requested, set current position as centre
- // this is currently never used
- if (center)
- {
- const char *oldText = strText;
- float mx=0;
- float maxx=0;
-
- while (c = *strText++)
- {
- if (c == ('\n')) mx = 0;
- if (c < (' ') ) continue;
- c -= 32;
- mx += (m_fTexCoords[c][2]-m_fTexCoords[c][0])/(m_fTexCoords[0][3] - m_fTexCoords[0][1]) + spacing;
- if (mx > maxx) maxx = mx;
- }
- sx -= scalex*maxx*size;
- strText = oldText;
- }
- // set general pipeline state
- D3D::stateman->PushBlendState(m_blendstate);
- D3D::stateman->PushRasterizerState(m_raststate);
- D3D::stateman->Apply();
-
- D3D::context->PSSetShader(m_pshader, NULL, 0);
- D3D::context->VSSetShader(m_vshader, NULL, 0);
-
- D3D::context->IASetInputLayout(m_InputLayout);
- D3D::context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- D3D::context->PSSetShaderResources(0, 1, &m_pTexture);
-
- float fStartX = sx;
- while (c = *strText++)
- {
- if (c == ('\n'))
- {
- sx = fStartX;
- sy -= scaley * size;
- }
- if (c < (' ')) continue;
-
- c -= 32;
- float tx1 = m_fTexCoords[c][0];
- float ty1 = m_fTexCoords[c][1];
- float tx2 = m_fTexCoords[c][2];
- float ty2 = m_fTexCoords[c][3];
-
- float w = (float)(tx2-tx1) * m_dwTexWidth * scalex * sizeratio;
- float h = (float)(ty1-ty2) * m_dwTexHeight * scaley * sizeratio;
-
- FONT2DVERTEX v[6];
- v[0] = InitFont2DVertex( sx, h+sy, dwColor, tx1, ty2);
- v[1] = InitFont2DVertex( sx, sy, dwColor, tx1, ty1);
- v[2] = InitFont2DVertex(w+sx, h+sy, dwColor, tx2, ty2);
- v[3] = InitFont2DVertex(w+sx, sy, dwColor, tx2, ty1);
- v[4] = v[2];
- v[5] = v[1];
-
- memcpy(pVertices, v, 6*sizeof(FONT2DVERTEX));
-
- pVertices+=6;
- dwNumTriangles += 2;
-
- if (dwNumTriangles * 3 > (MAX_NUM_VERTICES - 6))
- {
- context->Unmap(m_pVB, 0);
-
- D3D::context->IASetVertexBuffers(0, 1, &m_pVB, &stride, &bufoffset);
- D3D::context->Draw(3 * dwNumTriangles, 0);
-
- dwNumTriangles = 0;
- D3D11_MAPPED_SUBRESOURCE vbmap;
- hr = context->Map(m_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vbmap);
- if (FAILED(hr)) PanicAlert("Mapping vertex buffer failed, %s %d\n", __FILE__, __LINE__);
- pVertices = (D3D::FONT2DVERTEX*)vbmap.pData;
- }
- sx += w + spacing * scalex * size;
- }
-
- // Unlock and render the vertex buffer
- context->Unmap(m_pVB, 0);
- if (dwNumTriangles > 0)
- {
- D3D::context->IASetVertexBuffers(0, 1, &m_pVB, &stride, &bufoffset);
- D3D::context->Draw(3 * dwNumTriangles, 0);
- }
- D3D::stateman->PopBlendState();
- D3D::stateman->PopRasterizerState();
- return S_OK;
-}
-
-ID3D11Buffer* CreateQuadVertexBuffer(unsigned int size, void* data)
-{
- ID3D11Buffer* vb;
- D3D11_BUFFER_DESC vbdesc;
- vbdesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- vbdesc.ByteWidth = size;
- vbdesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- vbdesc.MiscFlags = 0;
- vbdesc.Usage = D3D11_USAGE_DYNAMIC;
- if (data)
- {
- D3D11_SUBRESOURCE_DATA bufdata;
- bufdata.pSysMem = data;
- if (FAILED(device->CreateBuffer(&vbdesc, &bufdata, &vb))) return NULL;
- }
- else if (FAILED(device->CreateBuffer(&vbdesc, NULL, &vb))) return NULL;
-
- return vb;
-}
-
-ID3D11SamplerState* linear_copy_sampler = NULL;
-ID3D11SamplerState* point_copy_sampler = NULL;
-ID3D11Buffer* stqvb = NULL;
-ID3D11Buffer* stsqvb = NULL;
-ID3D11Buffer* clearvb = NULL;
-
-typedef struct { float x,y,z,u,v; } STQVertex;
-typedef struct { float x,y,z,u,v; } STSQVertex;
-typedef struct { float x,y,z; u32 col; } ClearVertex;
-
-struct
-{
- float u1, v1, u2, v2;
-} tex_quad_data;
-
-struct
-{
- MathUtil::Rectangle rdest;
- float u1, v1, u2, v2;
-} tex_sub_quad_data;
-
-struct
-{
- u32 col;
- float z;
-} clear_quad_data;
-
-void InitUtils()
-{
- float border[4] = { 0.f, 0.f, 0.f, 0.f };
- D3D11_SAMPLER_DESC samDesc = CD3D11_SAMPLER_DESC(D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, 0.f, 1, D3D11_COMPARISON_ALWAYS, border, -D3D11_FLOAT32_MAX, D3D11_FLOAT32_MAX);
- HRESULT hr = D3D::device->CreateSamplerState(&samDesc, &point_copy_sampler);
- if (FAILED(hr)) PanicAlert("Failed to create sampler state at %s %d\n", __FILE__, __LINE__);
- else SetDebugObjectName((ID3D11DeviceChild*)point_copy_sampler, "point copy sampler state");
-
- samDesc = CD3D11_SAMPLER_DESC(D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, 0.f, 1, D3D11_COMPARISON_ALWAYS, border, -D3D11_FLOAT32_MAX, D3D11_FLOAT32_MAX);
- hr = D3D::device->CreateSamplerState(&samDesc, &linear_copy_sampler);
- if (FAILED(hr)) PanicAlert("Failed to create sampler state at %s %d\n", __FILE__, __LINE__);
- else SetDebugObjectName((ID3D11DeviceChild*)linear_copy_sampler, "linear copy sampler state");
-
- // cached data used to avoid unnecessarily reloading the vertex buffers
- memset(&tex_quad_data, 0, sizeof(tex_quad_data));
- memset(&tex_sub_quad_data, 0, sizeof(tex_sub_quad_data));
- memset(&clear_quad_data, 0, sizeof(clear_quad_data));
-
- STQVertex stqcoords[4] = {
- {-1.0f, 1.0f, 0.0f, 0, 0},
- { 1.0f, 1.0f, 0.0f, 0, 0},
- {-1.0f,-1.0f, 0.0f, 0, 0},
- { 1.0f,-1.0f, 0.0f, 0, 0},
- };
-
- STSQVertex stsqcoords[4];
- memset(stsqcoords, 0, sizeof(stsqcoords));
-
- ClearVertex cqcoords[4] = {
- {-1.0f, 1.0f, 0, 0},
- { 1.0f, 1.0f, 0, 0},
- {-1.0f, -1.0f, 0, 0},
- { 1.0f, -1.0f, 0, 0},
- };
-
- stqvb = CreateQuadVertexBuffer(4*sizeof(STQVertex), stqcoords);
- CHECK(stqvb!=NULL, "Create vertex buffer of drawShadedTexQuad");
- SetDebugObjectName((ID3D11DeviceChild*)stqvb, "vertex buffer of drawShadedTexQuad");
-
- stsqvb = CreateQuadVertexBuffer(4*sizeof(STSQVertex), stsqcoords);
- CHECK(stsqvb!=NULL, "Create vertex buffer of drawShadedTexSubQuad");
- SetDebugObjectName((ID3D11DeviceChild*)stsqvb, "vertex buffer of drawShadedTexSubQuad");
-
- clearvb = CreateQuadVertexBuffer(4*sizeof(ClearVertex), cqcoords);
- CHECK(clearvb!=NULL, "Create vertex buffer of drawClearQuad");
- SetDebugObjectName((ID3D11DeviceChild*)clearvb, "vertex buffer of drawClearQuad");
-
- font.Init();
-}
-
-void ShutdownUtils()
-{
- font.Shutdown();
- SAFE_RELEASE(point_copy_sampler);
- SAFE_RELEASE(linear_copy_sampler);
- SAFE_RELEASE(stqvb);
- SAFE_RELEASE(stsqvb);
- SAFE_RELEASE(clearvb);
-}
-
-void SetPointCopySampler()
-{
- D3D::context->PSSetSamplers(0, 1, &point_copy_sampler);
-}
-
-void SetLinearCopySampler()
-{
- D3D::context->PSSetSamplers(0, 1, &linear_copy_sampler);
-}
-
-void drawShadedTexQuad(ID3D11ShaderResourceView* texture,
- const D3D11_RECT* rSource,
- int SourceWidth,
- int SourceHeight,
- ID3D11PixelShader* PShader,
- ID3D11VertexShader* Vshader,
- ID3D11InputLayout* layout)
-{
- float sw = 1.0f /(float) SourceWidth;
- float sh = 1.0f /(float) SourceHeight;
- float u1 = ((float)rSource->left) * sw;
- float u2 = ((float)rSource->right) * sw;
- float v1 = ((float)rSource->top) * sh;
- float v2 = ((float)rSource->bottom) * sh;
-
- STQVertex coords[4] = {
- {-1.0f, 1.0f, 0.0f, u1, v1},
- { 1.0f, 1.0f, 0.0f, u2, v1},
- {-1.0f,-1.0f, 0.0f, u1, v2},
- { 1.0f,-1.0f, 0.0f, u2, v2},
- };
-
- // only upload the data to VRAM if it changed
- if (tex_quad_data.u1 != u1 || tex_quad_data.v1 != v1 ||
- tex_quad_data.u2 != u2 || tex_quad_data.v2 != v2)
- {
- D3D11_MAPPED_SUBRESOURCE map;
- D3D::context->Map(stqvb, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
- memcpy(map.pData, coords, sizeof(coords));
- D3D::context->Unmap(stqvb, 0);
- tex_quad_data.u1 = u1;
- tex_quad_data.v1 = v1;
- tex_quad_data.u2 = u2;
- tex_quad_data.v2 = v2;
- }
- UINT stride = sizeof(STQVertex);
- UINT offset = 0;
-
- D3D::context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
- D3D::context->IASetInputLayout(layout);
- D3D::context->IASetVertexBuffers(0, 1, &stqvb, &stride, &offset);
- D3D::context->PSSetShader(PShader, NULL, 0);
- D3D::context->PSSetShaderResources(0, 1, &texture);
- D3D::context->VSSetShader(Vshader, NULL, 0);
- D3D::stateman->Apply();
- D3D::context->Draw(4, 0);
-
- ID3D11ShaderResourceView* texres = NULL;
- context->PSSetShaderResources(0, 1, &texres); // immediately unbind the texture
-}
-
-void drawShadedTexSubQuad(ID3D11ShaderResourceView* texture,
- const MathUtil::Rectangle* rSource,
- int SourceWidth,
- int SourceHeight,
- const MathUtil::Rectangle* rDest,
- ID3D11PixelShader* PShader,
- ID3D11VertexShader* Vshader,
- ID3D11InputLayout* layout)
-{
- float sw = 1.0f /(float) SourceWidth;
- float sh = 1.0f /(float) SourceHeight;
- float u1 = (rSource->left ) * sw;
- float u2 = (rSource->right ) * sw;
- float v1 = (rSource->top ) * sh;
- float v2 = (rSource->bottom) * sh;
-
- STSQVertex coords[4] = {
- { rDest->left , rDest->bottom, 0.0f, u1, v1},
- { rDest->right, rDest->bottom, 0.0f, u2, v1},
- { rDest->left , rDest->top , 0.0f, u1, v2},
- { rDest->right, rDest->top , 0.0f, u2, v2},
- };
-
- // only upload the data to VRAM if it changed
- if (memcmp(rDest, &tex_sub_quad_data.rdest, sizeof(rDest)) != 0 ||
- tex_sub_quad_data.u1 != u1 || tex_sub_quad_data.v1 != v1 ||
- tex_sub_quad_data.u2 != u2 || tex_sub_quad_data.v2 != v2)
- {
- D3D11_MAPPED_SUBRESOURCE map;
- D3D::context->Map(stsqvb, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
- memcpy(map.pData, coords, sizeof(coords));
- D3D::context->Unmap(stsqvb, 0);
- tex_sub_quad_data.u1 = u1;
- tex_sub_quad_data.v1 = v1;
- tex_sub_quad_data.u2 = u2;
- tex_sub_quad_data.v2 = v2;
- memcpy(&tex_sub_quad_data.rdest, &rDest, sizeof(rDest));
- }
- UINT stride = sizeof(STSQVertex);
- UINT offset = 0;
-
- context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
- context->IASetVertexBuffers(0, 1, &stsqvb, &stride, &offset);
- context->IASetInputLayout(layout);
- context->PSSetShaderResources(0, 1, &texture);
- context->PSSetShader(PShader, NULL, 0);
- context->VSSetShader(Vshader, NULL, 0);
- stateman->Apply();
- context->Draw(4, 0);
-
- ID3D11ShaderResourceView* texres = NULL;
- context->PSSetShaderResources(0, 1, &texres); // immediately unbind the texture
-}
-
-void drawClearQuad(u32 Color, float z, ID3D11PixelShader* PShader, ID3D11VertexShader* Vshader, ID3D11InputLayout* layout)
-{
- if (clear_quad_data.col != Color || clear_quad_data.z != z)
- {
- const ClearVertex coords[4] = {
- {-1.0f, 1.0f, z, Color},
- { 1.0f, 1.0f, z, Color},
- {-1.0f, -1.0f, z, Color},
- { 1.0f, -1.0f, z, Color},
- };
-
- D3D11_MAPPED_SUBRESOURCE map;
- context->Map(clearvb, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
- memcpy(map.pData, coords, sizeof(coords));
- context->Unmap(clearvb, 0);
- clear_quad_data.col = Color;
- clear_quad_data.z = z;
- }
- context->VSSetShader(Vshader, NULL, 0);
- context->PSSetShader(PShader, NULL, 0);
- context->IASetInputLayout(layout);
-
- UINT stride = sizeof(ClearVertex);
- UINT offset = 0;
- context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
- context->IASetVertexBuffers(0, 1, &clearvb, &stride, &offset);
- stateman->Apply();
- context->Draw(4, 0);
-}
-
-
-} // namespace
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+// Common
+#include "Common.h"
+
+// DX11
+#include "DX11_Render.h"
+#include "DX11_D3DBase.h"
+#include "DX11_D3DUtil.h"
+#include "DX11_D3DTexture.h"
+#include "DX11_PixelShaderCache.h"
+#include "DX11_VertexShaderCache.h"
+#include "DX11_D3DShader.h"
+
+namespace DX11
+{
+
+namespace D3D
+{
+
+CD3DFont font;
+
+#define MAX_NUM_VERTICES 300
+struct FONT2DVERTEX {
+ float x,y,z;
+ float col[4];
+ float tu, tv;
+};
+
+inline FONT2DVERTEX InitFont2DVertex(float x, float y, u32 color, float tu, float tv)
+{
+ FONT2DVERTEX v; v.x=x; v.y=y; v.z=0; v.tu = tu; v.tv = tv;
+ v.col[0] = ((float)((color >> 16) & 0xFF)) / 255.f;
+ v.col[1] = ((float)((color >> 8) & 0xFF)) / 255.f;
+ v.col[2] = ((float)((color >> 0) & 0xFF)) / 255.f;
+ v.col[3] = ((float)((color >> 24) & 0xFF)) / 255.f;
+ return v;
+}
+
+CD3DFont::CD3DFont() : m_dwTexWidth(512), m_dwTexHeight(512)
+{
+ m_pTexture = NULL;
+ m_pVB = NULL;
+ m_InputLayout = NULL;
+ m_pshader = NULL;
+ m_vshader = NULL;
+}
+
+const char fontpixshader[] = {
+ "Texture2D tex2D;\n"
+ "SamplerState linearSampler\n"
+ "{\n"
+ " Filter = MIN_MAG_MIP_LINEAR;\n"
+ " AddressU = D3D11_TEXTURE_ADDRESS_BORDER;\n"
+ " AddressV = D3D11_TEXTURE_ADDRESS_BORDER;\n"
+ " BorderColor = float4(0.f, 0.f, 0.f, 0.f);\n"
+ "};\n"
+ "struct PS_INPUT\n"
+ "{\n"
+ " float4 pos : SV_POSITION;\n"
+ " float4 col : COLOR;\n"
+ " float2 tex : TEXCOORD;\n"
+ "};\n"
+ "float4 main( PS_INPUT input ) : SV_Target\n"
+ "{\n"
+ " return tex2D.Sample( linearSampler, input.tex ) * input.col;\n"
+ "};\n"
+};
+
+const char fontvertshader[] = {
+ "struct VS_INPUT\n"
+ "{\n"
+ " float4 pos : POSITION;\n"
+ " float4 col : COLOR;\n"
+ " float2 tex : TEXCOORD;\n"
+ "};\n"
+ "struct PS_INPUT\n"
+ "{\n"
+ " float4 pos : SV_POSITION;\n"
+ " float4 col : COLOR;\n"
+ " float2 tex : TEXCOORD;\n"
+ "};\n"
+ "PS_INPUT main( VS_INPUT input )\n"
+ "{\n"
+ " PS_INPUT output;\n"
+ " output.pos = input.pos;\n"
+ " output.col = input.col;\n"
+ " output.tex = input.tex;\n"
+ " return output;\n"
+ "};\n"
+};
+
+int CD3DFont::Init()
+{
+ HRESULT hr;
+
+ // prepare to create a bitmap
+ unsigned int* pBitmapBits;
+ BITMAPINFO bmi;
+ ZeroMemory(&bmi.bmiHeader, sizeof(BITMAPINFOHEADER));
+ bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ bmi.bmiHeader.biWidth = (int)m_dwTexWidth;
+ bmi.bmiHeader.biHeight = -(int)m_dwTexHeight;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biCompression = BI_RGB;
+ bmi.bmiHeader.biBitCount = 32;
+
+ // create a DC and a bitmap for the font
+ HDC hDC = CreateCompatibleDC(NULL);
+ HBITMAP hbmBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&pBitmapBits, NULL, 0);
+ SetMapMode(hDC, MM_TEXT);
+
+ // create a GDI font
+ HFONT hFont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE,
+ FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
+ CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
+ VARIABLE_PITCH, _T("Tahoma"));
+ if (NULL == hFont) return E_FAIL;
+
+ HGDIOBJ hOldbmBitmap = SelectObject(hDC, hbmBitmap);
+ HGDIOBJ hOldFont = SelectObject(hDC, hFont);
+
+ // set text properties
+ SetTextColor(hDC, 0xFFFFFF);
+ SetBkColor (hDC, 0);
+ SetTextAlign(hDC, TA_TOP);
+
+ TEXTMETRICW tm;
+ GetTextMetricsW(hDC, &tm);
+ m_LineHeight = tm.tmHeight;
+
+ // loop through all printable characters and output them to the bitmap
+ // meanwhile, keep track of the corresponding tex coords for each character.
+ int x = 0, y = 0;
+ char str[2] = "\0";
+ for (int c = 0; c < 127 - 32; c++)
+ {
+ str[0] = c + 32;
+ SIZE size;
+ GetTextExtentPoint32A(hDC, str, 1, &size);
+ if ((int)(x+size.cx+1) > m_dwTexWidth)
+ {
+ x = 0;
+ y += m_LineHeight;
+ }
+
+ ExtTextOutA(hDC, x+1, y+0, ETO_OPAQUE | ETO_CLIPPED, NULL, str, 1, NULL);
+ m_fTexCoords[c][0] = (float) x /m_dwTexWidth;
+ m_fTexCoords[c][1] = (float) y /m_dwTexHeight;
+ m_fTexCoords[c][2] = (float)(x+size.cx)/m_dwTexWidth;
+ m_fTexCoords[c][3] = (float)(y+size.cy)/m_dwTexHeight;
+
+ x += size.cx + 3; // 3 to work around annoying ij conflict (part of the j ends up with the i)
+ }
+
+ // create a new texture for the font
+ // possible optimization: store the converted data in a buffer and fill the texture on creation.
+ // That way, we can use a static texture
+ ID3D11Texture2D* buftex;
+ D3D11_TEXTURE2D_DESC texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8G8B8A8_UNORM, m_dwTexWidth, m_dwTexHeight,
+ 1, 1, D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DYNAMIC,
+ D3D11_CPU_ACCESS_WRITE);
+ hr = device->CreateTexture2D(&texdesc, NULL, &buftex);
+ if (FAILED(hr))
+ {
+ PanicAlert("Failed to create font texture");
+ return hr;
+ }
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)buftex, "texture of a CD3DFont object");
+
+ // lock the surface and write the alpha values for the set pixels
+ D3D11_MAPPED_SUBRESOURCE texmap;
+ hr = context->Map(buftex, 0, D3D11_MAP_WRITE_DISCARD, 0, &texmap);
+ if (FAILED(hr)) PanicAlert("Failed to map a texture at %s %d\n", __FILE__, __LINE__);
+
+ for (y = 0; y < m_dwTexHeight; y++)
+ {
+ u32* pDst32 = (u32*)((u8*)texmap.pData + y * texmap.RowPitch);
+ for (x = 0; x < m_dwTexWidth; x++)
+ {
+ const u8 bAlpha = (pBitmapBits[m_dwTexWidth * y + x] & 0xff);
+ *pDst32++ = (((bAlpha << 4) | bAlpha) << 24) | 0xFFFFFF;
+ }
+ }
+
+ // clean up
+ context->Unmap(buftex, 0);
+ hr = D3D::device->CreateShaderResourceView(buftex, NULL, &m_pTexture);
+ if (FAILED(hr)) PanicAlert("Failed to create shader resource view at %s %d\n", __FILE__, __LINE__);
+ SAFE_RELEASE(buftex);
+
+ SelectObject(hDC, hOldbmBitmap);
+ DeleteObject(hbmBitmap);
+
+ SelectObject(hDC, hOldFont);
+ DeleteObject(hFont);
+
+ // setup device objects for drawing
+ m_pshader = D3D::CompileAndCreatePixelShader(fontpixshader, sizeof(fontpixshader));
+ if (m_pshader == NULL) PanicAlert("Failed to create pixel shader, %s %d\n", __FILE__, __LINE__);
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_pshader, "pixel shader of a CD3DFont object");
+
+ D3DBlob* vsbytecode;
+ D3D::CompileVertexShader(fontvertshader, sizeof(fontvertshader), &vsbytecode);
+ if (vsbytecode == NULL) PanicAlert("Failed to compile vertex shader, %s %d\n", __FILE__, __LINE__);
+ m_vshader = D3D::CreateVertexShaderFromByteCode(vsbytecode);
+ if (m_vshader == NULL) PanicAlert("Failed to create vertex shader, %s %d\n", __FILE__, __LINE__);
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_vshader, "vertex shader of a CD3DFont object");
+
+ const D3D11_INPUT_ELEMENT_DESC desc[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ };
+ hr = D3D::device->CreateInputLayout(desc, 3, vsbytecode->Data(), vsbytecode->Size(), &m_InputLayout);
+ if (FAILED(hr)) PanicAlert("Failed to create input layout, %s %d\n", __FILE__, __LINE__);
+ SAFE_RELEASE(vsbytecode);
+
+ D3D11_BLEND_DESC blenddesc;
+ blenddesc.AlphaToCoverageEnable = FALSE;
+ blenddesc.IndependentBlendEnable = FALSE;
+ blenddesc.RenderTarget[0].BlendEnable = TRUE;
+ blenddesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
+ blenddesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
+ blenddesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
+ blenddesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
+ blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
+ blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
+ blenddesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
+ hr = D3D::device->CreateBlendState(&blenddesc, &m_blendstate);
+ CHECK(hr==S_OK, "Create font blend state");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_blendstate, "blend state of a CD3DFont object");
+
+ // this might need to be changed when adding multisampling support
+ D3D11_RASTERIZER_DESC rastdesc = CD3D11_RASTERIZER_DESC(D3D11_FILL_SOLID, D3D11_CULL_NONE, false, 0, 0.f, 0.f, false, false, false, false);
+ hr = D3D::device->CreateRasterizerState(&rastdesc, &m_raststate);
+ CHECK(hr==S_OK, "Create font rasterizer state");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_raststate, "rasterizer state of a CD3DFont object");
+
+ D3D11_BUFFER_DESC vbdesc = CD3D11_BUFFER_DESC(MAX_NUM_VERTICES*sizeof(FONT2DVERTEX), D3D11_BIND_VERTEX_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE);
+ if (FAILED(hr = device->CreateBuffer(&vbdesc, NULL, &m_pVB)))
+ {
+ PanicAlert("Failed to create font vertex buffer at %s, line %d\n", __FILE__, __LINE__);
+ return hr;
+ }
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_pVB, "vertex buffer of a CD3DFont object");
+ return S_OK;
+}
+
+int CD3DFont::Shutdown()
+{
+ SAFE_RELEASE(m_pVB);
+ SAFE_RELEASE(m_pTexture);
+ SAFE_RELEASE(m_InputLayout);
+ SAFE_RELEASE(m_pshader);
+ SAFE_RELEASE(m_vshader);
+
+ SAFE_RELEASE(m_blendstate);
+ SAFE_RELEASE(m_raststate);
+
+ return S_OK;
+}
+
+int CD3DFont::DrawTextScaled(float x, float y, float size, float spacing, u32 dwColor, const char* strText, bool center)
+{
+ if (!m_pVB) return 0;
+
+ UINT stride = sizeof(FONT2DVERTEX);
+ UINT bufoffset = 0;
+
+ float scalex = 1 / (float)D3D::GetBackBufferWidth() * 2.f;
+ float scaley = 1 / (float)D3D::GetBackBufferHeight() * 2.f;
+ float sizeratio = size / (float)m_LineHeight;
+
+ // translate starting positions
+ float sx = x * scalex - 1.f;
+ float sy = 1.f - y * scaley;
+ char c;
+
+ // fill vertex buffer
+ FONT2DVERTEX* pVertices;
+ int dwNumTriangles = 0L;
+
+ D3D11_MAPPED_SUBRESOURCE vbmap;
+ HRESULT hr = context->Map(m_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vbmap);
+ if (FAILED(hr)) PanicAlert("Mapping vertex buffer failed, %s %d\n", __FILE__, __LINE__);
+ pVertices = (D3D::FONT2DVERTEX*)vbmap.pData;
+
+ // if center was requested, set current position as centre
+ // this is currently never used
+ if (center)
+ {
+ const char *oldText = strText;
+ float mx=0;
+ float maxx=0;
+
+ while (c = *strText++)
+ {
+ if (c == ('\n')) mx = 0;
+ if (c < (' ') ) continue;
+ c -= 32;
+ mx += (m_fTexCoords[c][2]-m_fTexCoords[c][0])/(m_fTexCoords[0][3] - m_fTexCoords[0][1]) + spacing;
+ if (mx > maxx) maxx = mx;
+ }
+ sx -= scalex*maxx*size;
+ strText = oldText;
+ }
+ // set general pipeline state
+ D3D::stateman->PushBlendState(m_blendstate);
+ D3D::stateman->PushRasterizerState(m_raststate);
+ D3D::stateman->Apply();
+
+ D3D::context->PSSetShader(m_pshader, NULL, 0);
+ D3D::context->VSSetShader(m_vshader, NULL, 0);
+
+ D3D::context->IASetInputLayout(m_InputLayout);
+ D3D::context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ D3D::context->PSSetShaderResources(0, 1, &m_pTexture);
+
+ float fStartX = sx;
+ while (c = *strText++)
+ {
+ if (c == ('\n'))
+ {
+ sx = fStartX;
+ sy -= scaley * size;
+ }
+ if (c < (' ')) continue;
+
+ c -= 32;
+ float tx1 = m_fTexCoords[c][0];
+ float ty1 = m_fTexCoords[c][1];
+ float tx2 = m_fTexCoords[c][2];
+ float ty2 = m_fTexCoords[c][3];
+
+ float w = (float)(tx2-tx1) * m_dwTexWidth * scalex * sizeratio;
+ float h = (float)(ty1-ty2) * m_dwTexHeight * scaley * sizeratio;
+
+ FONT2DVERTEX v[6];
+ v[0] = InitFont2DVertex( sx, h+sy, dwColor, tx1, ty2);
+ v[1] = InitFont2DVertex( sx, sy, dwColor, tx1, ty1);
+ v[2] = InitFont2DVertex(w+sx, h+sy, dwColor, tx2, ty2);
+ v[3] = InitFont2DVertex(w+sx, sy, dwColor, tx2, ty1);
+ v[4] = v[2];
+ v[5] = v[1];
+
+ memcpy(pVertices, v, 6*sizeof(FONT2DVERTEX));
+
+ pVertices+=6;
+ dwNumTriangles += 2;
+
+ if (dwNumTriangles * 3 > (MAX_NUM_VERTICES - 6))
+ {
+ context->Unmap(m_pVB, 0);
+
+ D3D::context->IASetVertexBuffers(0, 1, &m_pVB, &stride, &bufoffset);
+ D3D::context->Draw(3 * dwNumTriangles, 0);
+
+ dwNumTriangles = 0;
+ D3D11_MAPPED_SUBRESOURCE vbmap;
+ hr = context->Map(m_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vbmap);
+ if (FAILED(hr)) PanicAlert("Mapping vertex buffer failed, %s %d\n", __FILE__, __LINE__);
+ pVertices = (D3D::FONT2DVERTEX*)vbmap.pData;
+ }
+ sx += w + spacing * scalex * size;
+ }
+
+ // Unlock and render the vertex buffer
+ context->Unmap(m_pVB, 0);
+ if (dwNumTriangles > 0)
+ {
+ D3D::context->IASetVertexBuffers(0, 1, &m_pVB, &stride, &bufoffset);
+ D3D::context->Draw(3 * dwNumTriangles, 0);
+ }
+ D3D::stateman->PopBlendState();
+ D3D::stateman->PopRasterizerState();
+ return S_OK;
+}
+
+ID3D11Buffer* CreateQuadVertexBuffer(unsigned int size, void* data)
+{
+ ID3D11Buffer* vb;
+ D3D11_BUFFER_DESC vbdesc;
+ vbdesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ vbdesc.ByteWidth = size;
+ vbdesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ vbdesc.MiscFlags = 0;
+ vbdesc.Usage = D3D11_USAGE_DYNAMIC;
+ if (data)
+ {
+ D3D11_SUBRESOURCE_DATA bufdata;
+ bufdata.pSysMem = data;
+ if (FAILED(device->CreateBuffer(&vbdesc, &bufdata, &vb))) return NULL;
+ }
+ else if (FAILED(device->CreateBuffer(&vbdesc, NULL, &vb))) return NULL;
+
+ return vb;
+}
+
+ID3D11SamplerState* linear_copy_sampler = NULL;
+ID3D11SamplerState* point_copy_sampler = NULL;
+ID3D11Buffer* stqvb = NULL;
+ID3D11Buffer* stsqvb = NULL;
+ID3D11Buffer* clearvb = NULL;
+
+typedef struct { float x,y,z,u,v; } STQVertex;
+typedef struct { float x,y,z,u,v; } STSQVertex;
+typedef struct { float x,y,z; u32 col; } ClearVertex;
+
+struct
+{
+ float u1, v1, u2, v2;
+} tex_quad_data;
+
+struct
+{
+ MathUtil::Rectangle rdest;
+ float u1, v1, u2, v2;
+} tex_sub_quad_data;
+
+struct
+{
+ u32 col;
+ float z;
+} clear_quad_data;
+
+void InitUtils()
+{
+ float border[4] = { 0.f, 0.f, 0.f, 0.f };
+ D3D11_SAMPLER_DESC samDesc = CD3D11_SAMPLER_DESC(D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, 0.f, 1, D3D11_COMPARISON_ALWAYS, border, -D3D11_FLOAT32_MAX, D3D11_FLOAT32_MAX);
+ HRESULT hr = D3D::device->CreateSamplerState(&samDesc, &point_copy_sampler);
+ if (FAILED(hr)) PanicAlert("Failed to create sampler state at %s %d\n", __FILE__, __LINE__);
+ else SetDebugObjectName((ID3D11DeviceChild*)point_copy_sampler, "point copy sampler state");
+
+ samDesc = CD3D11_SAMPLER_DESC(D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, 0.f, 1, D3D11_COMPARISON_ALWAYS, border, -D3D11_FLOAT32_MAX, D3D11_FLOAT32_MAX);
+ hr = D3D::device->CreateSamplerState(&samDesc, &linear_copy_sampler);
+ if (FAILED(hr)) PanicAlert("Failed to create sampler state at %s %d\n", __FILE__, __LINE__);
+ else SetDebugObjectName((ID3D11DeviceChild*)linear_copy_sampler, "linear copy sampler state");
+
+ // cached data used to avoid unnecessarily reloading the vertex buffers
+ memset(&tex_quad_data, 0, sizeof(tex_quad_data));
+ memset(&tex_sub_quad_data, 0, sizeof(tex_sub_quad_data));
+ memset(&clear_quad_data, 0, sizeof(clear_quad_data));
+
+ STQVertex stqcoords[4] = {
+ {-1.0f, 1.0f, 0.0f, 0, 0},
+ { 1.0f, 1.0f, 0.0f, 0, 0},
+ {-1.0f,-1.0f, 0.0f, 0, 0},
+ { 1.0f,-1.0f, 0.0f, 0, 0},
+ };
+
+ STSQVertex stsqcoords[4];
+ memset(stsqcoords, 0, sizeof(stsqcoords));
+
+ ClearVertex cqcoords[4] = {
+ {-1.0f, 1.0f, 0, 0},
+ { 1.0f, 1.0f, 0, 0},
+ {-1.0f, -1.0f, 0, 0},
+ { 1.0f, -1.0f, 0, 0},
+ };
+
+ stqvb = CreateQuadVertexBuffer(4*sizeof(STQVertex), stqcoords);
+ CHECK(stqvb!=NULL, "Create vertex buffer of drawShadedTexQuad");
+ SetDebugObjectName((ID3D11DeviceChild*)stqvb, "vertex buffer of drawShadedTexQuad");
+
+ stsqvb = CreateQuadVertexBuffer(4*sizeof(STSQVertex), stsqcoords);
+ CHECK(stsqvb!=NULL, "Create vertex buffer of drawShadedTexSubQuad");
+ SetDebugObjectName((ID3D11DeviceChild*)stsqvb, "vertex buffer of drawShadedTexSubQuad");
+
+ clearvb = CreateQuadVertexBuffer(4*sizeof(ClearVertex), cqcoords);
+ CHECK(clearvb!=NULL, "Create vertex buffer of drawClearQuad");
+ SetDebugObjectName((ID3D11DeviceChild*)clearvb, "vertex buffer of drawClearQuad");
+
+ font.Init();
+}
+
+void ShutdownUtils()
+{
+ font.Shutdown();
+ SAFE_RELEASE(point_copy_sampler);
+ SAFE_RELEASE(linear_copy_sampler);
+ SAFE_RELEASE(stqvb);
+ SAFE_RELEASE(stsqvb);
+ SAFE_RELEASE(clearvb);
+}
+
+void SetPointCopySampler()
+{
+ D3D::context->PSSetSamplers(0, 1, &point_copy_sampler);
+}
+
+void SetLinearCopySampler()
+{
+ D3D::context->PSSetSamplers(0, 1, &linear_copy_sampler);
+}
+
+void drawShadedTexQuad(ID3D11ShaderResourceView* texture,
+ const D3D11_RECT* rSource,
+ int SourceWidth,
+ int SourceHeight,
+ ID3D11PixelShader* PShader,
+ ID3D11VertexShader* Vshader,
+ ID3D11InputLayout* layout)
+{
+ float sw = 1.0f /(float) SourceWidth;
+ float sh = 1.0f /(float) SourceHeight;
+ float u1 = ((float)rSource->left) * sw;
+ float u2 = ((float)rSource->right) * sw;
+ float v1 = ((float)rSource->top) * sh;
+ float v2 = ((float)rSource->bottom) * sh;
+
+ STQVertex coords[4] = {
+ {-1.0f, 1.0f, 0.0f, u1, v1},
+ { 1.0f, 1.0f, 0.0f, u2, v1},
+ {-1.0f,-1.0f, 0.0f, u1, v2},
+ { 1.0f,-1.0f, 0.0f, u2, v2},
+ };
+
+ // only upload the data to VRAM if it changed
+ if (tex_quad_data.u1 != u1 || tex_quad_data.v1 != v1 ||
+ tex_quad_data.u2 != u2 || tex_quad_data.v2 != v2)
+ {
+ D3D11_MAPPED_SUBRESOURCE map;
+ D3D::context->Map(stqvb, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
+ memcpy(map.pData, coords, sizeof(coords));
+ D3D::context->Unmap(stqvb, 0);
+ tex_quad_data.u1 = u1;
+ tex_quad_data.v1 = v1;
+ tex_quad_data.u2 = u2;
+ tex_quad_data.v2 = v2;
+ }
+ UINT stride = sizeof(STQVertex);
+ UINT offset = 0;
+
+ D3D::context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ D3D::context->IASetInputLayout(layout);
+ D3D::context->IASetVertexBuffers(0, 1, &stqvb, &stride, &offset);
+ D3D::context->PSSetShader(PShader, NULL, 0);
+ D3D::context->PSSetShaderResources(0, 1, &texture);
+ D3D::context->VSSetShader(Vshader, NULL, 0);
+ D3D::stateman->Apply();
+ D3D::context->Draw(4, 0);
+
+ ID3D11ShaderResourceView* texres = NULL;
+ context->PSSetShaderResources(0, 1, &texres); // immediately unbind the texture
+}
+
+void drawShadedTexSubQuad(ID3D11ShaderResourceView* texture,
+ const MathUtil::Rectangle* rSource,
+ int SourceWidth,
+ int SourceHeight,
+ const MathUtil::Rectangle* rDest,
+ ID3D11PixelShader* PShader,
+ ID3D11VertexShader* Vshader,
+ ID3D11InputLayout* layout)
+{
+ float sw = 1.0f /(float) SourceWidth;
+ float sh = 1.0f /(float) SourceHeight;
+ float u1 = (rSource->left ) * sw;
+ float u2 = (rSource->right ) * sw;
+ float v1 = (rSource->top ) * sh;
+ float v2 = (rSource->bottom) * sh;
+
+ STSQVertex coords[4] = {
+ { rDest->left , rDest->bottom, 0.0f, u1, v1},
+ { rDest->right, rDest->bottom, 0.0f, u2, v1},
+ { rDest->left , rDest->top , 0.0f, u1, v2},
+ { rDest->right, rDest->top , 0.0f, u2, v2},
+ };
+
+ // only upload the data to VRAM if it changed
+ if (memcmp(rDest, &tex_sub_quad_data.rdest, sizeof(rDest)) != 0 ||
+ tex_sub_quad_data.u1 != u1 || tex_sub_quad_data.v1 != v1 ||
+ tex_sub_quad_data.u2 != u2 || tex_sub_quad_data.v2 != v2)
+ {
+ D3D11_MAPPED_SUBRESOURCE map;
+ D3D::context->Map(stsqvb, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
+ memcpy(map.pData, coords, sizeof(coords));
+ D3D::context->Unmap(stsqvb, 0);
+ tex_sub_quad_data.u1 = u1;
+ tex_sub_quad_data.v1 = v1;
+ tex_sub_quad_data.u2 = u2;
+ tex_sub_quad_data.v2 = v2;
+ memcpy(&tex_sub_quad_data.rdest, &rDest, sizeof(rDest));
+ }
+ UINT stride = sizeof(STSQVertex);
+ UINT offset = 0;
+
+ context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ context->IASetVertexBuffers(0, 1, &stsqvb, &stride, &offset);
+ context->IASetInputLayout(layout);
+ context->PSSetShaderResources(0, 1, &texture);
+ context->PSSetShader(PShader, NULL, 0);
+ context->VSSetShader(Vshader, NULL, 0);
+ stateman->Apply();
+ context->Draw(4, 0);
+
+ ID3D11ShaderResourceView* texres = NULL;
+ context->PSSetShaderResources(0, 1, &texres); // immediately unbind the texture
+}
+
+void drawClearQuad(u32 Color, float z, ID3D11PixelShader* PShader, ID3D11VertexShader* Vshader, ID3D11InputLayout* layout)
+{
+ if (clear_quad_data.col != Color || clear_quad_data.z != z)
+ {
+ const ClearVertex coords[4] = {
+ {-1.0f, 1.0f, z, Color},
+ { 1.0f, 1.0f, z, Color},
+ {-1.0f, -1.0f, z, Color},
+ { 1.0f, -1.0f, z, Color},
+ };
+
+ D3D11_MAPPED_SUBRESOURCE map;
+ context->Map(clearvb, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
+ memcpy(map.pData, coords, sizeof(coords));
+ context->Unmap(clearvb, 0);
+ clear_quad_data.col = Color;
+ clear_quad_data.z = z;
+ }
+ context->VSSetShader(Vshader, NULL, 0);
+ context->PSSetShader(PShader, NULL, 0);
+ context->IASetInputLayout(layout);
+
+ UINT stride = sizeof(ClearVertex);
+ UINT offset = 0;
+ context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ context->IASetVertexBuffers(0, 1, &clearvb, &stride, &offset);
+ stateman->Apply();
+ context->Draw(4, 0);
+}
+
+
+} // namespace
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DUtil.h b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DUtil.h
index 0e7ad0ac77..487a84724f 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DUtil.h
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_D3DUtil.h
@@ -1,91 +1,91 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#pragma once
-
-#include
-#include
-
-#include "DX11_D3DBase.h"
-
-namespace DX11
-{
-
-namespace D3D
-{
- // Font creation flags
- #define D3DFONT_BOLD 0x0001
- #define D3DFONT_ITALIC 0x0002
-
- // Font rendering flags
- #define D3DFONT_CENTERED 0x0001
-
- class CD3DFont
- {
- ID3D11ShaderResourceView* m_pTexture;
- ID3D11Buffer* m_pVB;
- ID3D11InputLayout* m_InputLayout;
- ID3D11PixelShader* m_pshader;
- ID3D11VertexShader* m_vshader;
- ID3D11BlendState* m_blendstate;
- ID3D11RasterizerState* m_raststate;
- const int m_dwTexWidth;
- const int m_dwTexHeight;
- unsigned int m_LineHeight;
- float m_fTexCoords[128-32][4];
-
- public:
- CD3DFont();
- // 2D text drawing function
- // Initializing and destroying device-dependent objects
- int Init();
- int Shutdown();
- int DrawTextScaled(float x, float y,
- float size,
- float spacing, u32 dwColor,
- const char* strText, bool center=true);
- };
-
- extern CD3DFont font;
-
- void InitUtils();
- void ShutdownUtils();
-
- void SetPointCopySampler();
- void SetLinearCopySampler();
-
- void drawShadedTexQuad(ID3D11ShaderResourceView* texture,
- const D3D11_RECT* rSource,
- int SourceWidth,
- int SourceHeight,
- ID3D11PixelShader* PShader,
- ID3D11VertexShader* VShader,
- ID3D11InputLayout* layout);
- void drawShadedTexSubQuad(ID3D11ShaderResourceView* texture,
- const MathUtil::Rectangle* rSource,
- int SourceWidth,
- int SourceHeight,
- const MathUtil::Rectangle* rDest,
- ID3D11PixelShader* PShader,
- ID3D11VertexShader* Vshader,
- ID3D11InputLayout* layout);
- void drawClearQuad(u32 Color, float z, ID3D11PixelShader* PShader, ID3D11VertexShader* Vshader, ID3D11InputLayout* layout);
- void SaveRenderStates();
- void RestoreRenderStates();
-}
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#pragma once
+
+#include
+#include
+
+#include "DX11_D3DBase.h"
+
+namespace DX11
+{
+
+namespace D3D
+{
+ // Font creation flags
+ #define D3DFONT_BOLD 0x0001
+ #define D3DFONT_ITALIC 0x0002
+
+ // Font rendering flags
+ #define D3DFONT_CENTERED 0x0001
+
+ class CD3DFont
+ {
+ ID3D11ShaderResourceView* m_pTexture;
+ ID3D11Buffer* m_pVB;
+ ID3D11InputLayout* m_InputLayout;
+ ID3D11PixelShader* m_pshader;
+ ID3D11VertexShader* m_vshader;
+ ID3D11BlendState* m_blendstate;
+ ID3D11RasterizerState* m_raststate;
+ const int m_dwTexWidth;
+ const int m_dwTexHeight;
+ unsigned int m_LineHeight;
+ float m_fTexCoords[128-32][4];
+
+ public:
+ CD3DFont();
+ // 2D text drawing function
+ // Initializing and destroying device-dependent objects
+ int Init();
+ int Shutdown();
+ int DrawTextScaled(float x, float y,
+ float size,
+ float spacing, u32 dwColor,
+ const char* strText, bool center=true);
+ };
+
+ extern CD3DFont font;
+
+ void InitUtils();
+ void ShutdownUtils();
+
+ void SetPointCopySampler();
+ void SetLinearCopySampler();
+
+ void drawShadedTexQuad(ID3D11ShaderResourceView* texture,
+ const D3D11_RECT* rSource,
+ int SourceWidth,
+ int SourceHeight,
+ ID3D11PixelShader* PShader,
+ ID3D11VertexShader* VShader,
+ ID3D11InputLayout* layout);
+ void drawShadedTexSubQuad(ID3D11ShaderResourceView* texture,
+ const MathUtil::Rectangle* rSource,
+ int SourceWidth,
+ int SourceHeight,
+ const MathUtil::Rectangle* rDest,
+ ID3D11PixelShader* PShader,
+ ID3D11VertexShader* Vshader,
+ ID3D11InputLayout* layout);
+ void drawClearQuad(u32 Color, float z, ID3D11PixelShader* PShader, ID3D11VertexShader* Vshader, ID3D11InputLayout* layout);
+ void SaveRenderStates();
+ void RestoreRenderStates();
+}
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_FramebufferManager.cpp b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_FramebufferManager.cpp
index 5a4d6562e3..b345cee502 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_FramebufferManager.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_FramebufferManager.cpp
@@ -1,162 +1,162 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-// VideoCommon
-#include "VideoConfig.h"
-
-// DX11
-#include "DX11_Render.h"
-#include "DX11_D3DBase.h"
-#include "DX11_D3DTexture.h"
-#include "DX11_D3DUtil.h"
-#include "DX11_FramebufferManager.h"
-#include "DX11_PixelShaderCache.h"
-#include "DX11_VertexShaderCache.h"
-
-#include "../Main.h"
-
-namespace DX11
-{
-
-XFBSource FramebufferManager::m_realXFBSource; // used in real XFB mode
-
-FramebufferManager::EFB FramebufferManager::m_efb;
-
-D3DTexture2D* &FramebufferManager::GetEFBColorTexture() { return m_efb.color_tex; }
-ID3D11Texture2D* &FramebufferManager::GetEFBColorStagingBuffer() { return m_efb.color_staging_buf; }
-
-D3DTexture2D* &FramebufferManager::GetEFBDepthTexture() { return m_efb.depth_tex; }
-D3DTexture2D* &FramebufferManager::GetEFBDepthReadTexture() { return m_efb.depth_read_texture; }
-ID3D11Texture2D* &FramebufferManager::GetEFBDepthStagingBuffer() { return m_efb.depth_staging_buf; }
-
-FramebufferManager::FramebufferManager()
-{
- m_efb.color_tex = NULL;
- m_efb.color_staging_buf = NULL;
- m_efb.depth_tex = NULL;
- m_efb.depth_staging_buf = NULL;
- m_efb.depth_read_texture = NULL;
-
- m_realXFBSource.tex = NULL;
-
- unsigned int target_width = Renderer::GetFullTargetWidth();
- unsigned int target_height = Renderer::GetFullTargetHeight();
- ID3D11Texture2D* buf;
- D3D11_TEXTURE2D_DESC texdesc;
- HRESULT hr;
-
- // create framebuffer color texture
- m_efb.color_tex = D3DTexture2D::Create(target_width, target_height,
- (D3D11_BIND_FLAG)(D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE),
- D3D11_USAGE_DEFAULT, DXGI_FORMAT_R8G8B8A8_UNORM);
- CHECK(m_efb.color_tex, "create EFB color texture (size: %dx%d)", target_width, target_height);
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_tex->GetTex(), "EFB color texture");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_tex->GetRTV(), "EFB color texture render target view");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_tex->GetSRV(), "EFB color texture shader resource view");
-
- // create a staging texture for Renderer::AccessEFB
- texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8G8B8A8_UNORM, 1, 1, 1, 1, 0,
- D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_WRITE|D3D11_CPU_ACCESS_READ);
- hr = D3D::device->CreateTexture2D(&texdesc, NULL, &m_efb.color_staging_buf);
- CHECK(SUCCEEDED(hr), "create EFB color staging buffer (hr=%#x)", hr);
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_staging_buf, "EFB color staging texture (used for Renderer::AccessEFB)");
-
- // EFB depth buffer
- texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R24G8_TYPELESS, target_width,
- target_height, 1, 1, D3D11_BIND_DEPTH_STENCIL|D3D11_BIND_SHADER_RESOURCE);
- hr = D3D::device->CreateTexture2D(&texdesc, NULL, &buf);
- CHECK(hr==S_OK, "create EFB depth texture (size: %dx%d; hr=%#x)", target_width, target_height, hr);
- m_efb.depth_tex = new D3DTexture2D(buf, (D3D11_BIND_FLAG)(D3D11_BIND_DEPTH_STENCIL|D3D11_BIND_SHADER_RESOURCE),
- DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_D24_UNORM_S8_UINT);
- SAFE_RELEASE(buf);
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_tex->GetTex(), "EFB depth texture");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_tex->GetDSV(), "EFB depth texture depth stencil view");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_tex->GetSRV(), "EFB depth texture shader resource view");
-
- // render target for depth buffer access in Renderer::AccessEFB
- texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R32_FLOAT, 4, 4, 1, 1, D3D11_BIND_RENDER_TARGET);
- hr = D3D::device->CreateTexture2D(&texdesc, NULL, &buf);
- CHECK(hr==S_OK, "create EFB depth read texture (hr=%#x)", hr);
- m_efb.depth_read_texture = new D3DTexture2D(buf, D3D11_BIND_RENDER_TARGET);
- SAFE_RELEASE(buf);
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_read_texture->GetTex(), "EFB depth read texture (used in Renderer::AccessEFB)");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_read_texture->GetRTV(), "EFB depth read texture render target view (used in Renderer::AccessEFB)");
-
- // staging texture to which we copy the data from m_efb.depth_read_texture
- texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R32_FLOAT, 4, 4, 1, 1, 0, D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_READ|D3D11_CPU_ACCESS_WRITE);
- hr = D3D::device->CreateTexture2D(&texdesc, NULL, &m_efb.depth_staging_buf);
- CHECK(hr==S_OK, "create EFB depth staging buffer (hr=%#x)", hr);
- D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_staging_buf, "EFB depth staging texture (used for Renderer::AccessEFB)");
-}
-
-FramebufferManager::~FramebufferManager()
-{
- SAFE_RELEASE(m_efb.color_tex);
- SAFE_RELEASE(m_efb.color_staging_buf);
- SAFE_RELEASE(m_efb.depth_tex);
- SAFE_RELEASE(m_efb.depth_staging_buf);
- SAFE_RELEASE(m_efb.depth_read_texture);
-
- SAFE_RELEASE(m_realXFBSource.tex);
-}
-
-void XFBSource::CopyEFB(const TargetRectangle& efbSource)
-{
- // copy EFB data to XFB and restore render target again
- D3D11_VIEWPORT vp = CD3D11_VIEWPORT(0.f, 0.f, (float)texWidth, (float)texHeight);
- D3D::context->RSSetViewports(1, &vp);
- D3D::context->OMSetRenderTargets(1, &tex->GetRTV(), NULL);
- D3D::SetLinearCopySampler();
-
- D3DTexture2D* const ctex = FramebufferManager::GetEFBColorTexture();
-
- D3D::drawShadedTexQuad(ctex->GetSRV(), efbSource.AsRECT(),
- Renderer::GetFullTargetWidth(), Renderer::GetFullTargetHeight(),
- PixelShaderCache::GetColorCopyProgram(), VertexShaderCache::GetSimpleVertexShader(),
- VertexShaderCache::GetSimpleInputLayout());
-
- D3D::context->OMSetRenderTargets(1, &ctex->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV());
-}
-
-XFBSource::~XFBSource()
-{
- tex->Release();
-}
-
-XFBSourceBase* FramebufferManager::CreateXFBSource(unsigned int target_width, unsigned int target_height)
-{
- XFBSource* const xfbs = new XFBSource;
- xfbs->tex = D3DTexture2D::Create(target_width, target_height,
- (D3D11_BIND_FLAG)(D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE),
- D3D11_USAGE_DEFAULT, DXGI_FORMAT_R8G8B8A8_UNORM);
-
- return xfbs;
-}
-
-void FramebufferManager::copyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc)
-{
- // TODO
- PanicAlert("copyToRealXFB not implemented, yet\n");
-}
-
-const XFBSource** FramebufferManager::getRealXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32 &xfbCount)
-{
- PanicAlert("getRealXFBSource not implemented, yet\n");
- return NULL;
-}
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+// VideoCommon
+#include "VideoConfig.h"
+
+// DX11
+#include "DX11_Render.h"
+#include "DX11_D3DBase.h"
+#include "DX11_D3DTexture.h"
+#include "DX11_D3DUtil.h"
+#include "DX11_FramebufferManager.h"
+#include "DX11_PixelShaderCache.h"
+#include "DX11_VertexShaderCache.h"
+
+#include "../Main.h"
+
+namespace DX11
+{
+
+XFBSource FramebufferManager::m_realXFBSource; // used in real XFB mode
+
+FramebufferManager::EFB FramebufferManager::m_efb;
+
+D3DTexture2D* &FramebufferManager::GetEFBColorTexture() { return m_efb.color_tex; }
+ID3D11Texture2D* &FramebufferManager::GetEFBColorStagingBuffer() { return m_efb.color_staging_buf; }
+
+D3DTexture2D* &FramebufferManager::GetEFBDepthTexture() { return m_efb.depth_tex; }
+D3DTexture2D* &FramebufferManager::GetEFBDepthReadTexture() { return m_efb.depth_read_texture; }
+ID3D11Texture2D* &FramebufferManager::GetEFBDepthStagingBuffer() { return m_efb.depth_staging_buf; }
+
+FramebufferManager::FramebufferManager()
+{
+ m_efb.color_tex = NULL;
+ m_efb.color_staging_buf = NULL;
+ m_efb.depth_tex = NULL;
+ m_efb.depth_staging_buf = NULL;
+ m_efb.depth_read_texture = NULL;
+
+ m_realXFBSource.tex = NULL;
+
+ unsigned int target_width = Renderer::GetFullTargetWidth();
+ unsigned int target_height = Renderer::GetFullTargetHeight();
+ ID3D11Texture2D* buf;
+ D3D11_TEXTURE2D_DESC texdesc;
+ HRESULT hr;
+
+ // create framebuffer color texture
+ m_efb.color_tex = D3DTexture2D::Create(target_width, target_height,
+ (D3D11_BIND_FLAG)(D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE),
+ D3D11_USAGE_DEFAULT, DXGI_FORMAT_R8G8B8A8_UNORM);
+ CHECK(m_efb.color_tex, "create EFB color texture (size: %dx%d)", target_width, target_height);
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_tex->GetTex(), "EFB color texture");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_tex->GetRTV(), "EFB color texture render target view");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_tex->GetSRV(), "EFB color texture shader resource view");
+
+ // create a staging texture for Renderer::AccessEFB
+ texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8G8B8A8_UNORM, 1, 1, 1, 1, 0,
+ D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_WRITE|D3D11_CPU_ACCESS_READ);
+ hr = D3D::device->CreateTexture2D(&texdesc, NULL, &m_efb.color_staging_buf);
+ CHECK(SUCCEEDED(hr), "create EFB color staging buffer (hr=%#x)", hr);
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_staging_buf, "EFB color staging texture (used for Renderer::AccessEFB)");
+
+ // EFB depth buffer
+ texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R24G8_TYPELESS, target_width,
+ target_height, 1, 1, D3D11_BIND_DEPTH_STENCIL|D3D11_BIND_SHADER_RESOURCE);
+ hr = D3D::device->CreateTexture2D(&texdesc, NULL, &buf);
+ CHECK(hr==S_OK, "create EFB depth texture (size: %dx%d; hr=%#x)", target_width, target_height, hr);
+ m_efb.depth_tex = new D3DTexture2D(buf, (D3D11_BIND_FLAG)(D3D11_BIND_DEPTH_STENCIL|D3D11_BIND_SHADER_RESOURCE),
+ DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_D24_UNORM_S8_UINT);
+ SAFE_RELEASE(buf);
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_tex->GetTex(), "EFB depth texture");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_tex->GetDSV(), "EFB depth texture depth stencil view");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_tex->GetSRV(), "EFB depth texture shader resource view");
+
+ // render target for depth buffer access in Renderer::AccessEFB
+ texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R32_FLOAT, 4, 4, 1, 1, D3D11_BIND_RENDER_TARGET);
+ hr = D3D::device->CreateTexture2D(&texdesc, NULL, &buf);
+ CHECK(hr==S_OK, "create EFB depth read texture (hr=%#x)", hr);
+ m_efb.depth_read_texture = new D3DTexture2D(buf, D3D11_BIND_RENDER_TARGET);
+ SAFE_RELEASE(buf);
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_read_texture->GetTex(), "EFB depth read texture (used in Renderer::AccessEFB)");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_read_texture->GetRTV(), "EFB depth read texture render target view (used in Renderer::AccessEFB)");
+
+ // staging texture to which we copy the data from m_efb.depth_read_texture
+ texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R32_FLOAT, 4, 4, 1, 1, 0, D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_READ|D3D11_CPU_ACCESS_WRITE);
+ hr = D3D::device->CreateTexture2D(&texdesc, NULL, &m_efb.depth_staging_buf);
+ CHECK(hr==S_OK, "create EFB depth staging buffer (hr=%#x)", hr);
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_staging_buf, "EFB depth staging texture (used for Renderer::AccessEFB)");
+}
+
+FramebufferManager::~FramebufferManager()
+{
+ SAFE_RELEASE(m_efb.color_tex);
+ SAFE_RELEASE(m_efb.color_staging_buf);
+ SAFE_RELEASE(m_efb.depth_tex);
+ SAFE_RELEASE(m_efb.depth_staging_buf);
+ SAFE_RELEASE(m_efb.depth_read_texture);
+
+ SAFE_RELEASE(m_realXFBSource.tex);
+}
+
+void XFBSource::CopyEFB(const TargetRectangle& efbSource)
+{
+ // copy EFB data to XFB and restore render target again
+ D3D11_VIEWPORT vp = CD3D11_VIEWPORT(0.f, 0.f, (float)texWidth, (float)texHeight);
+ D3D::context->RSSetViewports(1, &vp);
+ D3D::context->OMSetRenderTargets(1, &tex->GetRTV(), NULL);
+ D3D::SetLinearCopySampler();
+
+ D3DTexture2D* const ctex = FramebufferManager::GetEFBColorTexture();
+
+ D3D::drawShadedTexQuad(ctex->GetSRV(), efbSource.AsRECT(),
+ Renderer::GetFullTargetWidth(), Renderer::GetFullTargetHeight(),
+ PixelShaderCache::GetColorCopyProgram(), VertexShaderCache::GetSimpleVertexShader(),
+ VertexShaderCache::GetSimpleInputLayout());
+
+ D3D::context->OMSetRenderTargets(1, &ctex->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV());
+}
+
+XFBSource::~XFBSource()
+{
+ tex->Release();
+}
+
+XFBSourceBase* FramebufferManager::CreateXFBSource(unsigned int target_width, unsigned int target_height)
+{
+ XFBSource* const xfbs = new XFBSource;
+ xfbs->tex = D3DTexture2D::Create(target_width, target_height,
+ (D3D11_BIND_FLAG)(D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE),
+ D3D11_USAGE_DEFAULT, DXGI_FORMAT_R8G8B8A8_UNORM);
+
+ return xfbs;
+}
+
+void FramebufferManager::copyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc)
+{
+ // TODO
+ PanicAlert("copyToRealXFB not implemented, yet\n");
+}
+
+const XFBSource** FramebufferManager::getRealXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32 &xfbCount)
+{
+ PanicAlert("getRealXFBSource not implemented, yet\n");
+ return NULL;
+}
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_FramebufferManager.h b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_FramebufferManager.h
index 3a0179bdbd..8ff14891e3 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_FramebufferManager.h
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_FramebufferManager.h
@@ -1,108 +1,108 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#ifndef _DX11_FBMANAGER_D3D_H_
-#define _DX11_FBMANAGER_D3D_H_
-
-#include
-
-#include "DX11_D3DBase.h"
-
-#include "../FramebufferManager.h"
-
-namespace DX11
-{
-
-// On the GameCube, the game sends a request for the graphics processor to
-// transfer its internal EFB (Embedded Framebuffer) to an area in GameCube RAM
-// called the XFB (External Framebuffer). The size and location of the XFB is
-// decided at the time of the copy, and the format is always YUYV. The video
-// interface is given a pointer to the XFB, which will be decoded and
-// displayed on the TV.
-//
-// There are two ways for Dolphin to emulate this:
-//
-// Real XFB mode:
-//
-// Dolphin will behave like the GameCube and encode the EFB to
-// a portion of GameCube RAM. The emulated video interface will decode the data
-// for output to the screen.
-//
-// Advantages: Behaves exactly like the GameCube.
-// Disadvantages: Resolution will be limited.
-//
-// Virtual XFB mode:
-//
-// When a request is made to copy the EFB to an XFB, Dolphin
-// will remember the RAM location and size of the XFB in a Virtual XFB list.
-// The video interface will look up the XFB in the list and use the enhanced
-// data stored there, if available.
-//
-// Advantages: Enables high resolution graphics, better than real hardware.
-// Disadvantages: If the GameCube CPU writes directly to the XFB (which is
-// possible but uncommon), the Virtual XFB will not capture this information.
-
-// There may be multiple XFBs in GameCube RAM. This is the maximum number to
-// virtualize.
-
-struct XFBSource : public XFBSourceBase
-{
- XFBSource() : tex(NULL) {}
- ~XFBSource();
-
- void CopyEFB(const TargetRectangle& efbSource);
-
- D3DTexture2D* tex;
-};
-
-class FramebufferManager : public ::FramebufferManagerBase
-{
- friend struct XFBSource;
-
-public:
- FramebufferManager();
- ~FramebufferManager();
-
- static D3DTexture2D* &GetEFBColorTexture();
- static ID3D11Texture2D* &GetEFBColorStagingBuffer();
-
- static D3DTexture2D* &GetEFBDepthTexture();
- static D3DTexture2D* &GetEFBDepthReadTexture();
- static ID3D11Texture2D* &GetEFBDepthStagingBuffer();
-
- XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height);
-
-private:
- static void copyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc);
- static const XFBSource** getRealXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32 &xfbCount);
-
- static XFBSource m_realXFBSource; // used in real XFB mode
-
- static struct EFB
- {
- D3DTexture2D* color_tex;
- ID3D11Texture2D* color_staging_buf;
-
- D3DTexture2D* depth_tex;
- ID3D11Texture2D* depth_staging_buf;
- D3DTexture2D* depth_read_texture;
- } m_efb;
-};
-
-}
-
-#endif
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#ifndef _DX11_FBMANAGER_D3D_H_
+#define _DX11_FBMANAGER_D3D_H_
+
+#include
+
+#include "DX11_D3DBase.h"
+
+#include "../FramebufferManager.h"
+
+namespace DX11
+{
+
+// On the GameCube, the game sends a request for the graphics processor to
+// transfer its internal EFB (Embedded Framebuffer) to an area in GameCube RAM
+// called the XFB (External Framebuffer). The size and location of the XFB is
+// decided at the time of the copy, and the format is always YUYV. The video
+// interface is given a pointer to the XFB, which will be decoded and
+// displayed on the TV.
+//
+// There are two ways for Dolphin to emulate this:
+//
+// Real XFB mode:
+//
+// Dolphin will behave like the GameCube and encode the EFB to
+// a portion of GameCube RAM. The emulated video interface will decode the data
+// for output to the screen.
+//
+// Advantages: Behaves exactly like the GameCube.
+// Disadvantages: Resolution will be limited.
+//
+// Virtual XFB mode:
+//
+// When a request is made to copy the EFB to an XFB, Dolphin
+// will remember the RAM location and size of the XFB in a Virtual XFB list.
+// The video interface will look up the XFB in the list and use the enhanced
+// data stored there, if available.
+//
+// Advantages: Enables high resolution graphics, better than real hardware.
+// Disadvantages: If the GameCube CPU writes directly to the XFB (which is
+// possible but uncommon), the Virtual XFB will not capture this information.
+
+// There may be multiple XFBs in GameCube RAM. This is the maximum number to
+// virtualize.
+
+struct XFBSource : public XFBSourceBase
+{
+ XFBSource() : tex(NULL) {}
+ ~XFBSource();
+
+ void CopyEFB(const TargetRectangle& efbSource);
+
+ D3DTexture2D* tex;
+};
+
+class FramebufferManager : public ::FramebufferManagerBase
+{
+ friend struct XFBSource;
+
+public:
+ FramebufferManager();
+ ~FramebufferManager();
+
+ static D3DTexture2D* &GetEFBColorTexture();
+ static ID3D11Texture2D* &GetEFBColorStagingBuffer();
+
+ static D3DTexture2D* &GetEFBDepthTexture();
+ static D3DTexture2D* &GetEFBDepthReadTexture();
+ static ID3D11Texture2D* &GetEFBDepthStagingBuffer();
+
+ XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height);
+
+private:
+ static void copyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc);
+ static const XFBSource** getRealXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32 &xfbCount);
+
+ static XFBSource m_realXFBSource; // used in real XFB mode
+
+ static struct EFB
+ {
+ D3DTexture2D* color_tex;
+ ID3D11Texture2D* color_staging_buf;
+
+ D3DTexture2D* depth_tex;
+ ID3D11Texture2D* depth_staging_buf;
+ D3DTexture2D* depth_read_texture;
+ } m_efb;
+};
+
+}
+
+#endif
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_GfxState.cpp b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_GfxState.cpp
index 79ed26815d..c9b32e8455 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_GfxState.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_GfxState.cpp
@@ -1,372 +1,372 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#include "VideoConfig.h"
-#include "DX11_GfxState.h"
-
-namespace DX11
-{
-
-namespace D3D
-{
-
-EmuGfxState* gfxstate;
-StateManager* stateman;
-
-EmuGfxState::EmuGfxState() : vertexshader(NULL), vsbytecode(NULL), pixelshader(NULL), psbytecode(NULL), apply_called(false)
-{
- for (unsigned int k = 0;k < 8;k++)
- {
- float border[4] = {0.f, 0.f, 0.f, 0.f};
- shader_resources[k] = NULL;
- samplerdesc[k] = CD3D11_SAMPLER_DESC(D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_CLAMP, D3D11_TEXTURE_ADDRESS_CLAMP, D3D11_TEXTURE_ADDRESS_CLAMP, 0.f, 16, D3D11_COMPARISON_ALWAYS, border, -D3D11_FLOAT32_MAX, D3D11_FLOAT32_MAX);
- if(g_ActiveConfig.iMaxAnisotropy > 1) samplerdesc[k].Filter = D3D11_FILTER_ANISOTROPIC;
- }
-
- memset(&blenddesc, 0, sizeof(blenddesc));
- blenddesc.AlphaToCoverageEnable = FALSE;
- blenddesc.IndependentBlendEnable = FALSE;
- blenddesc.RenderTarget[0].BlendEnable = FALSE;
- blenddesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
- blenddesc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;
- blenddesc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO;
- blenddesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
- blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
- blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
- blenddesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
-
- memset(&depthdesc, 0, sizeof(depthdesc));
- depthdesc.DepthEnable = TRUE;
- depthdesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
- depthdesc.DepthFunc = D3D11_COMPARISON_LESS;
- depthdesc.StencilEnable = FALSE;
- depthdesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
- depthdesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
-
- // this probably must be changed once multisampling support gets added
- rastdesc = CD3D11_RASTERIZER_DESC(D3D11_FILL_SOLID, D3D11_CULL_NONE, false, 0, 0.f, 0, false, true, false, false);
-
- pscbuf = NULL;
- vscbuf = NULL;
- vshaderchanged = false;
- inp_layout = NULL;
- num_inp_elems = 0;
-
- pscbufchanged = false;
- vscbufchanged = false;
-}
-
-EmuGfxState::~EmuGfxState()
-{
- for (unsigned int k = 0;k < 8;k++)
- SAFE_RELEASE(shader_resources[k])
-
- SAFE_RELEASE(vsbytecode);
- SAFE_RELEASE(psbytecode);
- SAFE_RELEASE(vertexshader);
- SAFE_RELEASE(pixelshader);
-
- SAFE_RELEASE(pscbuf);
- SAFE_RELEASE(vscbuf);
-
- SAFE_RELEASE(inp_layout);
-}
-
-// TODO: No need to store the whole bytecode, signature might be enough (?)
-void EmuGfxState::SetVShader(ID3D11VertexShader* shader, D3DBlob* bcode)
-{
- // TODO: vshaderchanged actually just needs to be true if the signature changed
- if (bcode && vsbytecode != bcode) vshaderchanged = true;
- SAFE_RELEASE(vsbytecode);
- SAFE_RELEASE(vertexshader);
-
- if (shader && bcode)
- {
- vertexshader = shader;
- shader->AddRef();
- vsbytecode = bcode;
- bcode->AddRef();
- }
- else if (shader || bcode)
- {
- PanicAlert("Invalid parameters!\n");
- }
-}
-
-void EmuGfxState::SetPShader(ID3D11PixelShader* shader)
-{
- if (pixelshader) pixelshader->Release();
- pixelshader = shader;
- if (shader) shader->AddRef();
-}
-
-void EmuGfxState::SetInputElements(const D3D11_INPUT_ELEMENT_DESC* elems, UINT num)
-{
- num_inp_elems = num;
- memcpy(inp_elems, elems, num*sizeof(D3D11_INPUT_ELEMENT_DESC));
-}
-
-void EmuGfxState::SetShaderResource(unsigned int stage, ID3D11ShaderResourceView* srv)
-{
- if (shader_resources[stage])
- shader_resources[stage]->Release();
- shader_resources[stage] = srv;
- if (srv)
- srv->AddRef();
-}
-
-void EmuGfxState::ApplyState()
-{
- HRESULT hr;
-
- // input layout (only needs to be updated if the vertex shader signature changed)
- if (vshaderchanged)
- {
- SAFE_RELEASE(inp_layout);
- hr = D3D::device->CreateInputLayout(inp_elems, num_inp_elems, vsbytecode->Data(), vsbytecode->Size(), &inp_layout);
- if (FAILED(hr)) PanicAlert("Failed to create input layout, %s %d\n", __FILE__, __LINE__);
- SetDebugObjectName((ID3D11DeviceChild*)inp_layout, "an input layout of EmuGfxState");
- vshaderchanged = false;
- }
- D3D::context->IASetInputLayout(inp_layout);
-
- // vertex shader
- // TODO: divide the global variables of the generated shaders into about 5 constant buffers
- // TODO: improve interaction between EmuGfxState and global state management, so that we don't need to set the constant buffers every time
- if (!vscbuf)
- {
- unsigned int size = ((sizeof(vsconstants))&(~0xf))+0x10; // must be a multiple of 16
- D3D11_BUFFER_DESC cbdesc = CD3D11_BUFFER_DESC(size, D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE);
- hr = device->CreateBuffer(&cbdesc, NULL, &vscbuf);
- CHECK(hr==S_OK, "Create vertex shader constant buffer (size=%u)", size);
- SetDebugObjectName((ID3D11DeviceChild*)vscbuf, "a vertex shader constant buffer of EmuGfxState");
- }
- if (vscbufchanged)
- {
- D3D11_MAPPED_SUBRESOURCE map;
- context->Map(vscbuf, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
- memcpy(map.pData, vsconstants, sizeof(vsconstants));
- context->Unmap(vscbuf, 0);
- }
- D3D::context->VSSetConstantBuffers(0, 1, &vscbuf);
-
- // pixel shader
- if (!pscbuf)
- {
- unsigned int size = ((sizeof(psconstants))&(~0xf))+0x10; // must be a multiple of 16
- D3D11_BUFFER_DESC cbdesc = CD3D11_BUFFER_DESC(size, D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE);
- device->CreateBuffer(&cbdesc, NULL, &pscbuf);
- CHECK(hr==S_OK, "Create pixel shader constant buffer (size=%u)", size);
- SetDebugObjectName((ID3D11DeviceChild*)pscbuf, "a pixel shader constant buffer of EmuGfxState");
- }
- if (pscbufchanged)
- {
- D3D11_MAPPED_SUBRESOURCE map;
- context->Map(pscbuf, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
- memcpy(map.pData, psconstants, sizeof(psconstants));
- context->Unmap(pscbuf, 0);
- pscbufchanged = false;
- }
- D3D::context->PSSetConstantBuffers(0, 1, &pscbuf);
-
- ID3D11SamplerState* samplerstate[8];
- for (unsigned int stage = 0; stage < 8; stage++)
- {
- if (shader_resources[stage])
- {
- if(g_ActiveConfig.iMaxAnisotropy > 1) samplerdesc[stage].Filter = D3D11_FILTER_ANISOTROPIC;
- hr = D3D::device->CreateSamplerState(&samplerdesc[stage], &samplerstate[stage]);
- if (FAILED(hr)) PanicAlert("Fail %s %d, stage=%d\n", __FILE__, __LINE__, stage);
- else SetDebugObjectName((ID3D11DeviceChild*)samplerstate[stage], "a sampler state of EmuGfxState");
- }
- else samplerstate[stage] = NULL;
- }
- D3D::context->PSSetSamplers(0, 8, samplerstate);
- for (unsigned int stage = 0; stage < 8; stage++)
- SAFE_RELEASE(samplerstate[stage]);
-
- ID3D11BlendState* blstate;
- hr = device->CreateBlendState(&blenddesc, &blstate);
- if (FAILED(hr)) PanicAlert("Failed to create blend state at %s %d\n", __FILE__, __LINE__);
- stateman->PushBlendState(blstate);
- SetDebugObjectName((ID3D11DeviceChild*)blstate, "a blend state of EmuGfxState");
- SAFE_RELEASE(blstate);
-
- rastdesc.FillMode = (g_ActiveConfig.bWireFrame) ? D3D11_FILL_WIREFRAME : D3D11_FILL_SOLID;
- ID3D11RasterizerState* raststate;
- hr = device->CreateRasterizerState(&rastdesc, &raststate);
- if (FAILED(hr)) PanicAlert("Failed to create rasterizer state at %s %d\n", __FILE__, __LINE__);
- SetDebugObjectName((ID3D11DeviceChild*)raststate, "a rasterizer state of EmuGfxState");
- stateman->PushRasterizerState(raststate);
- SAFE_RELEASE(raststate);
-
- ID3D11DepthStencilState* depth_state;
- hr = device->CreateDepthStencilState(&depthdesc, &depth_state);
- if (SUCCEEDED(hr)) SetDebugObjectName((ID3D11DeviceChild*)depth_state, "a depth-stencil state of EmuGfxState");
- else PanicAlert("Failed to create depth state at %s %d\n", __FILE__, __LINE__);
- D3D::stateman->PushDepthState(depth_state);
- SAFE_RELEASE(depth_state);
-
- context->PSSetShader(pixelshader, NULL, 0);
- context->VSSetShader(vertexshader, NULL, 0);
- context->PSSetShaderResources(0, 8, shader_resources);
-
- stateman->Apply();
- apply_called = true;
-}
-
-void EmuGfxState::AlphaPass()
-{
- if (!apply_called) ERROR_LOG(VIDEO, "EmuGfxState::AlphaPass called without having called ApplyState before!")
- else stateman->PopBlendState();
-
- // pixel shader for alpha pass is different, so update it
- context->PSSetShader(pixelshader, NULL, 0);
-
- ID3D11BlendState* blstate;
- D3D11_BLEND_DESC desc = blenddesc;
- desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALPHA;
- desc.RenderTarget[0].BlendEnable = FALSE;
- HRESULT hr = device->CreateBlendState(&desc, &blstate);
- if (FAILED(hr)) PanicAlert("Failed to create blend state at %s %d\n", __FILE__, __LINE__);
- SetDebugObjectName((ID3D11DeviceChild*)blstate, "a blend state of EmuGfxState (created during alpha pass)");
- stateman->PushBlendState(blstate);
- blstate->Release();
-
- stateman->Apply();
-}
-
-void EmuGfxState::Reset()
-{
- for (unsigned int k = 0;k < 8;k++)
- SAFE_RELEASE(shader_resources[k]);
-
- context->PSSetShaderResources(0, 8, shader_resources); // unbind all textures
- if (apply_called)
- {
- stateman->PopBlendState();
- stateman->PopDepthState();
- stateman->PopRasterizerState();
- apply_called = false;
- }
-}
-
-void EmuGfxState::SetAlphaBlendEnable(bool enable)
-{
- blenddesc.RenderTarget[0].BlendEnable = enable;
-}
-
-void EmuGfxState::SetRenderTargetWriteMask(UINT8 mask)
-{
- blenddesc.RenderTarget[0].RenderTargetWriteMask = mask;
-}
-
-void EmuGfxState::SetSrcBlend(D3D11_BLEND val)
-{
- // TODO: Check whether e.g. the dest color check is needed here
- blenddesc.RenderTarget[0].SrcBlend = val;
- if (val == D3D11_BLEND_SRC_COLOR) blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
- else if (val == D3D11_BLEND_INV_SRC_COLOR) blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
- else if (val == D3D11_BLEND_DEST_COLOR) blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_DEST_ALPHA;
- else if (val == D3D11_BLEND_INV_DEST_COLOR) blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_DEST_ALPHA;
- else blenddesc.RenderTarget[0].SrcBlendAlpha = val;
-}
-
-void EmuGfxState::SetDestBlend(D3D11_BLEND val)
-{
- // TODO: Check whether e.g. the source color check is needed here
- blenddesc.RenderTarget[0].DestBlend = val;
- if (val == D3D11_BLEND_SRC_COLOR) blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_SRC_ALPHA;
- else if (val == D3D11_BLEND_INV_SRC_COLOR) blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
- else if (val == D3D11_BLEND_DEST_COLOR) blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA;
- else if (val == D3D11_BLEND_INV_DEST_COLOR) blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_DEST_ALPHA;
- else blenddesc.RenderTarget[0].DestBlendAlpha = val;
-}
-
-void EmuGfxState::SetBlendOp(D3D11_BLEND_OP val)
-{
- blenddesc.RenderTarget[0].BlendOp = val;
- blenddesc.RenderTarget[0].BlendOpAlpha = val;
-}
-
-void EmuGfxState::SetSamplerFilter(DWORD stage, D3D11_FILTER filter)
-{
- samplerdesc[stage].Filter = filter;
-}
-
-template AutoState::AutoState(const T* object) : state(object)
-{
- ((IUnknown*)state)->AddRef();
-}
-
-template AutoState::AutoState(const AutoState &source)
-{
- state = source.GetPtr();
- ((T*)state)->AddRef();
-}
-
-template AutoState::~AutoState()
-{
- if(state) ((T*)state)->Release();
- state = NULL;
-}
-
-StateManager::StateManager() : cur_blendstate(NULL), cur_depthstate(NULL), cur_raststate(NULL) {}
-
-void StateManager::PushBlendState(const ID3D11BlendState* state) { blendstates.push(AutoBlendState(state)); }
-void StateManager::PushDepthState(const ID3D11DepthStencilState* state) { depthstates.push(AutoDepthStencilState(state)); }
-void StateManager::PushRasterizerState(const ID3D11RasterizerState* state) { raststates.push(AutoRasterizerState(state)); }
-void StateManager::PopBlendState() { blendstates.pop(); }
-void StateManager::PopDepthState() { depthstates.pop(); }
-void StateManager::PopRasterizerState() { raststates.pop(); }
-
-void StateManager::Apply()
-{
- if (!blendstates.empty())
- {
- if (cur_blendstate != blendstates.top().GetPtr())
- {
- cur_blendstate = (ID3D11BlendState*)blendstates.top().GetPtr();
- D3D::context->OMSetBlendState(cur_blendstate, NULL, 0xFFFFFFFF);
- }
- }
- else ERROR_LOG(VIDEO, "Tried to apply without blend state!");
-
- if (!depthstates.empty())
- {
- if (cur_depthstate != depthstates.top().GetPtr())
- {
- cur_depthstate = (ID3D11DepthStencilState*)depthstates.top().GetPtr();
- D3D::context->OMSetDepthStencilState(cur_depthstate, 0);
- }
- }
- else ERROR_LOG(VIDEO, "Tried to apply without depth state!");
-
- if (!raststates.empty())
- {
- if (cur_raststate != raststates.top().GetPtr())
- {
- cur_raststate = (ID3D11RasterizerState*)raststates.top().GetPtr();
- D3D::context->RSSetState(cur_raststate);
- }
- }
- else ERROR_LOG(VIDEO, "Tried to apply without rasterizer state!");
-}
-
-} // namespace
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include "VideoConfig.h"
+#include "DX11_GfxState.h"
+
+namespace DX11
+{
+
+namespace D3D
+{
+
+EmuGfxState* gfxstate;
+StateManager* stateman;
+
+EmuGfxState::EmuGfxState() : vertexshader(NULL), vsbytecode(NULL), pixelshader(NULL), psbytecode(NULL), apply_called(false)
+{
+ for (unsigned int k = 0;k < 8;k++)
+ {
+ float border[4] = {0.f, 0.f, 0.f, 0.f};
+ shader_resources[k] = NULL;
+ samplerdesc[k] = CD3D11_SAMPLER_DESC(D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_CLAMP, D3D11_TEXTURE_ADDRESS_CLAMP, D3D11_TEXTURE_ADDRESS_CLAMP, 0.f, 16, D3D11_COMPARISON_ALWAYS, border, -D3D11_FLOAT32_MAX, D3D11_FLOAT32_MAX);
+ if(g_ActiveConfig.iMaxAnisotropy > 1) samplerdesc[k].Filter = D3D11_FILTER_ANISOTROPIC;
+ }
+
+ memset(&blenddesc, 0, sizeof(blenddesc));
+ blenddesc.AlphaToCoverageEnable = FALSE;
+ blenddesc.IndependentBlendEnable = FALSE;
+ blenddesc.RenderTarget[0].BlendEnable = FALSE;
+ blenddesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
+ blenddesc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;
+ blenddesc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO;
+ blenddesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
+ blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
+ blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
+ blenddesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
+
+ memset(&depthdesc, 0, sizeof(depthdesc));
+ depthdesc.DepthEnable = TRUE;
+ depthdesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
+ depthdesc.DepthFunc = D3D11_COMPARISON_LESS;
+ depthdesc.StencilEnable = FALSE;
+ depthdesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
+ depthdesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
+
+ // this probably must be changed once multisampling support gets added
+ rastdesc = CD3D11_RASTERIZER_DESC(D3D11_FILL_SOLID, D3D11_CULL_NONE, false, 0, 0.f, 0, false, true, false, false);
+
+ pscbuf = NULL;
+ vscbuf = NULL;
+ vshaderchanged = false;
+ inp_layout = NULL;
+ num_inp_elems = 0;
+
+ pscbufchanged = false;
+ vscbufchanged = false;
+}
+
+EmuGfxState::~EmuGfxState()
+{
+ for (unsigned int k = 0;k < 8;k++)
+ SAFE_RELEASE(shader_resources[k])
+
+ SAFE_RELEASE(vsbytecode);
+ SAFE_RELEASE(psbytecode);
+ SAFE_RELEASE(vertexshader);
+ SAFE_RELEASE(pixelshader);
+
+ SAFE_RELEASE(pscbuf);
+ SAFE_RELEASE(vscbuf);
+
+ SAFE_RELEASE(inp_layout);
+}
+
+// TODO: No need to store the whole bytecode, signature might be enough (?)
+void EmuGfxState::SetVShader(ID3D11VertexShader* shader, D3DBlob* bcode)
+{
+ // TODO: vshaderchanged actually just needs to be true if the signature changed
+ if (bcode && vsbytecode != bcode) vshaderchanged = true;
+ SAFE_RELEASE(vsbytecode);
+ SAFE_RELEASE(vertexshader);
+
+ if (shader && bcode)
+ {
+ vertexshader = shader;
+ shader->AddRef();
+ vsbytecode = bcode;
+ bcode->AddRef();
+ }
+ else if (shader || bcode)
+ {
+ PanicAlert("Invalid parameters!\n");
+ }
+}
+
+void EmuGfxState::SetPShader(ID3D11PixelShader* shader)
+{
+ if (pixelshader) pixelshader->Release();
+ pixelshader = shader;
+ if (shader) shader->AddRef();
+}
+
+void EmuGfxState::SetInputElements(const D3D11_INPUT_ELEMENT_DESC* elems, UINT num)
+{
+ num_inp_elems = num;
+ memcpy(inp_elems, elems, num*sizeof(D3D11_INPUT_ELEMENT_DESC));
+}
+
+void EmuGfxState::SetShaderResource(unsigned int stage, ID3D11ShaderResourceView* srv)
+{
+ if (shader_resources[stage])
+ shader_resources[stage]->Release();
+ shader_resources[stage] = srv;
+ if (srv)
+ srv->AddRef();
+}
+
+void EmuGfxState::ApplyState()
+{
+ HRESULT hr;
+
+ // input layout (only needs to be updated if the vertex shader signature changed)
+ if (vshaderchanged)
+ {
+ SAFE_RELEASE(inp_layout);
+ hr = D3D::device->CreateInputLayout(inp_elems, num_inp_elems, vsbytecode->Data(), vsbytecode->Size(), &inp_layout);
+ if (FAILED(hr)) PanicAlert("Failed to create input layout, %s %d\n", __FILE__, __LINE__);
+ SetDebugObjectName((ID3D11DeviceChild*)inp_layout, "an input layout of EmuGfxState");
+ vshaderchanged = false;
+ }
+ D3D::context->IASetInputLayout(inp_layout);
+
+ // vertex shader
+ // TODO: divide the global variables of the generated shaders into about 5 constant buffers
+ // TODO: improve interaction between EmuGfxState and global state management, so that we don't need to set the constant buffers every time
+ if (!vscbuf)
+ {
+ unsigned int size = ((sizeof(vsconstants))&(~0xf))+0x10; // must be a multiple of 16
+ D3D11_BUFFER_DESC cbdesc = CD3D11_BUFFER_DESC(size, D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE);
+ hr = device->CreateBuffer(&cbdesc, NULL, &vscbuf);
+ CHECK(hr==S_OK, "Create vertex shader constant buffer (size=%u)", size);
+ SetDebugObjectName((ID3D11DeviceChild*)vscbuf, "a vertex shader constant buffer of EmuGfxState");
+ }
+ if (vscbufchanged)
+ {
+ D3D11_MAPPED_SUBRESOURCE map;
+ context->Map(vscbuf, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
+ memcpy(map.pData, vsconstants, sizeof(vsconstants));
+ context->Unmap(vscbuf, 0);
+ }
+ D3D::context->VSSetConstantBuffers(0, 1, &vscbuf);
+
+ // pixel shader
+ if (!pscbuf)
+ {
+ unsigned int size = ((sizeof(psconstants))&(~0xf))+0x10; // must be a multiple of 16
+ D3D11_BUFFER_DESC cbdesc = CD3D11_BUFFER_DESC(size, D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE);
+ device->CreateBuffer(&cbdesc, NULL, &pscbuf);
+ CHECK(hr==S_OK, "Create pixel shader constant buffer (size=%u)", size);
+ SetDebugObjectName((ID3D11DeviceChild*)pscbuf, "a pixel shader constant buffer of EmuGfxState");
+ }
+ if (pscbufchanged)
+ {
+ D3D11_MAPPED_SUBRESOURCE map;
+ context->Map(pscbuf, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
+ memcpy(map.pData, psconstants, sizeof(psconstants));
+ context->Unmap(pscbuf, 0);
+ pscbufchanged = false;
+ }
+ D3D::context->PSSetConstantBuffers(0, 1, &pscbuf);
+
+ ID3D11SamplerState* samplerstate[8];
+ for (unsigned int stage = 0; stage < 8; stage++)
+ {
+ if (shader_resources[stage])
+ {
+ if(g_ActiveConfig.iMaxAnisotropy > 1) samplerdesc[stage].Filter = D3D11_FILTER_ANISOTROPIC;
+ hr = D3D::device->CreateSamplerState(&samplerdesc[stage], &samplerstate[stage]);
+ if (FAILED(hr)) PanicAlert("Fail %s %d, stage=%d\n", __FILE__, __LINE__, stage);
+ else SetDebugObjectName((ID3D11DeviceChild*)samplerstate[stage], "a sampler state of EmuGfxState");
+ }
+ else samplerstate[stage] = NULL;
+ }
+ D3D::context->PSSetSamplers(0, 8, samplerstate);
+ for (unsigned int stage = 0; stage < 8; stage++)
+ SAFE_RELEASE(samplerstate[stage]);
+
+ ID3D11BlendState* blstate;
+ hr = device->CreateBlendState(&blenddesc, &blstate);
+ if (FAILED(hr)) PanicAlert("Failed to create blend state at %s %d\n", __FILE__, __LINE__);
+ stateman->PushBlendState(blstate);
+ SetDebugObjectName((ID3D11DeviceChild*)blstate, "a blend state of EmuGfxState");
+ SAFE_RELEASE(blstate);
+
+ rastdesc.FillMode = (g_ActiveConfig.bWireFrame) ? D3D11_FILL_WIREFRAME : D3D11_FILL_SOLID;
+ ID3D11RasterizerState* raststate;
+ hr = device->CreateRasterizerState(&rastdesc, &raststate);
+ if (FAILED(hr)) PanicAlert("Failed to create rasterizer state at %s %d\n", __FILE__, __LINE__);
+ SetDebugObjectName((ID3D11DeviceChild*)raststate, "a rasterizer state of EmuGfxState");
+ stateman->PushRasterizerState(raststate);
+ SAFE_RELEASE(raststate);
+
+ ID3D11DepthStencilState* depth_state;
+ hr = device->CreateDepthStencilState(&depthdesc, &depth_state);
+ if (SUCCEEDED(hr)) SetDebugObjectName((ID3D11DeviceChild*)depth_state, "a depth-stencil state of EmuGfxState");
+ else PanicAlert("Failed to create depth state at %s %d\n", __FILE__, __LINE__);
+ D3D::stateman->PushDepthState(depth_state);
+ SAFE_RELEASE(depth_state);
+
+ context->PSSetShader(pixelshader, NULL, 0);
+ context->VSSetShader(vertexshader, NULL, 0);
+ context->PSSetShaderResources(0, 8, shader_resources);
+
+ stateman->Apply();
+ apply_called = true;
+}
+
+void EmuGfxState::AlphaPass()
+{
+ if (!apply_called) ERROR_LOG(VIDEO, "EmuGfxState::AlphaPass called without having called ApplyState before!")
+ else stateman->PopBlendState();
+
+ // pixel shader for alpha pass is different, so update it
+ context->PSSetShader(pixelshader, NULL, 0);
+
+ ID3D11BlendState* blstate;
+ D3D11_BLEND_DESC desc = blenddesc;
+ desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALPHA;
+ desc.RenderTarget[0].BlendEnable = FALSE;
+ HRESULT hr = device->CreateBlendState(&desc, &blstate);
+ if (FAILED(hr)) PanicAlert("Failed to create blend state at %s %d\n", __FILE__, __LINE__);
+ SetDebugObjectName((ID3D11DeviceChild*)blstate, "a blend state of EmuGfxState (created during alpha pass)");
+ stateman->PushBlendState(blstate);
+ blstate->Release();
+
+ stateman->Apply();
+}
+
+void EmuGfxState::Reset()
+{
+ for (unsigned int k = 0;k < 8;k++)
+ SAFE_RELEASE(shader_resources[k]);
+
+ context->PSSetShaderResources(0, 8, shader_resources); // unbind all textures
+ if (apply_called)
+ {
+ stateman->PopBlendState();
+ stateman->PopDepthState();
+ stateman->PopRasterizerState();
+ apply_called = false;
+ }
+}
+
+void EmuGfxState::SetAlphaBlendEnable(bool enable)
+{
+ blenddesc.RenderTarget[0].BlendEnable = enable;
+}
+
+void EmuGfxState::SetRenderTargetWriteMask(UINT8 mask)
+{
+ blenddesc.RenderTarget[0].RenderTargetWriteMask = mask;
+}
+
+void EmuGfxState::SetSrcBlend(D3D11_BLEND val)
+{
+ // TODO: Check whether e.g. the dest color check is needed here
+ blenddesc.RenderTarget[0].SrcBlend = val;
+ if (val == D3D11_BLEND_SRC_COLOR) blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
+ else if (val == D3D11_BLEND_INV_SRC_COLOR) blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
+ else if (val == D3D11_BLEND_DEST_COLOR) blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_DEST_ALPHA;
+ else if (val == D3D11_BLEND_INV_DEST_COLOR) blenddesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_DEST_ALPHA;
+ else blenddesc.RenderTarget[0].SrcBlendAlpha = val;
+}
+
+void EmuGfxState::SetDestBlend(D3D11_BLEND val)
+{
+ // TODO: Check whether e.g. the source color check is needed here
+ blenddesc.RenderTarget[0].DestBlend = val;
+ if (val == D3D11_BLEND_SRC_COLOR) blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_SRC_ALPHA;
+ else if (val == D3D11_BLEND_INV_SRC_COLOR) blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
+ else if (val == D3D11_BLEND_DEST_COLOR) blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA;
+ else if (val == D3D11_BLEND_INV_DEST_COLOR) blenddesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_DEST_ALPHA;
+ else blenddesc.RenderTarget[0].DestBlendAlpha = val;
+}
+
+void EmuGfxState::SetBlendOp(D3D11_BLEND_OP val)
+{
+ blenddesc.RenderTarget[0].BlendOp = val;
+ blenddesc.RenderTarget[0].BlendOpAlpha = val;
+}
+
+void EmuGfxState::SetSamplerFilter(DWORD stage, D3D11_FILTER filter)
+{
+ samplerdesc[stage].Filter = filter;
+}
+
+template AutoState::AutoState(const T* object) : state(object)
+{
+ ((IUnknown*)state)->AddRef();
+}
+
+template AutoState::AutoState(const AutoState &source)
+{
+ state = source.GetPtr();
+ ((T*)state)->AddRef();
+}
+
+template AutoState::~AutoState()
+{
+ if(state) ((T*)state)->Release();
+ state = NULL;
+}
+
+StateManager::StateManager() : cur_blendstate(NULL), cur_depthstate(NULL), cur_raststate(NULL) {}
+
+void StateManager::PushBlendState(const ID3D11BlendState* state) { blendstates.push(AutoBlendState(state)); }
+void StateManager::PushDepthState(const ID3D11DepthStencilState* state) { depthstates.push(AutoDepthStencilState(state)); }
+void StateManager::PushRasterizerState(const ID3D11RasterizerState* state) { raststates.push(AutoRasterizerState(state)); }
+void StateManager::PopBlendState() { blendstates.pop(); }
+void StateManager::PopDepthState() { depthstates.pop(); }
+void StateManager::PopRasterizerState() { raststates.pop(); }
+
+void StateManager::Apply()
+{
+ if (!blendstates.empty())
+ {
+ if (cur_blendstate != blendstates.top().GetPtr())
+ {
+ cur_blendstate = (ID3D11BlendState*)blendstates.top().GetPtr();
+ D3D::context->OMSetBlendState(cur_blendstate, NULL, 0xFFFFFFFF);
+ }
+ }
+ else ERROR_LOG(VIDEO, "Tried to apply without blend state!");
+
+ if (!depthstates.empty())
+ {
+ if (cur_depthstate != depthstates.top().GetPtr())
+ {
+ cur_depthstate = (ID3D11DepthStencilState*)depthstates.top().GetPtr();
+ D3D::context->OMSetDepthStencilState(cur_depthstate, 0);
+ }
+ }
+ else ERROR_LOG(VIDEO, "Tried to apply without depth state!");
+
+ if (!raststates.empty())
+ {
+ if (cur_raststate != raststates.top().GetPtr())
+ {
+ cur_raststate = (ID3D11RasterizerState*)raststates.top().GetPtr();
+ D3D::context->RSSetState(cur_raststate);
+ }
+ }
+ else ERROR_LOG(VIDEO, "Tried to apply without rasterizer state!");
+}
+
+} // namespace
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_GfxState.h b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_GfxState.h
index ff2423af79..f9c13a6583 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_GfxState.h
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_GfxState.h
@@ -1,142 +1,142 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#pragma once
-
-#include
-
-// VideoCommon
-#include "VertexShaderGen.h"
-#include "PixelShaderGen.h"
-
-// DX11
-#include "DX11_D3DBase.h"
-#include "DX11_D3DBlob.h"
-
-namespace DX11
-{
-
-namespace D3D
-{
-
-// stores the pipeline state to use when calling VertexManager::Flush()
-class EmuGfxState
-{
-public:
- EmuGfxState();
- ~EmuGfxState();
-
- void SetVShader(ID3D11VertexShader* shader, D3DBlob* bcode);
- void SetPShader(ID3D11PixelShader* shader);
- void SetInputElements(const D3D11_INPUT_ELEMENT_DESC* elems, UINT num);
- void SetShaderResource(unsigned int stage, ID3D11ShaderResourceView* srv);
-
- void ApplyState(); // apply current state
- void AlphaPass(); // only modify the current state to enable the alpha pass
- void Reset();
-
- // blend state
- void SetAlphaBlendEnable(bool enable);
- void SetRenderTargetWriteMask(UINT8 mask);
- void SetSrcBlend(D3D11_BLEND val);
- void SetDestBlend(D3D11_BLEND val);
- void SetBlendOp(D3D11_BLEND_OP val);
-
- // sampler states
- void SetSamplerFilter(DWORD stage, D3D11_FILTER filter);
-
- // TODO: add methods for changing the other states instead of modifying them directly
-
- D3D11_SAMPLER_DESC samplerdesc[8];
- D3D11_RASTERIZER_DESC rastdesc;
- D3D11_DEPTH_STENCIL_DESC depthdesc;
-
- float psconstants[C_PENVCONST_END*4];
- float vsconstants[C_VENVCONST_END*4];
- bool vscbufchanged;
- bool pscbufchanged;
-
-private:
- ID3D11VertexShader* vertexshader;
- D3DBlob* vsbytecode;
- ID3D11PixelShader* pixelshader;
- D3DBlob* psbytecode;
- bool vshaderchanged;
-
- ID3D11Buffer* vscbuf;
- ID3D11Buffer* pscbuf;
-
- ID3D11InputLayout* inp_layout;
- D3D11_INPUT_ELEMENT_DESC inp_elems[32];
- int num_inp_elems;
-
- ID3D11ShaderResourceView* shader_resources[8];
- D3D11_BLEND_DESC blenddesc;
-
- bool apply_called;
-};
-
-template class AutoState
-{
-public:
- AutoState(const T* object);
- AutoState(const AutoState &source);
- ~AutoState();
-
- const inline T* GetPtr() const { return state; }
-
-private:
- const T* state;
-};
-
-typedef AutoState AutoBlendState;
-typedef AutoState AutoDepthStencilState;
-typedef AutoState 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);
-
- // call these after drawing
- void PopBlendState();
- void PopDepthState();
- void PopRasterizerState();
-
- // call this before any drawing operation if states could have changed meanwhile
- void Apply();
-
-private:
- std::stack blendstates;
- std::stack depthstates;
- std::stack raststates;
- ID3D11BlendState* cur_blendstate;
- ID3D11DepthStencilState* cur_depthstate;
- ID3D11RasterizerState* cur_raststate;
-};
-
-extern EmuGfxState* gfxstate;
-extern StateManager* stateman;
-
-} // namespace
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#pragma once
+
+#include
+
+// VideoCommon
+#include "VertexShaderGen.h"
+#include "PixelShaderGen.h"
+
+// DX11
+#include "DX11_D3DBase.h"
+#include "DX11_D3DBlob.h"
+
+namespace DX11
+{
+
+namespace D3D
+{
+
+// stores the pipeline state to use when calling VertexManager::Flush()
+class EmuGfxState
+{
+public:
+ EmuGfxState();
+ ~EmuGfxState();
+
+ void SetVShader(ID3D11VertexShader* shader, D3DBlob* bcode);
+ void SetPShader(ID3D11PixelShader* shader);
+ void SetInputElements(const D3D11_INPUT_ELEMENT_DESC* elems, UINT num);
+ void SetShaderResource(unsigned int stage, ID3D11ShaderResourceView* srv);
+
+ void ApplyState(); // apply current state
+ void AlphaPass(); // only modify the current state to enable the alpha pass
+ void Reset();
+
+ // blend state
+ void SetAlphaBlendEnable(bool enable);
+ void SetRenderTargetWriteMask(UINT8 mask);
+ void SetSrcBlend(D3D11_BLEND val);
+ void SetDestBlend(D3D11_BLEND val);
+ void SetBlendOp(D3D11_BLEND_OP val);
+
+ // sampler states
+ void SetSamplerFilter(DWORD stage, D3D11_FILTER filter);
+
+ // TODO: add methods for changing the other states instead of modifying them directly
+
+ D3D11_SAMPLER_DESC samplerdesc[8];
+ D3D11_RASTERIZER_DESC rastdesc;
+ D3D11_DEPTH_STENCIL_DESC depthdesc;
+
+ float psconstants[C_PENVCONST_END*4];
+ float vsconstants[C_VENVCONST_END*4];
+ bool vscbufchanged;
+ bool pscbufchanged;
+
+private:
+ ID3D11VertexShader* vertexshader;
+ D3DBlob* vsbytecode;
+ ID3D11PixelShader* pixelshader;
+ D3DBlob* psbytecode;
+ bool vshaderchanged;
+
+ ID3D11Buffer* vscbuf;
+ ID3D11Buffer* pscbuf;
+
+ ID3D11InputLayout* inp_layout;
+ D3D11_INPUT_ELEMENT_DESC inp_elems[32];
+ int num_inp_elems;
+
+ ID3D11ShaderResourceView* shader_resources[8];
+ D3D11_BLEND_DESC blenddesc;
+
+ bool apply_called;
+};
+
+template class AutoState
+{
+public:
+ AutoState(const T* object);
+ AutoState(const AutoState &source);
+ ~AutoState();
+
+ const inline T* GetPtr() const { return state; }
+
+private:
+ const T* state;
+};
+
+typedef AutoState AutoBlendState;
+typedef AutoState AutoDepthStencilState;
+typedef AutoState 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);
+
+ // call these after drawing
+ void PopBlendState();
+ void PopDepthState();
+ void PopRasterizerState();
+
+ // call this before any drawing operation if states could have changed meanwhile
+ void Apply();
+
+private:
+ std::stack blendstates;
+ std::stack depthstates;
+ std::stack raststates;
+ ID3D11BlendState* cur_blendstate;
+ ID3D11DepthStencilState* cur_depthstate;
+ ID3D11RasterizerState* cur_raststate;
+};
+
+extern EmuGfxState* gfxstate;
+extern StateManager* stateman;
+
+} // namespace
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_NativeVertexFormat.cpp b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_NativeVertexFormat.cpp
index 2ac5afb219..dd7753e252 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_NativeVertexFormat.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_NativeVertexFormat.cpp
@@ -1,150 +1,150 @@
-
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-// Common
-#include "MemoryUtil.h"
-#include "x64Emitter.h"
-#include "ABI.h"
-
-// VideoCommon
-#include "Profiler.h"
-#include "CPMemory.h"
-#include "VertexShaderGen.h"
-#include "NativeVertexFormat.h"
-
-// DX11
-#include "DX11_D3DBase.h"
-#include "DX11_VertexShaderCache.h"
-#include "DX11_VertexManager.h"
-
-namespace DX11
-{
-
-class D3DVertexFormat : public NativeVertexFormat
-{
- D3D11_INPUT_ELEMENT_DESC m_elems[32];
- UINT m_num_elems;
-
-public:
- D3DVertexFormat() : m_num_elems(0) {}
- void Initialize(const PortableVertexDeclaration &_vtx_decl);
- void SetupVertexPointers() const;
-};
-
-NativeVertexFormat* VertexManager::CreateNativeVertexFormat()
-{
- return new D3DVertexFormat;
-}
-
-DXGI_FORMAT VarToD3D(VarType t, int size)
-{
- DXGI_FORMAT retval = DXGI_FORMAT_UNKNOWN;
- static const DXGI_FORMAT lookup1[5] = {
- DXGI_FORMAT_R8_SNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R16_SNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R32_FLOAT
- };
- static const DXGI_FORMAT lookup2[5] = {
- DXGI_FORMAT_R8G8_SNORM, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R16G16_SNORM, DXGI_FORMAT_R16G16_UNORM, DXGI_FORMAT_R32G32_FLOAT
- };
- static const DXGI_FORMAT lookup3[5] = {
- DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R32G32B32_FLOAT
- };
- static const DXGI_FORMAT lookup4[5] = {
- DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R16G16B16A16_SNORM, DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R32G32B32A32_FLOAT
- };
-
- switch (size)
- {
- case 1: retval = lookup1[t]; break;
- case 2: retval = lookup2[t]; break;
- case 3: retval = lookup3[t]; break;
- case 4: retval = lookup4[t]; break;
- default: break;
- }
- if (retval == DXGI_FORMAT_UNKNOWN)
- {
- PanicAlert("VarToD3D: Invalid type/size combo %i , %i", (int)t, size);
- }
- return retval;
-}
-
-void D3DVertexFormat::Initialize(const PortableVertexDeclaration &_vtx_decl)
-{
- vertex_stride = _vtx_decl.stride;
- memset(m_elems, 0, sizeof(m_elems));
-
- m_elems[m_num_elems].SemanticName = "POSITION";
- m_elems[m_num_elems].AlignedByteOffset = 0;
- m_elems[m_num_elems].Format = DXGI_FORMAT_R32G32B32_FLOAT;
- m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
- ++m_num_elems;
-
- for (int i = 0; i < 3; i++)
- {
- if (_vtx_decl.normal_offset[i] > 0)
- {
- m_elems[m_num_elems].SemanticName = "NORMAL";
- m_elems[m_num_elems].SemanticIndex = i;
- m_elems[m_num_elems].AlignedByteOffset = _vtx_decl.normal_offset[i];
- m_elems[m_num_elems].Format = VarToD3D(_vtx_decl.normal_gl_type, _vtx_decl.normal_gl_size);
- m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
- ++m_num_elems;
- }
- }
-
- for (int i = 0; i < 2; i++)
- {
- if (_vtx_decl.color_offset[i] > 0)
- {
- m_elems[m_num_elems].SemanticName = "COLOR";
- m_elems[m_num_elems].SemanticIndex = i;
- m_elems[m_num_elems].AlignedByteOffset = _vtx_decl.color_offset[i];
- m_elems[m_num_elems].Format = VarToD3D(_vtx_decl.color_gl_type, 4);
- m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
- ++m_num_elems;
- }
- }
-
- for (int i = 0; i < 8; i++)
- {
- if (_vtx_decl.texcoord_offset[i] > 0)
- {
- m_elems[m_num_elems].SemanticName = "TEXCOORD";
- m_elems[m_num_elems].SemanticIndex = i;
- m_elems[m_num_elems].AlignedByteOffset = _vtx_decl.texcoord_offset[i];
- m_elems[m_num_elems].Format = VarToD3D(_vtx_decl.texcoord_gl_type[i], _vtx_decl.texcoord_size[i]);
- m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
- ++m_num_elems;
- }
- }
-
- if (_vtx_decl.posmtx_offset != -1)
- {
- m_elems[m_num_elems].SemanticName = "BLENDINDICES";
- m_elems[m_num_elems].AlignedByteOffset = _vtx_decl.posmtx_offset;
- m_elems[m_num_elems].Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
- ++m_num_elems;
- }
-}
-
-void D3DVertexFormat::SetupVertexPointers() const
-{
- D3D::gfxstate->SetInputElements(m_elems, m_num_elems);
-}
-
-}
+
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+// Common
+#include "MemoryUtil.h"
+#include "x64Emitter.h"
+#include "ABI.h"
+
+// VideoCommon
+#include "Profiler.h"
+#include "CPMemory.h"
+#include "VertexShaderGen.h"
+#include "NativeVertexFormat.h"
+
+// DX11
+#include "DX11_D3DBase.h"
+#include "DX11_VertexShaderCache.h"
+#include "DX11_VertexManager.h"
+
+namespace DX11
+{
+
+class D3DVertexFormat : public NativeVertexFormat
+{
+ D3D11_INPUT_ELEMENT_DESC m_elems[32];
+ UINT m_num_elems;
+
+public:
+ D3DVertexFormat() : m_num_elems(0) {}
+ void Initialize(const PortableVertexDeclaration &_vtx_decl);
+ void SetupVertexPointers() const;
+};
+
+NativeVertexFormat* VertexManager::CreateNativeVertexFormat()
+{
+ return new D3DVertexFormat;
+}
+
+DXGI_FORMAT VarToD3D(VarType t, int size)
+{
+ DXGI_FORMAT retval = DXGI_FORMAT_UNKNOWN;
+ static const DXGI_FORMAT lookup1[5] = {
+ DXGI_FORMAT_R8_SNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R16_SNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R32_FLOAT
+ };
+ static const DXGI_FORMAT lookup2[5] = {
+ DXGI_FORMAT_R8G8_SNORM, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R16G16_SNORM, DXGI_FORMAT_R16G16_UNORM, DXGI_FORMAT_R32G32_FLOAT
+ };
+ static const DXGI_FORMAT lookup3[5] = {
+ DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R32G32B32_FLOAT
+ };
+ static const DXGI_FORMAT lookup4[5] = {
+ DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R16G16B16A16_SNORM, DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R32G32B32A32_FLOAT
+ };
+
+ switch (size)
+ {
+ case 1: retval = lookup1[t]; break;
+ case 2: retval = lookup2[t]; break;
+ case 3: retval = lookup3[t]; break;
+ case 4: retval = lookup4[t]; break;
+ default: break;
+ }
+ if (retval == DXGI_FORMAT_UNKNOWN)
+ {
+ PanicAlert("VarToD3D: Invalid type/size combo %i , %i", (int)t, size);
+ }
+ return retval;
+}
+
+void D3DVertexFormat::Initialize(const PortableVertexDeclaration &_vtx_decl)
+{
+ vertex_stride = _vtx_decl.stride;
+ memset(m_elems, 0, sizeof(m_elems));
+
+ m_elems[m_num_elems].SemanticName = "POSITION";
+ m_elems[m_num_elems].AlignedByteOffset = 0;
+ m_elems[m_num_elems].Format = DXGI_FORMAT_R32G32B32_FLOAT;
+ m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+ ++m_num_elems;
+
+ for (int i = 0; i < 3; i++)
+ {
+ if (_vtx_decl.normal_offset[i] > 0)
+ {
+ m_elems[m_num_elems].SemanticName = "NORMAL";
+ m_elems[m_num_elems].SemanticIndex = i;
+ m_elems[m_num_elems].AlignedByteOffset = _vtx_decl.normal_offset[i];
+ m_elems[m_num_elems].Format = VarToD3D(_vtx_decl.normal_gl_type, _vtx_decl.normal_gl_size);
+ m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+ ++m_num_elems;
+ }
+ }
+
+ for (int i = 0; i < 2; i++)
+ {
+ if (_vtx_decl.color_offset[i] > 0)
+ {
+ m_elems[m_num_elems].SemanticName = "COLOR";
+ m_elems[m_num_elems].SemanticIndex = i;
+ m_elems[m_num_elems].AlignedByteOffset = _vtx_decl.color_offset[i];
+ m_elems[m_num_elems].Format = VarToD3D(_vtx_decl.color_gl_type, 4);
+ m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+ ++m_num_elems;
+ }
+ }
+
+ for (int i = 0; i < 8; i++)
+ {
+ if (_vtx_decl.texcoord_offset[i] > 0)
+ {
+ m_elems[m_num_elems].SemanticName = "TEXCOORD";
+ m_elems[m_num_elems].SemanticIndex = i;
+ m_elems[m_num_elems].AlignedByteOffset = _vtx_decl.texcoord_offset[i];
+ m_elems[m_num_elems].Format = VarToD3D(_vtx_decl.texcoord_gl_type[i], _vtx_decl.texcoord_size[i]);
+ m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+ ++m_num_elems;
+ }
+ }
+
+ if (_vtx_decl.posmtx_offset != -1)
+ {
+ m_elems[m_num_elems].SemanticName = "BLENDINDICES";
+ m_elems[m_num_elems].AlignedByteOffset = _vtx_decl.posmtx_offset;
+ m_elems[m_num_elems].Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ m_elems[m_num_elems].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+ ++m_num_elems;
+ }
+}
+
+void D3DVertexFormat::SetupVertexPointers() const
+{
+ D3D::gfxstate->SetInputElements(m_elems, m_num_elems);
+}
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_PixelShaderCache.cpp b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_PixelShaderCache.cpp
index a017600c1f..64a710dbf7 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_PixelShaderCache.cpp
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_PixelShaderCache.cpp
@@ -1,306 +1,306 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-// Common
-#include "Common.h"
-#include "FileUtil.h"
-#include "LinearDiskCache.h"
-
-// VideoCommon
-#include "Statistics.h"
-#include "VideoConfig.h"
-#include "VertexLoader.h"
-#include "BPMemory.h"
-#include "XFMemory.h"
-#include "ImageWrite.h"
-#include "PixelShaderGen.h"
-#include "PixelShaderManager.h"
-
-// DX11
-#include "DX11_D3DBase.h"
-#include "DX11_D3DShader.h"
-#include "DX11_PixelShaderCache.h"
-
-#include
-
-#include "../Main.h"
-
-namespace DX11
-{
-
-PixelShaderCache::PSCache PixelShaderCache::PixelShaders;
-const PixelShaderCache::PSCacheEntry* PixelShaderCache::last_entry;
-
-LinearDiskCache g_ps_disk_cache;
-
-ID3D11PixelShader* s_ColorMatrixProgram = NULL;
-ID3D11PixelShader* s_ColorCopyProgram = NULL;
-ID3D11PixelShader* s_DepthMatrixProgram = NULL;
-ID3D11PixelShader* s_ClearProgram = NULL;
-
-const char clear_program_code[] = {
- "void main(\n"
- "out float4 ocol0 : SV_Target,\n"
- "in float4 pos : SV_Position,\n"
- "in float4 incol0 : COLOR0){\n"
- "ocol0 = incol0;\n"
- "}\n"
-};
-
-const char color_copy_program_code[] = {
- "sampler samp0 : register(s0);\n"
- "Texture2D Tex0 : register(t0);\n"
- "void main(\n"
- "out float4 ocol0 : SV_Target,\n"
- "in float4 pos : SV_Position,\n"
- "in float2 uv0 : TEXCOORD0){\n"
- "ocol0 = Tex0.Sample(samp0,uv0);\n"
- "}\n"
-};
-
-const char color_matrix_program_code[] = {
- "sampler samp0 : register(s0);\n"
- "Texture2D Tex0 : register(t0);\n"
- "uniform float4 cColMatrix[5] : register(c0);\n"
- "void main(\n"
- "out float4 ocol0 : SV_Target,\n"
- "in float4 pos : SV_Position,\n"
- " in float2 uv0 : TEXCOORD0){\n"
- "float4 texcol = Tex0.Sample(samp0,uv0);\n"
- "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n"
- "}\n"
-};
-
-const char depth_matrix_program[] = {
- "sampler samp0 : register(s0);\n"
- "Texture2D Tex0 : register(t0);\n"
- "uniform float4 cColMatrix[5] : register(c0);\n"
- "void main(\n"
- "out float4 ocol0 : SV_Target,\n"
- " in float4 pos : SV_Position,\n"
- " in float2 uv0 : TEXCOORD0){\n"
- "float4 texcol = Tex0.Sample(samp0,uv0);\n"
- "float4 EncodedDepth = frac((texcol.r * (16777215.0f/16777216.0f)) * float4(1.0f,255.0f,255.0f*255.0f,255.0f*255.0f*255.0f));\n"
- "texcol = float4((EncodedDepth.rgb * (16777216.0f/16777215.0f)),1.0f);\n"
- "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n"
- "}\n"
-};
-
-ID3D11PixelShader* PixelShaderCache::GetColorMatrixProgram()
-{
- return s_ColorMatrixProgram;
-}
-
-ID3D11PixelShader* PixelShaderCache::GetDepthMatrixProgram()
-{
- return s_DepthMatrixProgram;
-}
-
-ID3D11PixelShader* PixelShaderCache::GetColorCopyProgram()
-{
- return s_ColorCopyProgram;
-}
-
-ID3D11PixelShader* PixelShaderCache::GetClearProgram()
-{
- return s_ClearProgram;
-}
-
-// HACK to avoid some invasive VideoCommon changes
-// these values are hardcoded, they depend on internal D3DCompile behavior; TODO: Solve this with D3DReflect or something
-// offset given in floats, table index is float4
-unsigned int ps_constant_offset_table[] = {
- 0, 4, 8, 12, // C_COLORS, 16
- 16, 20, 24, 28, // C_KCOLORS, 16
- 32, // C_ALPHA, 4
- 36, 40, 44, 48, 52, 56, 60, 64, // C_TEXDIMS, 32
- 68, 72, // C_ZBIAS, 8
- 76, 80, // C_INDTEXSCALE, 8
- 84, 88, 92, 96, 100, 104, // C_INDTEXMTX, 24
- 108, 112, // C_FOG, 8
- 116, 120, 124 ,128, // C_COLORMATRIX, 16
- 132, 136, 140, 144, 148, // C_PLIGHTS0, 20
- 152, 156, 160, 164, 168, // C_PLIGHTS1, 20
- 172, 176, 180, 184, 188, // C_PLIGHTS2, 20
- 192, 196, 200, 204, 208, // C_PLIGHTS3, 20
- 212, 216, 220, 224, 228, // C_PLIGHTS4, 20
- 232, 236, 240, 244, 248, // C_PLIGHTS5, 20
- 252, 256, 260, 264, 268, // C_PLIGHTS6, 20
- 272, 276, 280, 284, 288, // C_PLIGHTS7, 20
- 292, 296, 300, 304, // C_PMATERIALS, 16
-};
-void PixelShaderCache::SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4)
-{
- D3D::gfxstate->psconstants[ps_constant_offset_table[const_number] ] = f1;
- D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]+1] = f2;
- D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]+2] = f3;
- D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]+3] = f4;
- D3D::gfxstate->pscbufchanged = true;
-}
-
-void PixelShaderCache::SetPSConstant4fv(unsigned int const_number, const float* f)
-{
- memcpy(&D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]], f, sizeof(float)*4);
- D3D::gfxstate->pscbufchanged = true;
-}
-
-void PixelShaderCache::SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float* f)
-{
- memcpy(&D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]], f, sizeof(float)*4*count);
- D3D::gfxstate->pscbufchanged = true;
-}
-
-// this class will load the precompiled shaders into our cache
-class PixelShaderCacheInserter : public LinearDiskCacheReader
-{
-public:
- void Read(const u8* key, int key_size, const u8* value, int value_size)
- {
- PIXELSHADERUID uid;
- if (key_size != sizeof(uid)) {
- ERROR_LOG(VIDEO, "Wrong key size in pixel shader cache");
- return;
- }
- memcpy(&uid, key, key_size);
- PixelShaderCache::InsertByteCode(uid, (void*)value, value_size);
- }
-};
-
-PixelShaderCache::PixelShaderCache()
-{
- // used when drawing clear quads
- s_ClearProgram = D3D::CompileAndCreatePixelShader(clear_program_code, sizeof(clear_program_code));
- CHECK(s_ClearProgram!=NULL, "Create clear pixel shader");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "clear pixel shader");
-
- // used when copying/resolving the color buffer
- s_ColorCopyProgram = D3D::CompileAndCreatePixelShader(color_copy_program_code, sizeof(color_copy_program_code));
- CHECK(s_ColorCopyProgram!=NULL, "Create color copy pixel shader");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "color copy pixel shader");
-
- // used for color conversion
- s_ColorMatrixProgram = D3D::CompileAndCreatePixelShader(color_matrix_program_code, sizeof(color_matrix_program_code));
- CHECK(s_ColorMatrixProgram!=NULL, "Create color matrix pixel shader");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "color matrix pixel shader");
-
- // used for depth copy
- s_DepthMatrixProgram = D3D::CompileAndCreatePixelShader(depth_matrix_program, sizeof(depth_matrix_program));
- CHECK(s_DepthMatrixProgram!=NULL, "Create depth matrix pixel shader");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "depth matrix pixel shader");
-
- Clear();
-
- if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX)))
- File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX));
-
- char cache_filename[MAX_PATH];
- sprintf(cache_filename, "%sdx11-%s-ps.cache", File::GetUserPath(D_SHADERCACHE_IDX), g_globals->unique_id);
- PixelShaderCacheInserter inserter;
- g_ps_disk_cache.OpenAndRead(cache_filename, &inserter);
-}
-
-// ONLY to be used during shutdown.
-void PixelShaderCache::Clear()
-{
- for (PSCache::iterator iter = PixelShaders.begin(); iter != PixelShaders.end(); iter++)
- iter->second.Destroy();
- PixelShaders.clear();
-}
-
-PixelShaderCache::~PixelShaderCache()
-{
- SAFE_RELEASE(s_ColorMatrixProgram);
- SAFE_RELEASE(s_ColorCopyProgram);
- SAFE_RELEASE(s_DepthMatrixProgram);
- SAFE_RELEASE(s_ClearProgram);
-
- Clear();
- g_ps_disk_cache.Sync();
- g_ps_disk_cache.Close();
-}
-
-bool PixelShaderCache::SetShader(bool dstAlpha)
-{
- PIXELSHADERUID uid;
- GetPixelShaderId(&uid, dstAlpha);
-
- // check if the shader is already set
- if (uid == last_pixel_shader_uid && PixelShaders[uid].frameCount == frameCount)
- {
- PSCache::const_iterator iter = PixelShaders.find(uid);
- return (iter != PixelShaders.end() && iter->second.shader);
- }
-
- memcpy(&last_pixel_shader_uid, &uid, sizeof(PIXELSHADERUID));
-
- // check if the shader is already in the cache
- PSCache::iterator iter = PixelShaders.find(uid);
- if (iter != PixelShaders.end())
- {
- iter->second.frameCount = frameCount;
- const PSCacheEntry &entry = iter->second;
- last_entry = &entry;
-
- D3D::gfxstate->SetPShader(entry.shader);
- return (entry.shader != NULL);
- }
-
- // need to compile a new shader
- const char* code = GeneratePixelShaderCode(dstAlpha, API_D3D11);
-
- D3DBlob* pbytecode;
- if (!D3D::CompilePixelShader(code, (unsigned int)strlen(code), &pbytecode))
- {
- PanicAlert("Failed to compile Pixel Shader:\n\n%s", code);
- return false;
- }
-
- // insert the bytecode into the caches
- g_ps_disk_cache.Append((u8*)&uid, sizeof(uid), (const u8*)pbytecode->Data(), pbytecode->Size());
- g_ps_disk_cache.Sync();
-
- bool result = InsertByteCode(uid, pbytecode->Data(), pbytecode->Size());
- D3D::gfxstate->SetPShader(last_entry->shader);
- pbytecode->Release();
- return result;
-}
-
-bool PixelShaderCache::InsertByteCode(const PIXELSHADERUID &uid, void* bytecode, unsigned int bytecodelen)
-{
- ID3D11PixelShader* shader = D3D::CreatePixelShaderFromByteCode(bytecode, bytecodelen);
- if (shader == NULL)
- {
- PanicAlert("Failed to create pixel shader at %s %d\n", __FILE__, __LINE__);
- return false;
- }
- // TODO: Somehow make the debug name a bit more specific
- D3D::SetDebugObjectName((ID3D11DeviceChild*)shader, "a pixel shader of PixelShaderCache");
-
- // make an entry in the table
- PSCacheEntry newentry;
- newentry.shader = shader;
- newentry.frameCount = frameCount;
- PixelShaders[uid] = newentry;
- last_entry = &PixelShaders[uid];
-
- INCSTAT(stats.numPixelShadersCreated);
- SETSTAT(stats.numPixelShadersAlive, PixelShaders.size());
-
- return true;
-}
-
-}
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+// Common
+#include "Common.h"
+#include "FileUtil.h"
+#include "LinearDiskCache.h"
+
+// VideoCommon
+#include "Statistics.h"
+#include "VideoConfig.h"
+#include "VertexLoader.h"
+#include "BPMemory.h"
+#include "XFMemory.h"
+#include "ImageWrite.h"
+#include "PixelShaderGen.h"
+#include "PixelShaderManager.h"
+
+// DX11
+#include "DX11_D3DBase.h"
+#include "DX11_D3DShader.h"
+#include "DX11_PixelShaderCache.h"
+
+#include
+
+#include "../Main.h"
+
+namespace DX11
+{
+
+PixelShaderCache::PSCache PixelShaderCache::PixelShaders;
+const PixelShaderCache::PSCacheEntry* PixelShaderCache::last_entry;
+
+LinearDiskCache g_ps_disk_cache;
+
+ID3D11PixelShader* s_ColorMatrixProgram = NULL;
+ID3D11PixelShader* s_ColorCopyProgram = NULL;
+ID3D11PixelShader* s_DepthMatrixProgram = NULL;
+ID3D11PixelShader* s_ClearProgram = NULL;
+
+const char clear_program_code[] = {
+ "void main(\n"
+ "out float4 ocol0 : SV_Target,\n"
+ "in float4 pos : SV_Position,\n"
+ "in float4 incol0 : COLOR0){\n"
+ "ocol0 = incol0;\n"
+ "}\n"
+};
+
+const char color_copy_program_code[] = {
+ "sampler samp0 : register(s0);\n"
+ "Texture2D Tex0 : register(t0);\n"
+ "void main(\n"
+ "out float4 ocol0 : SV_Target,\n"
+ "in float4 pos : SV_Position,\n"
+ "in float2 uv0 : TEXCOORD0){\n"
+ "ocol0 = Tex0.Sample(samp0,uv0);\n"
+ "}\n"
+};
+
+const char color_matrix_program_code[] = {
+ "sampler samp0 : register(s0);\n"
+ "Texture2D Tex0 : register(t0);\n"
+ "uniform float4 cColMatrix[5] : register(c0);\n"
+ "void main(\n"
+ "out float4 ocol0 : SV_Target,\n"
+ "in float4 pos : SV_Position,\n"
+ " in float2 uv0 : TEXCOORD0){\n"
+ "float4 texcol = Tex0.Sample(samp0,uv0);\n"
+ "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n"
+ "}\n"
+};
+
+const char depth_matrix_program[] = {
+ "sampler samp0 : register(s0);\n"
+ "Texture2D Tex0 : register(t0);\n"
+ "uniform float4 cColMatrix[5] : register(c0);\n"
+ "void main(\n"
+ "out float4 ocol0 : SV_Target,\n"
+ " in float4 pos : SV_Position,\n"
+ " in float2 uv0 : TEXCOORD0){\n"
+ "float4 texcol = Tex0.Sample(samp0,uv0);\n"
+ "float4 EncodedDepth = frac((texcol.r * (16777215.0f/16777216.0f)) * float4(1.0f,255.0f,255.0f*255.0f,255.0f*255.0f*255.0f));\n"
+ "texcol = float4((EncodedDepth.rgb * (16777216.0f/16777215.0f)),1.0f);\n"
+ "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n"
+ "}\n"
+};
+
+ID3D11PixelShader* PixelShaderCache::GetColorMatrixProgram()
+{
+ return s_ColorMatrixProgram;
+}
+
+ID3D11PixelShader* PixelShaderCache::GetDepthMatrixProgram()
+{
+ return s_DepthMatrixProgram;
+}
+
+ID3D11PixelShader* PixelShaderCache::GetColorCopyProgram()
+{
+ return s_ColorCopyProgram;
+}
+
+ID3D11PixelShader* PixelShaderCache::GetClearProgram()
+{
+ return s_ClearProgram;
+}
+
+// HACK to avoid some invasive VideoCommon changes
+// these values are hardcoded, they depend on internal D3DCompile behavior; TODO: Solve this with D3DReflect or something
+// offset given in floats, table index is float4
+unsigned int ps_constant_offset_table[] = {
+ 0, 4, 8, 12, // C_COLORS, 16
+ 16, 20, 24, 28, // C_KCOLORS, 16
+ 32, // C_ALPHA, 4
+ 36, 40, 44, 48, 52, 56, 60, 64, // C_TEXDIMS, 32
+ 68, 72, // C_ZBIAS, 8
+ 76, 80, // C_INDTEXSCALE, 8
+ 84, 88, 92, 96, 100, 104, // C_INDTEXMTX, 24
+ 108, 112, // C_FOG, 8
+ 116, 120, 124 ,128, // C_COLORMATRIX, 16
+ 132, 136, 140, 144, 148, // C_PLIGHTS0, 20
+ 152, 156, 160, 164, 168, // C_PLIGHTS1, 20
+ 172, 176, 180, 184, 188, // C_PLIGHTS2, 20
+ 192, 196, 200, 204, 208, // C_PLIGHTS3, 20
+ 212, 216, 220, 224, 228, // C_PLIGHTS4, 20
+ 232, 236, 240, 244, 248, // C_PLIGHTS5, 20
+ 252, 256, 260, 264, 268, // C_PLIGHTS6, 20
+ 272, 276, 280, 284, 288, // C_PLIGHTS7, 20
+ 292, 296, 300, 304, // C_PMATERIALS, 16
+};
+void PixelShaderCache::SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4)
+{
+ D3D::gfxstate->psconstants[ps_constant_offset_table[const_number] ] = f1;
+ D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]+1] = f2;
+ D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]+2] = f3;
+ D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]+3] = f4;
+ D3D::gfxstate->pscbufchanged = true;
+}
+
+void PixelShaderCache::SetPSConstant4fv(unsigned int const_number, const float* f)
+{
+ memcpy(&D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]], f, sizeof(float)*4);
+ D3D::gfxstate->pscbufchanged = true;
+}
+
+void PixelShaderCache::SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float* f)
+{
+ memcpy(&D3D::gfxstate->psconstants[ps_constant_offset_table[const_number]], f, sizeof(float)*4*count);
+ D3D::gfxstate->pscbufchanged = true;
+}
+
+// this class will load the precompiled shaders into our cache
+class PixelShaderCacheInserter : public LinearDiskCacheReader
+{
+public:
+ void Read(const u8* key, int key_size, const u8* value, int value_size)
+ {
+ PIXELSHADERUID uid;
+ if (key_size != sizeof(uid)) {
+ ERROR_LOG(VIDEO, "Wrong key size in pixel shader cache");
+ return;
+ }
+ memcpy(&uid, key, key_size);
+ PixelShaderCache::InsertByteCode(uid, (void*)value, value_size);
+ }
+};
+
+PixelShaderCache::PixelShaderCache()
+{
+ // used when drawing clear quads
+ s_ClearProgram = D3D::CompileAndCreatePixelShader(clear_program_code, sizeof(clear_program_code));
+ CHECK(s_ClearProgram!=NULL, "Create clear pixel shader");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "clear pixel shader");
+
+ // used when copying/resolving the color buffer
+ s_ColorCopyProgram = D3D::CompileAndCreatePixelShader(color_copy_program_code, sizeof(color_copy_program_code));
+ CHECK(s_ColorCopyProgram!=NULL, "Create color copy pixel shader");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "color copy pixel shader");
+
+ // used for color conversion
+ s_ColorMatrixProgram = D3D::CompileAndCreatePixelShader(color_matrix_program_code, sizeof(color_matrix_program_code));
+ CHECK(s_ColorMatrixProgram!=NULL, "Create color matrix pixel shader");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "color matrix pixel shader");
+
+ // used for depth copy
+ s_DepthMatrixProgram = D3D::CompileAndCreatePixelShader(depth_matrix_program, sizeof(depth_matrix_program));
+ CHECK(s_DepthMatrixProgram!=NULL, "Create depth matrix pixel shader");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "depth matrix pixel shader");
+
+ Clear();
+
+ if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX)))
+ File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX));
+
+ char cache_filename[MAX_PATH];
+ sprintf(cache_filename, "%sdx11-%s-ps.cache", File::GetUserPath(D_SHADERCACHE_IDX), g_globals->unique_id);
+ PixelShaderCacheInserter inserter;
+ g_ps_disk_cache.OpenAndRead(cache_filename, &inserter);
+}
+
+// ONLY to be used during shutdown.
+void PixelShaderCache::Clear()
+{
+ for (PSCache::iterator iter = PixelShaders.begin(); iter != PixelShaders.end(); iter++)
+ iter->second.Destroy();
+ PixelShaders.clear();
+}
+
+PixelShaderCache::~PixelShaderCache()
+{
+ SAFE_RELEASE(s_ColorMatrixProgram);
+ SAFE_RELEASE(s_ColorCopyProgram);
+ SAFE_RELEASE(s_DepthMatrixProgram);
+ SAFE_RELEASE(s_ClearProgram);
+
+ Clear();
+ g_ps_disk_cache.Sync();
+ g_ps_disk_cache.Close();
+}
+
+bool PixelShaderCache::SetShader(bool dstAlpha)
+{
+ PIXELSHADERUID uid;
+ GetPixelShaderId(&uid, dstAlpha);
+
+ // check if the shader is already set
+ if (uid == last_pixel_shader_uid && PixelShaders[uid].frameCount == frameCount)
+ {
+ PSCache::const_iterator iter = PixelShaders.find(uid);
+ return (iter != PixelShaders.end() && iter->second.shader);
+ }
+
+ memcpy(&last_pixel_shader_uid, &uid, sizeof(PIXELSHADERUID));
+
+ // check if the shader is already in the cache
+ PSCache::iterator iter = PixelShaders.find(uid);
+ if (iter != PixelShaders.end())
+ {
+ iter->second.frameCount = frameCount;
+ const PSCacheEntry &entry = iter->second;
+ last_entry = &entry;
+
+ D3D::gfxstate->SetPShader(entry.shader);
+ return (entry.shader != NULL);
+ }
+
+ // need to compile a new shader
+ const char* code = GeneratePixelShaderCode(dstAlpha, API_D3D11);
+
+ D3DBlob* pbytecode;
+ if (!D3D::CompilePixelShader(code, (unsigned int)strlen(code), &pbytecode))
+ {
+ PanicAlert("Failed to compile Pixel Shader:\n\n%s", code);
+ return false;
+ }
+
+ // insert the bytecode into the caches
+ g_ps_disk_cache.Append((u8*)&uid, sizeof(uid), (const u8*)pbytecode->Data(), pbytecode->Size());
+ g_ps_disk_cache.Sync();
+
+ bool result = InsertByteCode(uid, pbytecode->Data(), pbytecode->Size());
+ D3D::gfxstate->SetPShader(last_entry->shader);
+ pbytecode->Release();
+ return result;
+}
+
+bool PixelShaderCache::InsertByteCode(const PIXELSHADERUID &uid, void* bytecode, unsigned int bytecodelen)
+{
+ ID3D11PixelShader* shader = D3D::CreatePixelShaderFromByteCode(bytecode, bytecodelen);
+ if (shader == NULL)
+ {
+ PanicAlert("Failed to create pixel shader at %s %d\n", __FILE__, __LINE__);
+ return false;
+ }
+ // TODO: Somehow make the debug name a bit more specific
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)shader, "a pixel shader of PixelShaderCache");
+
+ // make an entry in the table
+ PSCacheEntry newentry;
+ newentry.shader = shader;
+ newentry.frameCount = frameCount;
+ PixelShaders[uid] = newentry;
+ last_entry = &PixelShaders[uid];
+
+ INCSTAT(stats.numPixelShadersCreated);
+ SETSTAT(stats.numPixelShadersAlive, PixelShaders.size());
+
+ return true;
+}
+
+}
diff --git a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_PixelShaderCache.h b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_PixelShaderCache.h
index 05f7ea12ca..6735d4d30a 100644
--- a/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_PixelShaderCache.h
+++ b/Source/Plugins/Plugin_VideoMerge/Src/DX11/DX11_PixelShaderCache.h
@@ -1,74 +1,74 @@
-// Copyright (C) 2003 Dolphin Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#pragma once
-
-#include