/// <summary>
        /// Set uniform state variable (variant type).
        /// </summary>
        /// <param name="ctx">
        /// A <see cref="GraphicsContext"/> used for operations.
        /// </param>
        /// <param name="uniformName">
        /// A <see cref="String"/> that specify the variable name in the shader source.
        /// </param>
        /// <param name="m">
        /// A <see cref="Matrix4x4"/> holding the uniform variabile data.
        /// </param>
        public void SetVariantUniform(GraphicsContext ctx, string uniformName, MatrixDouble4x4 m)
        {
            if (ctx == null)
            {
                throw new ArgumentNullException("ctx");
            }

            UniformBinding uniform = GetUniform(uniformName);

            switch (uniform.UniformType)
            {
            case ShaderUniformType.Mat4x4:
                SetUniform(ctx, uniformName, (Matrix4x4)m);
                break;

            case ShaderUniformType.DoubleMat4x4:
                SetUniform(ctx, uniformName, m);
                break;

            default:
                throw new ShaderException("unable to set double-precision floating-point matrix 4x4 data to uniform of type {0}", uniform.UniformType);
            }
        }
 void IShaderUniformContainer.SetUniform(GraphicsContext ctx, string uniformName, MatrixDouble4x4 m)
 {
     throw new NotImplementedException();
 }