/// <summary> /// Creates a default delegate for an OpenGL function in the event that it is not implemented by the driver. /// </summary> /// <param name="type">The OpenGL delegate type.</param> /// <param name="function">The name of the OpenGL function.</param> /// <param name="requirements">The OpenGL function's specified requirements.</param> /// <returns>The default delegate that was created.</returns> private static Delegate CreateDefaultDelegate(Type type, String function, RequireAttribute requirements) { var valFunction = Expression.Constant(function); var valHasReqs = Expression.Constant(requirements != null); var valIsCore = Expression.Constant(requirements != null && requirements.IsCore(majorVersion, minorVersion, isGLES)); var valExt = Expression.Constant(requirements == null ? null : requirements.Extension); var valExtFn = Expression.Constant(requirements == null ? null : requirements.ExtensionFunction); var delegateInvoke = type.GetMethod("Invoke"); var delegateParameters = delegateInvoke.GetParameters().Select(x => Expression.Parameter(x.ParameterType, x.Name)); var throwExpression = Expression.Throw(Expression.Call(miCreateDefaultDelegateException, valFunction, valIsCore, valHasReqs, Expression.Convert(valExt, typeof(String)), Expression.Convert(valExtFn, typeof(String))), delegateInvoke.ReturnType); var throwLambda = Expression.Lambda(type, throwExpression, delegateParameters); return(throwLambda.Compile()); }
/// <summary> /// Loads the default delegate for the specified field. /// </summary> /// <param name="field">The field for which to load a default delegate.</param> /// <param name="requirements">The OpenGL function's specified requirements.</param> private static void LoadDefaultDelegate(FieldInfo field, RequireAttribute requirements) { var fndefault = CreateDefaultDelegate(field.FieldType, field.Name, requirements); field.SetValue(null, fndefault); }
/// <summary> /// Creates a default delegate for an OpenGL function in the event that it is not implemented by the driver. /// </summary> /// <param name="type">The OpenGL delegate type.</param> /// <param name="function">The name of the OpenGL function.</param> /// <param name="requirements">The OpenGL function's specified requirements.</param> /// <returns>The default delegate that was created.</returns> private static Delegate CreateDefaultDelegate(Type type, String function, RequireAttribute requirements) { var valFunction = Expression.Constant(function); var valHasReqs = Expression.Constant(requirements != null); var valIsCore = Expression.Constant(requirements != null && requirements.IsCore(majorVersion, minorVersion, isGLES)); var valExt = Expression.Constant(requirements == null ? null : requirements.Extension); var valExtFn = Expression.Constant(requirements == null ? null : requirements.ExtensionFunction); var delegateInvoke = type.GetMethod("Invoke"); var delegateParameters = delegateInvoke.GetParameters().Select(x => Expression.Parameter(x.ParameterType, x.Name)); var throwExpression = Expression.Throw(Expression.Call(miCreateDefaultDelegateException, valFunction, valIsCore, valHasReqs, Expression.Convert(valExt, typeof(String)), Expression.Convert(valExtFn, typeof(String))), delegateInvoke.ReturnType); var throwLambda = Expression.Lambda(type, throwExpression, delegateParameters); return throwLambda.Compile(); }