new(FFI::arrayType(static::$ffi->type('GLubyte'), [strlen($funcname) + 1])); FFI::memcpy($funcstring, $funcname, strlen($funcname)); $funcstring[strlen($funcname)] = "\0"; /** @var CData $proc */ /** @noinspection PhpUndefinedMethodInspection */ $proc = static::$ffi->glXGetProcAddress( static::$ffi->cast("GLubyte*", $funcstring) ); /** @noinspection PhpUndefinedMethodInspection */ if ($proc === null || FFI::isNull($proc)) { throw new RuntimeException("GL function $name doesn't exist"); } return static::$ffi->cast($typename, $proc); } public static function shaderSource(int $shader, array $sources) { $lens = []; $strings = []; foreach ($sources as $source) { $strings[] = Utils::string($source, false); $lens[] = strlen($source); } $arrays = Utils::arrayOf('char*', $strings); $lengths = Utils::arrayOf('int32_t', $lens); glShaderSource($shader, count($sources), $arrays, $lengths); } }