public static void Validate(this Validatable validatable, ValidationContext ctx) { if (validatable == null) return; if (ctx == null) Validate(validatable); using (ValidationContext.Push(ctx)) { validatable.Validate(); } }
public static IDisposable Push(ValidationContext ctx) { if (Current == ctx) { return new DisposableAction(() => {}); } else { _stack.Push(ctx); return new DisposableAction(() => { (Current == ctx).AssertTrue(); _stack.Pop(); }); } }
public void Validate() { var ctx = new ValidationContext(this); using (ValidationContext.Push(ctx)) { // this is commented out because there's no problem with UnifiedTexturing // if the version is prior to PTX_15, corresponding directive just won't be rendered // (UnifiedTexturing == true).AssertImplies(Version >= SoftwareIsa.PTX_15); (UnifiedTexturing == false).AssertImplies(Version >= SoftwareIsa.PTX_15); (DowngradeDoubles == true).AssertImplies(Target < HardwareIsa.SM_13); Comments.ForEach(c => { c.AssertNotNull(); c.Validate(); }); Pragmas.ForEach(p => { p.AssertNotNull(); p.Validate(); }); Entries.ForEach(e => { e.AssertNotNull(); e.Validate(); }); (Entries.Count() == Entries.Select(e => e.Name).Distinct().Count()).AssertTrue(); Func<TypeName, bool> mentioned_type = t => ctx.Visited.Contains((Type)t); if (Target < HardwareIsa.SM_13 && !DowngradeDoubles) mentioned_type(TypeName.F64).AssertFalse(); if (Version < SoftwareIsa.PTX_15) (mentioned_type(TypeName.Samplerref) || mentioned_type(TypeName.Surfref)).AssertFalse(); (ctx.VisitedExprs.Where(arg => arg.is_texref()).Count() <= 128).AssertTrue(); (ctx.VisitedExprs.Where(arg => arg.is_samplerref()).Count() <= (UnifiedTexturing ? 128 : 16)).AssertTrue(); // todo. what's the max amount of surfaces? } }