Dynamic Texture Cache (WIP)

This commit is contained in:
MaxLastBreath 2024-09-12 07:32:49 +03:00
parent 579404df68
commit ab03806257
6 changed files with 316 additions and 8 deletions

View File

@ -71,6 +71,8 @@ namespace Ryujinx.Graphics.GAL
public readonly int GatherBiasPrecision;
public readonly ulong MaximumGpuMemory;
public Capabilities(
TargetApi api,
string vendorName,
@ -131,7 +133,8 @@ namespace Ryujinx.Graphics.GAL
int shaderSubgroupSize,
int storageBufferOffsetAlignment,
int textureBufferOffsetAlignment,
int gatherBiasPrecision)
int gatherBiasPrecision,
ulong maximumGpuMemory)
{
Api = api;
VendorName = vendorName;
@ -193,6 +196,7 @@ namespace Ryujinx.Graphics.GAL
StorageBufferOffsetAlignment = storageBufferOffsetAlignment;
TextureBufferOffsetAlignment = textureBufferOffsetAlignment;
GatherBiasPrecision = gatherBiasPrecision;
MaximumGpuMemory = maximumGpuMemory;
}
}
}

View File

@ -1,5 +1,7 @@
using Ryujinx.Graphics.GAL;
using System.Collections;
using System.Collections.Generic;
using Ryujinx.Common.Logging;
namespace Ryujinx.Graphics.Gpu.Image
{
@ -46,7 +48,6 @@ namespace Ryujinx.Graphics.Gpu.Image
{
private const int MinCountForDeletion = 32;
private const int MaxCapacity = 2048;
private const ulong MaxTextureSizeCapacity = 4096L * 1024 * 1024; // MB;
private readonly LinkedList<Texture> _textures;
private ulong _totalSize;
@ -55,12 +56,32 @@ namespace Ryujinx.Graphics.Gpu.Image
private HashSet<ShortTextureCacheEntry> _shortCache;
private readonly Dictionary<TextureDescriptor, ShortTextureCacheEntry> _shortCacheLookup;
private readonly GpuContext _context;
/// <summary>
/// Gets MaxTextureCapacity dynamically.
/// </summary>
private ulong GetMaxTextureCapacity() {
Capabilities capabilities = _context.Capabilities;
if (capabilities.MaximumGpuMemory <= 0)
{
return 1024L * 1024 * 1024;
}
else
{
return capabilities.MaximumGpuMemory / 2;
}
}
/// <summary>
/// Creates a new instance of the automatic deletion cache.
/// </summary>
public AutoDeleteCache()
public AutoDeleteCache(GpuContext _Context)
{
_context = _Context;
_textures = new LinkedList<Texture>();
_shortCacheBuilder = new HashSet<ShortTextureCacheEntry>();
@ -85,7 +106,7 @@ namespace Ryujinx.Graphics.Gpu.Image
texture.CacheNode = _textures.AddLast(texture);
if (_textures.Count > MaxCapacity ||
(_totalSize > MaxTextureSizeCapacity && _textures.Count >= MinCountForDeletion))
(_totalSize > GetMaxTextureCapacity() && _textures.Count >= MinCountForDeletion))
{
RemoveLeastUsedTexture();
}
@ -110,7 +131,7 @@ namespace Ryujinx.Graphics.Gpu.Image
_textures.AddLast(texture.CacheNode);
}
if (_totalSize > MaxTextureSizeCapacity && _textures.Count >= MinCountForDeletion)
if (_totalSize > GetMaxTextureCapacity() && _textures.Count >= MinCountForDeletion)
{
RemoveLeastUsedTexture();
}

View File

@ -65,7 +65,7 @@ namespace Ryujinx.Graphics.Gpu.Image
_textureOverlaps = new Texture[OverlapsBufferInitialCapacity];
_overlapInfo = new OverlapInfo[OverlapsBufferInitialCapacity];
_cache = new AutoDeleteCache();
_cache = new AutoDeleteCache(_context);
}
/// <summary>

