diff options
| author | Jules Blok <jules.blok@gmail.com> | 2014-11-23 02:13:25 +0100 |
|---|---|---|
| committer | Jules Blok <jules.blok@gmail.com> | 2014-12-14 13:28:46 +0100 |
| commit | 3355d8086dc449c7d0325273eafcc999cfc649ee (patch) | |
| tree | cb652b7e1dd44faf2dad13e126a5631ca4fb0d04 /Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp | |
| parent | 799697ad8095fcb364bdbd5e9c49a8adb8beda8d (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.cpp | 41 |
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(); |
