summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp
diff options
context:
space:
mode:
authorJules Blok <jules.blok@gmail.com>2014-11-23 02:13:25 +0100
committerJules Blok <jules.blok@gmail.com>2014-12-14 13:28:46 +0100
commit3355d8086dc449c7d0325273eafcc999cfc649ee (patch)
treecb652b7e1dd44faf2dad13e126a5631ca4fb0d04 /Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp
parent799697ad8095fcb364bdbd5e9c49a8adb8beda8d (diff)
D3DUtil: Use a geometry shader to clear all slices.
Diffstat (limited to 'Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp')
-rw-r--r--Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp b/Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp
index a7bc1a470e..087428a200 100644
--- a/Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp
+++ b/Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp
@@ -27,8 +27,12 @@ const GeometryShaderCache::GSCacheEntry* GeometryShaderCache::last_entry;
GeometryShaderUid GeometryShaderCache::last_uid;
UidChecker<GeometryShaderUid,ShaderCode> GeometryShaderCache::geometry_uid_checker;
+ID3D11GeometryShader* ClearGeometryShader = nullptr;
+
LinearDiskCache<GeometryShaderUid, u8> g_gs_disk_cache;
+ID3D11GeometryShader* GeometryShaderCache::GetClearGeometryShader() { return ClearGeometryShader; }
+
ID3D11Buffer* gscbuf = nullptr;
// this class will load the precompiled shaders into our cache
@@ -41,8 +45,43 @@ public:
}
};
+const char clear_shader_code[] = {
+ "struct VSOUTPUT\n"
+ "{\n"
+ "float4 vPosition : POSITION;\n"
+ "float4 vColor0 : COLOR0;\n"
+ "};\n"
+ "struct GSOUTPUT\n"
+ "{\n"
+ "float4 vPosition : POSITION;\n"
+ "float4 vColor0 : COLOR0;\n"
+ "uint slice : SV_RenderTargetArrayIndex;\n"
+ "};\n"
+ "[maxvertexcount(6)]\n"
+ "void main(triangle VSOUTPUT o[3], inout TriangleStream<GSOUTPUT> Output)\n"
+ "{\n"
+ "for(int slice = 0; slice < 2; slice++)\n"
+ "{\n"
+ "for(int i = 0; i < 3; i++)\n"
+ "{\n"
+ "GSOUTPUT OUT;\n"
+ "OUT.vPosition = o[i].vPosition;\n"
+ "OUT.vColor0 = o[i].vColor0;\n"
+ "OUT.slice = slice;\n"
+ "Output.Append(OUT);\n"
+ "}\n"
+ "Output.RestartStrip();\n"
+ "}\n"
+ "}\n"
+};
+
void GeometryShaderCache::Init()
{
+ // used when drawing clear quads
+ ClearGeometryShader = D3D::CompileAndCreateGeometryShader(clear_shader_code);
+ CHECK(ClearGeometryShader != nullptr, "Create clear geometry shader");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)ClearGeometryShader, "clear geometry shader");
+
Clear();
if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX)))
@@ -72,6 +111,8 @@ void GeometryShaderCache::Clear()
void GeometryShaderCache::Shutdown()
{
+ SAFE_RELEASE(ClearGeometryShader);
+
Clear();
g_gs_disk_cache.Sync();
g_gs_disk_cache.Close();