View File

@ -202,7 +202,8 @@ namespace Ryujinx.Graphics.OpenGL
shaderSubgroupSize: Constants.MaxSubgroupSize,
storageBufferOffsetAlignment: HwCapabilities.StorageBufferOffsetAlignment,
textureBufferOffsetAlignment: HwCapabilities.TextureBufferOffsetAlignment,
gatherBiasPrecision: intelWindows || amdWindows ? 8 : 0); // Precision is 8 for these vendors on Vulkan.
gatherBiasPrecision: intelWindows || amdWindows ? 8 : 0, // Precision is 8 for these vendors on Vulkan.
maximumGpuMemory : 0);
}
public void SetBufferData(BufferHandle buffer, int offset, ReadOnlySpan<byte> data)

View File

@ -781,7 +781,30 @@ namespace Ryujinx.Graphics.Vulkan
shaderSubgroupSize: (int)Capabilities.SubgroupSize,
storageBufferOffsetAlignment: (int)limits.MinStorageBufferOffsetAlignment,
textureBufferOffsetAlignment: (int)limits.MinTexelBufferOffsetAlignment,
gatherBiasPrecision: IsIntelWindows || IsAmdWindows ? (int)Capabilities.SubTexelPrecisionBits : 0);
gatherBiasPrecision: IsIntelWindows || IsAmdWindows ? (int)Capabilities.SubTexelPrecisionBits : 0,
maximumGpuMemory: GetTotalGPUMemory());
}
public ulong GetTotalGPUMemory(){
ulong totalMemory = 0;
PhysicalDeviceMemoryProperties memoryProperties;
Api.GetPhysicalDeviceMemoryProperties(_physicalDevice.PhysicalDevice, out memoryProperties);
for (int i = 0; i < memoryProperties.MemoryHeapCount; i++)
{
var heap = memoryProperties.MemoryHeaps[i];
if ((heap.Flags & MemoryHeapFlags.DeviceLocalBit) == MemoryHeapFlags.DeviceLocalBit)
{
totalMemory += heap.Size;
}
}
Logger.Info?.Print(LogClass.Gpu, $"GPU Memory: {totalMemory / (1024 * 1024)} MB");
return totalMemory;
}
public HardwareInfo GetHardwareInfo()

259
src/src.sln Normal file
View File

