Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ShaderMixinObjectId.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.IO;
5 using System.Runtime.InteropServices;
6 using SiliconStudio.Core.Diagnostics;
7 using SiliconStudio.Core.IO;
8 using SiliconStudio.Core.Serialization;
9 using SiliconStudio.Core.Storage;
10 using SiliconStudio.Paradox.Effects;
11 using SiliconStudio.Paradox.Effects.Data;
12 using SiliconStudio.Paradox.Shaders.Compiler;
13 
14 namespace SiliconStudio.Paradox.Shaders
15 {
16  /// <summary>
17  /// A helper class to compute a unique object id for a <see cref="ShaderMixinSource"/>.
18  /// </summary>
19  public class ShaderMixinObjectId
20  {
21  private static object generatorLock = new object();
22  private static ShaderMixinObjectId generator;
23 
24  private static ParameterCollection parameters;
25 
26  private readonly NativeMemoryStream memStream;
27  private readonly HashSerializationWriter writer;
28  private ObjectIdBuilder objectIdBuilder;
29  private IntPtr buffer;
30 
31  private ShaderMixinObjectId()
32  {
33  objectIdBuilder = new ObjectIdBuilder();
34  buffer = Marshal.AllocHGlobal(65536);
35  memStream = new NativeMemoryStream(buffer, 65536);
36  writer = new HashSerializationWriter(memStream);
37  writer.Context.SerializerSelector = new SerializerSelector();
38  writer.Context.SerializerSelector.RegisterProfile("Default");
39  writer.Context.SerializerSelector.RegisterSerializer(new ParameterKeyHashSerializer());
40  writer.Context.SerializerSelector.RegisterSerializer(new ParameterCollectionHashSerializer());
41 
42  if (parameters == null)
43  parameters = new ParameterCollection();
44  }
45 
46  /// <summary>
47  /// Computes a hash <see cref="ObjectId"/> for the specified mixin.
48  /// </summary>
49  /// <param name="mixin">The mixin.</param>
50  /// <param name="mixinParameters">The mixin parameters.</param>
51  /// <returns>EffectObjectIds.</returns>
52  public static EffectObjectIds Compute(ShaderMixinSource mixin, ShaderMixinParameters mixinParameters)
53  {
54  lock (generatorLock)
55  {
56  if (generator == null)
57  {
58  generator = new ShaderMixinObjectId();
59  }
60  return generator.ComputeInternal(mixin, mixinParameters);
61  }
62  }
63 
64  private unsafe EffectObjectIds ComputeInternal(ShaderMixinSource mixin, ShaderMixinParameters mixinParameters)
65  {
66  // Write to memory stream
67  memStream.Position = 0;
68  writer.Write(mixin);
69 
70  parameters.Clear();
71  parameters.Set(CompilerParameters.GraphicsPlatformKey, mixinParameters.Get(CompilerParameters.GraphicsPlatformKey));
72  parameters.Set(CompilerParameters.GraphicsProfileKey, mixinParameters.Get(CompilerParameters.GraphicsProfileKey));
73  parameters.Set(CompilerParameters.DebugKey, mixinParameters.Get(CompilerParameters.DebugKey));
74  writer.Write(parameters);
75 
76  // Compute hash
77  objectIdBuilder.Reset();
78  objectIdBuilder.Write((byte*)buffer, (int)memStream.Position);
79 
80  EffectObjectIds ids;
81 
82  ids.CompileParametersId = objectIdBuilder.ComputeHash();
83 
84  memStream.Position = 0;
85  writer.Write(mixin);
86  writer.Write(mixinParameters);
87  objectIdBuilder.Reset();
88  objectIdBuilder.Write((byte*)buffer, (int)memStream.Position);
89  ids.FullParametersId = objectIdBuilder.ComputeHash();
90 
91  return ids;
92  }
93  }
94 
95  public struct EffectObjectIds
96  {
99  }
100 }
A helper class to compute a unique object id for a ShaderMixinSource.
static EffectObjectIds Compute(ShaderMixinSource mixin, ShaderMixinParameters mixinParameters)
Computes a hash ObjectId for the specified mixin.
A mixin performing a combination of ShaderClassSource and other mixins.
Serializer context. It holds DataSerializer{T} objects and their factories.
A MemoryStream over a native memory region.
A hash to uniquely identify data.
Definition: ObjectId.cs:13
A container to handle a hierarchical collection of effect variables.