@ -0,0 +1,259 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.002.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ARMeilleure", "ARMeilleure\ARMeilleure.csproj", "{BE631816-E41F-49FC-9CBD-93CCA5FB6454}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "Ryujinx\Ryujinx.csproj", "{0E045C62-10EE-40ED-AA27-8111A74A4E56}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio", "Ryujinx.Audio\Ryujinx.Audio.csproj", "{062DFCCD-4025-4668-B4D3-BB390A3B545B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio.Backends.OpenAL", "Ryujinx.Audio.Backends.OpenAL\Ryujinx.Audio.Backends.OpenAL.csproj", "{A55A879C-2024-4021-933A-9C06A04684CD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio.Backends.SDL2", "Ryujinx.Audio.Backends.SDL2\Ryujinx.Audio.Backends.SDL2.csproj", "{29B56566-813F-4E51-A4EA-A5E5476AE700}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio.Backends.SoundIo", "Ryujinx.Audio.Backends.SoundIo\Ryujinx.Audio.Backends.SoundIo.csproj", "{244C9E21-9F8B-414E-B6B4-3205DF1D575D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Common", "Ryujinx.Common\Ryujinx.Common.csproj", "{AFAE9648-32DC-49DC-9F3C-B54EC2685E83}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Cpu", "Ryujinx.Cpu\Ryujinx.Cpu.csproj", "{14ADB075-BCCE-4714-80F8-4467A9A638E2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Device", "Ryujinx.Graphics.Device\Ryujinx.Graphics.Device.csproj", "{76B465C1-3892-434C-8E74-46375CE271B7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.GAL", "Ryujinx.Graphics.GAL\Ryujinx.Graphics.GAL.csproj", "{69E343BF-88F0-48B6-9425-093C3014D448}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Gpu", "Ryujinx.Graphics.Gpu\Ryujinx.Graphics.Gpu.csproj", "{613D8AF9-E8B7-472A-9D6B-36E24D15E012}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Host1x", "Ryujinx.Graphics.Host1x\Ryujinx.Graphics.Host1x.csproj", "{8ED88F92-245A-4C9D-9244-70065E4D8DB3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec", "Ryujinx.Graphics.Nvdec\Ryujinx.Graphics.Nvdec.csproj", "{8E5533FC-9CC4-4C00-9A97-686F61B20395}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.FFmpeg", "Ryujinx.Graphics.Nvdec.FFmpeg\Ryujinx.Graphics.Nvdec.FFmpeg.csproj", "{D11F7275-16E9-4944-80E7-AF97F5CB719E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.Vp9", "Ryujinx.Graphics.Nvdec.Vp9\Ryujinx.Graphics.Nvdec.Vp9.csproj", "{1CDA4236-CD6C-46B5-8D4E-4AF7B9142D23}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.OpenGL", "Ryujinx.Graphics.OpenGL\Ryujinx.Graphics.OpenGL.csproj", "{6EEC7CDE-C440-4A9F-9480-758AAF17EB79}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Shader", "Ryujinx.Graphics.Shader\Ryujinx.Graphics.Shader.csproj", "{3621AABE-4325-4399-A632-A598450B097A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Texture", "Ryujinx.Graphics.Texture\Ryujinx.Graphics.Texture.csproj", "{7B112D73-204F-4639-BECF-FDE04127D7AA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Vic", "Ryujinx.Graphics.Vic\Ryujinx.Graphics.Vic.csproj", "{966B18AF-05D4-4701-8471-D9693DE84A93}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Video", "Ryujinx.Graphics.Video\Ryujinx.Graphics.Video.csproj", "{3CCB3BCE-7E54-4821-9C90-4A2EA054A615}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Vulkan", "Ryujinx.Graphics.Vulkan\Ryujinx.Graphics.Vulkan.csproj", "{93608327-4A6B-47CA-AB30-894D68D09FED}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Gtk3", "Ryujinx.Gtk3\Ryujinx.Gtk3.csproj", "{E7998D97-F1FD-4BE1-AF4B-F4D0DCAE3E2A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Headless.SDL2", "Ryujinx.Headless.SDL2\Ryujinx.Headless.SDL2.csproj", "{0BEA8C4C-09C8-42E7-BB6C-716AD62259F0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE", "Ryujinx.HLE\Ryujinx.HLE.csproj", "{CF14B6B2-5853-43F6-A153-07D0425AF061}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{8EA2A119-436A-4187-96F3-A49F40ECF730}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon", "Ryujinx.Horizon\Ryujinx.Horizon.csproj", "{30112B27-8194-4B8A-9289-D4364A472107}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Common", "Ryujinx.Horizon.Common\Ryujinx.Horizon.Common.csproj", "{A892DFA6-74FE-449B-8E18-552C252C8A0E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Generators", "Ryujinx.Horizon.Generators\Ryujinx.Horizon.Generators.csproj", "{339A51F8-72F9-4914-9EB3-BB4C8E839A27}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Generators", "Ryujinx.Horizon.Kernel.Generators\Ryujinx.Horizon.Kernel.Generators.csproj", "{7CF25E42-232E-407C-B6CD-A1FDD4715762}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Input", "Ryujinx.Input\Ryujinx.Input.csproj", "{9328882E-408C-48C9-B349-48047E585C96}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Input.SDL2", "Ryujinx.Input.SDL2\Ryujinx.Input.SDL2.csproj", "{C9AC0437-8CBE-4054-82A4-4B4549F6595C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Memory", "Ryujinx.Memory\Ryujinx.Memory.csproj", "{B1FFD8B1-07F3-4F7F-9CAE-4FB600E7BA3B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.SDL2.Common", "Ryujinx.SDL2.Common\Ryujinx.SDL2.Common.csproj", "{38BDC98E-DDCF-4D7A-AD4A-E00120908B1D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.ShaderTools", "Ryujinx.ShaderTools\Ryujinx.ShaderTools.csproj", "{D41DB78A-E9BE-4B59-9851-915F870E2361}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Tests", "Ryujinx.Tests\Ryujinx.Tests.csproj", "{BD2FB9DF-791C-4271-BE51-B817902563BB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Tests.Memory", "Ryujinx.Tests.Memory\Ryujinx.Tests.Memory.csproj", "{76AFA1E6-3EED-4390-969A-C6BAA6D0E08E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Tests.Unicorn", "Ryujinx.Tests.Unicorn\Ryujinx.Tests.Unicorn.csproj", "{1A1D6863-A647-4406-BCA6-7997ABCD58C9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.UI.Common", "Ryujinx.UI.Common\Ryujinx.UI.Common.csproj", "{32D1A1D2-3D64-4B46-9512-364FFD43E30F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.UI.LocaleGenerator", "Ryujinx.UI.LocaleGenerator\Ryujinx.UI.LocaleGenerator.csproj", "{E9BBF6D2-C791-4ACA-A009-1290DB78A270}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spv.Generator", "Spv.Generator\Spv.Generator.csproj", "{63485F0E-A78F-44ED-9C46-CB542CC4AB02}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BE631816-E41F-49FC-9CBD-93CCA5FB6454}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE631816-E41F-49FC-9CBD-93CCA5FB6454}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BE631816-E41F-49FC-9CBD-93CCA5FB6454}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE631816-E41F-49FC-9CBD-93CCA5FB6454}.Release|Any CPU.Build.0 = Release|Any CPU
{0E045C62-10EE-40ED-AA27-8111A74A4E56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E045C62-10EE-40ED-AA27-8111A74A4E56}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E045C62-10EE-40ED-AA27-8111A74A4E56}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E045C62-10EE-40ED-AA27-8111A74A4E56}.Release|Any CPU.Build.0 = Release|Any CPU
{062DFCCD-4025-4668-B4D3-BB390A3B545B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{062DFCCD-4025-4668-B4D3-BB390A3B545B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{062DFCCD-4025-4668-B4D3-BB390A3B545B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{062DFCCD-4025-4668-B4D3-BB390A3B545B}.Release|Any CPU.Build.0 = Release|Any CPU
{A55A879C-2024-4021-933A-9C06A04684CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A55A879C-2024-4021-933A-9C06A04684CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A55A879C-2024-4021-933A-9C06A04684CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A55A879C-2024-4021-933A-9C06A04684CD}.Release|Any CPU.Build.0 = Release|Any CPU
{29B56566-813F-4E51-A4EA-A5E5476AE700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{29B56566-813F-4E51-A4EA-A5E5476AE700}.Debug|Any CPU.Build.0 = Debug|Any CPU
{29B56566-813F-4E51-A4EA-A5E5476AE700}.Release|Any CPU.ActiveCfg = Release|Any CPU
{29B56566-813F-4E51-A4EA-A5E5476AE700}.Release|Any CPU.Build.0 = Release|Any CPU
{244C9E21-9F8B-414E-B6B4-3205DF1D575D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{244C9E21-9F8B-414E-B6B4-3205DF1D575D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{244C9E21-9F8B-414E-B6B4-3205DF1D575D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{244C9E21-9F8B-414E-B6B4-3205DF1D575D}.Release|Any CPU.Build.0 = Release|Any CPU
{AFAE9648-32DC-49DC-9F3C-B54EC2685E83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFAE9648-32DC-49DC-9F3C-B54EC2685E83}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFAE9648-32DC-49DC-9F3C-B54EC2685E83}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFAE9648-32DC-49DC-9F3C-B54EC2685E83}.Release|Any CPU.Build.0 = Release|Any CPU
{14ADB075-BCCE-4714-80F8-4467A9A638E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{14ADB075-BCCE-4714-80F8-4467A9A638E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{14ADB075-BCCE-4714-80F8-4467A9A638E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{14ADB075-BCCE-4714-80F8-4467A9A638E2}.Release|Any CPU.Build.0 = Release|Any CPU
{76B465C1-3892-434C-8E74-46375CE271B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76B465C1-3892-434C-8E74-46375CE271B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76B465C1-3892-434C-8E74-46375CE271B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76B465C1-3892-434C-8E74-46375CE271B7}.Release|Any CPU.Build.0 = Release|Any CPU
{69E343BF-88F0-48B6-9425-093C3014D448}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{69E343BF-88F0-48B6-9425-093C3014D448}.Debug|Any CPU.Build.0 = Debug|Any CPU
{69E343BF-88F0-48B6-9425-093C3014D448}.Release|Any CPU.ActiveCfg = Release|Any CPU
{69E343BF-88F0-48B6-9425-093C3014D448}.Release|Any CPU.Build.0 = Release|Any CPU
{613D8AF9-E8B7-472A-9D6B-36E24D15E012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{613D8AF9-E8B7-472A-9D6B-36E24D15E012}.Debug|Any CPU.Build.0 = Debug|Any CPU
{613D8AF9-E8B7-472A-9D6B-36E24D15E012}.Release|Any CPU.ActiveCfg = Release|Any CPU
{613D8AF9-E8B7-472A-9D6B-36E24D15E012}.Release|Any CPU.Build.0 = Release|Any CPU
{8ED88F92-245A-4C9D-9244-70065E4D8DB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8ED88F92-245A-4C9D-9244-70065E4D8DB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8ED88F92-245A-4C9D-9244-70065E4D8DB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8ED88F92-245A-4C9D-9244-70065E4D8DB3}.Release|Any CPU.Build.0 = Release|Any CPU
{8E5533FC-9CC4-4C00-9A97-686F61B20395}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8E5533FC-9CC4-4C00-9A97-686F61B20395}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8E5533FC-9CC4-4C00-9A97-686F61B20395}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8E5533FC-9CC4-4C00-9A97-686F61B20395}.Release|Any CPU.Build.0 = Release|Any CPU
{D11F7275-16E9-4944-80E7-AF97F5CB719E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D11F7275-16E9-4944-80E7-AF97F5CB719E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D11F7275-16E9-4944-80E7-AF97F5CB719E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D11F7275-16E9-4944-80E7-AF97F5CB719E}.Release|Any CPU.Build.0 = Release|Any CPU
{1CDA4236-CD6C-46B5-8D4E-4AF7B9142D23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1CDA4236-CD6C-46B5-8D4E-4AF7B9142D23}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CDA4236-CD6C-46B5-8D4E-4AF7B9142D23}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1CDA4236-CD6C-46B5-8D4E-4AF7B9142D23}.Release|Any CPU.Build.0 = Release|Any CPU
{6EEC7CDE-C440-4A9F-9480-758AAF17EB79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6EEC7CDE-C440-4A9F-9480-758AAF17EB79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6EEC7CDE-C440-4A9F-9480-758AAF17EB79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6EEC7CDE-C440-4A9F-9480-758AAF17EB79}.Release|Any CPU.Build.0 = Release|Any CPU
{3621AABE-4325-4399-A632-A598450B097A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3621AABE-4325-4399-A632-A598450B097A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3621AABE-4325-4399-A632-A598450B097A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3621AABE-4325-4399-A632-A598450B097A}.Release|Any CPU.Build.0 = Release|Any CPU
{7B112D73-204F-4639-BECF-FDE04127D7AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B112D73-204F-4639-BECF-FDE04127D7AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B112D73-204F-4639-BECF-FDE04127D7AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B112D73-204F-4639-BECF-FDE04127D7AA}.Release|Any CPU.Build.0 = Release|Any CPU
{966B18AF-05D4-4701-8471-D9693DE84A93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{966B18AF-05D4-4701-8471-D9693DE84A93}.Debug|Any CPU.Build.0 = Debug|Any CPU
{966B18AF-05D4-4701-8471-D9693DE84A93}.Release|Any CPU.ActiveCfg = Release|Any CPU
{966B18AF-05D4-4701-8471-D9693DE84A93}.Release|Any CPU.Build.0 = Release|Any CPU
{3CCB3BCE-7E54-4821-9C90-4A2EA054A615}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3CCB3BCE-7E54-4821-9C90-4A2EA054A615}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3CCB3BCE-7E54-4821-9C90-4A2EA054A615}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3CCB3BCE-7E54-4821-9C90-4A2EA054A615}.Release|Any CPU.Build.0 = Release|Any CPU
{93608327-4A6B-47CA-AB30-894D68D09FED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{93608327-4A6B-47CA-AB30-894D68D09FED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{93608327-4A6B-47CA-AB30-894D68D09FED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{93608327-4A6B-47CA-AB30-894D68D09FED}.Release|Any CPU.Build.0 = Release|Any CPU
{E7998D97-F1FD-4BE1-AF4B-F4D0DCAE3E2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E7998D97-F1FD-4BE1-AF4B-F4D0DCAE3E2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E7998D97-F1FD-4BE1-AF4B-F4D0DCAE3E2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E7998D97-F1FD-4BE1-AF4B-F4D0DCAE3E2A}.Release|Any CPU.Build.0 = Release|Any CPU
{0BEA8C4C-09C8-42E7-BB6C-716AD62259F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0BEA8C4C-09C8-42E7-BB6C-716AD62259F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0BEA8C4C-09C8-42E7-BB6C-716AD62259F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0BEA8C4C-09C8-42E7-BB6C-716AD62259F0}.Release|Any CPU.Build.0 = Release|Any CPU
{CF14B6B2-5853-43F6-A153-07D0425AF061}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CF14B6B2-5853-43F6-A153-07D0425AF061}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CF14B6B2-5853-43F6-A153-07D0425AF061}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CF14B6B2-5853-43F6-A153-07D0425AF061}.Release|Any CPU.Build.0 = Release|Any CPU
{8EA2A119-436A-4187-96F3-A49F40ECF730}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8EA2A119-436A-4187-96F3-A49F40ECF730}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8EA2A119-436A-4187-96F3-A49F40ECF730}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8EA2A119-436A-4187-96F3-A49F40ECF730}.Release|Any CPU.Build.0 = Release|Any CPU
{30112B27-8194-4B8A-9289-D4364A472107}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{30112B27-8194-4B8A-9289-D4364A472107}.Debug|Any CPU.Build.0 = Debug|Any CPU
{30112B27-8194-4B8A-9289-D4364A472107}.Release|Any CPU.ActiveCfg = Release|Any CPU
{30112B27-8194-4B8A-9289-D4364A472107}.Release|Any CPU.Build.0 = Release|Any CPU
{A892DFA6-74FE-449B-8E18-552C252C8A0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A892DFA6-74FE-449B-8E18-552C252C8A0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A892DFA6-74FE-449B-8E18-552C252C8A0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A892DFA6-74FE-449B-8E18-552C252C8A0E}.Release|Any CPU.Build.0 = Release|Any CPU
{339A51F8-72F9-4914-9EB3-BB4C8E839A27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{339A51F8-72F9-4914-9EB3-BB4C8E839A27}.Debug|Any CPU.Build.0 = Debug|Any CPU
{339A51F8-72F9-4914-9EB3-BB4C8E839A27}.Release|Any CPU.ActiveCfg = Release|Any CPU
{339A51F8-72F9-4914-9EB3-BB4C8E839A27}.Release|Any CPU.Build.0 = Release|Any CPU
{7CF25E42-232E-407C-B6CD-A1FDD4715762}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7CF25E42-232E-407C-B6CD-A1FDD4715762}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7CF25E42-232E-407C-B6CD-A1FDD4715762}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7CF25E42-232E-407C-B6CD-A1FDD4715762}.Release|Any CPU.Build.0 = Release|Any CPU
{9328882E-408C-48C9-B349-48047E585C96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9328882E-408C-48C9-B349-48047E585C96}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9328882E-408C-48C9-B349-48047E585C96}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9328882E-408C-48C9-B349-48047E585C96}.Release|Any CPU.Build.0 = Release|Any CPU
{C9AC0437-8CBE-4054-82A4-4B4549F6595C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C9AC0437-8CBE-4054-82A4-4B4549F6595C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C9AC0437-8CBE-4054-82A4-4B4549F6595C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C9AC0437-8CBE-4054-82A4-4B4549F6595C}.Release|Any CPU.Build.0 = Release|Any CPU
{B1FFD8B1-07F3-4F7F-9CAE-4FB600E7BA3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B1FFD8B1-07F3-4F7F-9CAE-4FB600E7BA3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B1FFD8B1-07F3-4F7F-9CAE-4FB600E7BA3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B1FFD8B1-07F3-4F7F-9CAE-4FB600E7BA3B}.Release|Any CPU.Build.0 = Release|Any CPU
{38BDC98E-DDCF-4D7A-AD4A-E00120908B1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{38BDC98E-DDCF-4D7A-AD4A-E00120908B1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{38BDC98E-DDCF-4D7A-AD4A-E00120908B1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{38BDC98E-DDCF-4D7A-AD4A-E00120908B1D}.Release|Any CPU.Build.0 = Release|Any CPU
{D41DB78A-E9BE-4B59-9851-915F870E2361}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D41DB78A-E9BE-4B59-9851-915F870E2361}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D41DB78A-E9BE-4B59-9851-915F870E2361}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D41DB78A-E9BE-4B59-9851-915F870E2361}.Release|Any CPU.Build.0 = Release|Any CPU
{BD2FB9DF-791C-4271-BE51-B817902563BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BD2FB9DF-791C-4271-BE51-B817902563BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD2FB9DF-791C-4271-BE51-B817902563BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD2FB9DF-791C-4271-BE51-B817902563BB}.Release|Any CPU.Build.0 = Release|Any CPU
{76AFA1E6-3EED-4390-969A-C6BAA6D0E08E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76AFA1E6-3EED-4390-969A-C6BAA6D0E08E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76AFA1E6-3EED-4390-969A-C6BAA6D0E08E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76AFA1E6-3EED-4390-969A-C6BAA6D0E08E}.Release|Any CPU.Build.0 = Release|Any CPU
{1A1D6863-A647-4406-BCA6-7997ABCD58C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1A1D6863-A647-4406-BCA6-7997ABCD58C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1A1D6863-A647-4406-BCA6-7997ABCD58C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1A1D6863-A647-4406-BCA6-7997ABCD58C9}.Release|Any CPU.Build.0 = Release|Any CPU
{32D1A1D2-3D64-4B46-9512-364FFD43E30F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{32D1A1D2-3D64-4B46-9512-364FFD43E30F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{32D1A1D2-3D64-4B46-9512-364FFD43E30F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{32D1A1D2-3D64-4B46-9512-364FFD43E30F}.Release|Any CPU.Build.0 = Release|Any CPU
{E9BBF6D2-C791-4ACA-A009-1290DB78A270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E9BBF6D2-C791-4ACA-A009-1290DB78A270}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E9BBF6D2-C791-4ACA-A009-1290DB78A270}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E9BBF6D2-C791-4ACA-A009-1290DB78A270}.Release|Any CPU.Build.0 = Release|Any CPU
{63485F0E-A78F-44ED-9C46-CB542CC4AB02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{63485F0E-A78F-44ED-9C46-CB542CC4AB02}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63485F0E-A78F-44ED-9C46-CB542CC4AB02}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63485F0E-A78F-44ED-9C46-CB542CC4AB02}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {29E801EA-ED90-434D-9BB8-A2C75AD76615}
EndGlobalSection
EndGlobal