diff --git a/.gitmodules b/.gitmodules index b21937d..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "lib/SDL.zig"] - path = lib/SDL.zig - url = https://github.com/paoda/SDL.zig diff --git a/build.zig b/build.zig index b62e718..7ee0c69 100644 --- a/build.zig +++ b/build.zig @@ -1,66 +1,154 @@ const std = @import("std"); -const builtin = @import("builtin"); - -const sdl = @import("lib/SDL.zig/build.zig"); - -const SemVer = std.SemanticVersion; - -const target_version = "0.13.0"; +// Although this function looks imperative, it does not perform the build +// directly and instead it mutates the build graph (`b`) that will be then +// executed by an external runner. The functions in `std.Build` implement a DSL +// for defining build steps and express dependencies between them, allowing the +// build runner to parallelize the build automatically (and the cache system to +// know when a step doesn't need to be re-run). pub fn build(b: *std.Build) void { - const actual_version = builtin.zig_version; - if (comptime actual_version.order(SemVer.parse(target_version) catch unreachable) != .eq) { - @compileError("ZBA must be built with Zig v" ++ target_version ++ "."); - } - + // Standard target options allow the person running `zig build` to choose + // what target to build for. Here we do not override the defaults, which + // means any target is allowed, and the default is native. Other options + // for restricting supported target set are available. const target = b.standardTargetOptions(.{}); + // Standard optimization options allow the person running `zig build` to select + // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not + // set a preferred release mode, allowing the user to decide how to optimize. const optimize = b.standardOptimizeOption(.{}); + // It's also possible to define more custom flags to toggle optional features + // of this build script using `b.option()`. All defined flags (including + // target and optimize options) will be listed when running `zig build --help` + // in this directory. - const exe = b.addExecutable(.{ - .name = "zba", + // This creates a module, which represents a collection of source files alongside + // some compilation options, such as optimization mode and linked system libraries. + // Zig modules are the preferred way of making Zig code available to consumers. + // addModule defines a module that we intend to make available for importing + // to our consumers. We must give it a name because a Zig package can expose + // multiple modules and consumers will need to be able to specify which + // module they want to access. + const exe_mod = b.addModule("zba", .{ + // The root source file is the "entry point" of this module. Users of + // this module will only be able to access public declarations contained + // in this file, which means that if you have declarations that you + // intend to expose to consumers that were defined in other files part + // of this module, you will have to make sure to re-export them from + // the root file. .root_source_file = b.path("src/main.zig"), + // Later on we'll use this module as the root module of a test executable + // which requires us to specify a target. .target = target, - .optimize = optimize, + .link_libc = true, }); - const sdk = sdl.init(b, null, null); - const zgui = b.dependency("zgui", .{ .shared = false, .with_implot = true, .backend = .sdl2_opengl3 }); - const imgui = zgui.artifact("imgui"); + // Here we define an executable. An executable needs to have a root module + // which needs to expose a `main` function. While we could add a main function + // to the module defined above, it's sometimes preferable to split business + // business logic and the CLI into two separate modules. + // + // If your goal is to create a Zig library for others to use, consider if + // it might benefit from also exposing a CLI tool. A parser library for a + // data serialization format could also bundle a CLI syntax checker, for example. + // + // If instead your goal is to create an executable, consider if users might + // be interested in also being able to embed the core functionality of your + // program in their own executable in order to avoid the overhead involved in + // subprocessing your CLI tool. + // + // If neither case applies to you, feel free to delete the declaration you + // don't need and to put everything under a single module. + const exe = b.addExecutable(.{ .name = "zba", .root_module = exe_mod }); - exe.root_module.addImport("known_folders", b.dependency("known-folders", .{}).module("known-folders")); // https://github.com/ziglibs/known-folders - exe.root_module.addImport("datetime", b.dependency("zig-datetime", .{}).module("zig-datetime")); // https://github.com/frmdstryr/zig-datetime - exe.root_module.addImport("clap", b.dependency("zig-clap", .{}).module("clap")); // https://github.com/Hejsil/zig-clap - exe.root_module.addImport("zba-util", b.dependency("zba-util", .{}).module("zba-util")); // https://git.musuka.dev/paoda/zba-util - exe.root_module.addImport("tomlz", b.dependency("tomlz", .{}).module("tomlz")); // https://github.com/mattyhall/tomlz - exe.root_module.addImport("arm32", b.dependency("arm32", .{}).module("arm32")); // https://git.musuka.dev/paoda/arm32 - exe.root_module.addImport("gdbstub", b.dependency("zba-gdbstub", .{}).module("zba-gdbstub")); // https://git.musuka.dev/paoda/gdbstub - exe.root_module.addImport("nfd", b.dependency("nfd", .{}).module("nfd")); // https://github.com/fabioarnold/nfd-zig - exe.root_module.addImport("zgui", zgui.module("root")); // https://git.musuka.dev/paoda/zgui - exe.root_module.addImport("sdl2", sdk.getNativeModule()); // https://github.com/MasterQ32/SDL.zig + const zgui = b.dependency("zgui", .{ .shared = false, .with_implot = true, .backend = .sdl3_opengl3 }); + const sdl = b.dependency("sdl", .{ .target = target, .optimize = optimize, .preferred_linkage = .static }); + const gl = @import("zigglgen").generateBindingsModule(b, .{ .api = .gl, .version = .@"3.3", .profile = .core }); - exe.root_module.addAnonymousImport("bitfield", .{ .root_source_file = b.path("lib/bitfield.zig") }); // https://github.com/FlorenceOS/ - exe.root_module.addAnonymousImport("gl", .{ .root_source_file = b.path("lib/gl.zig") }); // https://github.com/MasterQ32/zig-opengl - exe.root_module.addAnonymousImport("example.toml", .{ .root_source_file = b.path("example.toml") }); + const sdl_lib = sdl.artifact("SDL3"); + const zgui_lib = zgui.artifact("imgui"); - sdk.link(exe, .dynamic, .SDL2); - sdk.link(imgui, .dynamic, .SDL2); - exe.linkLibrary(imgui); + exe_mod.linkLibrary(sdl_lib); + exe_mod.linkLibrary(zgui_lib); + exe_mod.addImport("gl", gl); + exe_mod.addImport("known_folders", b.dependency("known_folders", .{}).module("known-folders")); + exe_mod.addImport("datetime", b.dependency("datetime", .{}).module("datetime")); + exe_mod.addImport("clap", b.dependency("clap", .{}).module("clap")); + exe_mod.addImport("zba_util", b.dependency("zba_util", .{}).module("zba_util")); + exe_mod.addImport("arm32", b.dependency("arm32", .{}).module("arm32")); + exe_mod.addImport("gdbstub", b.dependency("zba_gdbstub", .{}).module("zba_gdbstub")); + exe_mod.addImport("nfd", b.dependency("nfdzig", .{}).module("nfd")); + exe_mod.addImport("zgui", zgui.module("root")); + exe_mod.addImport("bitjuggle", b.dependency("bitjuggle", .{}).module("bitjuggle")); + + // This declares intent for the executable to be installed into the + // install prefix when running `zig build` (i.e. when executing the default + // step). By default the install prefix is `zig-out/` but can be overridden + // by passing `--prefix` or `-p`. b.installArtifact(exe); - const run_cmd = b.addRunArtifact(exe); - run_cmd.step.dependOn(b.getInstallStep()); - if (b.args) |args| run_cmd.addArgs(args); - + // This creates a top level step. Top level steps have a name and can be + // invoked by name when running `zig build` (e.g. `zig build run`). + // This will evaluate the `run` step rather than the default step. + // For a top level step to actually do something, it must depend on other + // steps (e.g. a Run step, as we will see in a moment). const run_step = b.step("run", "Run the app"); + + // This creates a RunArtifact step in the build graph. A RunArtifact step + // invokes an executable compiled by Zig. Steps will only be executed by the + // runner if invoked directly by the user (in the case of top level steps) + // or if another step depends on it, so it's up to you to define when and + // how this Run step will be executed. In our case we want to run it when + // the user runs `zig build run`, so we create a dependency link. + const run_cmd = b.addRunArtifact(exe); run_step.dependOn(&run_cmd.step); - const exe_tests = b.addTest(.{ - .root_source_file = b.path("src/main.zig"), - .target = target, - .optimize = optimize, + // By making the run step depend on the default step, it will be run from the + // installation directory rather than directly from within the cache directory. + run_cmd.step.dependOn(b.getInstallStep()); + + // This allows the user to pass arguments to the application in the build + // command itself, like this: `zig build run -- arg1 arg2 etc` + if (b.args) |args| { + run_cmd.addArgs(args); + } + + // Creates an executable that will run `test` blocks from the provided module. + // Here `mod` needs to define a target, which is why earlier we made sure to + // set the releative field. + const mod_tests = b.addTest(.{ + .root_module = exe_mod, }); - const test_step = b.step("test", "Run unit tests"); - test_step.dependOn(&exe_tests.step); + // A run step that will run the test executable. + const run_mod_tests = b.addRunArtifact(mod_tests); + + // Creates an executable that will run `test` blocks from the executable's + // root module. Note that test executables only test one module at a time, + // hence why we have to create two separate ones. + const exe_tests = b.addTest(.{ + .root_module = exe.root_module, + }); + + // A run step that will run the second test executable. + const run_exe_tests = b.addRunArtifact(exe_tests); + + // A top level step for running all tests. dependOn can be called multiple + // times and since the two run steps do not depend on one another, this will + // make the two of them run in parallel. + const test_step = b.step("test", "Run tests"); + test_step.dependOn(&run_mod_tests.step); + test_step.dependOn(&run_exe_tests.step); + + // Just like flags, top level steps are also listed in the `--help` menu. + // + // The Zig build system is entirely implemented in userland, which means + // that it cannot hook into private compiler APIs. All compilation work + // orchestrated by the build system will result in other Zig compiler + // subcommands being invoked with the right flags defined. You can observe + // these invocations when one fails (or you pass a flag to increase + // verbosity) to validate assumptions and diagnose problems. + // + // Lastly, the Zig build system is relatively simple and self-contained, + // and reading its source code will allow you to master it. } diff --git a/build.zig.zon b/build.zig.zon index a62530c..d6aebd1 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,5 +1,5 @@ .{ - .name = "zba", + .name = .zba, .version = "0.1.0", .paths = .{ "build.zig", @@ -8,43 +8,48 @@ "lib/gl.zig", "src", }, - .minimum_zig_version = "0.13.0", + .minimum_zig_version = "0.15.1", + .fingerprint = 0xcb596c7fbdb20efc, .dependencies = .{ - .nfd = .{ - .url = "git+https://github.com/paoda/nfd-zig#ad81729d33da30d5f4fd23718debec48245121ca", - .hash = "1220a679380847513262c8c5c474d4a415f9ecc4921c8c6aefbdbdce66cf2aa19ceb", + // .tomlz = .{ + // .url = "git+https://github.com/paoda/tomlz#9a16dd53927ef2012478b6494bafb4475e44f4c9", + // .hash = "12204f922cab84980e36b5c058d354ec0ee169bda401c8e0e80a463580349b476569", + // }, + + .zba_util = .{ .path = "../zba-util" }, + .arm32 = .{ .path = "../arm32" }, + .zba_gdbstub = .{ .path = "../zba-gdbstub" }, + .known_folders = .{ + .url = "git+https://github.com/ziglibs/known-folders.git#ab5cf5feb936fa3b72c95d3ad0c0c67791937ba1", + .hash = "known_folders-0.0.0-Fy-PJtTTAADUOhGKM0sxzG4eMkNQxRvx9e5dfHVyaeA3", }, - .@"known-folders" = .{ - .url = "git+https://github.com/ziglibs/known-folders#1cceeb70e77dec941a4178160ff6c8d05a74de6f", - .hash = "12205f5e7505c96573f6fc5144592ec38942fb0a326d692f9cddc0c7dd38f9028f29", + .nfdzig = .{ + .url = "git+https://github.com/paoda/nfd-zig#0ad2a0c092ffba0c98613d619b82100c991f5ad6", + .hash = "nfdzig-0.1.0-11fxvN6IBgD5rvvfjrw1wPqibMsbUJ-h2ZcGR6FOEvrm", }, - .@"zig-datetime" = .{ - .url = "git+https://github.com/frmdstryr/zig-datetime#70aebf28fb3e137cd84123a9349d157a74708721", - .hash = "122077215ce36e125a490e59ec1748ffd4f6ba00d4d14f7308978e5360711d72d77f", + .datetime = .{ + .url = "git+https://github.com/frmdstryr/zig-datetime#3a39a21e6e34dcb0ade0ff828d0914d40ba535f3", + .hash = "datetime-0.8.0-cJNXzP_YAQBxQ5hkNNP6ScnG5XsqciJmeP5RVV4xwCBA", }, - .@"zig-clap" = .{ - .url = "git+https://github.com/Hejsil/zig-clap#c0193e9247335a6c1688b946325060289405de2a", - .hash = "12207ee987ce045596cb992cfb15b0d6d9456e50d4721c3061c69dabc2962053644d", + .clap = .{ + .url = "https://github.com/Hejsil/zig-clap/archive/refs/tags/0.11.0.tar.gz", + .hash = "clap-0.11.0-oBajB-HnAQDPCKYzwF7rO3qDFwRcD39Q0DALlTSz5H7e", }, - .@"zba-util" = .{ - .url = "git+https://git.musuka.dev/paoda/zba-util#bf0e744047ce1ec90172dbcc0c72bfcc29a063e3", - .hash = "1220d044ecfbeacc3b3cebeff131d587e24167d61435a3cb96dffd4d4521bb06aed0", + .sdl = .{ + .url = "git+https://github.com/castholm/SDL.git#b1913e7c31ad72ecfd3ab04aeac387027754cfaf", + .hash = "sdl-0.3.0+3.2.22-7uIn9Pg3fwGG2IyIOPxxOSVe-75nUng9clt7tXGFLzMr", }, - .@"zba-gdbstub" = .{ - .url = "git+https://git.musuka.dev/paoda/zba-gdbstub#9a50607d5f48293f950a4e823344f2bc24582a5a", - .hash = "1220ac267744ed2a735f03c4620d7c6210fbd36d7bfb2b376ddc3436faebadee0f61", + .zigglgen = .{ + .url = "git+https://github.com/castholm/zigglgen.git#a1e969b3e35818785fab0373124f50463793b28a", + .hash = "zigglgen-0.4.0-bmyqLQGMLwA0EPVmSm-Nc6Olb84zBzvwMjguxwKYLf1S", }, - .tomlz = .{ - .url = "git+https://github.com/paoda/tomlz#9a16dd53927ef2012478b6494bafb4475e44f4c9", - .hash = "12204f922cab84980e36b5c058d354ec0ee169bda401c8e0e80a463580349b476569", - }, - .arm32 = .{ - .url = "git+https://git.musuka.dev/paoda/arm32#814d081ea0983bc48841a6baad7158c157b17ad6", - .hash = "12203c3dacf3a7aa7aee5fc5763dd7b40399bd1c34d1483330b6bd5a76bffef22d82", + .bitjuggle = .{ + .url = "git+https://github.com/leecannon/zig-bitjuggle#80111f4f8c672aaea94a8a189ae2a7c8bbaf883f", + .hash = "bitjuggle-2.0.0-SJdU76dvAAARompHEhqKDiwZ4FE4FZ8eHvPvmz5JUOS0", }, .zgui = .{ - .url = "git+https://git.musuka.dev/paoda/zgui#7f8d05101e96c64314d7926c80ee157dcb89da4e", - .hash = "1220bd81a1c7734892b1d4233ed047710487787873c85dd5fc76d1764a331ed2ff43", + .url = "git+https://github.com/zig-gamedev/zgui#7fa8081c208885b85e3fdfc043cd9d9cb9559123", + .hash = "zgui-0.6.0-dev--L6sZL7tbQAPRLYrcQAVx0V49tPHAXNxclZ-v8IP4wLr", }, }, } diff --git a/lib/SDL.zig b/lib/SDL.zig deleted file mode 160000 index fac81ec..0000000 --- a/lib/SDL.zig +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fac81ec499cfd64da7b846de27f6db4a0d4943bf diff --git a/lib/bitfield.zig b/lib/bitfield.zig deleted file mode 100644 index 20bb77b..0000000 --- a/lib/bitfield.zig +++ /dev/null @@ -1,146 +0,0 @@ -const std = @import("std"); - -fn PtrCastPreserveCV(comptime T: type, comptime PtrToT: type, comptime NewT: type) type { - return switch (PtrToT) { - *T => *NewT, - *const T => *const NewT, - *volatile T => *volatile NewT, - *const volatile T => *const volatile NewT, - - else => @compileError("wtf you doing"), - }; -} - -fn BitType(comptime FieldType: type, comptime ValueType: type, comptime shamt: usize) type { - const self_bit: FieldType = (1 << shamt); - - return extern struct { - bits: Bitfield(FieldType, shamt, 1), - - pub fn set(self: anytype) void { - self.bits.field().* |= self_bit; - } - - pub fn unset(self: anytype) void { - self.bits.field().* &= ~self_bit; - } - - pub fn read(self: anytype) ValueType { - return @bitCast(@as(u1, @truncate(self.bits.field().* >> shamt))); - } - - // Since these are mostly used with MMIO, I want to avoid - // reading the memory just to write it again, also races - pub fn write(self: anytype, val: ValueType) void { - if (@as(bool, @bitCast(val))) { - self.set(); - } else { - self.unset(); - } - } - }; -} - -// Original Bit Constructor -// pub fn Bit(comptime FieldType: type, comptime shamt: usize) type { -// return BitType(FieldType, u1, shamt); -// } - -pub fn Bit(comptime FieldType: type, comptime shamt: usize) type { - return BitType(FieldType, bool, shamt); -} - -fn Boolean(comptime FieldType: type, comptime shamt: usize) type { - return BitType(FieldType, bool, shamt); -} - -pub fn Bitfield(comptime FieldType: type, comptime shamt: usize, comptime num_bits: usize) type { - if (shamt + num_bits > @bitSizeOf(FieldType)) { - @compileError("bitfield doesn't fit"); - } - - const self_mask: FieldType = ((1 << num_bits) - 1) << shamt; - - const ValueType = std.meta.Int(.unsigned, num_bits); - - return extern struct { - dummy: FieldType, - - fn field(self: anytype) PtrCastPreserveCV(@This(), @TypeOf(self), FieldType) { - return @ptrCast(self); - } - - pub fn write(self: anytype, val: ValueType) void { - self.field().* &= ~self_mask; - self.field().* |= @as(FieldType, @intCast(val)) << shamt; - } - - pub fn read(self: anytype) ValueType { - const val: FieldType = self.field().*; - return @intCast((val & self_mask) >> shamt); - } - }; -} - -test "bit" { - const S = extern union { - low: Bit(u32, 0), - high: Bit(u32, 1), - val: u32, - }; - - std.testing.expect(@sizeOf(S) == 4); - std.testing.expect(@bitSizeOf(S) == 32); - - var s: S = .{ .val = 1 }; - - std.testing.expect(s.low.read() == 1); - std.testing.expect(s.high.read() == 0); - - s.low.write(0); - s.high.write(1); - - std.testing.expect(s.val == 2); -} - -test "boolean" { - const S = extern union { - low: Boolean(u32, 0), - high: Boolean(u32, 1), - val: u32, - }; - - std.testing.expect(@sizeOf(S) == 4); - std.testing.expect(@bitSizeOf(S) == 32); - - var s: S = .{ .val = 2 }; - - std.testing.expect(s.low.read() == false); - std.testing.expect(s.high.read() == true); - - s.low.write(true); - s.high.write(false); - - std.testing.expect(s.val == 1); -} - -test "bitfield" { - const S = extern union { - low: Bitfield(u32, 0, 16), - high: Bitfield(u32, 16, 16), - val: u32, - }; - - std.testing.expect(@sizeOf(S) == 4); - std.testing.expect(@bitSizeOf(S) == 32); - - var s: S = .{ .val = 0x13376969 }; - - std.testing.expect(s.low.read() == 0x6969); - std.testing.expect(s.high.read() == 0x1337); - - s.low.write(0x1337); - s.high.write(0x6969); - - std.testing.expect(s.val == 0x69691337); -} diff --git a/lib/gl.zig b/lib/gl.zig deleted file mode 100644 index 4560cf7..0000000 --- a/lib/gl.zig +++ /dev/null @@ -1,5053 +0,0 @@ -// -// This code file is licenced under any of Public Domain, WTFPL or CC0. -// There are no restrictions in the use of this file. -// - -// -// Generation parameters: -// API: GL_VERSION_3_3 -// Profile: core -// Extensions: -// - -// -// This file was generated with the following command line: -// generator C:\Users\paoda\dev\open\zig-opengl\bin\Debug\net6.0\generator.dll .\OpenGL-Registry\xml\gl.xml gl.zig GL_VERSION_3_3 -// - -const std = @import("std"); -const builtin = @import("builtin"); -const log = std.log.scoped(.OpenGL); - -pub const FunctionPointer: type = blk: { - const BaseFunc = fn (u32) callconv(.C) u32; - const SpecializedFnPtr = FnPtr(BaseFunc); - const fnptr_type = @typeInfo(SpecializedFnPtr); - var generic_type = fnptr_type; - std.debug.assert(generic_type.Pointer.size == .One); - generic_type.Pointer.child = anyopaque; - break :blk @Type(generic_type); -}; - -pub const GLenum = c_uint; -pub const GLboolean = u8; -pub const GLbitfield = c_uint; -pub const GLbyte = i8; -pub const GLubyte = u8; -pub const GLshort = i16; -pub const GLushort = u16; -pub const GLint = c_int; -pub const GLuint = c_uint; -pub const GLclampx = i32; -pub const GLsizei = c_int; -pub const GLfloat = f32; -pub const GLclampf = f32; -pub const GLdouble = f64; -pub const GLclampd = f64; -pub const GLeglClientBufferEXT = void; -pub const GLeglImageOES = void; -pub const GLchar = u8; -pub const GLcharARB = u8; - -pub const GLhandleARB = if (builtin.os.tag == .macos) *anyopaque else c_uint; - -pub const GLhalf = u16; -pub const GLhalfARB = u16; -pub const GLfixed = i32; -pub const GLintptr = usize; -pub const GLintptrARB = usize; -pub const GLsizeiptr = isize; -pub const GLsizeiptrARB = isize; -pub const GLint64 = i64; -pub const GLint64EXT = i64; -pub const GLuint64 = u64; -pub const GLuint64EXT = u64; - -pub const GLsync = *opaque {}; - -pub const _cl_context = opaque {}; -pub const _cl_event = opaque {}; - -pub const GLDEBUGPROC = FnPtr(fn (source: GLenum, _type: GLenum, id: GLuint, severity: GLenum, length: GLsizei, message: [*:0]const u8, userParam: ?*anyopaque) callconv(.C) void); -pub const GLDEBUGPROCARB = FnPtr(fn (source: GLenum, _type: GLenum, id: GLuint, severity: GLenum, length: GLsizei, message: [*:0]const u8, userParam: ?*anyopaque) callconv(.C) void); -pub const GLDEBUGPROCKHR = FnPtr(fn (source: GLenum, _type: GLenum, id: GLuint, severity: GLenum, length: GLsizei, message: [*:0]const u8, userParam: ?*anyopaque) callconv(.C) void); - -pub const GLDEBUGPROCAMD = FnPtr(fn (id: GLuint, category: GLenum, severity: GLenum, length: GLsizei, message: [*:0]const u8, userParam: ?*anyopaque) callconv(.C) void); - -pub const GLhalfNV = u16; -pub const GLvdpauSurfaceNV = GLintptr; -pub const GLVULKANPROCNV = *const fn () callconv(.C) void; - -fn FnPtr(comptime Fn: type) type { - return if (@import("builtin").zig_backend != .stage1) - *const Fn - else - Fn; -} - -pub const DEPTH_BUFFER_BIT = 0x00000100; -pub const STENCIL_BUFFER_BIT = 0x00000400; -pub const COLOR_BUFFER_BIT = 0x00004000; -pub const FALSE = 0; -pub const TRUE = 1; -pub const POINTS = 0x0000; -pub const LINES = 0x0001; -pub const LINE_LOOP = 0x0002; -pub const LINE_STRIP = 0x0003; -pub const TRIANGLES = 0x0004; -pub const TRIANGLE_STRIP = 0x0005; -pub const TRIANGLE_FAN = 0x0006; -pub const NEVER = 0x0200; -pub const LESS = 0x0201; -pub const EQUAL = 0x0202; -pub const LEQUAL = 0x0203; -pub const GREATER = 0x0204; -pub const NOTEQUAL = 0x0205; -pub const GEQUAL = 0x0206; -pub const ALWAYS = 0x0207; -pub const ZERO = 0; -pub const ONE = 1; -pub const SRC_COLOR = 0x0300; -pub const ONE_MINUS_SRC_COLOR = 0x0301; -pub const SRC_ALPHA = 0x0302; -pub const ONE_MINUS_SRC_ALPHA = 0x0303; -pub const DST_ALPHA = 0x0304; -pub const ONE_MINUS_DST_ALPHA = 0x0305; -pub const DST_COLOR = 0x0306; -pub const ONE_MINUS_DST_COLOR = 0x0307; -pub const SRC_ALPHA_SATURATE = 0x0308; -pub const NONE = 0; -pub const FRONT_LEFT = 0x0400; -pub const FRONT_RIGHT = 0x0401; -pub const BACK_LEFT = 0x0402; -pub const BACK_RIGHT = 0x0403; -pub const FRONT = 0x0404; -pub const BACK = 0x0405; -pub const LEFT = 0x0406; -pub const RIGHT = 0x0407; -pub const FRONT_AND_BACK = 0x0408; -pub const NO_ERROR = 0; -pub const INVALID_ENUM = 0x0500; -pub const INVALID_VALUE = 0x0501; -pub const INVALID_OPERATION = 0x0502; -pub const OUT_OF_MEMORY = 0x0505; -pub const CW = 0x0900; -pub const CCW = 0x0901; -pub const POINT_SIZE = 0x0B11; -pub const POINT_SIZE_RANGE = 0x0B12; -pub const POINT_SIZE_GRANULARITY = 0x0B13; -pub const LINE_SMOOTH = 0x0B20; -pub const LINE_WIDTH = 0x0B21; -pub const LINE_WIDTH_RANGE = 0x0B22; -pub const LINE_WIDTH_GRANULARITY = 0x0B23; -pub const POLYGON_MODE = 0x0B40; -pub const POLYGON_SMOOTH = 0x0B41; -pub const CULL_FACE = 0x0B44; -pub const CULL_FACE_MODE = 0x0B45; -pub const FRONT_FACE = 0x0B46; -pub const DEPTH_RANGE = 0x0B70; -pub const DEPTH_TEST = 0x0B71; -pub const DEPTH_WRITEMASK = 0x0B72; -pub const DEPTH_CLEAR_VALUE = 0x0B73; -pub const DEPTH_FUNC = 0x0B74; -pub const STENCIL_TEST = 0x0B90; -pub const STENCIL_CLEAR_VALUE = 0x0B91; -pub const STENCIL_FUNC = 0x0B92; -pub const STENCIL_VALUE_MASK = 0x0B93; -pub const STENCIL_FAIL = 0x0B94; -pub const STENCIL_PASS_DEPTH_FAIL = 0x0B95; -pub const STENCIL_PASS_DEPTH_PASS = 0x0B96; -pub const STENCIL_REF = 0x0B97; -pub const STENCIL_WRITEMASK = 0x0B98; -pub const VIEWPORT = 0x0BA2; -pub const DITHER = 0x0BD0; -pub const BLEND_DST = 0x0BE0; -pub const BLEND_SRC = 0x0BE1; -pub const BLEND = 0x0BE2; -pub const LOGIC_OP_MODE = 0x0BF0; -pub const DRAW_BUFFER = 0x0C01; -pub const READ_BUFFER = 0x0C02; -pub const SCISSOR_BOX = 0x0C10; -pub const SCISSOR_TEST = 0x0C11; -pub const COLOR_CLEAR_VALUE = 0x0C22; -pub const COLOR_WRITEMASK = 0x0C23; -pub const DOUBLEBUFFER = 0x0C32; -pub const STEREO = 0x0C33; -pub const LINE_SMOOTH_HINT = 0x0C52; -pub const POLYGON_SMOOTH_HINT = 0x0C53; -pub const UNPACK_SWAP_BYTES = 0x0CF0; -pub const UNPACK_LSB_FIRST = 0x0CF1; -pub const UNPACK_ROW_LENGTH = 0x0CF2; -pub const UNPACK_SKIP_ROWS = 0x0CF3; -pub const UNPACK_SKIP_PIXELS = 0x0CF4; -pub const UNPACK_ALIGNMENT = 0x0CF5; -pub const PACK_SWAP_BYTES = 0x0D00; -pub const PACK_LSB_FIRST = 0x0D01; -pub const PACK_ROW_LENGTH = 0x0D02; -pub const PACK_SKIP_ROWS = 0x0D03; -pub const PACK_SKIP_PIXELS = 0x0D04; -pub const PACK_ALIGNMENT = 0x0D05; -pub const MAX_TEXTURE_SIZE = 0x0D33; -pub const MAX_VIEWPORT_DIMS = 0x0D3A; -pub const SUBPIXEL_BITS = 0x0D50; -pub const TEXTURE_1D = 0x0DE0; -pub const TEXTURE_2D = 0x0DE1; -pub const TEXTURE_WIDTH = 0x1000; -pub const TEXTURE_HEIGHT = 0x1001; -pub const TEXTURE_BORDER_COLOR = 0x1004; -pub const DONT_CARE = 0x1100; -pub const FASTEST = 0x1101; -pub const NICEST = 0x1102; -pub const BYTE = 0x1400; -pub const UNSIGNED_BYTE = 0x1401; -pub const SHORT = 0x1402; -pub const UNSIGNED_SHORT = 0x1403; -pub const INT = 0x1404; -pub const UNSIGNED_INT = 0x1405; -pub const FLOAT = 0x1406; -pub const CLEAR = 0x1500; -pub const AND = 0x1501; -pub const AND_REVERSE = 0x1502; -pub const COPY = 0x1503; -pub const AND_INVERTED = 0x1504; -pub const NOOP = 0x1505; -pub const XOR = 0x1506; -pub const OR = 0x1507; -pub const NOR = 0x1508; -pub const EQUIV = 0x1509; -pub const INVERT = 0x150A; -pub const OR_REVERSE = 0x150B; -pub const COPY_INVERTED = 0x150C; -pub const OR_INVERTED = 0x150D; -pub const NAND = 0x150E; -pub const SET = 0x150F; -pub const TEXTURE = 0x1702; -pub const COLOR = 0x1800; -pub const DEPTH = 0x1801; -pub const STENCIL = 0x1802; -pub const STENCIL_INDEX = 0x1901; -pub const DEPTH_COMPONENT = 0x1902; -pub const RED = 0x1903; -pub const GREEN = 0x1904; -pub const BLUE = 0x1905; -pub const ALPHA = 0x1906; -pub const RGB = 0x1907; -pub const RGBA = 0x1908; -pub const POINT = 0x1B00; -pub const LINE = 0x1B01; -pub const FILL = 0x1B02; -pub const KEEP = 0x1E00; -pub const REPLACE = 0x1E01; -pub const INCR = 0x1E02; -pub const DECR = 0x1E03; -pub const VENDOR = 0x1F00; -pub const RENDERER = 0x1F01; -pub const VERSION = 0x1F02; -pub const EXTENSIONS = 0x1F03; -pub const NEAREST = 0x2600; -pub const LINEAR = 0x2601; -pub const NEAREST_MIPMAP_NEAREST = 0x2700; -pub const LINEAR_MIPMAP_NEAREST = 0x2701; -pub const NEAREST_MIPMAP_LINEAR = 0x2702; -pub const LINEAR_MIPMAP_LINEAR = 0x2703; -pub const TEXTURE_MAG_FILTER = 0x2800; -pub const TEXTURE_MIN_FILTER = 0x2801; -pub const TEXTURE_WRAP_S = 0x2802; -pub const TEXTURE_WRAP_T = 0x2803; -pub const REPEAT = 0x2901; -pub const COLOR_LOGIC_OP = 0x0BF2; -pub const POLYGON_OFFSET_UNITS = 0x2A00; -pub const POLYGON_OFFSET_POINT = 0x2A01; -pub const POLYGON_OFFSET_LINE = 0x2A02; -pub const POLYGON_OFFSET_FILL = 0x8037; -pub const POLYGON_OFFSET_FACTOR = 0x8038; -pub const TEXTURE_BINDING_1D = 0x8068; -pub const TEXTURE_BINDING_2D = 0x8069; -pub const TEXTURE_INTERNAL_FORMAT = 0x1003; -pub const TEXTURE_RED_SIZE = 0x805C; -pub const TEXTURE_GREEN_SIZE = 0x805D; -pub const TEXTURE_BLUE_SIZE = 0x805E; -pub const TEXTURE_ALPHA_SIZE = 0x805F; -pub const DOUBLE = 0x140A; -pub const PROXY_TEXTURE_1D = 0x8063; -pub const PROXY_TEXTURE_2D = 0x8064; -pub const R3_G3_B2 = 0x2A10; -pub const RGB4 = 0x804F; -pub const RGB5 = 0x8050; -pub const RGB8 = 0x8051; -pub const RGB10 = 0x8052; -pub const RGB12 = 0x8053; -pub const RGB16 = 0x8054; -pub const RGBA2 = 0x8055; -pub const RGBA4 = 0x8056; -pub const RGB5_A1 = 0x8057; -pub const RGBA8 = 0x8058; -pub const RGB10_A2 = 0x8059; -pub const RGBA12 = 0x805A; -pub const RGBA16 = 0x805B; -pub const UNSIGNED_BYTE_3_3_2 = 0x8032; -pub const UNSIGNED_SHORT_4_4_4_4 = 0x8033; -pub const UNSIGNED_SHORT_5_5_5_1 = 0x8034; -pub const UNSIGNED_INT_8_8_8_8 = 0x8035; -pub const UNSIGNED_INT_10_10_10_2 = 0x8036; -pub const TEXTURE_BINDING_3D = 0x806A; -pub const PACK_SKIP_IMAGES = 0x806B; -pub const PACK_IMAGE_HEIGHT = 0x806C; -pub const UNPACK_SKIP_IMAGES = 0x806D; -pub const UNPACK_IMAGE_HEIGHT = 0x806E; -pub const TEXTURE_3D = 0x806F; -pub const PROXY_TEXTURE_3D = 0x8070; -pub const TEXTURE_DEPTH = 0x8071; -pub const TEXTURE_WRAP_R = 0x8072; -pub const MAX_3D_TEXTURE_SIZE = 0x8073; -pub const UNSIGNED_BYTE_2_3_3_REV = 0x8362; -pub const UNSIGNED_SHORT_5_6_5 = 0x8363; -pub const UNSIGNED_SHORT_5_6_5_REV = 0x8364; -pub const UNSIGNED_SHORT_4_4_4_4_REV = 0x8365; -pub const UNSIGNED_SHORT_1_5_5_5_REV = 0x8366; -pub const UNSIGNED_INT_8_8_8_8_REV = 0x8367; -pub const UNSIGNED_INT_2_10_10_10_REV = 0x8368; -pub const BGR = 0x80E0; -pub const BGRA = 0x80E1; -pub const MAX_ELEMENTS_VERTICES = 0x80E8; -pub const MAX_ELEMENTS_INDICES = 0x80E9; -pub const CLAMP_TO_EDGE = 0x812F; -pub const TEXTURE_MIN_LOD = 0x813A; -pub const TEXTURE_MAX_LOD = 0x813B; -pub const TEXTURE_BASE_LEVEL = 0x813C; -pub const TEXTURE_MAX_LEVEL = 0x813D; -pub const SMOOTH_POINT_SIZE_RANGE = 0x0B12; -pub const SMOOTH_POINT_SIZE_GRANULARITY = 0x0B13; -pub const SMOOTH_LINE_WIDTH_RANGE = 0x0B22; -pub const SMOOTH_LINE_WIDTH_GRANULARITY = 0x0B23; -pub const ALIASED_LINE_WIDTH_RANGE = 0x846E; -pub const TEXTURE0 = 0x84C0; -pub const TEXTURE1 = 0x84C1; -pub const TEXTURE2 = 0x84C2; -pub const TEXTURE3 = 0x84C3; -pub const TEXTURE4 = 0x84C4; -pub const TEXTURE5 = 0x84C5; -pub const TEXTURE6 = 0x84C6; -pub const TEXTURE7 = 0x84C7; -pub const TEXTURE8 = 0x84C8; -pub const TEXTURE9 = 0x84C9; -pub const TEXTURE10 = 0x84CA; -pub const TEXTURE11 = 0x84CB; -pub const TEXTURE12 = 0x84CC; -pub const TEXTURE13 = 0x84CD; -pub const TEXTURE14 = 0x84CE; -pub const TEXTURE15 = 0x84CF; -pub const TEXTURE16 = 0x84D0; -pub const TEXTURE17 = 0x84D1; -pub const TEXTURE18 = 0x84D2; -pub const TEXTURE19 = 0x84D3; -pub const TEXTURE20 = 0x84D4; -pub const TEXTURE21 = 0x84D5; -pub const TEXTURE22 = 0x84D6; -pub const TEXTURE23 = 0x84D7; -pub const TEXTURE24 = 0x84D8; -pub const TEXTURE25 = 0x84D9; -pub const TEXTURE26 = 0x84DA; -pub const TEXTURE27 = 0x84DB; -pub const TEXTURE28 = 0x84DC; -pub const TEXTURE29 = 0x84DD; -pub const TEXTURE30 = 0x84DE; -pub const TEXTURE31 = 0x84DF; -pub const ACTIVE_TEXTURE = 0x84E0; -pub const MULTISAMPLE = 0x809D; -pub const SAMPLE_ALPHA_TO_COVERAGE = 0x809E; -pub const SAMPLE_ALPHA_TO_ONE = 0x809F; -pub const SAMPLE_COVERAGE = 0x80A0; -pub const SAMPLE_BUFFERS = 0x80A8; -pub const SAMPLES = 0x80A9; -pub const SAMPLE_COVERAGE_VALUE = 0x80AA; -pub const SAMPLE_COVERAGE_INVERT = 0x80AB; -pub const TEXTURE_CUBE_MAP = 0x8513; -pub const TEXTURE_BINDING_CUBE_MAP = 0x8514; -pub const TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515; -pub const TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516; -pub const TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517; -pub const TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518; -pub const TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519; -pub const TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A; -pub const PROXY_TEXTURE_CUBE_MAP = 0x851B; -pub const MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C; -pub const COMPRESSED_RGB = 0x84ED; -pub const COMPRESSED_RGBA = 0x84EE; -pub const TEXTURE_COMPRESSION_HINT = 0x84EF; -pub const TEXTURE_COMPRESSED_IMAGE_SIZE = 0x86A0; -pub const TEXTURE_COMPRESSED = 0x86A1; -pub const NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2; -pub const COMPRESSED_TEXTURE_FORMATS = 0x86A3; -pub const CLAMP_TO_BORDER = 0x812D; -pub const INT_2_10_10_10_REV = 0x8D9F; -pub const TIMESTAMP = 0x8E28; -pub const TIME_ELAPSED = 0x88BF; -pub const TEXTURE_SWIZZLE_RGBA = 0x8E46; -pub const TEXTURE_SWIZZLE_A = 0x8E45; -pub const TEXTURE_SWIZZLE_B = 0x8E44; -pub const TEXTURE_SWIZZLE_G = 0x8E43; -pub const TEXTURE_SWIZZLE_R = 0x8E42; -pub const RGB10_A2UI = 0x906F; -pub const BLEND_DST_RGB = 0x80C8; -pub const BLEND_SRC_RGB = 0x80C9; -pub const BLEND_DST_ALPHA = 0x80CA; -pub const BLEND_SRC_ALPHA = 0x80CB; -pub const POINT_FADE_THRESHOLD_SIZE = 0x8128; -pub const DEPTH_COMPONENT16 = 0x81A5; -pub const DEPTH_COMPONENT24 = 0x81A6; -pub const DEPTH_COMPONENT32 = 0x81A7; -pub const MIRRORED_REPEAT = 0x8370; -pub const MAX_TEXTURE_LOD_BIAS = 0x84FD; -pub const TEXTURE_LOD_BIAS = 0x8501; -pub const INCR_WRAP = 0x8507; -pub const DECR_WRAP = 0x8508; -pub const TEXTURE_DEPTH_SIZE = 0x884A; -pub const TEXTURE_COMPARE_MODE = 0x884C; -pub const TEXTURE_COMPARE_FUNC = 0x884D; -pub const SAMPLER_BINDING = 0x8919; -pub const ANY_SAMPLES_PASSED = 0x8C2F; -pub const MAX_DUAL_SOURCE_DRAW_BUFFERS = 0x88FC; -pub const ONE_MINUS_SRC1_ALPHA = 0x88FB; -pub const ONE_MINUS_SRC1_COLOR = 0x88FA; -pub const SRC1_COLOR = 0x88F9; -pub const VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE; -pub const MAX_INTEGER_SAMPLES = 0x9110; -pub const MAX_DEPTH_TEXTURE_SAMPLES = 0x910F; -pub const MAX_COLOR_TEXTURE_SAMPLES = 0x910E; -pub const UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D; -pub const INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C; -pub const SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B; -pub const UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A; -pub const INT_SAMPLER_2D_MULTISAMPLE = 0x9109; -pub const SAMPLER_2D_MULTISAMPLE = 0x9108; -pub const TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107; -pub const TEXTURE_SAMPLES = 0x9106; -pub const TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105; -pub const TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104; -pub const PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103; -pub const TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; -pub const PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101; -pub const TEXTURE_2D_MULTISAMPLE = 0x9100; -pub const MAX_SAMPLE_MASK_WORDS = 0x8E59; -pub const SAMPLE_MASK_VALUE = 0x8E52; -pub const SAMPLE_MASK = 0x8E51; -pub const SAMPLE_POSITION = 0x8E50; -pub const SYNC_FLUSH_COMMANDS_BIT = 0x00000001; -pub const TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFF; -pub const WAIT_FAILED = 0x911D; -pub const CONDITION_SATISFIED = 0x911C; -pub const TIMEOUT_EXPIRED = 0x911B; -pub const ALREADY_SIGNALED = 0x911A; -pub const SIGNALED = 0x9119; -pub const UNSIGNALED = 0x9118; -pub const SYNC_GPU_COMMANDS_COMPLETE = 0x9117; -pub const BLEND_COLOR = 0x8005; -pub const BLEND_EQUATION = 0x8009; -pub const CONSTANT_COLOR = 0x8001; -pub const ONE_MINUS_CONSTANT_COLOR = 0x8002; -pub const CONSTANT_ALPHA = 0x8003; -pub const ONE_MINUS_CONSTANT_ALPHA = 0x8004; -pub const FUNC_ADD = 0x8006; -pub const FUNC_REVERSE_SUBTRACT = 0x800B; -pub const FUNC_SUBTRACT = 0x800A; -pub const MIN = 0x8007; -pub const MAX = 0x8008; -pub const BUFFER_SIZE = 0x8764; -pub const BUFFER_USAGE = 0x8765; -pub const QUERY_COUNTER_BITS = 0x8864; -pub const CURRENT_QUERY = 0x8865; -pub const QUERY_RESULT = 0x8866; -pub const QUERY_RESULT_AVAILABLE = 0x8867; -pub const ARRAY_BUFFER = 0x8892; -pub const ELEMENT_ARRAY_BUFFER = 0x8893; -pub const ARRAY_BUFFER_BINDING = 0x8894; -pub const ELEMENT_ARRAY_BUFFER_BINDING = 0x8895; -pub const VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F; -pub const READ_ONLY = 0x88B8; -pub const WRITE_ONLY = 0x88B9; -pub const READ_WRITE = 0x88BA; -pub const BUFFER_ACCESS = 0x88BB; -pub const BUFFER_MAPPED = 0x88BC; -pub const BUFFER_MAP_POINTER = 0x88BD; -pub const STREAM_DRAW = 0x88E0; -pub const STREAM_READ = 0x88E1; -pub const STREAM_COPY = 0x88E2; -pub const STATIC_DRAW = 0x88E4; -pub const STATIC_READ = 0x88E5; -pub const STATIC_COPY = 0x88E6; -pub const DYNAMIC_DRAW = 0x88E8; -pub const DYNAMIC_READ = 0x88E9; -pub const DYNAMIC_COPY = 0x88EA; -pub const SAMPLES_PASSED = 0x8914; -pub const SRC1_ALPHA = 0x8589; -pub const SYNC_FENCE = 0x9116; -pub const SYNC_FLAGS = 0x9115; -pub const SYNC_STATUS = 0x9114; -pub const SYNC_CONDITION = 0x9113; -pub const OBJECT_TYPE = 0x9112; -pub const MAX_SERVER_WAIT_TIMEOUT = 0x9111; -pub const TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; -pub const PROVOKING_VERTEX = 0x8E4F; -pub const LAST_VERTEX_CONVENTION = 0x8E4E; -pub const FIRST_VERTEX_CONVENTION = 0x8E4D; -pub const QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C; -pub const DEPTH_CLAMP = 0x864F; -pub const CONTEXT_PROFILE_MASK = 0x9126; -pub const MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125; -pub const MAX_GEOMETRY_OUTPUT_COMPONENTS = 0x9124; -pub const MAX_GEOMETRY_INPUT_COMPONENTS = 0x9123; -pub const MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122; -pub const BLEND_EQUATION_RGB = 0x8009; -pub const VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622; -pub const VERTEX_ATTRIB_ARRAY_SIZE = 0x8623; -pub const VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624; -pub const VERTEX_ATTRIB_ARRAY_TYPE = 0x8625; -pub const CURRENT_VERTEX_ATTRIB = 0x8626; -pub const VERTEX_PROGRAM_POINT_SIZE = 0x8642; -pub const VERTEX_ATTRIB_ARRAY_POINTER = 0x8645; -pub const STENCIL_BACK_FUNC = 0x8800; -pub const STENCIL_BACK_FAIL = 0x8801; -pub const STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802; -pub const STENCIL_BACK_PASS_DEPTH_PASS = 0x8803; -pub const MAX_DRAW_BUFFERS = 0x8824; -pub const DRAW_BUFFER0 = 0x8825; -pub const DRAW_BUFFER1 = 0x8826; -pub const DRAW_BUFFER2 = 0x8827; -pub const DRAW_BUFFER3 = 0x8828; -pub const DRAW_BUFFER4 = 0x8829; -pub const DRAW_BUFFER5 = 0x882A; -pub const DRAW_BUFFER6 = 0x882B; -pub const DRAW_BUFFER7 = 0x882C; -pub const DRAW_BUFFER8 = 0x882D; -pub const DRAW_BUFFER9 = 0x882E; -pub const DRAW_BUFFER10 = 0x882F; -pub const DRAW_BUFFER11 = 0x8830; -pub const DRAW_BUFFER12 = 0x8831; -pub const DRAW_BUFFER13 = 0x8832; -pub const DRAW_BUFFER14 = 0x8833; -pub const DRAW_BUFFER15 = 0x8834; -pub const BLEND_EQUATION_ALPHA = 0x883D; -pub const MAX_VERTEX_ATTRIBS = 0x8869; -pub const VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A; -pub const MAX_TEXTURE_IMAGE_UNITS = 0x8872; -pub const FRAGMENT_SHADER = 0x8B30; -pub const VERTEX_SHADER = 0x8B31; -pub const MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49; -pub const MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A; -pub const MAX_VARYING_FLOATS = 0x8B4B; -pub const MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C; -pub const MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D; -pub const SHADER_TYPE = 0x8B4F; -pub const FLOAT_VEC2 = 0x8B50; -pub const FLOAT_VEC3 = 0x8B51; -pub const FLOAT_VEC4 = 0x8B52; -pub const INT_VEC2 = 0x8B53; -pub const INT_VEC3 = 0x8B54; -pub const INT_VEC4 = 0x8B55; -pub const BOOL = 0x8B56; -pub const BOOL_VEC2 = 0x8B57; -pub const BOOL_VEC3 = 0x8B58; -pub const BOOL_VEC4 = 0x8B59; -pub const FLOAT_MAT2 = 0x8B5A; -pub const FLOAT_MAT3 = 0x8B5B; -pub const FLOAT_MAT4 = 0x8B5C; -pub const SAMPLER_1D = 0x8B5D; -pub const SAMPLER_2D = 0x8B5E; -pub const SAMPLER_3D = 0x8B5F; -pub const SAMPLER_CUBE = 0x8B60; -pub const SAMPLER_1D_SHADOW = 0x8B61; -pub const SAMPLER_2D_SHADOW = 0x8B62; -pub const DELETE_STATUS = 0x8B80; -pub const COMPILE_STATUS = 0x8B81; -pub const LINK_STATUS = 0x8B82; -pub const VALIDATE_STATUS = 0x8B83; -pub const INFO_LOG_LENGTH = 0x8B84; -pub const ATTACHED_SHADERS = 0x8B85; -pub const ACTIVE_UNIFORMS = 0x8B86; -pub const ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87; -pub const SHADER_SOURCE_LENGTH = 0x8B88; -pub const ACTIVE_ATTRIBUTES = 0x8B89; -pub const ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A; -pub const FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B; -pub const SHADING_LANGUAGE_VERSION = 0x8B8C; -pub const CURRENT_PROGRAM = 0x8B8D; -pub const POINT_SPRITE_COORD_ORIGIN = 0x8CA0; -pub const LOWER_LEFT = 0x8CA1; -pub const UPPER_LEFT = 0x8CA2; -pub const STENCIL_BACK_REF = 0x8CA3; -pub const STENCIL_BACK_VALUE_MASK = 0x8CA4; -pub const STENCIL_BACK_WRITEMASK = 0x8CA5; -pub const MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 0x8DE1; -pub const MAX_GEOMETRY_OUTPUT_VERTICES = 0x8DE0; -pub const MAX_GEOMETRY_UNIFORM_COMPONENTS = 0x8DDF; -pub const GEOMETRY_OUTPUT_TYPE = 0x8918; -pub const PIXEL_PACK_BUFFER = 0x88EB; -pub const PIXEL_UNPACK_BUFFER = 0x88EC; -pub const PIXEL_PACK_BUFFER_BINDING = 0x88ED; -pub const PIXEL_UNPACK_BUFFER_BINDING = 0x88EF; -pub const FLOAT_MAT2x3 = 0x8B65; -pub const FLOAT_MAT2x4 = 0x8B66; -pub const FLOAT_MAT3x2 = 0x8B67; -pub const FLOAT_MAT3x4 = 0x8B68; -pub const FLOAT_MAT4x2 = 0x8B69; -pub const FLOAT_MAT4x3 = 0x8B6A; -pub const SRGB = 0x8C40; -pub const SRGB8 = 0x8C41; -pub const SRGB_ALPHA = 0x8C42; -pub const SRGB8_ALPHA8 = 0x8C43; -pub const COMPRESSED_SRGB = 0x8C48; -pub const COMPRESSED_SRGB_ALPHA = 0x8C49; -pub const GEOMETRY_INPUT_TYPE = 0x8917; -pub const GEOMETRY_VERTICES_OUT = 0x8916; -pub const GEOMETRY_SHADER = 0x8DD9; -pub const FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0x8DA8; -pub const FRAMEBUFFER_ATTACHMENT_LAYERED = 0x8DA7; -pub const MAX_GEOMETRY_TEXTURE_IMAGE_UNITS = 0x8C29; -pub const PROGRAM_POINT_SIZE = 0x8642; -pub const COMPARE_REF_TO_TEXTURE = 0x884E; -pub const CLIP_DISTANCE0 = 0x3000; -pub const CLIP_DISTANCE1 = 0x3001; -pub const CLIP_DISTANCE2 = 0x3002; -pub const CLIP_DISTANCE3 = 0x3003; -pub const CLIP_DISTANCE4 = 0x3004; -pub const CLIP_DISTANCE5 = 0x3005; -pub const CLIP_DISTANCE6 = 0x3006; -pub const CLIP_DISTANCE7 = 0x3007; -pub const MAX_CLIP_DISTANCES = 0x0D32; -pub const MAJOR_VERSION = 0x821B; -pub const MINOR_VERSION = 0x821C; -pub const NUM_EXTENSIONS = 0x821D; -pub const CONTEXT_FLAGS = 0x821E; -pub const COMPRESSED_RED = 0x8225; -pub const COMPRESSED_RG = 0x8226; -pub const CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = 0x00000001; -pub const RGBA32F = 0x8814; -pub const RGB32F = 0x8815; -pub const RGBA16F = 0x881A; -pub const RGB16F = 0x881B; -pub const VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD; -pub const MAX_ARRAY_TEXTURE_LAYERS = 0x88FF; -pub const MIN_PROGRAM_TEXEL_OFFSET = 0x8904; -pub const MAX_PROGRAM_TEXEL_OFFSET = 0x8905; -pub const CLAMP_READ_COLOR = 0x891C; -pub const FIXED_ONLY = 0x891D; -pub const MAX_VARYING_COMPONENTS = 0x8B4B; -pub const TEXTURE_1D_ARRAY = 0x8C18; -pub const PROXY_TEXTURE_1D_ARRAY = 0x8C19; -pub const TEXTURE_2D_ARRAY = 0x8C1A; -pub const PROXY_TEXTURE_2D_ARRAY = 0x8C1B; -pub const TEXTURE_BINDING_1D_ARRAY = 0x8C1C; -pub const TEXTURE_BINDING_2D_ARRAY = 0x8C1D; -pub const R11F_G11F_B10F = 0x8C3A; -pub const UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B; -pub const RGB9_E5 = 0x8C3D; -pub const UNSIGNED_INT_5_9_9_9_REV = 0x8C3E; -pub const TEXTURE_SHARED_SIZE = 0x8C3F; -pub const TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76; -pub const TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F; -pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80; -pub const TRANSFORM_FEEDBACK_VARYINGS = 0x8C83; -pub const TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84; -pub const TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85; -pub const PRIMITIVES_GENERATED = 0x8C87; -pub const TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88; -pub const RASTERIZER_DISCARD = 0x8C89; -pub const MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A; -pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B; -pub const INTERLEAVED_ATTRIBS = 0x8C8C; -pub const SEPARATE_ATTRIBS = 0x8C8D; -pub const TRANSFORM_FEEDBACK_BUFFER = 0x8C8E; -pub const TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F; -pub const RGBA32UI = 0x8D70; -pub const RGB32UI = 0x8D71; -pub const RGBA16UI = 0x8D76; -pub const RGB16UI = 0x8D77; -pub const RGBA8UI = 0x8D7C; -pub const RGB8UI = 0x8D7D; -pub const RGBA32I = 0x8D82; -pub const RGB32I = 0x8D83; -pub const RGBA16I = 0x8D88; -pub const RGB16I = 0x8D89; -pub const RGBA8I = 0x8D8E; -pub const RGB8I = 0x8D8F; -pub const RED_INTEGER = 0x8D94; -pub const GREEN_INTEGER = 0x8D95; -pub const BLUE_INTEGER = 0x8D96; -pub const RGB_INTEGER = 0x8D98; -pub const RGBA_INTEGER = 0x8D99; -pub const BGR_INTEGER = 0x8D9A; -pub const BGRA_INTEGER = 0x8D9B; -pub const SAMPLER_1D_ARRAY = 0x8DC0; -pub const SAMPLER_2D_ARRAY = 0x8DC1; -pub const SAMPLER_1D_ARRAY_SHADOW = 0x8DC3; -pub const SAMPLER_2D_ARRAY_SHADOW = 0x8DC4; -pub const SAMPLER_CUBE_SHADOW = 0x8DC5; -pub const UNSIGNED_INT_VEC2 = 0x8DC6; -pub const UNSIGNED_INT_VEC3 = 0x8DC7; -pub const UNSIGNED_INT_VEC4 = 0x8DC8; -pub const INT_SAMPLER_1D = 0x8DC9; -pub const INT_SAMPLER_2D = 0x8DCA; -pub const INT_SAMPLER_3D = 0x8DCB; -pub const INT_SAMPLER_CUBE = 0x8DCC; -pub const INT_SAMPLER_1D_ARRAY = 0x8DCE; -pub const INT_SAMPLER_2D_ARRAY = 0x8DCF; -pub const UNSIGNED_INT_SAMPLER_1D = 0x8DD1; -pub const UNSIGNED_INT_SAMPLER_2D = 0x8DD2; -pub const UNSIGNED_INT_SAMPLER_3D = 0x8DD3; -pub const UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4; -pub const UNSIGNED_INT_SAMPLER_1D_ARRAY = 0x8DD6; -pub const UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7; -pub const QUERY_WAIT = 0x8E13; -pub const QUERY_NO_WAIT = 0x8E14; -pub const QUERY_BY_REGION_WAIT = 0x8E15; -pub const QUERY_BY_REGION_NO_WAIT = 0x8E16; -pub const BUFFER_ACCESS_FLAGS = 0x911F; -pub const BUFFER_MAP_LENGTH = 0x9120; -pub const BUFFER_MAP_OFFSET = 0x9121; -pub const DEPTH_COMPONENT32F = 0x8CAC; -pub const DEPTH32F_STENCIL8 = 0x8CAD; -pub const FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; -pub const INVALID_FRAMEBUFFER_OPERATION = 0x0506; -pub const FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210; -pub const FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211; -pub const FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212; -pub const FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213; -pub const FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214; -pub const FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215; -pub const FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216; -pub const FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; -pub const FRAMEBUFFER_DEFAULT = 0x8218; -pub const FRAMEBUFFER_UNDEFINED = 0x8219; -pub const DEPTH_STENCIL_ATTACHMENT = 0x821A; -pub const MAX_RENDERBUFFER_SIZE = 0x84E8; -pub const DEPTH_STENCIL = 0x84F9; -pub const UNSIGNED_INT_24_8 = 0x84FA; -pub const DEPTH24_STENCIL8 = 0x88F0; -pub const TEXTURE_STENCIL_SIZE = 0x88F1; -pub const TEXTURE_RED_TYPE = 0x8C10; -pub const TEXTURE_GREEN_TYPE = 0x8C11; -pub const TEXTURE_BLUE_TYPE = 0x8C12; -pub const TEXTURE_ALPHA_TYPE = 0x8C13; -pub const TEXTURE_DEPTH_TYPE = 0x8C16; -pub const UNSIGNED_NORMALIZED = 0x8C17; -pub const FRAMEBUFFER_BINDING = 0x8CA6; -pub const DRAW_FRAMEBUFFER_BINDING = 0x8CA6; -pub const RENDERBUFFER_BINDING = 0x8CA7; -pub const READ_FRAMEBUFFER = 0x8CA8; -pub const DRAW_FRAMEBUFFER = 0x8CA9; -pub const READ_FRAMEBUFFER_BINDING = 0x8CAA; -pub const RENDERBUFFER_SAMPLES = 0x8CAB; -pub const FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0; -pub const FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1; -pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2; -pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3; -pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4; -pub const FRAMEBUFFER_COMPLETE = 0x8CD5; -pub const FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6; -pub const FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7; -pub const FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB; -pub const FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC; -pub const FRAMEBUFFER_UNSUPPORTED = 0x8CDD; -pub const MAX_COLOR_ATTACHMENTS = 0x8CDF; -pub const COLOR_ATTACHMENT0 = 0x8CE0; -pub const COLOR_ATTACHMENT1 = 0x8CE1; -pub const COLOR_ATTACHMENT2 = 0x8CE2; -pub const COLOR_ATTACHMENT3 = 0x8CE3; -pub const COLOR_ATTACHMENT4 = 0x8CE4; -pub const COLOR_ATTACHMENT5 = 0x8CE5; -pub const COLOR_ATTACHMENT6 = 0x8CE6; -pub const COLOR_ATTACHMENT7 = 0x8CE7; -pub const COLOR_ATTACHMENT8 = 0x8CE8; -pub const COLOR_ATTACHMENT9 = 0x8CE9; -pub const COLOR_ATTACHMENT10 = 0x8CEA; -pub const COLOR_ATTACHMENT11 = 0x8CEB; -pub const COLOR_ATTACHMENT12 = 0x8CEC; -pub const COLOR_ATTACHMENT13 = 0x8CED; -pub const COLOR_ATTACHMENT14 = 0x8CEE; -pub const COLOR_ATTACHMENT15 = 0x8CEF; -pub const COLOR_ATTACHMENT16 = 0x8CF0; -pub const COLOR_ATTACHMENT17 = 0x8CF1; -pub const COLOR_ATTACHMENT18 = 0x8CF2; -pub const COLOR_ATTACHMENT19 = 0x8CF3; -pub const COLOR_ATTACHMENT20 = 0x8CF4; -pub const COLOR_ATTACHMENT21 = 0x8CF5; -pub const COLOR_ATTACHMENT22 = 0x8CF6; -pub const COLOR_ATTACHMENT23 = 0x8CF7; -pub const COLOR_ATTACHMENT24 = 0x8CF8; -pub const COLOR_ATTACHMENT25 = 0x8CF9; -pub const COLOR_ATTACHMENT26 = 0x8CFA; -pub const COLOR_ATTACHMENT27 = 0x8CFB; -pub const COLOR_ATTACHMENT28 = 0x8CFC; -pub const COLOR_ATTACHMENT29 = 0x8CFD; -pub const COLOR_ATTACHMENT30 = 0x8CFE; -pub const COLOR_ATTACHMENT31 = 0x8CFF; -pub const DEPTH_ATTACHMENT = 0x8D00; -pub const STENCIL_ATTACHMENT = 0x8D20; -pub const FRAMEBUFFER = 0x8D40; -pub const RENDERBUFFER = 0x8D41; -pub const RENDERBUFFER_WIDTH = 0x8D42; -pub const RENDERBUFFER_HEIGHT = 0x8D43; -pub const RENDERBUFFER_INTERNAL_FORMAT = 0x8D44; -pub const STENCIL_INDEX1 = 0x8D46; -pub const STENCIL_INDEX4 = 0x8D47; -pub const STENCIL_INDEX8 = 0x8D48; -pub const STENCIL_INDEX16 = 0x8D49; -pub const RENDERBUFFER_RED_SIZE = 0x8D50; -pub const RENDERBUFFER_GREEN_SIZE = 0x8D51; -pub const RENDERBUFFER_BLUE_SIZE = 0x8D52; -pub const RENDERBUFFER_ALPHA_SIZE = 0x8D53; -pub const RENDERBUFFER_DEPTH_SIZE = 0x8D54; -pub const RENDERBUFFER_STENCIL_SIZE = 0x8D55; -pub const FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56; -pub const MAX_SAMPLES = 0x8D57; -pub const LINES_ADJACENCY = 0x000A; -pub const CONTEXT_COMPATIBILITY_PROFILE_BIT = 0x00000002; -pub const CONTEXT_CORE_PROFILE_BIT = 0x00000001; -pub const FRAMEBUFFER_SRGB = 0x8DB9; -pub const HALF_FLOAT = 0x140B; -pub const MAP_READ_BIT = 0x0001; -pub const MAP_WRITE_BIT = 0x0002; -pub const MAP_INVALIDATE_RANGE_BIT = 0x0004; -pub const MAP_INVALIDATE_BUFFER_BIT = 0x0008; -pub const MAP_FLUSH_EXPLICIT_BIT = 0x0010; -pub const MAP_UNSYNCHRONIZED_BIT = 0x0020; -pub const COMPRESSED_RED_RGTC1 = 0x8DBB; -pub const COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC; -pub const COMPRESSED_RG_RGTC2 = 0x8DBD; -pub const COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE; -pub const RG = 0x8227; -pub const RG_INTEGER = 0x8228; -pub const R8 = 0x8229; -pub const R16 = 0x822A; -pub const RG8 = 0x822B; -pub const RG16 = 0x822C; -pub const R16F = 0x822D; -pub const R32F = 0x822E; -pub const RG16F = 0x822F; -pub const RG32F = 0x8230; -pub const R8I = 0x8231; -pub const R8UI = 0x8232; -pub const R16I = 0x8233; -pub const R16UI = 0x8234; -pub const R32I = 0x8235; -pub const R32UI = 0x8236; -pub const RG8I = 0x8237; -pub const RG8UI = 0x8238; -pub const RG16I = 0x8239; -pub const RG16UI = 0x823A; -pub const RG32I = 0x823B; -pub const RG32UI = 0x823C; -pub const VERTEX_ARRAY_BINDING = 0x85B5; -pub const TRIANGLE_STRIP_ADJACENCY = 0x000D; -pub const TRIANGLES_ADJACENCY = 0x000C; -pub const LINE_STRIP_ADJACENCY = 0x000B; -pub const SAMPLER_2D_RECT = 0x8B63; -pub const SAMPLER_2D_RECT_SHADOW = 0x8B64; -pub const SAMPLER_BUFFER = 0x8DC2; -pub const INT_SAMPLER_2D_RECT = 0x8DCD; -pub const INT_SAMPLER_BUFFER = 0x8DD0; -pub const UNSIGNED_INT_SAMPLER_2D_RECT = 0x8DD5; -pub const UNSIGNED_INT_SAMPLER_BUFFER = 0x8DD8; -pub const TEXTURE_BUFFER = 0x8C2A; -pub const MAX_TEXTURE_BUFFER_SIZE = 0x8C2B; -pub const TEXTURE_BINDING_BUFFER = 0x8C2C; -pub const TEXTURE_BUFFER_DATA_STORE_BINDING = 0x8C2D; -pub const TEXTURE_RECTANGLE = 0x84F5; -pub const TEXTURE_BINDING_RECTANGLE = 0x84F6; -pub const PROXY_TEXTURE_RECTANGLE = 0x84F7; -pub const MAX_RECTANGLE_TEXTURE_SIZE = 0x84F8; -pub const R8_SNORM = 0x8F94; -pub const RG8_SNORM = 0x8F95; -pub const RGB8_SNORM = 0x8F96; -pub const RGBA8_SNORM = 0x8F97; -pub const R16_SNORM = 0x8F98; -pub const RG16_SNORM = 0x8F99; -pub const RGB16_SNORM = 0x8F9A; -pub const RGBA16_SNORM = 0x8F9B; -pub const SIGNED_NORMALIZED = 0x8F9C; -pub const PRIMITIVE_RESTART = 0x8F9D; -pub const PRIMITIVE_RESTART_INDEX = 0x8F9E; -pub const COPY_READ_BUFFER = 0x8F36; -pub const COPY_WRITE_BUFFER = 0x8F37; -pub const UNIFORM_BUFFER = 0x8A11; -pub const UNIFORM_BUFFER_BINDING = 0x8A28; -pub const UNIFORM_BUFFER_START = 0x8A29; -pub const UNIFORM_BUFFER_SIZE = 0x8A2A; -pub const MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B; -pub const MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C; -pub const MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D; -pub const MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E; -pub const MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F; -pub const MAX_UNIFORM_BLOCK_SIZE = 0x8A30; -pub const MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31; -pub const MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32; -pub const MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33; -pub const UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; -pub const ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35; -pub const ACTIVE_UNIFORM_BLOCKS = 0x8A36; -pub const UNIFORM_TYPE = 0x8A37; -pub const UNIFORM_SIZE = 0x8A38; -pub const UNIFORM_NAME_LENGTH = 0x8A39; -pub const UNIFORM_BLOCK_INDEX = 0x8A3A; -pub const UNIFORM_OFFSET = 0x8A3B; -pub const UNIFORM_ARRAY_STRIDE = 0x8A3C; -pub const UNIFORM_MATRIX_STRIDE = 0x8A3D; -pub const UNIFORM_IS_ROW_MAJOR = 0x8A3E; -pub const UNIFORM_BLOCK_BINDING = 0x8A3F; -pub const UNIFORM_BLOCK_DATA_SIZE = 0x8A40; -pub const UNIFORM_BLOCK_NAME_LENGTH = 0x8A41; -pub const UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42; -pub const UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43; -pub const UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44; -pub const UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45; -pub const UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; -pub const INVALID_INDEX = 0xFFFFFFFF; - -pub fn cullFace(_mode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glCullFace, .{_mode}); -} - -pub fn frontFace(_mode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glFrontFace, .{_mode}); -} - -pub fn hint(_target: GLenum, _mode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glHint, .{ _target, _mode }); -} - -pub fn lineWidth(_width: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glLineWidth, .{_width}); -} - -pub fn pointSize(_size: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glPointSize, .{_size}); -} - -pub fn polygonMode(_face: GLenum, _mode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glPolygonMode, .{ _face, _mode }); -} - -pub fn scissor(_x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glScissor, .{ _x, _y, _width, _height }); -} - -pub fn texParameterf(_target: GLenum, _pname: GLenum, _param: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexParameterf, .{ _target, _pname, _param }); -} - -pub fn texParameterfv(_target: GLenum, _pname: GLenum, _params: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexParameterfv, .{ _target, _pname, _params }); -} - -pub fn texParameteri(_target: GLenum, _pname: GLenum, _param: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexParameteri, .{ _target, _pname, _param }); -} - -pub fn texParameteriv(_target: GLenum, _pname: GLenum, _params: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexParameteriv, .{ _target, _pname, _params }); -} - -pub fn texImage1D(_target: GLenum, _level: GLint, _internalformat: GLint, _width: GLsizei, _border: GLint, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexImage1D, .{ _target, _level, _internalformat, _width, _border, _format, _type, _pixels }); -} - -pub fn texImage2D(_target: GLenum, _level: GLint, _internalformat: GLint, _width: GLsizei, _height: GLsizei, _border: GLint, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexImage2D, .{ _target, _level, _internalformat, _width, _height, _border, _format, _type, _pixels }); -} - -pub fn drawBuffer(_buf: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawBuffer, .{_buf}); -} - -pub fn clear(_mask: GLbitfield) callconv(.C) void { - return @call(.always_tail, function_pointers.glClear, .{_mask}); -} - -pub fn clearColor(_red: GLfloat, _green: GLfloat, _blue: GLfloat, _alpha: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glClearColor, .{ _red, _green, _blue, _alpha }); -} - -pub fn clearStencil(_s: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glClearStencil, .{_s}); -} - -pub fn clearDepth(_depth: GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glClearDepth, .{_depth}); -} - -pub fn stencilMask(_mask: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glStencilMask, .{_mask}); -} - -pub fn colorMask(_red: GLboolean, _green: GLboolean, _blue: GLboolean, _alpha: GLboolean) callconv(.C) void { - return @call(.always_tail, function_pointers.glColorMask, .{ _red, _green, _blue, _alpha }); -} - -pub fn depthMask(_flag: GLboolean) callconv(.C) void { - return @call(.always_tail, function_pointers.glDepthMask, .{_flag}); -} - -pub fn disable(_cap: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glDisable, .{_cap}); -} - -pub fn enable(_cap: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glEnable, .{_cap}); -} - -pub fn finish() callconv(.C) void { - return @call(.always_tail, function_pointers.glFinish, .{}); -} - -pub fn flush() callconv(.C) void { - return @call(.always_tail, function_pointers.glFlush, .{}); -} - -pub fn blendFunc(_sfactor: GLenum, _dfactor: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glBlendFunc, .{ _sfactor, _dfactor }); -} - -pub fn logicOp(_opcode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glLogicOp, .{_opcode}); -} - -pub fn stencilFunc(_func: GLenum, _ref: GLint, _mask: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glStencilFunc, .{ _func, _ref, _mask }); -} - -pub fn stencilOp(_fail: GLenum, _zfail: GLenum, _zpass: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glStencilOp, .{ _fail, _zfail, _zpass }); -} - -pub fn depthFunc(_func: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glDepthFunc, .{_func}); -} - -pub fn pixelStoref(_pname: GLenum, _param: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glPixelStoref, .{ _pname, _param }); -} - -pub fn pixelStorei(_pname: GLenum, _param: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glPixelStorei, .{ _pname, _param }); -} - -pub fn readBuffer(_src: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glReadBuffer, .{_src}); -} - -pub fn readPixels(_x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei, _format: GLenum, _type: GLenum, _pixels: ?*anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glReadPixels, .{ _x, _y, _width, _height, _format, _type, _pixels }); -} - -pub fn getBooleanv(_pname: GLenum, _data: [*c]GLboolean) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetBooleanv, .{ _pname, _data }); -} - -pub fn getDoublev(_pname: GLenum, _data: [*c]GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetDoublev, .{ _pname, _data }); -} - -pub fn getError() callconv(.C) GLenum { - return @call(.always_tail, function_pointers.glGetError, .{}); -} - -pub fn getFloatv(_pname: GLenum, _data: [*c]GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetFloatv, .{ _pname, _data }); -} - -pub fn getIntegerv(_pname: GLenum, _data: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetIntegerv, .{ _pname, _data }); -} - -pub fn getString(_name: GLenum) callconv(.C) ?[*:0]const GLubyte { - return @call(.always_tail, function_pointers.glGetString, .{_name}); -} - -pub fn getTexImage(_target: GLenum, _level: GLint, _format: GLenum, _type: GLenum, _pixels: ?*anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetTexImage, .{ _target, _level, _format, _type, _pixels }); -} - -pub fn getTexParameterfv(_target: GLenum, _pname: GLenum, _params: [*c]GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetTexParameterfv, .{ _target, _pname, _params }); -} - -pub fn getTexParameteriv(_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetTexParameteriv, .{ _target, _pname, _params }); -} - -pub fn getTexLevelParameterfv(_target: GLenum, _level: GLint, _pname: GLenum, _params: [*c]GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetTexLevelParameterfv, .{ _target, _level, _pname, _params }); -} - -pub fn getTexLevelParameteriv(_target: GLenum, _level: GLint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetTexLevelParameteriv, .{ _target, _level, _pname, _params }); -} - -pub fn isEnabled(_cap: GLenum) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsEnabled, .{_cap}); -} - -pub fn depthRange(_n: GLdouble, _f: GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glDepthRange, .{ _n, _f }); -} - -pub fn viewport(_x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glViewport, .{ _x, _y, _width, _height }); -} - -pub fn drawArrays(_mode: GLenum, _first: GLint, _count: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawArrays, .{ _mode, _first, _count }); -} - -pub fn drawElements(_mode: GLenum, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawElements, .{ _mode, _count, _type, _indices }); -} - -pub fn polygonOffset(_factor: GLfloat, _units: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glPolygonOffset, .{ _factor, _units }); -} - -pub fn copyTexImage1D(_target: GLenum, _level: GLint, _internalformat: GLenum, _x: GLint, _y: GLint, _width: GLsizei, _border: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glCopyTexImage1D, .{ _target, _level, _internalformat, _x, _y, _width, _border }); -} - -pub fn copyTexImage2D(_target: GLenum, _level: GLint, _internalformat: GLenum, _x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei, _border: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glCopyTexImage2D, .{ _target, _level, _internalformat, _x, _y, _width, _height, _border }); -} - -pub fn copyTexSubImage1D(_target: GLenum, _level: GLint, _xoffset: GLint, _x: GLint, _y: GLint, _width: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glCopyTexSubImage1D, .{ _target, _level, _xoffset, _x, _y, _width }); -} - -pub fn copyTexSubImage2D(_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glCopyTexSubImage2D, .{ _target, _level, _xoffset, _yoffset, _x, _y, _width, _height }); -} - -pub fn texSubImage1D(_target: GLenum, _level: GLint, _xoffset: GLint, _width: GLsizei, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexSubImage1D, .{ _target, _level, _xoffset, _width, _format, _type, _pixels }); -} - -pub fn texSubImage2D(_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _width: GLsizei, _height: GLsizei, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexSubImage2D, .{ _target, _level, _xoffset, _yoffset, _width, _height, _format, _type, _pixels }); -} - -pub fn bindTexture(_target: GLenum, _texture: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindTexture, .{ _target, _texture }); -} - -pub fn deleteTextures(_n: GLsizei, _textures: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteTextures, .{ _n, _textures }); -} - -pub fn genTextures(_n: GLsizei, _textures: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGenTextures, .{ _n, _textures }); -} - -pub fn isTexture(_texture: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsTexture, .{_texture}); -} - -pub fn drawRangeElements(_mode: GLenum, _start: GLuint, _end: GLuint, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawRangeElements, .{ _mode, _start, _end, _count, _type, _indices }); -} - -pub fn texImage3D(_target: GLenum, _level: GLint, _internalformat: GLint, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _border: GLint, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexImage3D, .{ _target, _level, _internalformat, _width, _height, _depth, _border, _format, _type, _pixels }); -} - -pub fn texSubImage3D(_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _zoffset: GLint, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexSubImage3D, .{ _target, _level, _xoffset, _yoffset, _zoffset, _width, _height, _depth, _format, _type, _pixels }); -} - -pub fn copyTexSubImage3D(_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _zoffset: GLint, _x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glCopyTexSubImage3D, .{ _target, _level, _xoffset, _yoffset, _zoffset, _x, _y, _width, _height }); -} - -pub fn activeTexture(_texture: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glActiveTexture, .{_texture}); -} - -pub fn sampleCoverage(_value: GLfloat, _invert: GLboolean) callconv(.C) void { - return @call(.always_tail, function_pointers.glSampleCoverage, .{ _value, _invert }); -} - -pub fn compressedTexImage3D(_target: GLenum, _level: GLint, _internalformat: GLenum, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _border: GLint, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glCompressedTexImage3D, .{ _target, _level, _internalformat, _width, _height, _depth, _border, _imageSize, _data }); -} - -pub fn compressedTexImage2D(_target: GLenum, _level: GLint, _internalformat: GLenum, _width: GLsizei, _height: GLsizei, _border: GLint, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glCompressedTexImage2D, .{ _target, _level, _internalformat, _width, _height, _border, _imageSize, _data }); -} - -pub fn compressedTexImage1D(_target: GLenum, _level: GLint, _internalformat: GLenum, _width: GLsizei, _border: GLint, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glCompressedTexImage1D, .{ _target, _level, _internalformat, _width, _border, _imageSize, _data }); -} - -pub fn compressedTexSubImage3D(_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _zoffset: GLint, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _format: GLenum, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glCompressedTexSubImage3D, .{ _target, _level, _xoffset, _yoffset, _zoffset, _width, _height, _depth, _format, _imageSize, _data }); -} - -pub fn compressedTexSubImage2D(_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _width: GLsizei, _height: GLsizei, _format: GLenum, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glCompressedTexSubImage2D, .{ _target, _level, _xoffset, _yoffset, _width, _height, _format, _imageSize, _data }); -} - -pub fn compressedTexSubImage1D(_target: GLenum, _level: GLint, _xoffset: GLint, _width: GLsizei, _format: GLenum, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glCompressedTexSubImage1D, .{ _target, _level, _xoffset, _width, _format, _imageSize, _data }); -} - -pub fn getCompressedTexImage(_target: GLenum, _level: GLint, _img: ?*anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetCompressedTexImage, .{ _target, _level, _img }); -} - -pub fn vertexAttribP4uiv(_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribP4uiv, .{ _index, _type, _normalized, _value }); -} - -pub fn vertexAttribP4ui(_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribP4ui, .{ _index, _type, _normalized, _value }); -} - -pub fn vertexAttribP3uiv(_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribP3uiv, .{ _index, _type, _normalized, _value }); -} - -pub fn vertexAttribP3ui(_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribP3ui, .{ _index, _type, _normalized, _value }); -} - -pub fn vertexAttribP2uiv(_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribP2uiv, .{ _index, _type, _normalized, _value }); -} - -pub fn vertexAttribP2ui(_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribP2ui, .{ _index, _type, _normalized, _value }); -} - -pub fn vertexAttribP1uiv(_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribP1uiv, .{ _index, _type, _normalized, _value }); -} - -pub fn vertexAttribP1ui(_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribP1ui, .{ _index, _type, _normalized, _value }); -} - -pub fn vertexAttribDivisor(_index: GLuint, _divisor: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribDivisor, .{ _index, _divisor }); -} - -pub fn getQueryObjectui64v(_id: GLuint, _pname: GLenum, _params: [*c]GLuint64) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetQueryObjectui64v, .{ _id, _pname, _params }); -} - -pub fn getQueryObjecti64v(_id: GLuint, _pname: GLenum, _params: [*c]GLint64) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetQueryObjecti64v, .{ _id, _pname, _params }); -} - -pub fn queryCounter(_id: GLuint, _target: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glQueryCounter, .{ _id, _target }); -} - -pub fn getSamplerParameterIuiv(_sampler: GLuint, _pname: GLenum, _params: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetSamplerParameterIuiv, .{ _sampler, _pname, _params }); -} - -pub fn getSamplerParameterfv(_sampler: GLuint, _pname: GLenum, _params: [*c]GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetSamplerParameterfv, .{ _sampler, _pname, _params }); -} - -pub fn getSamplerParameterIiv(_sampler: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetSamplerParameterIiv, .{ _sampler, _pname, _params }); -} - -pub fn getSamplerParameteriv(_sampler: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetSamplerParameteriv, .{ _sampler, _pname, _params }); -} - -pub fn samplerParameterIuiv(_sampler: GLuint, _pname: GLenum, _param: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glSamplerParameterIuiv, .{ _sampler, _pname, _param }); -} - -pub fn samplerParameterIiv(_sampler: GLuint, _pname: GLenum, _param: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glSamplerParameterIiv, .{ _sampler, _pname, _param }); -} - -pub fn samplerParameterfv(_sampler: GLuint, _pname: GLenum, _param: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glSamplerParameterfv, .{ _sampler, _pname, _param }); -} - -pub fn samplerParameterf(_sampler: GLuint, _pname: GLenum, _param: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glSamplerParameterf, .{ _sampler, _pname, _param }); -} - -pub fn samplerParameteriv(_sampler: GLuint, _pname: GLenum, _param: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glSamplerParameteriv, .{ _sampler, _pname, _param }); -} - -pub fn samplerParameteri(_sampler: GLuint, _pname: GLenum, _param: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glSamplerParameteri, .{ _sampler, _pname, _param }); -} - -pub fn bindSampler(_unit: GLuint, _sampler: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindSampler, .{ _unit, _sampler }); -} - -pub fn isSampler(_sampler: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsSampler, .{_sampler}); -} - -pub fn deleteSamplers(_count: GLsizei, _samplers: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteSamplers, .{ _count, _samplers }); -} - -pub fn genSamplers(_count: GLsizei, _samplers: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGenSamplers, .{ _count, _samplers }); -} - -pub fn getFragDataIndex(_program: GLuint, _name: [*c]const GLchar) callconv(.C) GLint { - return @call(.always_tail, function_pointers.glGetFragDataIndex, .{ _program, _name }); -} - -pub fn bindFragDataLocationIndexed(_program: GLuint, _colorNumber: GLuint, _index: GLuint, _name: [*c]const GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindFragDataLocationIndexed, .{ _program, _colorNumber, _index, _name }); -} - -pub fn sampleMaski(_maskNumber: GLuint, _mask: GLbitfield) callconv(.C) void { - return @call(.always_tail, function_pointers.glSampleMaski, .{ _maskNumber, _mask }); -} - -pub fn getMultisamplefv(_pname: GLenum, _index: GLuint, _val: [*c]GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetMultisamplefv, .{ _pname, _index, _val }); -} - -pub fn texImage3DMultisample(_target: GLenum, _samples: GLsizei, _internalformat: GLenum, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _fixedsamplelocations: GLboolean) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexImage3DMultisample, .{ _target, _samples, _internalformat, _width, _height, _depth, _fixedsamplelocations }); -} - -pub fn texImage2DMultisample(_target: GLenum, _samples: GLsizei, _internalformat: GLenum, _width: GLsizei, _height: GLsizei, _fixedsamplelocations: GLboolean) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexImage2DMultisample, .{ _target, _samples, _internalformat, _width, _height, _fixedsamplelocations }); -} - -pub fn framebufferTexture(_target: GLenum, _attachment: GLenum, _texture: GLuint, _level: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glFramebufferTexture, .{ _target, _attachment, _texture, _level }); -} - -pub fn getBufferParameteri64v(_target: GLenum, _pname: GLenum, _params: [*c]GLint64) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetBufferParameteri64v, .{ _target, _pname, _params }); -} - -pub fn blendFuncSeparate(_sfactorRGB: GLenum, _dfactorRGB: GLenum, _sfactorAlpha: GLenum, _dfactorAlpha: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glBlendFuncSeparate, .{ _sfactorRGB, _dfactorRGB, _sfactorAlpha, _dfactorAlpha }); -} - -pub fn multiDrawArrays(_mode: GLenum, _first: [*c]const GLint, _count: [*c]const GLsizei, _drawcount: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glMultiDrawArrays, .{ _mode, _first, _count, _drawcount }); -} - -pub fn multiDrawElements(_mode: GLenum, _count: [*c]const GLsizei, _type: GLenum, _indices: [*c]const ?*const anyopaque, _drawcount: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glMultiDrawElements, .{ _mode, _count, _type, _indices, _drawcount }); -} - -pub fn pointParameterf(_pname: GLenum, _param: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glPointParameterf, .{ _pname, _param }); -} - -pub fn pointParameterfv(_pname: GLenum, _params: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glPointParameterfv, .{ _pname, _params }); -} - -pub fn pointParameteri(_pname: GLenum, _param: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glPointParameteri, .{ _pname, _param }); -} - -pub fn pointParameteriv(_pname: GLenum, _params: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glPointParameteriv, .{ _pname, _params }); -} - -pub fn getInteger64i_v(_target: GLenum, _index: GLuint, _data: [*c]GLint64) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetInteger64i_v, .{ _target, _index, _data }); -} - -pub fn getSynciv(_sync: GLsync, _pname: GLenum, _count: GLsizei, _length: [*c]GLsizei, _values: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetSynciv, .{ _sync, _pname, _count, _length, _values }); -} - -pub fn getInteger64v(_pname: GLenum, _data: [*c]GLint64) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetInteger64v, .{ _pname, _data }); -} - -pub fn waitSync(_sync: GLsync, _flags: GLbitfield, _timeout: GLuint64) callconv(.C) void { - return @call(.always_tail, function_pointers.glWaitSync, .{ _sync, _flags, _timeout }); -} - -pub fn clientWaitSync(_sync: GLsync, _flags: GLbitfield, _timeout: GLuint64) callconv(.C) GLenum { - return @call(.always_tail, function_pointers.glClientWaitSync, .{ _sync, _flags, _timeout }); -} - -pub fn deleteSync(_sync: GLsync) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteSync, .{_sync}); -} - -pub fn isSync(_sync: GLsync) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsSync, .{_sync}); -} - -pub fn fenceSync(_condition: GLenum, _flags: GLbitfield) callconv(.C) GLsync { - return @call(.always_tail, function_pointers.glFenceSync, .{ _condition, _flags }); -} - -pub fn blendColor(_red: GLfloat, _green: GLfloat, _blue: GLfloat, _alpha: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glBlendColor, .{ _red, _green, _blue, _alpha }); -} - -pub fn blendEquation(_mode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glBlendEquation, .{_mode}); -} - -pub fn provokingVertex(_mode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glProvokingVertex, .{_mode}); -} - -pub fn multiDrawElementsBaseVertex(_mode: GLenum, _count: [*c]const GLsizei, _type: GLenum, _indices: [*c]const ?*const anyopaque, _drawcount: GLsizei, _basevertex: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glMultiDrawElementsBaseVertex, .{ _mode, _count, _type, _indices, _drawcount, _basevertex }); -} - -pub fn drawElementsInstancedBaseVertex(_mode: GLenum, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque, _instancecount: GLsizei, _basevertex: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawElementsInstancedBaseVertex, .{ _mode, _count, _type, _indices, _instancecount, _basevertex }); -} - -pub fn drawRangeElementsBaseVertex(_mode: GLenum, _start: GLuint, _end: GLuint, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque, _basevertex: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawRangeElementsBaseVertex, .{ _mode, _start, _end, _count, _type, _indices, _basevertex }); -} - -pub fn drawElementsBaseVertex(_mode: GLenum, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque, _basevertex: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawElementsBaseVertex, .{ _mode, _count, _type, _indices, _basevertex }); -} - -pub fn genQueries(_n: GLsizei, _ids: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGenQueries, .{ _n, _ids }); -} - -pub fn deleteQueries(_n: GLsizei, _ids: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteQueries, .{ _n, _ids }); -} - -pub fn isQuery(_id: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsQuery, .{_id}); -} - -pub fn beginQuery(_target: GLenum, _id: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glBeginQuery, .{ _target, _id }); -} - -pub fn endQuery(_target: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glEndQuery, .{_target}); -} - -pub fn getQueryiv(_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetQueryiv, .{ _target, _pname, _params }); -} - -pub fn getQueryObjectiv(_id: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetQueryObjectiv, .{ _id, _pname, _params }); -} - -pub fn getQueryObjectuiv(_id: GLuint, _pname: GLenum, _params: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetQueryObjectuiv, .{ _id, _pname, _params }); -} - -pub fn bindBuffer(_target: GLenum, _buffer: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindBuffer, .{ _target, _buffer }); -} - -pub fn deleteBuffers(_n: GLsizei, _buffers: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteBuffers, .{ _n, _buffers }); -} - -pub fn genBuffers(_n: GLsizei, _buffers: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGenBuffers, .{ _n, _buffers }); -} - -pub fn isBuffer(_buffer: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsBuffer, .{_buffer}); -} - -pub fn bufferData(_target: GLenum, _size: GLsizeiptr, _data: ?*const anyopaque, _usage: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glBufferData, .{ _target, _size, _data, _usage }); -} - -pub fn bufferSubData(_target: GLenum, _offset: GLintptr, _size: GLsizeiptr, _data: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glBufferSubData, .{ _target, _offset, _size, _data }); -} - -pub fn getBufferSubData(_target: GLenum, _offset: GLintptr, _size: GLsizeiptr, _data: ?*anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetBufferSubData, .{ _target, _offset, _size, _data }); -} - -pub fn mapBuffer(_target: GLenum, _access: GLenum) callconv(.C) ?*anyopaque { - return @call(.always_tail, function_pointers.glMapBuffer, .{ _target, _access }); -} - -pub fn unmapBuffer(_target: GLenum) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glUnmapBuffer, .{_target}); -} - -pub fn getBufferParameteriv(_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetBufferParameteriv, .{ _target, _pname, _params }); -} - -pub fn getBufferPointerv(_target: GLenum, _pname: GLenum, _params: ?*?*anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetBufferPointerv, .{ _target, _pname, _params }); -} - -pub fn blendEquationSeparate(_modeRGB: GLenum, _modeAlpha: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glBlendEquationSeparate, .{ _modeRGB, _modeAlpha }); -} - -pub fn drawBuffers(_n: GLsizei, _bufs: [*c]const GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawBuffers, .{ _n, _bufs }); -} - -pub fn stencilOpSeparate(_face: GLenum, _sfail: GLenum, _dpfail: GLenum, _dppass: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glStencilOpSeparate, .{ _face, _sfail, _dpfail, _dppass }); -} - -pub fn stencilFuncSeparate(_face: GLenum, _func: GLenum, _ref: GLint, _mask: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glStencilFuncSeparate, .{ _face, _func, _ref, _mask }); -} - -pub fn stencilMaskSeparate(_face: GLenum, _mask: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glStencilMaskSeparate, .{ _face, _mask }); -} - -pub fn attachShader(_program: GLuint, _shader: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glAttachShader, .{ _program, _shader }); -} - -pub fn bindAttribLocation(_program: GLuint, _index: GLuint, _name: [*c]const GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindAttribLocation, .{ _program, _index, _name }); -} - -pub fn compileShader(_shader: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glCompileShader, .{_shader}); -} - -pub fn createProgram() callconv(.C) GLuint { - return @call(.always_tail, function_pointers.glCreateProgram, .{}); -} - -pub fn createShader(_type: GLenum) callconv(.C) GLuint { - return @call(.always_tail, function_pointers.glCreateShader, .{_type}); -} - -pub fn deleteProgram(_program: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteProgram, .{_program}); -} - -pub fn deleteShader(_shader: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteShader, .{_shader}); -} - -pub fn detachShader(_program: GLuint, _shader: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDetachShader, .{ _program, _shader }); -} - -pub fn disableVertexAttribArray(_index: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDisableVertexAttribArray, .{_index}); -} - -pub fn enableVertexAttribArray(_index: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glEnableVertexAttribArray, .{_index}); -} - -pub fn getActiveAttrib(_program: GLuint, _index: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _size: [*c]GLint, _type: [*c]GLenum, _name: [*c]GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetActiveAttrib, .{ _program, _index, _bufSize, _length, _size, _type, _name }); -} - -pub fn getActiveUniform(_program: GLuint, _index: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _size: [*c]GLint, _type: [*c]GLenum, _name: [*c]GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetActiveUniform, .{ _program, _index, _bufSize, _length, _size, _type, _name }); -} - -pub fn getAttachedShaders(_program: GLuint, _maxCount: GLsizei, _count: [*c]GLsizei, _shaders: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetAttachedShaders, .{ _program, _maxCount, _count, _shaders }); -} - -pub fn getAttribLocation(_program: GLuint, _name: [*c]const GLchar) callconv(.C) GLint { - return @call(.always_tail, function_pointers.glGetAttribLocation, .{ _program, _name }); -} - -pub fn getProgramiv(_program: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetProgramiv, .{ _program, _pname, _params }); -} - -pub fn getProgramInfoLog(_program: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _infoLog: [*c]GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetProgramInfoLog, .{ _program, _bufSize, _length, _infoLog }); -} - -pub fn getShaderiv(_shader: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetShaderiv, .{ _shader, _pname, _params }); -} - -pub fn getShaderInfoLog(_shader: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _infoLog: [*c]GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetShaderInfoLog, .{ _shader, _bufSize, _length, _infoLog }); -} - -pub fn getShaderSource(_shader: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _source: [*c]GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetShaderSource, .{ _shader, _bufSize, _length, _source }); -} - -pub fn getUniformLocation(_program: GLuint, _name: [*c]const GLchar) callconv(.C) GLint { - return @call(.always_tail, function_pointers.glGetUniformLocation, .{ _program, _name }); -} - -pub fn getUniformfv(_program: GLuint, _location: GLint, _params: [*c]GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetUniformfv, .{ _program, _location, _params }); -} - -pub fn getUniformiv(_program: GLuint, _location: GLint, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetUniformiv, .{ _program, _location, _params }); -} - -pub fn getVertexAttribdv(_index: GLuint, _pname: GLenum, _params: [*c]GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetVertexAttribdv, .{ _index, _pname, _params }); -} - -pub fn getVertexAttribfv(_index: GLuint, _pname: GLenum, _params: [*c]GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetVertexAttribfv, .{ _index, _pname, _params }); -} - -pub fn getVertexAttribiv(_index: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetVertexAttribiv, .{ _index, _pname, _params }); -} - -pub fn getVertexAttribPointerv(_index: GLuint, _pname: GLenum, _pointer: ?*?*anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetVertexAttribPointerv, .{ _index, _pname, _pointer }); -} - -pub fn isProgram(_program: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsProgram, .{_program}); -} - -pub fn isShader(_shader: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsShader, .{_shader}); -} - -pub fn linkProgram(_program: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glLinkProgram, .{_program}); -} - -pub fn shaderSource(_shader: GLuint, _count: GLsizei, _string: [*c]const [*c]const GLchar, _length: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glShaderSource, .{ _shader, _count, _string, _length }); -} - -pub fn useProgram(_program: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUseProgram, .{_program}); -} - -pub fn uniform1f(_location: GLint, _v0: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform1f, .{ _location, _v0 }); -} - -pub fn uniform2f(_location: GLint, _v0: GLfloat, _v1: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform2f, .{ _location, _v0, _v1 }); -} - -pub fn uniform3f(_location: GLint, _v0: GLfloat, _v1: GLfloat, _v2: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform3f, .{ _location, _v0, _v1, _v2 }); -} - -pub fn uniform4f(_location: GLint, _v0: GLfloat, _v1: GLfloat, _v2: GLfloat, _v3: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform4f, .{ _location, _v0, _v1, _v2, _v3 }); -} - -pub fn uniform1i(_location: GLint, _v0: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform1i, .{ _location, _v0 }); -} - -pub fn uniform2i(_location: GLint, _v0: GLint, _v1: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform2i, .{ _location, _v0, _v1 }); -} - -pub fn uniform3i(_location: GLint, _v0: GLint, _v1: GLint, _v2: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform3i, .{ _location, _v0, _v1, _v2 }); -} - -pub fn uniform4i(_location: GLint, _v0: GLint, _v1: GLint, _v2: GLint, _v3: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform4i, .{ _location, _v0, _v1, _v2, _v3 }); -} - -pub fn uniform1fv(_location: GLint, _count: GLsizei, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform1fv, .{ _location, _count, _value }); -} - -pub fn uniform2fv(_location: GLint, _count: GLsizei, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform2fv, .{ _location, _count, _value }); -} - -pub fn uniform3fv(_location: GLint, _count: GLsizei, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform3fv, .{ _location, _count, _value }); -} - -pub fn uniform4fv(_location: GLint, _count: GLsizei, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform4fv, .{ _location, _count, _value }); -} - -pub fn uniform1iv(_location: GLint, _count: GLsizei, _value: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform1iv, .{ _location, _count, _value }); -} - -pub fn uniform2iv(_location: GLint, _count: GLsizei, _value: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform2iv, .{ _location, _count, _value }); -} - -pub fn uniform3iv(_location: GLint, _count: GLsizei, _value: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform3iv, .{ _location, _count, _value }); -} - -pub fn uniform4iv(_location: GLint, _count: GLsizei, _value: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform4iv, .{ _location, _count, _value }); -} - -pub fn uniformMatrix2fv(_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformMatrix2fv, .{ _location, _count, _transpose, _value }); -} - -pub fn uniformMatrix3fv(_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformMatrix3fv, .{ _location, _count, _transpose, _value }); -} - -pub fn uniformMatrix4fv(_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformMatrix4fv, .{ _location, _count, _transpose, _value }); -} - -pub fn validateProgram(_program: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glValidateProgram, .{_program}); -} - -pub fn vertexAttrib1d(_index: GLuint, _x: GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib1d, .{ _index, _x }); -} - -pub fn vertexAttrib1dv(_index: GLuint, _v: [*c]const GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib1dv, .{ _index, _v }); -} - -pub fn vertexAttrib1f(_index: GLuint, _x: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib1f, .{ _index, _x }); -} - -pub fn vertexAttrib1fv(_index: GLuint, _v: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib1fv, .{ _index, _v }); -} - -pub fn vertexAttrib1s(_index: GLuint, _x: GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib1s, .{ _index, _x }); -} - -pub fn vertexAttrib1sv(_index: GLuint, _v: [*c]const GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib1sv, .{ _index, _v }); -} - -pub fn vertexAttrib2d(_index: GLuint, _x: GLdouble, _y: GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib2d, .{ _index, _x, _y }); -} - -pub fn vertexAttrib2dv(_index: GLuint, _v: [*c]const GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib2dv, .{ _index, _v }); -} - -pub fn vertexAttrib2f(_index: GLuint, _x: GLfloat, _y: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib2f, .{ _index, _x, _y }); -} - -pub fn vertexAttrib2fv(_index: GLuint, _v: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib2fv, .{ _index, _v }); -} - -pub fn vertexAttrib2s(_index: GLuint, _x: GLshort, _y: GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib2s, .{ _index, _x, _y }); -} - -pub fn vertexAttrib2sv(_index: GLuint, _v: [*c]const GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib2sv, .{ _index, _v }); -} - -pub fn vertexAttrib3d(_index: GLuint, _x: GLdouble, _y: GLdouble, _z: GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib3d, .{ _index, _x, _y, _z }); -} - -pub fn vertexAttrib3dv(_index: GLuint, _v: [*c]const GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib3dv, .{ _index, _v }); -} - -pub fn vertexAttrib3f(_index: GLuint, _x: GLfloat, _y: GLfloat, _z: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib3f, .{ _index, _x, _y, _z }); -} - -pub fn vertexAttrib3fv(_index: GLuint, _v: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib3fv, .{ _index, _v }); -} - -pub fn vertexAttrib3s(_index: GLuint, _x: GLshort, _y: GLshort, _z: GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib3s, .{ _index, _x, _y, _z }); -} - -pub fn vertexAttrib3sv(_index: GLuint, _v: [*c]const GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib3sv, .{ _index, _v }); -} - -pub fn vertexAttrib4Nbv(_index: GLuint, _v: [*c]const GLbyte) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4Nbv, .{ _index, _v }); -} - -pub fn vertexAttrib4Niv(_index: GLuint, _v: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4Niv, .{ _index, _v }); -} - -pub fn vertexAttrib4Nsv(_index: GLuint, _v: [*c]const GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4Nsv, .{ _index, _v }); -} - -pub fn vertexAttrib4Nub(_index: GLuint, _x: GLubyte, _y: GLubyte, _z: GLubyte, _w: GLubyte) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4Nub, .{ _index, _x, _y, _z, _w }); -} - -pub fn vertexAttrib4Nubv(_index: GLuint, _v: ?[*:0]const GLubyte) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4Nubv, .{ _index, _v }); -} - -pub fn vertexAttrib4Nuiv(_index: GLuint, _v: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4Nuiv, .{ _index, _v }); -} - -pub fn vertexAttrib4Nusv(_index: GLuint, _v: [*c]const GLushort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4Nusv, .{ _index, _v }); -} - -pub fn vertexAttrib4bv(_index: GLuint, _v: [*c]const GLbyte) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4bv, .{ _index, _v }); -} - -pub fn vertexAttrib4d(_index: GLuint, _x: GLdouble, _y: GLdouble, _z: GLdouble, _w: GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4d, .{ _index, _x, _y, _z, _w }); -} - -pub fn vertexAttrib4dv(_index: GLuint, _v: [*c]const GLdouble) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4dv, .{ _index, _v }); -} - -pub fn vertexAttrib4f(_index: GLuint, _x: GLfloat, _y: GLfloat, _z: GLfloat, _w: GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4f, .{ _index, _x, _y, _z, _w }); -} - -pub fn vertexAttrib4fv(_index: GLuint, _v: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4fv, .{ _index, _v }); -} - -pub fn vertexAttrib4iv(_index: GLuint, _v: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4iv, .{ _index, _v }); -} - -pub fn vertexAttrib4s(_index: GLuint, _x: GLshort, _y: GLshort, _z: GLshort, _w: GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4s, .{ _index, _x, _y, _z, _w }); -} - -pub fn vertexAttrib4sv(_index: GLuint, _v: [*c]const GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4sv, .{ _index, _v }); -} - -pub fn vertexAttrib4ubv(_index: GLuint, _v: ?[*:0]const GLubyte) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4ubv, .{ _index, _v }); -} - -pub fn vertexAttrib4uiv(_index: GLuint, _v: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4uiv, .{ _index, _v }); -} - -pub fn vertexAttrib4usv(_index: GLuint, _v: [*c]const GLushort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttrib4usv, .{ _index, _v }); -} - -pub fn vertexAttribPointer(_index: GLuint, _size: GLint, _type: GLenum, _normalized: GLboolean, _stride: GLsizei, _pointer: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribPointer, .{ _index, _size, _type, _normalized, _stride, _pointer }); -} - -pub fn uniformMatrix2x3fv(_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformMatrix2x3fv, .{ _location, _count, _transpose, _value }); -} - -pub fn uniformMatrix3x2fv(_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformMatrix3x2fv, .{ _location, _count, _transpose, _value }); -} - -pub fn uniformMatrix2x4fv(_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformMatrix2x4fv, .{ _location, _count, _transpose, _value }); -} - -pub fn uniformMatrix4x2fv(_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformMatrix4x2fv, .{ _location, _count, _transpose, _value }); -} - -pub fn uniformMatrix3x4fv(_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformMatrix3x4fv, .{ _location, _count, _transpose, _value }); -} - -pub fn uniformMatrix4x3fv(_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformMatrix4x3fv, .{ _location, _count, _transpose, _value }); -} - -pub fn colorMaski(_index: GLuint, _r: GLboolean, _g: GLboolean, _b: GLboolean, _a: GLboolean) callconv(.C) void { - return @call(.always_tail, function_pointers.glColorMaski, .{ _index, _r, _g, _b, _a }); -} - -pub fn getBooleani_v(_target: GLenum, _index: GLuint, _data: [*c]GLboolean) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetBooleani_v, .{ _target, _index, _data }); -} - -pub fn getIntegeri_v(_target: GLenum, _index: GLuint, _data: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetIntegeri_v, .{ _target, _index, _data }); -} - -pub fn enablei(_target: GLenum, _index: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glEnablei, .{ _target, _index }); -} - -pub fn disablei(_target: GLenum, _index: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDisablei, .{ _target, _index }); -} - -pub fn isEnabledi(_target: GLenum, _index: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsEnabledi, .{ _target, _index }); -} - -pub fn beginTransformFeedback(_primitiveMode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glBeginTransformFeedback, .{_primitiveMode}); -} - -pub fn endTransformFeedback() callconv(.C) void { - return @call(.always_tail, function_pointers.glEndTransformFeedback, .{}); -} - -pub fn bindBufferRange(_target: GLenum, _index: GLuint, _buffer: GLuint, _offset: GLintptr, _size: GLsizeiptr) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindBufferRange, .{ _target, _index, _buffer, _offset, _size }); -} - -pub fn bindBufferBase(_target: GLenum, _index: GLuint, _buffer: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindBufferBase, .{ _target, _index, _buffer }); -} - -pub fn transformFeedbackVaryings(_program: GLuint, _count: GLsizei, _varyings: [*c]const [*c]const GLchar, _bufferMode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glTransformFeedbackVaryings, .{ _program, _count, _varyings, _bufferMode }); -} - -pub fn getTransformFeedbackVarying(_program: GLuint, _index: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _size: [*c]GLsizei, _type: [*c]GLenum, _name: [*c]GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetTransformFeedbackVarying, .{ _program, _index, _bufSize, _length, _size, _type, _name }); -} - -pub fn clampColor(_target: GLenum, _clamp: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glClampColor, .{ _target, _clamp }); -} - -pub fn beginConditionalRender(_id: GLuint, _mode: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glBeginConditionalRender, .{ _id, _mode }); -} - -pub fn endConditionalRender() callconv(.C) void { - return @call(.always_tail, function_pointers.glEndConditionalRender, .{}); -} - -pub fn vertexAttribIPointer(_index: GLuint, _size: GLint, _type: GLenum, _stride: GLsizei, _pointer: ?*const anyopaque) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribIPointer, .{ _index, _size, _type, _stride, _pointer }); -} - -pub fn getVertexAttribIiv(_index: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetVertexAttribIiv, .{ _index, _pname, _params }); -} - -pub fn getVertexAttribIuiv(_index: GLuint, _pname: GLenum, _params: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetVertexAttribIuiv, .{ _index, _pname, _params }); -} - -pub fn vertexAttribI1i(_index: GLuint, _x: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI1i, .{ _index, _x }); -} - -pub fn vertexAttribI2i(_index: GLuint, _x: GLint, _y: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI2i, .{ _index, _x, _y }); -} - -pub fn vertexAttribI3i(_index: GLuint, _x: GLint, _y: GLint, _z: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI3i, .{ _index, _x, _y, _z }); -} - -pub fn vertexAttribI4i(_index: GLuint, _x: GLint, _y: GLint, _z: GLint, _w: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI4i, .{ _index, _x, _y, _z, _w }); -} - -pub fn vertexAttribI1ui(_index: GLuint, _x: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI1ui, .{ _index, _x }); -} - -pub fn vertexAttribI2ui(_index: GLuint, _x: GLuint, _y: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI2ui, .{ _index, _x, _y }); -} - -pub fn vertexAttribI3ui(_index: GLuint, _x: GLuint, _y: GLuint, _z: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI3ui, .{ _index, _x, _y, _z }); -} - -pub fn vertexAttribI4ui(_index: GLuint, _x: GLuint, _y: GLuint, _z: GLuint, _w: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI4ui, .{ _index, _x, _y, _z, _w }); -} - -pub fn vertexAttribI1iv(_index: GLuint, _v: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI1iv, .{ _index, _v }); -} - -pub fn vertexAttribI2iv(_index: GLuint, _v: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI2iv, .{ _index, _v }); -} - -pub fn vertexAttribI3iv(_index: GLuint, _v: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI3iv, .{ _index, _v }); -} - -pub fn vertexAttribI4iv(_index: GLuint, _v: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI4iv, .{ _index, _v }); -} - -pub fn vertexAttribI1uiv(_index: GLuint, _v: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI1uiv, .{ _index, _v }); -} - -pub fn vertexAttribI2uiv(_index: GLuint, _v: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI2uiv, .{ _index, _v }); -} - -pub fn vertexAttribI3uiv(_index: GLuint, _v: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI3uiv, .{ _index, _v }); -} - -pub fn vertexAttribI4uiv(_index: GLuint, _v: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI4uiv, .{ _index, _v }); -} - -pub fn vertexAttribI4bv(_index: GLuint, _v: [*c]const GLbyte) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI4bv, .{ _index, _v }); -} - -pub fn vertexAttribI4sv(_index: GLuint, _v: [*c]const GLshort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI4sv, .{ _index, _v }); -} - -pub fn vertexAttribI4ubv(_index: GLuint, _v: ?[*:0]const GLubyte) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI4ubv, .{ _index, _v }); -} - -pub fn vertexAttribI4usv(_index: GLuint, _v: [*c]const GLushort) callconv(.C) void { - return @call(.always_tail, function_pointers.glVertexAttribI4usv, .{ _index, _v }); -} - -pub fn getUniformuiv(_program: GLuint, _location: GLint, _params: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetUniformuiv, .{ _program, _location, _params }); -} - -pub fn bindFragDataLocation(_program: GLuint, _color: GLuint, _name: [*c]const GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindFragDataLocation, .{ _program, _color, _name }); -} - -pub fn getFragDataLocation(_program: GLuint, _name: [*c]const GLchar) callconv(.C) GLint { - return @call(.always_tail, function_pointers.glGetFragDataLocation, .{ _program, _name }); -} - -pub fn uniform1ui(_location: GLint, _v0: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform1ui, .{ _location, _v0 }); -} - -pub fn uniform2ui(_location: GLint, _v0: GLuint, _v1: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform2ui, .{ _location, _v0, _v1 }); -} - -pub fn uniform3ui(_location: GLint, _v0: GLuint, _v1: GLuint, _v2: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform3ui, .{ _location, _v0, _v1, _v2 }); -} - -pub fn uniform4ui(_location: GLint, _v0: GLuint, _v1: GLuint, _v2: GLuint, _v3: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform4ui, .{ _location, _v0, _v1, _v2, _v3 }); -} - -pub fn uniform1uiv(_location: GLint, _count: GLsizei, _value: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform1uiv, .{ _location, _count, _value }); -} - -pub fn uniform2uiv(_location: GLint, _count: GLsizei, _value: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform2uiv, .{ _location, _count, _value }); -} - -pub fn uniform3uiv(_location: GLint, _count: GLsizei, _value: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform3uiv, .{ _location, _count, _value }); -} - -pub fn uniform4uiv(_location: GLint, _count: GLsizei, _value: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniform4uiv, .{ _location, _count, _value }); -} - -pub fn texParameterIiv(_target: GLenum, _pname: GLenum, _params: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexParameterIiv, .{ _target, _pname, _params }); -} - -pub fn texParameterIuiv(_target: GLenum, _pname: GLenum, _params: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexParameterIuiv, .{ _target, _pname, _params }); -} - -pub fn getTexParameterIiv(_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetTexParameterIiv, .{ _target, _pname, _params }); -} - -pub fn getTexParameterIuiv(_target: GLenum, _pname: GLenum, _params: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetTexParameterIuiv, .{ _target, _pname, _params }); -} - -pub fn clearBufferiv(_buffer: GLenum, _drawbuffer: GLint, _value: [*c]const GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glClearBufferiv, .{ _buffer, _drawbuffer, _value }); -} - -pub fn clearBufferuiv(_buffer: GLenum, _drawbuffer: GLint, _value: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glClearBufferuiv, .{ _buffer, _drawbuffer, _value }); -} - -pub fn clearBufferfv(_buffer: GLenum, _drawbuffer: GLint, _value: [*c]const GLfloat) callconv(.C) void { - return @call(.always_tail, function_pointers.glClearBufferfv, .{ _buffer, _drawbuffer, _value }); -} - -pub fn clearBufferfi(_buffer: GLenum, _drawbuffer: GLint, _depth: GLfloat, _stencil: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glClearBufferfi, .{ _buffer, _drawbuffer, _depth, _stencil }); -} - -pub fn getStringi(_name: GLenum, _index: GLuint) callconv(.C) ?[*:0]const GLubyte { - return @call(.always_tail, function_pointers.glGetStringi, .{ _name, _index }); -} - -pub fn isRenderbuffer(_renderbuffer: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsRenderbuffer, .{_renderbuffer}); -} - -pub fn bindRenderbuffer(_target: GLenum, _renderbuffer: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindRenderbuffer, .{ _target, _renderbuffer }); -} - -pub fn deleteRenderbuffers(_n: GLsizei, _renderbuffers: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteRenderbuffers, .{ _n, _renderbuffers }); -} - -pub fn genRenderbuffers(_n: GLsizei, _renderbuffers: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGenRenderbuffers, .{ _n, _renderbuffers }); -} - -pub fn renderbufferStorage(_target: GLenum, _internalformat: GLenum, _width: GLsizei, _height: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glRenderbufferStorage, .{ _target, _internalformat, _width, _height }); -} - -pub fn getRenderbufferParameteriv(_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetRenderbufferParameteriv, .{ _target, _pname, _params }); -} - -pub fn isFramebuffer(_framebuffer: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsFramebuffer, .{_framebuffer}); -} - -pub fn bindFramebuffer(_target: GLenum, _framebuffer: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindFramebuffer, .{ _target, _framebuffer }); -} - -pub fn deleteFramebuffers(_n: GLsizei, _framebuffers: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteFramebuffers, .{ _n, _framebuffers }); -} - -pub fn genFramebuffers(_n: GLsizei, _framebuffers: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGenFramebuffers, .{ _n, _framebuffers }); -} - -pub fn checkFramebufferStatus(_target: GLenum) callconv(.C) GLenum { - return @call(.always_tail, function_pointers.glCheckFramebufferStatus, .{_target}); -} - -pub fn framebufferTexture1D(_target: GLenum, _attachment: GLenum, _textarget: GLenum, _texture: GLuint, _level: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glFramebufferTexture1D, .{ _target, _attachment, _textarget, _texture, _level }); -} - -pub fn framebufferTexture2D(_target: GLenum, _attachment: GLenum, _textarget: GLenum, _texture: GLuint, _level: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glFramebufferTexture2D, .{ _target, _attachment, _textarget, _texture, _level }); -} - -pub fn framebufferTexture3D(_target: GLenum, _attachment: GLenum, _textarget: GLenum, _texture: GLuint, _level: GLint, _zoffset: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glFramebufferTexture3D, .{ _target, _attachment, _textarget, _texture, _level, _zoffset }); -} - -pub fn framebufferRenderbuffer(_target: GLenum, _attachment: GLenum, _renderbuffertarget: GLenum, _renderbuffer: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glFramebufferRenderbuffer, .{ _target, _attachment, _renderbuffertarget, _renderbuffer }); -} - -pub fn getFramebufferAttachmentParameteriv(_target: GLenum, _attachment: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetFramebufferAttachmentParameteriv, .{ _target, _attachment, _pname, _params }); -} - -pub fn generateMipmap(_target: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glGenerateMipmap, .{_target}); -} - -pub fn blitFramebuffer(_srcX0: GLint, _srcY0: GLint, _srcX1: GLint, _srcY1: GLint, _dstX0: GLint, _dstY0: GLint, _dstX1: GLint, _dstY1: GLint, _mask: GLbitfield, _filter: GLenum) callconv(.C) void { - return @call(.always_tail, function_pointers.glBlitFramebuffer, .{ _srcX0, _srcY0, _srcX1, _srcY1, _dstX0, _dstY0, _dstX1, _dstY1, _mask, _filter }); -} - -pub fn renderbufferStorageMultisample(_target: GLenum, _samples: GLsizei, _internalformat: GLenum, _width: GLsizei, _height: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glRenderbufferStorageMultisample, .{ _target, _samples, _internalformat, _width, _height }); -} - -pub fn framebufferTextureLayer(_target: GLenum, _attachment: GLenum, _texture: GLuint, _level: GLint, _layer: GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glFramebufferTextureLayer, .{ _target, _attachment, _texture, _level, _layer }); -} - -pub fn mapBufferRange(_target: GLenum, _offset: GLintptr, _length: GLsizeiptr, _access: GLbitfield) callconv(.C) ?*anyopaque { - return @call(.always_tail, function_pointers.glMapBufferRange, .{ _target, _offset, _length, _access }); -} - -pub fn flushMappedBufferRange(_target: GLenum, _offset: GLintptr, _length: GLsizeiptr) callconv(.C) void { - return @call(.always_tail, function_pointers.glFlushMappedBufferRange, .{ _target, _offset, _length }); -} - -pub fn bindVertexArray(_array: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glBindVertexArray, .{_array}); -} - -pub fn deleteVertexArrays(_n: GLsizei, _arrays: [*c]const GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glDeleteVertexArrays, .{ _n, _arrays }); -} - -pub fn genVertexArrays(_n: GLsizei, _arrays: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGenVertexArrays, .{ _n, _arrays }); -} - -pub fn isVertexArray(_array: GLuint) callconv(.C) GLboolean { - return @call(.always_tail, function_pointers.glIsVertexArray, .{_array}); -} - -pub fn drawArraysInstanced(_mode: GLenum, _first: GLint, _count: GLsizei, _instancecount: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawArraysInstanced, .{ _mode, _first, _count, _instancecount }); -} - -pub fn drawElementsInstanced(_mode: GLenum, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque, _instancecount: GLsizei) callconv(.C) void { - return @call(.always_tail, function_pointers.glDrawElementsInstanced, .{ _mode, _count, _type, _indices, _instancecount }); -} - -pub fn texBuffer(_target: GLenum, _internalformat: GLenum, _buffer: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glTexBuffer, .{ _target, _internalformat, _buffer }); -} - -pub fn primitiveRestartIndex(_index: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glPrimitiveRestartIndex, .{_index}); -} - -pub fn copyBufferSubData(_readTarget: GLenum, _writeTarget: GLenum, _readOffset: GLintptr, _writeOffset: GLintptr, _size: GLsizeiptr) callconv(.C) void { - return @call(.always_tail, function_pointers.glCopyBufferSubData, .{ _readTarget, _writeTarget, _readOffset, _writeOffset, _size }); -} - -pub fn getUniformIndices(_program: GLuint, _uniformCount: GLsizei, _uniformNames: [*c]const [*c]const GLchar, _uniformIndices: [*c]GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetUniformIndices, .{ _program, _uniformCount, _uniformNames, _uniformIndices }); -} - -pub fn getActiveUniformsiv(_program: GLuint, _uniformCount: GLsizei, _uniformIndices: [*c]const GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetActiveUniformsiv, .{ _program, _uniformCount, _uniformIndices, _pname, _params }); -} - -pub fn getActiveUniformName(_program: GLuint, _uniformIndex: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _uniformName: [*c]GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetActiveUniformName, .{ _program, _uniformIndex, _bufSize, _length, _uniformName }); -} - -pub fn getUniformBlockIndex(_program: GLuint, _uniformBlockName: [*c]const GLchar) callconv(.C) GLuint { - return @call(.always_tail, function_pointers.glGetUniformBlockIndex, .{ _program, _uniformBlockName }); -} - -pub fn getActiveUniformBlockiv(_program: GLuint, _uniformBlockIndex: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetActiveUniformBlockiv, .{ _program, _uniformBlockIndex, _pname, _params }); -} - -pub fn getActiveUniformBlockName(_program: GLuint, _uniformBlockIndex: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _uniformBlockName: [*c]GLchar) callconv(.C) void { - return @call(.always_tail, function_pointers.glGetActiveUniformBlockName, .{ _program, _uniformBlockIndex, _bufSize, _length, _uniformBlockName }); -} - -pub fn uniformBlockBinding(_program: GLuint, _uniformBlockIndex: GLuint, _uniformBlockBinding: GLuint) callconv(.C) void { - return @call(.always_tail, function_pointers.glUniformBlockBinding, .{ _program, _uniformBlockIndex, _uniformBlockBinding }); -} -// Extensions: - -// Loader API: -pub fn load(load_ctx: anytype, get_proc_address: fn (@TypeOf(load_ctx), [:0]const u8) ?FunctionPointer) !void { - var success = true; - if (get_proc_address(load_ctx, "glCullFace")) |proc| { - function_pointers.glCullFace = @ptrCast(proc); - } else { - log.err("entry point glCullFace not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFrontFace")) |proc| { - function_pointers.glFrontFace = @ptrCast(proc); - } else { - log.err("entry point glFrontFace not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glHint")) |proc| { - function_pointers.glHint = @ptrCast(proc); - } else { - log.err("entry point glHint not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glLineWidth")) |proc| { - function_pointers.glLineWidth = @ptrCast(proc); - } else { - log.err("entry point glLineWidth not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPointSize")) |proc| { - function_pointers.glPointSize = @ptrCast(proc); - } else { - log.err("entry point glPointSize not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPolygonMode")) |proc| { - function_pointers.glPolygonMode = @ptrCast(proc); - } else { - log.err("entry point glPolygonMode not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glScissor")) |proc| { - function_pointers.glScissor = @ptrCast(proc); - } else { - log.err("entry point glScissor not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexParameterf")) |proc| { - function_pointers.glTexParameterf = @ptrCast(proc); - } else { - log.err("entry point glTexParameterf not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexParameterfv")) |proc| { - function_pointers.glTexParameterfv = @ptrCast(proc); - } else { - log.err("entry point glTexParameterfv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexParameteri")) |proc| { - function_pointers.glTexParameteri = @ptrCast(proc); - } else { - log.err("entry point glTexParameteri not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexParameteriv")) |proc| { - function_pointers.glTexParameteriv = @ptrCast(proc); - } else { - log.err("entry point glTexParameteriv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexImage1D")) |proc| { - function_pointers.glTexImage1D = @ptrCast(proc); - } else { - log.err("entry point glTexImage1D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexImage2D")) |proc| { - function_pointers.glTexImage2D = @ptrCast(proc); - } else { - log.err("entry point glTexImage2D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawBuffer")) |proc| { - function_pointers.glDrawBuffer = @ptrCast(proc); - } else { - log.err("entry point glDrawBuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClear")) |proc| { - function_pointers.glClear = @ptrCast(proc); - } else { - log.err("entry point glClear not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClearColor")) |proc| { - function_pointers.glClearColor = @ptrCast(proc); - } else { - log.err("entry point glClearColor not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClearStencil")) |proc| { - function_pointers.glClearStencil = @ptrCast(proc); - } else { - log.err("entry point glClearStencil not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClearDepth")) |proc| { - function_pointers.glClearDepth = @ptrCast(proc); - } else { - log.err("entry point glClearDepth not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glStencilMask")) |proc| { - function_pointers.glStencilMask = @ptrCast(proc); - } else { - log.err("entry point glStencilMask not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glColorMask")) |proc| { - function_pointers.glColorMask = @ptrCast(proc); - } else { - log.err("entry point glColorMask not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDepthMask")) |proc| { - function_pointers.glDepthMask = @ptrCast(proc); - } else { - log.err("entry point glDepthMask not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDisable")) |proc| { - function_pointers.glDisable = @ptrCast(proc); - } else { - log.err("entry point glDisable not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glEnable")) |proc| { - function_pointers.glEnable = @ptrCast(proc); - } else { - log.err("entry point glEnable not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFinish")) |proc| { - function_pointers.glFinish = @ptrCast(proc); - } else { - log.err("entry point glFinish not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFlush")) |proc| { - function_pointers.glFlush = @ptrCast(proc); - } else { - log.err("entry point glFlush not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBlendFunc")) |proc| { - function_pointers.glBlendFunc = @ptrCast(proc); - } else { - log.err("entry point glBlendFunc not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glLogicOp")) |proc| { - function_pointers.glLogicOp = @ptrCast(proc); - } else { - log.err("entry point glLogicOp not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glStencilFunc")) |proc| { - function_pointers.glStencilFunc = @ptrCast(proc); - } else { - log.err("entry point glStencilFunc not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glStencilOp")) |proc| { - function_pointers.glStencilOp = @ptrCast(proc); - } else { - log.err("entry point glStencilOp not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDepthFunc")) |proc| { - function_pointers.glDepthFunc = @ptrCast(proc); - } else { - log.err("entry point glDepthFunc not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPixelStoref")) |proc| { - function_pointers.glPixelStoref = @ptrCast(proc); - } else { - log.err("entry point glPixelStoref not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPixelStorei")) |proc| { - function_pointers.glPixelStorei = @ptrCast(proc); - } else { - log.err("entry point glPixelStorei not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glReadBuffer")) |proc| { - function_pointers.glReadBuffer = @ptrCast(proc); - } else { - log.err("entry point glReadBuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glReadPixels")) |proc| { - function_pointers.glReadPixels = @ptrCast(proc); - } else { - log.err("entry point glReadPixels not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetBooleanv")) |proc| { - function_pointers.glGetBooleanv = @ptrCast(proc); - } else { - log.err("entry point glGetBooleanv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetDoublev")) |proc| { - function_pointers.glGetDoublev = @ptrCast(proc); - } else { - log.err("entry point glGetDoublev not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetError")) |proc| { - function_pointers.glGetError = @ptrCast(proc); - } else { - log.err("entry point glGetError not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetFloatv")) |proc| { - function_pointers.glGetFloatv = @ptrCast(proc); - } else { - log.err("entry point glGetFloatv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetIntegerv")) |proc| { - function_pointers.glGetIntegerv = @ptrCast(proc); - } else { - log.err("entry point glGetIntegerv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetString")) |proc| { - function_pointers.glGetString = @ptrCast(proc); - } else { - log.err("entry point glGetString not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetTexImage")) |proc| { - function_pointers.glGetTexImage = @ptrCast(proc); - } else { - log.err("entry point glGetTexImage not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetTexParameterfv")) |proc| { - function_pointers.glGetTexParameterfv = @ptrCast(proc); - } else { - log.err("entry point glGetTexParameterfv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetTexParameteriv")) |proc| { - function_pointers.glGetTexParameteriv = @ptrCast(proc); - } else { - log.err("entry point glGetTexParameteriv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetTexLevelParameterfv")) |proc| { - function_pointers.glGetTexLevelParameterfv = @ptrCast(proc); - } else { - log.err("entry point glGetTexLevelParameterfv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetTexLevelParameteriv")) |proc| { - function_pointers.glGetTexLevelParameteriv = @ptrCast(proc); - } else { - log.err("entry point glGetTexLevelParameteriv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsEnabled")) |proc| { - function_pointers.glIsEnabled = @ptrCast(proc); - } else { - log.err("entry point glIsEnabled not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDepthRange")) |proc| { - function_pointers.glDepthRange = @ptrCast(proc); - } else { - log.err("entry point glDepthRange not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glViewport")) |proc| { - function_pointers.glViewport = @ptrCast(proc); - } else { - log.err("entry point glViewport not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawArrays")) |proc| { - function_pointers.glDrawArrays = @ptrCast(proc); - } else { - log.err("entry point glDrawArrays not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawElements")) |proc| { - function_pointers.glDrawElements = @ptrCast(proc); - } else { - log.err("entry point glDrawElements not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPolygonOffset")) |proc| { - function_pointers.glPolygonOffset = @ptrCast(proc); - } else { - log.err("entry point glPolygonOffset not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCopyTexImage1D")) |proc| { - function_pointers.glCopyTexImage1D = @ptrCast(proc); - } else { - log.err("entry point glCopyTexImage1D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCopyTexImage2D")) |proc| { - function_pointers.glCopyTexImage2D = @ptrCast(proc); - } else { - log.err("entry point glCopyTexImage2D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCopyTexSubImage1D")) |proc| { - function_pointers.glCopyTexSubImage1D = @ptrCast(proc); - } else { - log.err("entry point glCopyTexSubImage1D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCopyTexSubImage2D")) |proc| { - function_pointers.glCopyTexSubImage2D = @ptrCast(proc); - } else { - log.err("entry point glCopyTexSubImage2D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexSubImage1D")) |proc| { - function_pointers.glTexSubImage1D = @ptrCast(proc); - } else { - log.err("entry point glTexSubImage1D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexSubImage2D")) |proc| { - function_pointers.glTexSubImage2D = @ptrCast(proc); - } else { - log.err("entry point glTexSubImage2D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindTexture")) |proc| { - function_pointers.glBindTexture = @ptrCast(proc); - } else { - log.err("entry point glBindTexture not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteTextures")) |proc| { - function_pointers.glDeleteTextures = @ptrCast(proc); - } else { - log.err("entry point glDeleteTextures not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGenTextures")) |proc| { - function_pointers.glGenTextures = @ptrCast(proc); - } else { - log.err("entry point glGenTextures not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsTexture")) |proc| { - function_pointers.glIsTexture = @ptrCast(proc); - } else { - log.err("entry point glIsTexture not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawRangeElements")) |proc| { - function_pointers.glDrawRangeElements = @ptrCast(proc); - } else { - log.err("entry point glDrawRangeElements not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexImage3D")) |proc| { - function_pointers.glTexImage3D = @ptrCast(proc); - } else { - log.err("entry point glTexImage3D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexSubImage3D")) |proc| { - function_pointers.glTexSubImage3D = @ptrCast(proc); - } else { - log.err("entry point glTexSubImage3D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCopyTexSubImage3D")) |proc| { - function_pointers.glCopyTexSubImage3D = @ptrCast(proc); - } else { - log.err("entry point glCopyTexSubImage3D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glActiveTexture")) |proc| { - function_pointers.glActiveTexture = @ptrCast(proc); - } else { - log.err("entry point glActiveTexture not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glSampleCoverage")) |proc| { - function_pointers.glSampleCoverage = @ptrCast(proc); - } else { - log.err("entry point glSampleCoverage not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCompressedTexImage3D")) |proc| { - function_pointers.glCompressedTexImage3D = @ptrCast(proc); - } else { - log.err("entry point glCompressedTexImage3D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCompressedTexImage2D")) |proc| { - function_pointers.glCompressedTexImage2D = @ptrCast(proc); - } else { - log.err("entry point glCompressedTexImage2D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCompressedTexImage1D")) |proc| { - function_pointers.glCompressedTexImage1D = @ptrCast(proc); - } else { - log.err("entry point glCompressedTexImage1D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCompressedTexSubImage3D")) |proc| { - function_pointers.glCompressedTexSubImage3D = @ptrCast(proc); - } else { - log.err("entry point glCompressedTexSubImage3D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCompressedTexSubImage2D")) |proc| { - function_pointers.glCompressedTexSubImage2D = @ptrCast(proc); - } else { - log.err("entry point glCompressedTexSubImage2D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCompressedTexSubImage1D")) |proc| { - function_pointers.glCompressedTexSubImage1D = @ptrCast(proc); - } else { - log.err("entry point glCompressedTexSubImage1D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetCompressedTexImage")) |proc| { - function_pointers.glGetCompressedTexImage = @ptrCast(proc); - } else { - log.err("entry point glGetCompressedTexImage not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribP4uiv")) |proc| { - function_pointers.glVertexAttribP4uiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribP4uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribP4ui")) |proc| { - function_pointers.glVertexAttribP4ui = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribP4ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribP3uiv")) |proc| { - function_pointers.glVertexAttribP3uiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribP3uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribP3ui")) |proc| { - function_pointers.glVertexAttribP3ui = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribP3ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribP2uiv")) |proc| { - function_pointers.glVertexAttribP2uiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribP2uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribP2ui")) |proc| { - function_pointers.glVertexAttribP2ui = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribP2ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribP1uiv")) |proc| { - function_pointers.glVertexAttribP1uiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribP1uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribP1ui")) |proc| { - function_pointers.glVertexAttribP1ui = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribP1ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribDivisor")) |proc| { - function_pointers.glVertexAttribDivisor = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribDivisor not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetQueryObjectui64v")) |proc| { - function_pointers.glGetQueryObjectui64v = @ptrCast(proc); - } else { - log.err("entry point glGetQueryObjectui64v not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetQueryObjecti64v")) |proc| { - function_pointers.glGetQueryObjecti64v = @ptrCast(proc); - } else { - log.err("entry point glGetQueryObjecti64v not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glQueryCounter")) |proc| { - function_pointers.glQueryCounter = @ptrCast(proc); - } else { - log.err("entry point glQueryCounter not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetSamplerParameterIuiv")) |proc| { - function_pointers.glGetSamplerParameterIuiv = @ptrCast(proc); - } else { - log.err("entry point glGetSamplerParameterIuiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetSamplerParameterfv")) |proc| { - function_pointers.glGetSamplerParameterfv = @ptrCast(proc); - } else { - log.err("entry point glGetSamplerParameterfv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetSamplerParameterIiv")) |proc| { - function_pointers.glGetSamplerParameterIiv = @ptrCast(proc); - } else { - log.err("entry point glGetSamplerParameterIiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetSamplerParameteriv")) |proc| { - function_pointers.glGetSamplerParameteriv = @ptrCast(proc); - } else { - log.err("entry point glGetSamplerParameteriv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glSamplerParameterIuiv")) |proc| { - function_pointers.glSamplerParameterIuiv = @ptrCast(proc); - } else { - log.err("entry point glSamplerParameterIuiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glSamplerParameterIiv")) |proc| { - function_pointers.glSamplerParameterIiv = @ptrCast(proc); - } else { - log.err("entry point glSamplerParameterIiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glSamplerParameterfv")) |proc| { - function_pointers.glSamplerParameterfv = @ptrCast(proc); - } else { - log.err("entry point glSamplerParameterfv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glSamplerParameterf")) |proc| { - function_pointers.glSamplerParameterf = @ptrCast(proc); - } else { - log.err("entry point glSamplerParameterf not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glSamplerParameteriv")) |proc| { - function_pointers.glSamplerParameteriv = @ptrCast(proc); - } else { - log.err("entry point glSamplerParameteriv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glSamplerParameteri")) |proc| { - function_pointers.glSamplerParameteri = @ptrCast(proc); - } else { - log.err("entry point glSamplerParameteri not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindSampler")) |proc| { - function_pointers.glBindSampler = @ptrCast(proc); - } else { - log.err("entry point glBindSampler not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsSampler")) |proc| { - function_pointers.glIsSampler = @ptrCast(proc); - } else { - log.err("entry point glIsSampler not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteSamplers")) |proc| { - function_pointers.glDeleteSamplers = @ptrCast(proc); - } else { - log.err("entry point glDeleteSamplers not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGenSamplers")) |proc| { - function_pointers.glGenSamplers = @ptrCast(proc); - } else { - log.err("entry point glGenSamplers not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetFragDataIndex")) |proc| { - function_pointers.glGetFragDataIndex = @ptrCast(proc); - } else { - log.err("entry point glGetFragDataIndex not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindFragDataLocationIndexed")) |proc| { - function_pointers.glBindFragDataLocationIndexed = @ptrCast(proc); - } else { - log.err("entry point glBindFragDataLocationIndexed not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glSampleMaski")) |proc| { - function_pointers.glSampleMaski = @ptrCast(proc); - } else { - log.err("entry point glSampleMaski not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetMultisamplefv")) |proc| { - function_pointers.glGetMultisamplefv = @ptrCast(proc); - } else { - log.err("entry point glGetMultisamplefv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexImage3DMultisample")) |proc| { - function_pointers.glTexImage3DMultisample = @ptrCast(proc); - } else { - log.err("entry point glTexImage3DMultisample not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexImage2DMultisample")) |proc| { - function_pointers.glTexImage2DMultisample = @ptrCast(proc); - } else { - log.err("entry point glTexImage2DMultisample not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFramebufferTexture")) |proc| { - function_pointers.glFramebufferTexture = @ptrCast(proc); - } else { - log.err("entry point glFramebufferTexture not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetBufferParameteri64v")) |proc| { - function_pointers.glGetBufferParameteri64v = @ptrCast(proc); - } else { - log.err("entry point glGetBufferParameteri64v not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBlendFuncSeparate")) |proc| { - function_pointers.glBlendFuncSeparate = @ptrCast(proc); - } else { - log.err("entry point glBlendFuncSeparate not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glMultiDrawArrays")) |proc| { - function_pointers.glMultiDrawArrays = @ptrCast(proc); - } else { - log.err("entry point glMultiDrawArrays not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glMultiDrawElements")) |proc| { - function_pointers.glMultiDrawElements = @ptrCast(proc); - } else { - log.err("entry point glMultiDrawElements not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPointParameterf")) |proc| { - function_pointers.glPointParameterf = @ptrCast(proc); - } else { - log.err("entry point glPointParameterf not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPointParameterfv")) |proc| { - function_pointers.glPointParameterfv = @ptrCast(proc); - } else { - log.err("entry point glPointParameterfv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPointParameteri")) |proc| { - function_pointers.glPointParameteri = @ptrCast(proc); - } else { - log.err("entry point glPointParameteri not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPointParameteriv")) |proc| { - function_pointers.glPointParameteriv = @ptrCast(proc); - } else { - log.err("entry point glPointParameteriv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetInteger64i_v")) |proc| { - function_pointers.glGetInteger64i_v = @ptrCast(proc); - } else { - log.err("entry point glGetInteger64i_v not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetSynciv")) |proc| { - function_pointers.glGetSynciv = @ptrCast(proc); - } else { - log.err("entry point glGetSynciv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetInteger64v")) |proc| { - function_pointers.glGetInteger64v = @ptrCast(proc); - } else { - log.err("entry point glGetInteger64v not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glWaitSync")) |proc| { - function_pointers.glWaitSync = @ptrCast(proc); - } else { - log.err("entry point glWaitSync not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClientWaitSync")) |proc| { - function_pointers.glClientWaitSync = @ptrCast(proc); - } else { - log.err("entry point glClientWaitSync not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteSync")) |proc| { - function_pointers.glDeleteSync = @ptrCast(proc); - } else { - log.err("entry point glDeleteSync not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsSync")) |proc| { - function_pointers.glIsSync = @ptrCast(proc); - } else { - log.err("entry point glIsSync not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFenceSync")) |proc| { - function_pointers.glFenceSync = @ptrCast(proc); - } else { - log.err("entry point glFenceSync not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBlendColor")) |proc| { - function_pointers.glBlendColor = @ptrCast(proc); - } else { - log.err("entry point glBlendColor not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBlendEquation")) |proc| { - function_pointers.glBlendEquation = @ptrCast(proc); - } else { - log.err("entry point glBlendEquation not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glProvokingVertex")) |proc| { - function_pointers.glProvokingVertex = @ptrCast(proc); - } else { - log.err("entry point glProvokingVertex not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glMultiDrawElementsBaseVertex")) |proc| { - function_pointers.glMultiDrawElementsBaseVertex = @ptrCast(proc); - } else { - log.err("entry point glMultiDrawElementsBaseVertex not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawElementsInstancedBaseVertex")) |proc| { - function_pointers.glDrawElementsInstancedBaseVertex = @ptrCast(proc); - } else { - log.err("entry point glDrawElementsInstancedBaseVertex not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawRangeElementsBaseVertex")) |proc| { - function_pointers.glDrawRangeElementsBaseVertex = @ptrCast(proc); - } else { - log.err("entry point glDrawRangeElementsBaseVertex not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawElementsBaseVertex")) |proc| { - function_pointers.glDrawElementsBaseVertex = @ptrCast(proc); - } else { - log.err("entry point glDrawElementsBaseVertex not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGenQueries")) |proc| { - function_pointers.glGenQueries = @ptrCast(proc); - } else { - log.err("entry point glGenQueries not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteQueries")) |proc| { - function_pointers.glDeleteQueries = @ptrCast(proc); - } else { - log.err("entry point glDeleteQueries not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsQuery")) |proc| { - function_pointers.glIsQuery = @ptrCast(proc); - } else { - log.err("entry point glIsQuery not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBeginQuery")) |proc| { - function_pointers.glBeginQuery = @ptrCast(proc); - } else { - log.err("entry point glBeginQuery not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glEndQuery")) |proc| { - function_pointers.glEndQuery = @ptrCast(proc); - } else { - log.err("entry point glEndQuery not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetQueryiv")) |proc| { - function_pointers.glGetQueryiv = @ptrCast(proc); - } else { - log.err("entry point glGetQueryiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetQueryObjectiv")) |proc| { - function_pointers.glGetQueryObjectiv = @ptrCast(proc); - } else { - log.err("entry point glGetQueryObjectiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetQueryObjectuiv")) |proc| { - function_pointers.glGetQueryObjectuiv = @ptrCast(proc); - } else { - log.err("entry point glGetQueryObjectuiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindBuffer")) |proc| { - function_pointers.glBindBuffer = @ptrCast(proc); - } else { - log.err("entry point glBindBuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteBuffers")) |proc| { - function_pointers.glDeleteBuffers = @ptrCast(proc); - } else { - log.err("entry point glDeleteBuffers not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGenBuffers")) |proc| { - function_pointers.glGenBuffers = @ptrCast(proc); - } else { - log.err("entry point glGenBuffers not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsBuffer")) |proc| { - function_pointers.glIsBuffer = @ptrCast(proc); - } else { - log.err("entry point glIsBuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBufferData")) |proc| { - function_pointers.glBufferData = @ptrCast(proc); - } else { - log.err("entry point glBufferData not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBufferSubData")) |proc| { - function_pointers.glBufferSubData = @ptrCast(proc); - } else { - log.err("entry point glBufferSubData not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetBufferSubData")) |proc| { - function_pointers.glGetBufferSubData = @ptrCast(proc); - } else { - log.err("entry point glGetBufferSubData not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glMapBuffer")) |proc| { - function_pointers.glMapBuffer = @ptrCast(proc); - } else { - log.err("entry point glMapBuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUnmapBuffer")) |proc| { - function_pointers.glUnmapBuffer = @ptrCast(proc); - } else { - log.err("entry point glUnmapBuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetBufferParameteriv")) |proc| { - function_pointers.glGetBufferParameteriv = @ptrCast(proc); - } else { - log.err("entry point glGetBufferParameteriv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetBufferPointerv")) |proc| { - function_pointers.glGetBufferPointerv = @ptrCast(proc); - } else { - log.err("entry point glGetBufferPointerv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBlendEquationSeparate")) |proc| { - function_pointers.glBlendEquationSeparate = @ptrCast(proc); - } else { - log.err("entry point glBlendEquationSeparate not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawBuffers")) |proc| { - function_pointers.glDrawBuffers = @ptrCast(proc); - } else { - log.err("entry point glDrawBuffers not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glStencilOpSeparate")) |proc| { - function_pointers.glStencilOpSeparate = @ptrCast(proc); - } else { - log.err("entry point glStencilOpSeparate not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glStencilFuncSeparate")) |proc| { - function_pointers.glStencilFuncSeparate = @ptrCast(proc); - } else { - log.err("entry point glStencilFuncSeparate not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glStencilMaskSeparate")) |proc| { - function_pointers.glStencilMaskSeparate = @ptrCast(proc); - } else { - log.err("entry point glStencilMaskSeparate not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glAttachShader")) |proc| { - function_pointers.glAttachShader = @ptrCast(proc); - } else { - log.err("entry point glAttachShader not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindAttribLocation")) |proc| { - function_pointers.glBindAttribLocation = @ptrCast(proc); - } else { - log.err("entry point glBindAttribLocation not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCompileShader")) |proc| { - function_pointers.glCompileShader = @ptrCast(proc); - } else { - log.err("entry point glCompileShader not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCreateProgram")) |proc| { - function_pointers.glCreateProgram = @ptrCast(proc); - } else { - log.err("entry point glCreateProgram not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCreateShader")) |proc| { - function_pointers.glCreateShader = @ptrCast(proc); - } else { - log.err("entry point glCreateShader not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteProgram")) |proc| { - function_pointers.glDeleteProgram = @ptrCast(proc); - } else { - log.err("entry point glDeleteProgram not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteShader")) |proc| { - function_pointers.glDeleteShader = @ptrCast(proc); - } else { - log.err("entry point glDeleteShader not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDetachShader")) |proc| { - function_pointers.glDetachShader = @ptrCast(proc); - } else { - log.err("entry point glDetachShader not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDisableVertexAttribArray")) |proc| { - function_pointers.glDisableVertexAttribArray = @ptrCast(proc); - } else { - log.err("entry point glDisableVertexAttribArray not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glEnableVertexAttribArray")) |proc| { - function_pointers.glEnableVertexAttribArray = @ptrCast(proc); - } else { - log.err("entry point glEnableVertexAttribArray not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetActiveAttrib")) |proc| { - function_pointers.glGetActiveAttrib = @ptrCast(proc); - } else { - log.err("entry point glGetActiveAttrib not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetActiveUniform")) |proc| { - function_pointers.glGetActiveUniform = @ptrCast(proc); - } else { - log.err("entry point glGetActiveUniform not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetAttachedShaders")) |proc| { - function_pointers.glGetAttachedShaders = @ptrCast(proc); - } else { - log.err("entry point glGetAttachedShaders not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetAttribLocation")) |proc| { - function_pointers.glGetAttribLocation = @ptrCast(proc); - } else { - log.err("entry point glGetAttribLocation not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetProgramiv")) |proc| { - function_pointers.glGetProgramiv = @ptrCast(proc); - } else { - log.err("entry point glGetProgramiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetProgramInfoLog")) |proc| { - function_pointers.glGetProgramInfoLog = @ptrCast(proc); - } else { - log.err("entry point glGetProgramInfoLog not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetShaderiv")) |proc| { - function_pointers.glGetShaderiv = @ptrCast(proc); - } else { - log.err("entry point glGetShaderiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetShaderInfoLog")) |proc| { - function_pointers.glGetShaderInfoLog = @ptrCast(proc); - } else { - log.err("entry point glGetShaderInfoLog not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetShaderSource")) |proc| { - function_pointers.glGetShaderSource = @ptrCast(proc); - } else { - log.err("entry point glGetShaderSource not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetUniformLocation")) |proc| { - function_pointers.glGetUniformLocation = @ptrCast(proc); - } else { - log.err("entry point glGetUniformLocation not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetUniformfv")) |proc| { - function_pointers.glGetUniformfv = @ptrCast(proc); - } else { - log.err("entry point glGetUniformfv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetUniformiv")) |proc| { - function_pointers.glGetUniformiv = @ptrCast(proc); - } else { - log.err("entry point glGetUniformiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetVertexAttribdv")) |proc| { - function_pointers.glGetVertexAttribdv = @ptrCast(proc); - } else { - log.err("entry point glGetVertexAttribdv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetVertexAttribfv")) |proc| { - function_pointers.glGetVertexAttribfv = @ptrCast(proc); - } else { - log.err("entry point glGetVertexAttribfv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetVertexAttribiv")) |proc| { - function_pointers.glGetVertexAttribiv = @ptrCast(proc); - } else { - log.err("entry point glGetVertexAttribiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetVertexAttribPointerv")) |proc| { - function_pointers.glGetVertexAttribPointerv = @ptrCast(proc); - } else { - log.err("entry point glGetVertexAttribPointerv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsProgram")) |proc| { - function_pointers.glIsProgram = @ptrCast(proc); - } else { - log.err("entry point glIsProgram not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsShader")) |proc| { - function_pointers.glIsShader = @ptrCast(proc); - } else { - log.err("entry point glIsShader not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glLinkProgram")) |proc| { - function_pointers.glLinkProgram = @ptrCast(proc); - } else { - log.err("entry point glLinkProgram not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glShaderSource")) |proc| { - function_pointers.glShaderSource = @ptrCast(proc); - } else { - log.err("entry point glShaderSource not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUseProgram")) |proc| { - function_pointers.glUseProgram = @ptrCast(proc); - } else { - log.err("entry point glUseProgram not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform1f")) |proc| { - function_pointers.glUniform1f = @ptrCast(proc); - } else { - log.err("entry point glUniform1f not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform2f")) |proc| { - function_pointers.glUniform2f = @ptrCast(proc); - } else { - log.err("entry point glUniform2f not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform3f")) |proc| { - function_pointers.glUniform3f = @ptrCast(proc); - } else { - log.err("entry point glUniform3f not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform4f")) |proc| { - function_pointers.glUniform4f = @ptrCast(proc); - } else { - log.err("entry point glUniform4f not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform1i")) |proc| { - function_pointers.glUniform1i = @ptrCast(proc); - } else { - log.err("entry point glUniform1i not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform2i")) |proc| { - function_pointers.glUniform2i = @ptrCast(proc); - } else { - log.err("entry point glUniform2i not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform3i")) |proc| { - function_pointers.glUniform3i = @ptrCast(proc); - } else { - log.err("entry point glUniform3i not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform4i")) |proc| { - function_pointers.glUniform4i = @ptrCast(proc); - } else { - log.err("entry point glUniform4i not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform1fv")) |proc| { - function_pointers.glUniform1fv = @ptrCast(proc); - } else { - log.err("entry point glUniform1fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform2fv")) |proc| { - function_pointers.glUniform2fv = @ptrCast(proc); - } else { - log.err("entry point glUniform2fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform3fv")) |proc| { - function_pointers.glUniform3fv = @ptrCast(proc); - } else { - log.err("entry point glUniform3fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform4fv")) |proc| { - function_pointers.glUniform4fv = @ptrCast(proc); - } else { - log.err("entry point glUniform4fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform1iv")) |proc| { - function_pointers.glUniform1iv = @ptrCast(proc); - } else { - log.err("entry point glUniform1iv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform2iv")) |proc| { - function_pointers.glUniform2iv = @ptrCast(proc); - } else { - log.err("entry point glUniform2iv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform3iv")) |proc| { - function_pointers.glUniform3iv = @ptrCast(proc); - } else { - log.err("entry point glUniform3iv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform4iv")) |proc| { - function_pointers.glUniform4iv = @ptrCast(proc); - } else { - log.err("entry point glUniform4iv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformMatrix2fv")) |proc| { - function_pointers.glUniformMatrix2fv = @ptrCast(proc); - } else { - log.err("entry point glUniformMatrix2fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformMatrix3fv")) |proc| { - function_pointers.glUniformMatrix3fv = @ptrCast(proc); - } else { - log.err("entry point glUniformMatrix3fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformMatrix4fv")) |proc| { - function_pointers.glUniformMatrix4fv = @ptrCast(proc); - } else { - log.err("entry point glUniformMatrix4fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glValidateProgram")) |proc| { - function_pointers.glValidateProgram = @ptrCast(proc); - } else { - log.err("entry point glValidateProgram not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib1d")) |proc| { - function_pointers.glVertexAttrib1d = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib1d not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib1dv")) |proc| { - function_pointers.glVertexAttrib1dv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib1dv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib1f")) |proc| { - function_pointers.glVertexAttrib1f = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib1f not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib1fv")) |proc| { - function_pointers.glVertexAttrib1fv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib1fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib1s")) |proc| { - function_pointers.glVertexAttrib1s = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib1s not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib1sv")) |proc| { - function_pointers.glVertexAttrib1sv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib1sv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib2d")) |proc| { - function_pointers.glVertexAttrib2d = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib2d not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib2dv")) |proc| { - function_pointers.glVertexAttrib2dv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib2dv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib2f")) |proc| { - function_pointers.glVertexAttrib2f = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib2f not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib2fv")) |proc| { - function_pointers.glVertexAttrib2fv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib2fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib2s")) |proc| { - function_pointers.glVertexAttrib2s = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib2s not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib2sv")) |proc| { - function_pointers.glVertexAttrib2sv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib2sv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib3d")) |proc| { - function_pointers.glVertexAttrib3d = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib3d not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib3dv")) |proc| { - function_pointers.glVertexAttrib3dv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib3dv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib3f")) |proc| { - function_pointers.glVertexAttrib3f = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib3f not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib3fv")) |proc| { - function_pointers.glVertexAttrib3fv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib3fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib3s")) |proc| { - function_pointers.glVertexAttrib3s = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib3s not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib3sv")) |proc| { - function_pointers.glVertexAttrib3sv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib3sv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4Nbv")) |proc| { - function_pointers.glVertexAttrib4Nbv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4Nbv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4Niv")) |proc| { - function_pointers.glVertexAttrib4Niv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4Niv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4Nsv")) |proc| { - function_pointers.glVertexAttrib4Nsv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4Nsv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4Nub")) |proc| { - function_pointers.glVertexAttrib4Nub = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4Nub not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4Nubv")) |proc| { - function_pointers.glVertexAttrib4Nubv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4Nubv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4Nuiv")) |proc| { - function_pointers.glVertexAttrib4Nuiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4Nuiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4Nusv")) |proc| { - function_pointers.glVertexAttrib4Nusv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4Nusv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4bv")) |proc| { - function_pointers.glVertexAttrib4bv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4bv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4d")) |proc| { - function_pointers.glVertexAttrib4d = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4d not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4dv")) |proc| { - function_pointers.glVertexAttrib4dv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4dv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4f")) |proc| { - function_pointers.glVertexAttrib4f = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4f not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4fv")) |proc| { - function_pointers.glVertexAttrib4fv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4iv")) |proc| { - function_pointers.glVertexAttrib4iv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4iv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4s")) |proc| { - function_pointers.glVertexAttrib4s = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4s not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4sv")) |proc| { - function_pointers.glVertexAttrib4sv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4sv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4ubv")) |proc| { - function_pointers.glVertexAttrib4ubv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4ubv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4uiv")) |proc| { - function_pointers.glVertexAttrib4uiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttrib4usv")) |proc| { - function_pointers.glVertexAttrib4usv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttrib4usv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribPointer")) |proc| { - function_pointers.glVertexAttribPointer = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribPointer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformMatrix2x3fv")) |proc| { - function_pointers.glUniformMatrix2x3fv = @ptrCast(proc); - } else { - log.err("entry point glUniformMatrix2x3fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformMatrix3x2fv")) |proc| { - function_pointers.glUniformMatrix3x2fv = @ptrCast(proc); - } else { - log.err("entry point glUniformMatrix3x2fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformMatrix2x4fv")) |proc| { - function_pointers.glUniformMatrix2x4fv = @ptrCast(proc); - } else { - log.err("entry point glUniformMatrix2x4fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformMatrix4x2fv")) |proc| { - function_pointers.glUniformMatrix4x2fv = @ptrCast(proc); - } else { - log.err("entry point glUniformMatrix4x2fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformMatrix3x4fv")) |proc| { - function_pointers.glUniformMatrix3x4fv = @ptrCast(proc); - } else { - log.err("entry point glUniformMatrix3x4fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformMatrix4x3fv")) |proc| { - function_pointers.glUniformMatrix4x3fv = @ptrCast(proc); - } else { - log.err("entry point glUniformMatrix4x3fv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glColorMaski")) |proc| { - function_pointers.glColorMaski = @ptrCast(proc); - } else { - log.err("entry point glColorMaski not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetBooleani_v")) |proc| { - function_pointers.glGetBooleani_v = @ptrCast(proc); - } else { - log.err("entry point glGetBooleani_v not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetIntegeri_v")) |proc| { - function_pointers.glGetIntegeri_v = @ptrCast(proc); - } else { - log.err("entry point glGetIntegeri_v not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glEnablei")) |proc| { - function_pointers.glEnablei = @ptrCast(proc); - } else { - log.err("entry point glEnablei not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDisablei")) |proc| { - function_pointers.glDisablei = @ptrCast(proc); - } else { - log.err("entry point glDisablei not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsEnabledi")) |proc| { - function_pointers.glIsEnabledi = @ptrCast(proc); - } else { - log.err("entry point glIsEnabledi not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBeginTransformFeedback")) |proc| { - function_pointers.glBeginTransformFeedback = @ptrCast(proc); - } else { - log.err("entry point glBeginTransformFeedback not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glEndTransformFeedback")) |proc| { - function_pointers.glEndTransformFeedback = @ptrCast(proc); - } else { - log.err("entry point glEndTransformFeedback not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindBufferRange")) |proc| { - function_pointers.glBindBufferRange = @ptrCast(proc); - } else { - log.err("entry point glBindBufferRange not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindBufferBase")) |proc| { - function_pointers.glBindBufferBase = @ptrCast(proc); - } else { - log.err("entry point glBindBufferBase not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTransformFeedbackVaryings")) |proc| { - function_pointers.glTransformFeedbackVaryings = @ptrCast(proc); - } else { - log.err("entry point glTransformFeedbackVaryings not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetTransformFeedbackVarying")) |proc| { - function_pointers.glGetTransformFeedbackVarying = @ptrCast(proc); - } else { - log.err("entry point glGetTransformFeedbackVarying not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClampColor")) |proc| { - function_pointers.glClampColor = @ptrCast(proc); - } else { - log.err("entry point glClampColor not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBeginConditionalRender")) |proc| { - function_pointers.glBeginConditionalRender = @ptrCast(proc); - } else { - log.err("entry point glBeginConditionalRender not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glEndConditionalRender")) |proc| { - function_pointers.glEndConditionalRender = @ptrCast(proc); - } else { - log.err("entry point glEndConditionalRender not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribIPointer")) |proc| { - function_pointers.glVertexAttribIPointer = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribIPointer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetVertexAttribIiv")) |proc| { - function_pointers.glGetVertexAttribIiv = @ptrCast(proc); - } else { - log.err("entry point glGetVertexAttribIiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetVertexAttribIuiv")) |proc| { - function_pointers.glGetVertexAttribIuiv = @ptrCast(proc); - } else { - log.err("entry point glGetVertexAttribIuiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI1i")) |proc| { - function_pointers.glVertexAttribI1i = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI1i not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI2i")) |proc| { - function_pointers.glVertexAttribI2i = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI2i not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI3i")) |proc| { - function_pointers.glVertexAttribI3i = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI3i not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI4i")) |proc| { - function_pointers.glVertexAttribI4i = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI4i not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI1ui")) |proc| { - function_pointers.glVertexAttribI1ui = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI1ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI2ui")) |proc| { - function_pointers.glVertexAttribI2ui = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI2ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI3ui")) |proc| { - function_pointers.glVertexAttribI3ui = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI3ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI4ui")) |proc| { - function_pointers.glVertexAttribI4ui = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI4ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI1iv")) |proc| { - function_pointers.glVertexAttribI1iv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI1iv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI2iv")) |proc| { - function_pointers.glVertexAttribI2iv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI2iv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI3iv")) |proc| { - function_pointers.glVertexAttribI3iv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI3iv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI4iv")) |proc| { - function_pointers.glVertexAttribI4iv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI4iv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI1uiv")) |proc| { - function_pointers.glVertexAttribI1uiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI1uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI2uiv")) |proc| { - function_pointers.glVertexAttribI2uiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI2uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI3uiv")) |proc| { - function_pointers.glVertexAttribI3uiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI3uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI4uiv")) |proc| { - function_pointers.glVertexAttribI4uiv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI4uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI4bv")) |proc| { - function_pointers.glVertexAttribI4bv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI4bv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI4sv")) |proc| { - function_pointers.glVertexAttribI4sv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI4sv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI4ubv")) |proc| { - function_pointers.glVertexAttribI4ubv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI4ubv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glVertexAttribI4usv")) |proc| { - function_pointers.glVertexAttribI4usv = @ptrCast(proc); - } else { - log.err("entry point glVertexAttribI4usv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetUniformuiv")) |proc| { - function_pointers.glGetUniformuiv = @ptrCast(proc); - } else { - log.err("entry point glGetUniformuiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindFragDataLocation")) |proc| { - function_pointers.glBindFragDataLocation = @ptrCast(proc); - } else { - log.err("entry point glBindFragDataLocation not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetFragDataLocation")) |proc| { - function_pointers.glGetFragDataLocation = @ptrCast(proc); - } else { - log.err("entry point glGetFragDataLocation not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform1ui")) |proc| { - function_pointers.glUniform1ui = @ptrCast(proc); - } else { - log.err("entry point glUniform1ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform2ui")) |proc| { - function_pointers.glUniform2ui = @ptrCast(proc); - } else { - log.err("entry point glUniform2ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform3ui")) |proc| { - function_pointers.glUniform3ui = @ptrCast(proc); - } else { - log.err("entry point glUniform3ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform4ui")) |proc| { - function_pointers.glUniform4ui = @ptrCast(proc); - } else { - log.err("entry point glUniform4ui not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform1uiv")) |proc| { - function_pointers.glUniform1uiv = @ptrCast(proc); - } else { - log.err("entry point glUniform1uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform2uiv")) |proc| { - function_pointers.glUniform2uiv = @ptrCast(proc); - } else { - log.err("entry point glUniform2uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform3uiv")) |proc| { - function_pointers.glUniform3uiv = @ptrCast(proc); - } else { - log.err("entry point glUniform3uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniform4uiv")) |proc| { - function_pointers.glUniform4uiv = @ptrCast(proc); - } else { - log.err("entry point glUniform4uiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexParameterIiv")) |proc| { - function_pointers.glTexParameterIiv = @ptrCast(proc); - } else { - log.err("entry point glTexParameterIiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexParameterIuiv")) |proc| { - function_pointers.glTexParameterIuiv = @ptrCast(proc); - } else { - log.err("entry point glTexParameterIuiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetTexParameterIiv")) |proc| { - function_pointers.glGetTexParameterIiv = @ptrCast(proc); - } else { - log.err("entry point glGetTexParameterIiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetTexParameterIuiv")) |proc| { - function_pointers.glGetTexParameterIuiv = @ptrCast(proc); - } else { - log.err("entry point glGetTexParameterIuiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClearBufferiv")) |proc| { - function_pointers.glClearBufferiv = @ptrCast(proc); - } else { - log.err("entry point glClearBufferiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClearBufferuiv")) |proc| { - function_pointers.glClearBufferuiv = @ptrCast(proc); - } else { - log.err("entry point glClearBufferuiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClearBufferfv")) |proc| { - function_pointers.glClearBufferfv = @ptrCast(proc); - } else { - log.err("entry point glClearBufferfv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glClearBufferfi")) |proc| { - function_pointers.glClearBufferfi = @ptrCast(proc); - } else { - log.err("entry point glClearBufferfi not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetStringi")) |proc| { - function_pointers.glGetStringi = @ptrCast(proc); - } else { - log.err("entry point glGetStringi not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsRenderbuffer")) |proc| { - function_pointers.glIsRenderbuffer = @ptrCast(proc); - } else { - log.err("entry point glIsRenderbuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindRenderbuffer")) |proc| { - function_pointers.glBindRenderbuffer = @ptrCast(proc); - } else { - log.err("entry point glBindRenderbuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteRenderbuffers")) |proc| { - function_pointers.glDeleteRenderbuffers = @ptrCast(proc); - } else { - log.err("entry point glDeleteRenderbuffers not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGenRenderbuffers")) |proc| { - function_pointers.glGenRenderbuffers = @ptrCast(proc); - } else { - log.err("entry point glGenRenderbuffers not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glRenderbufferStorage")) |proc| { - function_pointers.glRenderbufferStorage = @ptrCast(proc); - } else { - log.err("entry point glRenderbufferStorage not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetRenderbufferParameteriv")) |proc| { - function_pointers.glGetRenderbufferParameteriv = @ptrCast(proc); - } else { - log.err("entry point glGetRenderbufferParameteriv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsFramebuffer")) |proc| { - function_pointers.glIsFramebuffer = @ptrCast(proc); - } else { - log.err("entry point glIsFramebuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindFramebuffer")) |proc| { - function_pointers.glBindFramebuffer = @ptrCast(proc); - } else { - log.err("entry point glBindFramebuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteFramebuffers")) |proc| { - function_pointers.glDeleteFramebuffers = @ptrCast(proc); - } else { - log.err("entry point glDeleteFramebuffers not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGenFramebuffers")) |proc| { - function_pointers.glGenFramebuffers = @ptrCast(proc); - } else { - log.err("entry point glGenFramebuffers not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCheckFramebufferStatus")) |proc| { - function_pointers.glCheckFramebufferStatus = @ptrCast(proc); - } else { - log.err("entry point glCheckFramebufferStatus not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFramebufferTexture1D")) |proc| { - function_pointers.glFramebufferTexture1D = @ptrCast(proc); - } else { - log.err("entry point glFramebufferTexture1D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFramebufferTexture2D")) |proc| { - function_pointers.glFramebufferTexture2D = @ptrCast(proc); - } else { - log.err("entry point glFramebufferTexture2D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFramebufferTexture3D")) |proc| { - function_pointers.glFramebufferTexture3D = @ptrCast(proc); - } else { - log.err("entry point glFramebufferTexture3D not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFramebufferRenderbuffer")) |proc| { - function_pointers.glFramebufferRenderbuffer = @ptrCast(proc); - } else { - log.err("entry point glFramebufferRenderbuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetFramebufferAttachmentParameteriv")) |proc| { - function_pointers.glGetFramebufferAttachmentParameteriv = @ptrCast(proc); - } else { - log.err("entry point glGetFramebufferAttachmentParameteriv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGenerateMipmap")) |proc| { - function_pointers.glGenerateMipmap = @ptrCast(proc); - } else { - log.err("entry point glGenerateMipmap not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBlitFramebuffer")) |proc| { - function_pointers.glBlitFramebuffer = @ptrCast(proc); - } else { - log.err("entry point glBlitFramebuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glRenderbufferStorageMultisample")) |proc| { - function_pointers.glRenderbufferStorageMultisample = @ptrCast(proc); - } else { - log.err("entry point glRenderbufferStorageMultisample not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFramebufferTextureLayer")) |proc| { - function_pointers.glFramebufferTextureLayer = @ptrCast(proc); - } else { - log.err("entry point glFramebufferTextureLayer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glMapBufferRange")) |proc| { - function_pointers.glMapBufferRange = @ptrCast(proc); - } else { - log.err("entry point glMapBufferRange not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glFlushMappedBufferRange")) |proc| { - function_pointers.glFlushMappedBufferRange = @ptrCast(proc); - } else { - log.err("entry point glFlushMappedBufferRange not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glBindVertexArray")) |proc| { - function_pointers.glBindVertexArray = @ptrCast(proc); - } else { - log.err("entry point glBindVertexArray not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDeleteVertexArrays")) |proc| { - function_pointers.glDeleteVertexArrays = @ptrCast(proc); - } else { - log.err("entry point glDeleteVertexArrays not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGenVertexArrays")) |proc| { - function_pointers.glGenVertexArrays = @ptrCast(proc); - } else { - log.err("entry point glGenVertexArrays not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glIsVertexArray")) |proc| { - function_pointers.glIsVertexArray = @ptrCast(proc); - } else { - log.err("entry point glIsVertexArray not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawArraysInstanced")) |proc| { - function_pointers.glDrawArraysInstanced = @ptrCast(proc); - } else { - log.err("entry point glDrawArraysInstanced not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glDrawElementsInstanced")) |proc| { - function_pointers.glDrawElementsInstanced = @ptrCast(proc); - } else { - log.err("entry point glDrawElementsInstanced not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glTexBuffer")) |proc| { - function_pointers.glTexBuffer = @ptrCast(proc); - } else { - log.err("entry point glTexBuffer not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glPrimitiveRestartIndex")) |proc| { - function_pointers.glPrimitiveRestartIndex = @ptrCast(proc); - } else { - log.err("entry point glPrimitiveRestartIndex not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glCopyBufferSubData")) |proc| { - function_pointers.glCopyBufferSubData = @ptrCast(proc); - } else { - log.err("entry point glCopyBufferSubData not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetUniformIndices")) |proc| { - function_pointers.glGetUniformIndices = @ptrCast(proc); - } else { - log.err("entry point glGetUniformIndices not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetActiveUniformsiv")) |proc| { - function_pointers.glGetActiveUniformsiv = @ptrCast(proc); - } else { - log.err("entry point glGetActiveUniformsiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetActiveUniformName")) |proc| { - function_pointers.glGetActiveUniformName = @ptrCast(proc); - } else { - log.err("entry point glGetActiveUniformName not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetUniformBlockIndex")) |proc| { - function_pointers.glGetUniformBlockIndex = @ptrCast(proc); - } else { - log.err("entry point glGetUniformBlockIndex not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetActiveUniformBlockiv")) |proc| { - function_pointers.glGetActiveUniformBlockiv = @ptrCast(proc); - } else { - log.err("entry point glGetActiveUniformBlockiv not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glGetActiveUniformBlockName")) |proc| { - function_pointers.glGetActiveUniformBlockName = @ptrCast(proc); - } else { - log.err("entry point glGetActiveUniformBlockName not found!", .{}); - success = false; - } - if (get_proc_address(load_ctx, "glUniformBlockBinding")) |proc| { - function_pointers.glUniformBlockBinding = @ptrCast(proc); - } else { - log.err("entry point glUniformBlockBinding not found!", .{}); - success = false; - } - if (!success) - return error.EntryPointNotFound; -} - -const function_signatures = struct { - const glCullFace = fn (_mode: GLenum) callconv(.C) void; - const glFrontFace = fn (_mode: GLenum) callconv(.C) void; - const glHint = fn (_target: GLenum, _mode: GLenum) callconv(.C) void; - const glLineWidth = fn (_width: GLfloat) callconv(.C) void; - const glPointSize = fn (_size: GLfloat) callconv(.C) void; - const glPolygonMode = fn (_face: GLenum, _mode: GLenum) callconv(.C) void; - const glScissor = fn (_x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei) callconv(.C) void; - const glTexParameterf = fn (_target: GLenum, _pname: GLenum, _param: GLfloat) callconv(.C) void; - const glTexParameterfv = fn (_target: GLenum, _pname: GLenum, _params: [*c]const GLfloat) callconv(.C) void; - const glTexParameteri = fn (_target: GLenum, _pname: GLenum, _param: GLint) callconv(.C) void; - const glTexParameteriv = fn (_target: GLenum, _pname: GLenum, _params: [*c]const GLint) callconv(.C) void; - const glTexImage1D = fn (_target: GLenum, _level: GLint, _internalformat: GLint, _width: GLsizei, _border: GLint, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void; - const glTexImage2D = fn (_target: GLenum, _level: GLint, _internalformat: GLint, _width: GLsizei, _height: GLsizei, _border: GLint, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void; - const glDrawBuffer = fn (_buf: GLenum) callconv(.C) void; - const glClear = fn (_mask: GLbitfield) callconv(.C) void; - const glClearColor = fn (_red: GLfloat, _green: GLfloat, _blue: GLfloat, _alpha: GLfloat) callconv(.C) void; - const glClearStencil = fn (_s: GLint) callconv(.C) void; - const glClearDepth = fn (_depth: GLdouble) callconv(.C) void; - const glStencilMask = fn (_mask: GLuint) callconv(.C) void; - const glColorMask = fn (_red: GLboolean, _green: GLboolean, _blue: GLboolean, _alpha: GLboolean) callconv(.C) void; - const glDepthMask = fn (_flag: GLboolean) callconv(.C) void; - const glDisable = fn (_cap: GLenum) callconv(.C) void; - const glEnable = fn (_cap: GLenum) callconv(.C) void; - const glFinish = fn () callconv(.C) void; - const glFlush = fn () callconv(.C) void; - const glBlendFunc = fn (_sfactor: GLenum, _dfactor: GLenum) callconv(.C) void; - const glLogicOp = fn (_opcode: GLenum) callconv(.C) void; - const glStencilFunc = fn (_func: GLenum, _ref: GLint, _mask: GLuint) callconv(.C) void; - const glStencilOp = fn (_fail: GLenum, _zfail: GLenum, _zpass: GLenum) callconv(.C) void; - const glDepthFunc = fn (_func: GLenum) callconv(.C) void; - const glPixelStoref = fn (_pname: GLenum, _param: GLfloat) callconv(.C) void; - const glPixelStorei = fn (_pname: GLenum, _param: GLint) callconv(.C) void; - const glReadBuffer = fn (_src: GLenum) callconv(.C) void; - const glReadPixels = fn (_x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei, _format: GLenum, _type: GLenum, _pixels: ?*anyopaque) callconv(.C) void; - const glGetBooleanv = fn (_pname: GLenum, _data: [*c]GLboolean) callconv(.C) void; - const glGetDoublev = fn (_pname: GLenum, _data: [*c]GLdouble) callconv(.C) void; - const glGetError = fn () callconv(.C) GLenum; - const glGetFloatv = fn (_pname: GLenum, _data: [*c]GLfloat) callconv(.C) void; - const glGetIntegerv = fn (_pname: GLenum, _data: [*c]GLint) callconv(.C) void; - const glGetString = fn (_name: GLenum) callconv(.C) ?[*:0]const GLubyte; - const glGetTexImage = fn (_target: GLenum, _level: GLint, _format: GLenum, _type: GLenum, _pixels: ?*anyopaque) callconv(.C) void; - const glGetTexParameterfv = fn (_target: GLenum, _pname: GLenum, _params: [*c]GLfloat) callconv(.C) void; - const glGetTexParameteriv = fn (_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetTexLevelParameterfv = fn (_target: GLenum, _level: GLint, _pname: GLenum, _params: [*c]GLfloat) callconv(.C) void; - const glGetTexLevelParameteriv = fn (_target: GLenum, _level: GLint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glIsEnabled = fn (_cap: GLenum) callconv(.C) GLboolean; - const glDepthRange = fn (_n: GLdouble, _f: GLdouble) callconv(.C) void; - const glViewport = fn (_x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei) callconv(.C) void; - const glDrawArrays = fn (_mode: GLenum, _first: GLint, _count: GLsizei) callconv(.C) void; - const glDrawElements = fn (_mode: GLenum, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque) callconv(.C) void; - const glPolygonOffset = fn (_factor: GLfloat, _units: GLfloat) callconv(.C) void; - const glCopyTexImage1D = fn (_target: GLenum, _level: GLint, _internalformat: GLenum, _x: GLint, _y: GLint, _width: GLsizei, _border: GLint) callconv(.C) void; - const glCopyTexImage2D = fn (_target: GLenum, _level: GLint, _internalformat: GLenum, _x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei, _border: GLint) callconv(.C) void; - const glCopyTexSubImage1D = fn (_target: GLenum, _level: GLint, _xoffset: GLint, _x: GLint, _y: GLint, _width: GLsizei) callconv(.C) void; - const glCopyTexSubImage2D = fn (_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei) callconv(.C) void; - const glTexSubImage1D = fn (_target: GLenum, _level: GLint, _xoffset: GLint, _width: GLsizei, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void; - const glTexSubImage2D = fn (_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _width: GLsizei, _height: GLsizei, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void; - const glBindTexture = fn (_target: GLenum, _texture: GLuint) callconv(.C) void; - const glDeleteTextures = fn (_n: GLsizei, _textures: [*c]const GLuint) callconv(.C) void; - const glGenTextures = fn (_n: GLsizei, _textures: [*c]GLuint) callconv(.C) void; - const glIsTexture = fn (_texture: GLuint) callconv(.C) GLboolean; - const glDrawRangeElements = fn (_mode: GLenum, _start: GLuint, _end: GLuint, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque) callconv(.C) void; - const glTexImage3D = fn (_target: GLenum, _level: GLint, _internalformat: GLint, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _border: GLint, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void; - const glTexSubImage3D = fn (_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _zoffset: GLint, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _format: GLenum, _type: GLenum, _pixels: ?*const anyopaque) callconv(.C) void; - const glCopyTexSubImage3D = fn (_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _zoffset: GLint, _x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei) callconv(.C) void; - const glActiveTexture = fn (_texture: GLenum) callconv(.C) void; - const glSampleCoverage = fn (_value: GLfloat, _invert: GLboolean) callconv(.C) void; - const glCompressedTexImage3D = fn (_target: GLenum, _level: GLint, _internalformat: GLenum, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _border: GLint, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void; - const glCompressedTexImage2D = fn (_target: GLenum, _level: GLint, _internalformat: GLenum, _width: GLsizei, _height: GLsizei, _border: GLint, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void; - const glCompressedTexImage1D = fn (_target: GLenum, _level: GLint, _internalformat: GLenum, _width: GLsizei, _border: GLint, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void; - const glCompressedTexSubImage3D = fn (_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _zoffset: GLint, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _format: GLenum, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void; - const glCompressedTexSubImage2D = fn (_target: GLenum, _level: GLint, _xoffset: GLint, _yoffset: GLint, _width: GLsizei, _height: GLsizei, _format: GLenum, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void; - const glCompressedTexSubImage1D = fn (_target: GLenum, _level: GLint, _xoffset: GLint, _width: GLsizei, _format: GLenum, _imageSize: GLsizei, _data: ?*const anyopaque) callconv(.C) void; - const glGetCompressedTexImage = fn (_target: GLenum, _level: GLint, _img: ?*anyopaque) callconv(.C) void; - const glVertexAttribP4uiv = fn (_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: [*c]const GLuint) callconv(.C) void; - const glVertexAttribP4ui = fn (_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: GLuint) callconv(.C) void; - const glVertexAttribP3uiv = fn (_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: [*c]const GLuint) callconv(.C) void; - const glVertexAttribP3ui = fn (_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: GLuint) callconv(.C) void; - const glVertexAttribP2uiv = fn (_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: [*c]const GLuint) callconv(.C) void; - const glVertexAttribP2ui = fn (_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: GLuint) callconv(.C) void; - const glVertexAttribP1uiv = fn (_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: [*c]const GLuint) callconv(.C) void; - const glVertexAttribP1ui = fn (_index: GLuint, _type: GLenum, _normalized: GLboolean, _value: GLuint) callconv(.C) void; - const glVertexAttribDivisor = fn (_index: GLuint, _divisor: GLuint) callconv(.C) void; - const glGetQueryObjectui64v = fn (_id: GLuint, _pname: GLenum, _params: [*c]GLuint64) callconv(.C) void; - const glGetQueryObjecti64v = fn (_id: GLuint, _pname: GLenum, _params: [*c]GLint64) callconv(.C) void; - const glQueryCounter = fn (_id: GLuint, _target: GLenum) callconv(.C) void; - const glGetSamplerParameterIuiv = fn (_sampler: GLuint, _pname: GLenum, _params: [*c]GLuint) callconv(.C) void; - const glGetSamplerParameterfv = fn (_sampler: GLuint, _pname: GLenum, _params: [*c]GLfloat) callconv(.C) void; - const glGetSamplerParameterIiv = fn (_sampler: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetSamplerParameteriv = fn (_sampler: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glSamplerParameterIuiv = fn (_sampler: GLuint, _pname: GLenum, _param: [*c]const GLuint) callconv(.C) void; - const glSamplerParameterIiv = fn (_sampler: GLuint, _pname: GLenum, _param: [*c]const GLint) callconv(.C) void; - const glSamplerParameterfv = fn (_sampler: GLuint, _pname: GLenum, _param: [*c]const GLfloat) callconv(.C) void; - const glSamplerParameterf = fn (_sampler: GLuint, _pname: GLenum, _param: GLfloat) callconv(.C) void; - const glSamplerParameteriv = fn (_sampler: GLuint, _pname: GLenum, _param: [*c]const GLint) callconv(.C) void; - const glSamplerParameteri = fn (_sampler: GLuint, _pname: GLenum, _param: GLint) callconv(.C) void; - const glBindSampler = fn (_unit: GLuint, _sampler: GLuint) callconv(.C) void; - const glIsSampler = fn (_sampler: GLuint) callconv(.C) GLboolean; - const glDeleteSamplers = fn (_count: GLsizei, _samplers: [*c]const GLuint) callconv(.C) void; - const glGenSamplers = fn (_count: GLsizei, _samplers: [*c]GLuint) callconv(.C) void; - const glGetFragDataIndex = fn (_program: GLuint, _name: [*c]const GLchar) callconv(.C) GLint; - const glBindFragDataLocationIndexed = fn (_program: GLuint, _colorNumber: GLuint, _index: GLuint, _name: [*c]const GLchar) callconv(.C) void; - const glSampleMaski = fn (_maskNumber: GLuint, _mask: GLbitfield) callconv(.C) void; - const glGetMultisamplefv = fn (_pname: GLenum, _index: GLuint, _val: [*c]GLfloat) callconv(.C) void; - const glTexImage3DMultisample = fn (_target: GLenum, _samples: GLsizei, _internalformat: GLenum, _width: GLsizei, _height: GLsizei, _depth: GLsizei, _fixedsamplelocations: GLboolean) callconv(.C) void; - const glTexImage2DMultisample = fn (_target: GLenum, _samples: GLsizei, _internalformat: GLenum, _width: GLsizei, _height: GLsizei, _fixedsamplelocations: GLboolean) callconv(.C) void; - const glFramebufferTexture = fn (_target: GLenum, _attachment: GLenum, _texture: GLuint, _level: GLint) callconv(.C) void; - const glGetBufferParameteri64v = fn (_target: GLenum, _pname: GLenum, _params: [*c]GLint64) callconv(.C) void; - const glBlendFuncSeparate = fn (_sfactorRGB: GLenum, _dfactorRGB: GLenum, _sfactorAlpha: GLenum, _dfactorAlpha: GLenum) callconv(.C) void; - const glMultiDrawArrays = fn (_mode: GLenum, _first: [*c]const GLint, _count: [*c]const GLsizei, _drawcount: GLsizei) callconv(.C) void; - const glMultiDrawElements = fn (_mode: GLenum, _count: [*c]const GLsizei, _type: GLenum, _indices: [*c]const ?*const anyopaque, _drawcount: GLsizei) callconv(.C) void; - const glPointParameterf = fn (_pname: GLenum, _param: GLfloat) callconv(.C) void; - const glPointParameterfv = fn (_pname: GLenum, _params: [*c]const GLfloat) callconv(.C) void; - const glPointParameteri = fn (_pname: GLenum, _param: GLint) callconv(.C) void; - const glPointParameteriv = fn (_pname: GLenum, _params: [*c]const GLint) callconv(.C) void; - const glGetInteger64i_v = fn (_target: GLenum, _index: GLuint, _data: [*c]GLint64) callconv(.C) void; - const glGetSynciv = fn (_sync: GLsync, _pname: GLenum, _count: GLsizei, _length: [*c]GLsizei, _values: [*c]GLint) callconv(.C) void; - const glGetInteger64v = fn (_pname: GLenum, _data: [*c]GLint64) callconv(.C) void; - const glWaitSync = fn (_sync: GLsync, _flags: GLbitfield, _timeout: GLuint64) callconv(.C) void; - const glClientWaitSync = fn (_sync: GLsync, _flags: GLbitfield, _timeout: GLuint64) callconv(.C) GLenum; - const glDeleteSync = fn (_sync: GLsync) callconv(.C) void; - const glIsSync = fn (_sync: GLsync) callconv(.C) GLboolean; - const glFenceSync = fn (_condition: GLenum, _flags: GLbitfield) callconv(.C) GLsync; - const glBlendColor = fn (_red: GLfloat, _green: GLfloat, _blue: GLfloat, _alpha: GLfloat) callconv(.C) void; - const glBlendEquation = fn (_mode: GLenum) callconv(.C) void; - const glProvokingVertex = fn (_mode: GLenum) callconv(.C) void; - const glMultiDrawElementsBaseVertex = fn (_mode: GLenum, _count: [*c]const GLsizei, _type: GLenum, _indices: [*c]const ?*const anyopaque, _drawcount: GLsizei, _basevertex: [*c]const GLint) callconv(.C) void; - const glDrawElementsInstancedBaseVertex = fn (_mode: GLenum, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque, _instancecount: GLsizei, _basevertex: GLint) callconv(.C) void; - const glDrawRangeElementsBaseVertex = fn (_mode: GLenum, _start: GLuint, _end: GLuint, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque, _basevertex: GLint) callconv(.C) void; - const glDrawElementsBaseVertex = fn (_mode: GLenum, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque, _basevertex: GLint) callconv(.C) void; - const glGenQueries = fn (_n: GLsizei, _ids: [*c]GLuint) callconv(.C) void; - const glDeleteQueries = fn (_n: GLsizei, _ids: [*c]const GLuint) callconv(.C) void; - const glIsQuery = fn (_id: GLuint) callconv(.C) GLboolean; - const glBeginQuery = fn (_target: GLenum, _id: GLuint) callconv(.C) void; - const glEndQuery = fn (_target: GLenum) callconv(.C) void; - const glGetQueryiv = fn (_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetQueryObjectiv = fn (_id: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetQueryObjectuiv = fn (_id: GLuint, _pname: GLenum, _params: [*c]GLuint) callconv(.C) void; - const glBindBuffer = fn (_target: GLenum, _buffer: GLuint) callconv(.C) void; - const glDeleteBuffers = fn (_n: GLsizei, _buffers: [*c]const GLuint) callconv(.C) void; - const glGenBuffers = fn (_n: GLsizei, _buffers: [*c]GLuint) callconv(.C) void; - const glIsBuffer = fn (_buffer: GLuint) callconv(.C) GLboolean; - const glBufferData = fn (_target: GLenum, _size: GLsizeiptr, _data: ?*const anyopaque, _usage: GLenum) callconv(.C) void; - const glBufferSubData = fn (_target: GLenum, _offset: GLintptr, _size: GLsizeiptr, _data: ?*const anyopaque) callconv(.C) void; - const glGetBufferSubData = fn (_target: GLenum, _offset: GLintptr, _size: GLsizeiptr, _data: ?*anyopaque) callconv(.C) void; - const glMapBuffer = fn (_target: GLenum, _access: GLenum) callconv(.C) ?*anyopaque; - const glUnmapBuffer = fn (_target: GLenum) callconv(.C) GLboolean; - const glGetBufferParameteriv = fn (_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetBufferPointerv = fn (_target: GLenum, _pname: GLenum, _params: ?*?*anyopaque) callconv(.C) void; - const glBlendEquationSeparate = fn (_modeRGB: GLenum, _modeAlpha: GLenum) callconv(.C) void; - const glDrawBuffers = fn (_n: GLsizei, _bufs: [*c]const GLenum) callconv(.C) void; - const glStencilOpSeparate = fn (_face: GLenum, _sfail: GLenum, _dpfail: GLenum, _dppass: GLenum) callconv(.C) void; - const glStencilFuncSeparate = fn (_face: GLenum, _func: GLenum, _ref: GLint, _mask: GLuint) callconv(.C) void; - const glStencilMaskSeparate = fn (_face: GLenum, _mask: GLuint) callconv(.C) void; - const glAttachShader = fn (_program: GLuint, _shader: GLuint) callconv(.C) void; - const glBindAttribLocation = fn (_program: GLuint, _index: GLuint, _name: [*c]const GLchar) callconv(.C) void; - const glCompileShader = fn (_shader: GLuint) callconv(.C) void; - const glCreateProgram = fn () callconv(.C) GLuint; - const glCreateShader = fn (_type: GLenum) callconv(.C) GLuint; - const glDeleteProgram = fn (_program: GLuint) callconv(.C) void; - const glDeleteShader = fn (_shader: GLuint) callconv(.C) void; - const glDetachShader = fn (_program: GLuint, _shader: GLuint) callconv(.C) void; - const glDisableVertexAttribArray = fn (_index: GLuint) callconv(.C) void; - const glEnableVertexAttribArray = fn (_index: GLuint) callconv(.C) void; - const glGetActiveAttrib = fn (_program: GLuint, _index: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _size: [*c]GLint, _type: [*c]GLenum, _name: [*c]GLchar) callconv(.C) void; - const glGetActiveUniform = fn (_program: GLuint, _index: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _size: [*c]GLint, _type: [*c]GLenum, _name: [*c]GLchar) callconv(.C) void; - const glGetAttachedShaders = fn (_program: GLuint, _maxCount: GLsizei, _count: [*c]GLsizei, _shaders: [*c]GLuint) callconv(.C) void; - const glGetAttribLocation = fn (_program: GLuint, _name: [*c]const GLchar) callconv(.C) GLint; - const glGetProgramiv = fn (_program: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetProgramInfoLog = fn (_program: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _infoLog: [*c]GLchar) callconv(.C) void; - const glGetShaderiv = fn (_shader: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetShaderInfoLog = fn (_shader: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _infoLog: [*c]GLchar) callconv(.C) void; - const glGetShaderSource = fn (_shader: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _source: [*c]GLchar) callconv(.C) void; - const glGetUniformLocation = fn (_program: GLuint, _name: [*c]const GLchar) callconv(.C) GLint; - const glGetUniformfv = fn (_program: GLuint, _location: GLint, _params: [*c]GLfloat) callconv(.C) void; - const glGetUniformiv = fn (_program: GLuint, _location: GLint, _params: [*c]GLint) callconv(.C) void; - const glGetVertexAttribdv = fn (_index: GLuint, _pname: GLenum, _params: [*c]GLdouble) callconv(.C) void; - const glGetVertexAttribfv = fn (_index: GLuint, _pname: GLenum, _params: [*c]GLfloat) callconv(.C) void; - const glGetVertexAttribiv = fn (_index: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetVertexAttribPointerv = fn (_index: GLuint, _pname: GLenum, _pointer: ?*?*anyopaque) callconv(.C) void; - const glIsProgram = fn (_program: GLuint) callconv(.C) GLboolean; - const glIsShader = fn (_shader: GLuint) callconv(.C) GLboolean; - const glLinkProgram = fn (_program: GLuint) callconv(.C) void; - const glShaderSource = fn (_shader: GLuint, _count: GLsizei, _string: [*c]const [*c]const GLchar, _length: [*c]const GLint) callconv(.C) void; - const glUseProgram = fn (_program: GLuint) callconv(.C) void; - const glUniform1f = fn (_location: GLint, _v0: GLfloat) callconv(.C) void; - const glUniform2f = fn (_location: GLint, _v0: GLfloat, _v1: GLfloat) callconv(.C) void; - const glUniform3f = fn (_location: GLint, _v0: GLfloat, _v1: GLfloat, _v2: GLfloat) callconv(.C) void; - const glUniform4f = fn (_location: GLint, _v0: GLfloat, _v1: GLfloat, _v2: GLfloat, _v3: GLfloat) callconv(.C) void; - const glUniform1i = fn (_location: GLint, _v0: GLint) callconv(.C) void; - const glUniform2i = fn (_location: GLint, _v0: GLint, _v1: GLint) callconv(.C) void; - const glUniform3i = fn (_location: GLint, _v0: GLint, _v1: GLint, _v2: GLint) callconv(.C) void; - const glUniform4i = fn (_location: GLint, _v0: GLint, _v1: GLint, _v2: GLint, _v3: GLint) callconv(.C) void; - const glUniform1fv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLfloat) callconv(.C) void; - const glUniform2fv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLfloat) callconv(.C) void; - const glUniform3fv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLfloat) callconv(.C) void; - const glUniform4fv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLfloat) callconv(.C) void; - const glUniform1iv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLint) callconv(.C) void; - const glUniform2iv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLint) callconv(.C) void; - const glUniform3iv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLint) callconv(.C) void; - const glUniform4iv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLint) callconv(.C) void; - const glUniformMatrix2fv = fn (_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void; - const glUniformMatrix3fv = fn (_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void; - const glUniformMatrix4fv = fn (_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void; - const glValidateProgram = fn (_program: GLuint) callconv(.C) void; - const glVertexAttrib1d = fn (_index: GLuint, _x: GLdouble) callconv(.C) void; - const glVertexAttrib1dv = fn (_index: GLuint, _v: [*c]const GLdouble) callconv(.C) void; - const glVertexAttrib1f = fn (_index: GLuint, _x: GLfloat) callconv(.C) void; - const glVertexAttrib1fv = fn (_index: GLuint, _v: [*c]const GLfloat) callconv(.C) void; - const glVertexAttrib1s = fn (_index: GLuint, _x: GLshort) callconv(.C) void; - const glVertexAttrib1sv = fn (_index: GLuint, _v: [*c]const GLshort) callconv(.C) void; - const glVertexAttrib2d = fn (_index: GLuint, _x: GLdouble, _y: GLdouble) callconv(.C) void; - const glVertexAttrib2dv = fn (_index: GLuint, _v: [*c]const GLdouble) callconv(.C) void; - const glVertexAttrib2f = fn (_index: GLuint, _x: GLfloat, _y: GLfloat) callconv(.C) void; - const glVertexAttrib2fv = fn (_index: GLuint, _v: [*c]const GLfloat) callconv(.C) void; - const glVertexAttrib2s = fn (_index: GLuint, _x: GLshort, _y: GLshort) callconv(.C) void; - const glVertexAttrib2sv = fn (_index: GLuint, _v: [*c]const GLshort) callconv(.C) void; - const glVertexAttrib3d = fn (_index: GLuint, _x: GLdouble, _y: GLdouble, _z: GLdouble) callconv(.C) void; - const glVertexAttrib3dv = fn (_index: GLuint, _v: [*c]const GLdouble) callconv(.C) void; - const glVertexAttrib3f = fn (_index: GLuint, _x: GLfloat, _y: GLfloat, _z: GLfloat) callconv(.C) void; - const glVertexAttrib3fv = fn (_index: GLuint, _v: [*c]const GLfloat) callconv(.C) void; - const glVertexAttrib3s = fn (_index: GLuint, _x: GLshort, _y: GLshort, _z: GLshort) callconv(.C) void; - const glVertexAttrib3sv = fn (_index: GLuint, _v: [*c]const GLshort) callconv(.C) void; - const glVertexAttrib4Nbv = fn (_index: GLuint, _v: [*c]const GLbyte) callconv(.C) void; - const glVertexAttrib4Niv = fn (_index: GLuint, _v: [*c]const GLint) callconv(.C) void; - const glVertexAttrib4Nsv = fn (_index: GLuint, _v: [*c]const GLshort) callconv(.C) void; - const glVertexAttrib4Nub = fn (_index: GLuint, _x: GLubyte, _y: GLubyte, _z: GLubyte, _w: GLubyte) callconv(.C) void; - const glVertexAttrib4Nubv = fn (_index: GLuint, _v: ?[*:0]const GLubyte) callconv(.C) void; - const glVertexAttrib4Nuiv = fn (_index: GLuint, _v: [*c]const GLuint) callconv(.C) void; - const glVertexAttrib4Nusv = fn (_index: GLuint, _v: [*c]const GLushort) callconv(.C) void; - const glVertexAttrib4bv = fn (_index: GLuint, _v: [*c]const GLbyte) callconv(.C) void; - const glVertexAttrib4d = fn (_index: GLuint, _x: GLdouble, _y: GLdouble, _z: GLdouble, _w: GLdouble) callconv(.C) void; - const glVertexAttrib4dv = fn (_index: GLuint, _v: [*c]const GLdouble) callconv(.C) void; - const glVertexAttrib4f = fn (_index: GLuint, _x: GLfloat, _y: GLfloat, _z: GLfloat, _w: GLfloat) callconv(.C) void; - const glVertexAttrib4fv = fn (_index: GLuint, _v: [*c]const GLfloat) callconv(.C) void; - const glVertexAttrib4iv = fn (_index: GLuint, _v: [*c]const GLint) callconv(.C) void; - const glVertexAttrib4s = fn (_index: GLuint, _x: GLshort, _y: GLshort, _z: GLshort, _w: GLshort) callconv(.C) void; - const glVertexAttrib4sv = fn (_index: GLuint, _v: [*c]const GLshort) callconv(.C) void; - const glVertexAttrib4ubv = fn (_index: GLuint, _v: ?[*:0]const GLubyte) callconv(.C) void; - const glVertexAttrib4uiv = fn (_index: GLuint, _v: [*c]const GLuint) callconv(.C) void; - const glVertexAttrib4usv = fn (_index: GLuint, _v: [*c]const GLushort) callconv(.C) void; - const glVertexAttribPointer = fn (_index: GLuint, _size: GLint, _type: GLenum, _normalized: GLboolean, _stride: GLsizei, _pointer: ?*const anyopaque) callconv(.C) void; - const glUniformMatrix2x3fv = fn (_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void; - const glUniformMatrix3x2fv = fn (_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void; - const glUniformMatrix2x4fv = fn (_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void; - const glUniformMatrix4x2fv = fn (_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void; - const glUniformMatrix3x4fv = fn (_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void; - const glUniformMatrix4x3fv = fn (_location: GLint, _count: GLsizei, _transpose: GLboolean, _value: [*c]const GLfloat) callconv(.C) void; - const glColorMaski = fn (_index: GLuint, _r: GLboolean, _g: GLboolean, _b: GLboolean, _a: GLboolean) callconv(.C) void; - const glGetBooleani_v = fn (_target: GLenum, _index: GLuint, _data: [*c]GLboolean) callconv(.C) void; - const glGetIntegeri_v = fn (_target: GLenum, _index: GLuint, _data: [*c]GLint) callconv(.C) void; - const glEnablei = fn (_target: GLenum, _index: GLuint) callconv(.C) void; - const glDisablei = fn (_target: GLenum, _index: GLuint) callconv(.C) void; - const glIsEnabledi = fn (_target: GLenum, _index: GLuint) callconv(.C) GLboolean; - const glBeginTransformFeedback = fn (_primitiveMode: GLenum) callconv(.C) void; - const glEndTransformFeedback = fn () callconv(.C) void; - const glBindBufferRange = fn (_target: GLenum, _index: GLuint, _buffer: GLuint, _offset: GLintptr, _size: GLsizeiptr) callconv(.C) void; - const glBindBufferBase = fn (_target: GLenum, _index: GLuint, _buffer: GLuint) callconv(.C) void; - const glTransformFeedbackVaryings = fn (_program: GLuint, _count: GLsizei, _varyings: [*c]const [*c]const GLchar, _bufferMode: GLenum) callconv(.C) void; - const glGetTransformFeedbackVarying = fn (_program: GLuint, _index: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _size: [*c]GLsizei, _type: [*c]GLenum, _name: [*c]GLchar) callconv(.C) void; - const glClampColor = fn (_target: GLenum, _clamp: GLenum) callconv(.C) void; - const glBeginConditionalRender = fn (_id: GLuint, _mode: GLenum) callconv(.C) void; - const glEndConditionalRender = fn () callconv(.C) void; - const glVertexAttribIPointer = fn (_index: GLuint, _size: GLint, _type: GLenum, _stride: GLsizei, _pointer: ?*const anyopaque) callconv(.C) void; - const glGetVertexAttribIiv = fn (_index: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetVertexAttribIuiv = fn (_index: GLuint, _pname: GLenum, _params: [*c]GLuint) callconv(.C) void; - const glVertexAttribI1i = fn (_index: GLuint, _x: GLint) callconv(.C) void; - const glVertexAttribI2i = fn (_index: GLuint, _x: GLint, _y: GLint) callconv(.C) void; - const glVertexAttribI3i = fn (_index: GLuint, _x: GLint, _y: GLint, _z: GLint) callconv(.C) void; - const glVertexAttribI4i = fn (_index: GLuint, _x: GLint, _y: GLint, _z: GLint, _w: GLint) callconv(.C) void; - const glVertexAttribI1ui = fn (_index: GLuint, _x: GLuint) callconv(.C) void; - const glVertexAttribI2ui = fn (_index: GLuint, _x: GLuint, _y: GLuint) callconv(.C) void; - const glVertexAttribI3ui = fn (_index: GLuint, _x: GLuint, _y: GLuint, _z: GLuint) callconv(.C) void; - const glVertexAttribI4ui = fn (_index: GLuint, _x: GLuint, _y: GLuint, _z: GLuint, _w: GLuint) callconv(.C) void; - const glVertexAttribI1iv = fn (_index: GLuint, _v: [*c]const GLint) callconv(.C) void; - const glVertexAttribI2iv = fn (_index: GLuint, _v: [*c]const GLint) callconv(.C) void; - const glVertexAttribI3iv = fn (_index: GLuint, _v: [*c]const GLint) callconv(.C) void; - const glVertexAttribI4iv = fn (_index: GLuint, _v: [*c]const GLint) callconv(.C) void; - const glVertexAttribI1uiv = fn (_index: GLuint, _v: [*c]const GLuint) callconv(.C) void; - const glVertexAttribI2uiv = fn (_index: GLuint, _v: [*c]const GLuint) callconv(.C) void; - const glVertexAttribI3uiv = fn (_index: GLuint, _v: [*c]const GLuint) callconv(.C) void; - const glVertexAttribI4uiv = fn (_index: GLuint, _v: [*c]const GLuint) callconv(.C) void; - const glVertexAttribI4bv = fn (_index: GLuint, _v: [*c]const GLbyte) callconv(.C) void; - const glVertexAttribI4sv = fn (_index: GLuint, _v: [*c]const GLshort) callconv(.C) void; - const glVertexAttribI4ubv = fn (_index: GLuint, _v: ?[*:0]const GLubyte) callconv(.C) void; - const glVertexAttribI4usv = fn (_index: GLuint, _v: [*c]const GLushort) callconv(.C) void; - const glGetUniformuiv = fn (_program: GLuint, _location: GLint, _params: [*c]GLuint) callconv(.C) void; - const glBindFragDataLocation = fn (_program: GLuint, _color: GLuint, _name: [*c]const GLchar) callconv(.C) void; - const glGetFragDataLocation = fn (_program: GLuint, _name: [*c]const GLchar) callconv(.C) GLint; - const glUniform1ui = fn (_location: GLint, _v0: GLuint) callconv(.C) void; - const glUniform2ui = fn (_location: GLint, _v0: GLuint, _v1: GLuint) callconv(.C) void; - const glUniform3ui = fn (_location: GLint, _v0: GLuint, _v1: GLuint, _v2: GLuint) callconv(.C) void; - const glUniform4ui = fn (_location: GLint, _v0: GLuint, _v1: GLuint, _v2: GLuint, _v3: GLuint) callconv(.C) void; - const glUniform1uiv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLuint) callconv(.C) void; - const glUniform2uiv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLuint) callconv(.C) void; - const glUniform3uiv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLuint) callconv(.C) void; - const glUniform4uiv = fn (_location: GLint, _count: GLsizei, _value: [*c]const GLuint) callconv(.C) void; - const glTexParameterIiv = fn (_target: GLenum, _pname: GLenum, _params: [*c]const GLint) callconv(.C) void; - const glTexParameterIuiv = fn (_target: GLenum, _pname: GLenum, _params: [*c]const GLuint) callconv(.C) void; - const glGetTexParameterIiv = fn (_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetTexParameterIuiv = fn (_target: GLenum, _pname: GLenum, _params: [*c]GLuint) callconv(.C) void; - const glClearBufferiv = fn (_buffer: GLenum, _drawbuffer: GLint, _value: [*c]const GLint) callconv(.C) void; - const glClearBufferuiv = fn (_buffer: GLenum, _drawbuffer: GLint, _value: [*c]const GLuint) callconv(.C) void; - const glClearBufferfv = fn (_buffer: GLenum, _drawbuffer: GLint, _value: [*c]const GLfloat) callconv(.C) void; - const glClearBufferfi = fn (_buffer: GLenum, _drawbuffer: GLint, _depth: GLfloat, _stencil: GLint) callconv(.C) void; - const glGetStringi = fn (_name: GLenum, _index: GLuint) callconv(.C) ?[*:0]const GLubyte; - const glIsRenderbuffer = fn (_renderbuffer: GLuint) callconv(.C) GLboolean; - const glBindRenderbuffer = fn (_target: GLenum, _renderbuffer: GLuint) callconv(.C) void; - const glDeleteRenderbuffers = fn (_n: GLsizei, _renderbuffers: [*c]const GLuint) callconv(.C) void; - const glGenRenderbuffers = fn (_n: GLsizei, _renderbuffers: [*c]GLuint) callconv(.C) void; - const glRenderbufferStorage = fn (_target: GLenum, _internalformat: GLenum, _width: GLsizei, _height: GLsizei) callconv(.C) void; - const glGetRenderbufferParameteriv = fn (_target: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glIsFramebuffer = fn (_framebuffer: GLuint) callconv(.C) GLboolean; - const glBindFramebuffer = fn (_target: GLenum, _framebuffer: GLuint) callconv(.C) void; - const glDeleteFramebuffers = fn (_n: GLsizei, _framebuffers: [*c]const GLuint) callconv(.C) void; - const glGenFramebuffers = fn (_n: GLsizei, _framebuffers: [*c]GLuint) callconv(.C) void; - const glCheckFramebufferStatus = fn (_target: GLenum) callconv(.C) GLenum; - const glFramebufferTexture1D = fn (_target: GLenum, _attachment: GLenum, _textarget: GLenum, _texture: GLuint, _level: GLint) callconv(.C) void; - const glFramebufferTexture2D = fn (_target: GLenum, _attachment: GLenum, _textarget: GLenum, _texture: GLuint, _level: GLint) callconv(.C) void; - const glFramebufferTexture3D = fn (_target: GLenum, _attachment: GLenum, _textarget: GLenum, _texture: GLuint, _level: GLint, _zoffset: GLint) callconv(.C) void; - const glFramebufferRenderbuffer = fn (_target: GLenum, _attachment: GLenum, _renderbuffertarget: GLenum, _renderbuffer: GLuint) callconv(.C) void; - const glGetFramebufferAttachmentParameteriv = fn (_target: GLenum, _attachment: GLenum, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGenerateMipmap = fn (_target: GLenum) callconv(.C) void; - const glBlitFramebuffer = fn (_srcX0: GLint, _srcY0: GLint, _srcX1: GLint, _srcY1: GLint, _dstX0: GLint, _dstY0: GLint, _dstX1: GLint, _dstY1: GLint, _mask: GLbitfield, _filter: GLenum) callconv(.C) void; - const glRenderbufferStorageMultisample = fn (_target: GLenum, _samples: GLsizei, _internalformat: GLenum, _width: GLsizei, _height: GLsizei) callconv(.C) void; - const glFramebufferTextureLayer = fn (_target: GLenum, _attachment: GLenum, _texture: GLuint, _level: GLint, _layer: GLint) callconv(.C) void; - const glMapBufferRange = fn (_target: GLenum, _offset: GLintptr, _length: GLsizeiptr, _access: GLbitfield) callconv(.C) ?*anyopaque; - const glFlushMappedBufferRange = fn (_target: GLenum, _offset: GLintptr, _length: GLsizeiptr) callconv(.C) void; - const glBindVertexArray = fn (_array: GLuint) callconv(.C) void; - const glDeleteVertexArrays = fn (_n: GLsizei, _arrays: [*c]const GLuint) callconv(.C) void; - const glGenVertexArrays = fn (_n: GLsizei, _arrays: [*c]GLuint) callconv(.C) void; - const glIsVertexArray = fn (_array: GLuint) callconv(.C) GLboolean; - const glDrawArraysInstanced = fn (_mode: GLenum, _first: GLint, _count: GLsizei, _instancecount: GLsizei) callconv(.C) void; - const glDrawElementsInstanced = fn (_mode: GLenum, _count: GLsizei, _type: GLenum, _indices: ?*const anyopaque, _instancecount: GLsizei) callconv(.C) void; - const glTexBuffer = fn (_target: GLenum, _internalformat: GLenum, _buffer: GLuint) callconv(.C) void; - const glPrimitiveRestartIndex = fn (_index: GLuint) callconv(.C) void; - const glCopyBufferSubData = fn (_readTarget: GLenum, _writeTarget: GLenum, _readOffset: GLintptr, _writeOffset: GLintptr, _size: GLsizeiptr) callconv(.C) void; - const glGetUniformIndices = fn (_program: GLuint, _uniformCount: GLsizei, _uniformNames: [*c]const [*c]const GLchar, _uniformIndices: [*c]GLuint) callconv(.C) void; - const glGetActiveUniformsiv = fn (_program: GLuint, _uniformCount: GLsizei, _uniformIndices: [*c]const GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetActiveUniformName = fn (_program: GLuint, _uniformIndex: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _uniformName: [*c]GLchar) callconv(.C) void; - const glGetUniformBlockIndex = fn (_program: GLuint, _uniformBlockName: [*c]const GLchar) callconv(.C) GLuint; - const glGetActiveUniformBlockiv = fn (_program: GLuint, _uniformBlockIndex: GLuint, _pname: GLenum, _params: [*c]GLint) callconv(.C) void; - const glGetActiveUniformBlockName = fn (_program: GLuint, _uniformBlockIndex: GLuint, _bufSize: GLsizei, _length: [*c]GLsizei, _uniformBlockName: [*c]GLchar) callconv(.C) void; - const glUniformBlockBinding = fn (_program: GLuint, _uniformBlockIndex: GLuint, _uniformBlockBinding: GLuint) callconv(.C) void; -}; - -const function_pointers = struct { - var glCullFace: FnPtr(function_signatures.glCullFace) = undefined; - var glFrontFace: FnPtr(function_signatures.glFrontFace) = undefined; - var glHint: FnPtr(function_signatures.glHint) = undefined; - var glLineWidth: FnPtr(function_signatures.glLineWidth) = undefined; - var glPointSize: FnPtr(function_signatures.glPointSize) = undefined; - var glPolygonMode: FnPtr(function_signatures.glPolygonMode) = undefined; - var glScissor: FnPtr(function_signatures.glScissor) = undefined; - var glTexParameterf: FnPtr(function_signatures.glTexParameterf) = undefined; - var glTexParameterfv: FnPtr(function_signatures.glTexParameterfv) = undefined; - var glTexParameteri: FnPtr(function_signatures.glTexParameteri) = undefined; - var glTexParameteriv: FnPtr(function_signatures.glTexParameteriv) = undefined; - var glTexImage1D: FnPtr(function_signatures.glTexImage1D) = undefined; - var glTexImage2D: FnPtr(function_signatures.glTexImage2D) = undefined; - var glDrawBuffer: FnPtr(function_signatures.glDrawBuffer) = undefined; - var glClear: FnPtr(function_signatures.glClear) = undefined; - var glClearColor: FnPtr(function_signatures.glClearColor) = undefined; - var glClearStencil: FnPtr(function_signatures.glClearStencil) = undefined; - var glClearDepth: FnPtr(function_signatures.glClearDepth) = undefined; - var glStencilMask: FnPtr(function_signatures.glStencilMask) = undefined; - var glColorMask: FnPtr(function_signatures.glColorMask) = undefined; - var glDepthMask: FnPtr(function_signatures.glDepthMask) = undefined; - var glDisable: FnPtr(function_signatures.glDisable) = undefined; - var glEnable: FnPtr(function_signatures.glEnable) = undefined; - var glFinish: FnPtr(function_signatures.glFinish) = undefined; - var glFlush: FnPtr(function_signatures.glFlush) = undefined; - var glBlendFunc: FnPtr(function_signatures.glBlendFunc) = undefined; - var glLogicOp: FnPtr(function_signatures.glLogicOp) = undefined; - var glStencilFunc: FnPtr(function_signatures.glStencilFunc) = undefined; - var glStencilOp: FnPtr(function_signatures.glStencilOp) = undefined; - var glDepthFunc: FnPtr(function_signatures.glDepthFunc) = undefined; - var glPixelStoref: FnPtr(function_signatures.glPixelStoref) = undefined; - var glPixelStorei: FnPtr(function_signatures.glPixelStorei) = undefined; - var glReadBuffer: FnPtr(function_signatures.glReadBuffer) = undefined; - var glReadPixels: FnPtr(function_signatures.glReadPixels) = undefined; - var glGetBooleanv: FnPtr(function_signatures.glGetBooleanv) = undefined; - var glGetDoublev: FnPtr(function_signatures.glGetDoublev) = undefined; - var glGetError: FnPtr(function_signatures.glGetError) = undefined; - var glGetFloatv: FnPtr(function_signatures.glGetFloatv) = undefined; - var glGetIntegerv: FnPtr(function_signatures.glGetIntegerv) = undefined; - var glGetString: FnPtr(function_signatures.glGetString) = undefined; - var glGetTexImage: FnPtr(function_signatures.glGetTexImage) = undefined; - var glGetTexParameterfv: FnPtr(function_signatures.glGetTexParameterfv) = undefined; - var glGetTexParameteriv: FnPtr(function_signatures.glGetTexParameteriv) = undefined; - var glGetTexLevelParameterfv: FnPtr(function_signatures.glGetTexLevelParameterfv) = undefined; - var glGetTexLevelParameteriv: FnPtr(function_signatures.glGetTexLevelParameteriv) = undefined; - var glIsEnabled: FnPtr(function_signatures.glIsEnabled) = undefined; - var glDepthRange: FnPtr(function_signatures.glDepthRange) = undefined; - var glViewport: FnPtr(function_signatures.glViewport) = undefined; - var glDrawArrays: FnPtr(function_signatures.glDrawArrays) = undefined; - var glDrawElements: FnPtr(function_signatures.glDrawElements) = undefined; - var glPolygonOffset: FnPtr(function_signatures.glPolygonOffset) = undefined; - var glCopyTexImage1D: FnPtr(function_signatures.glCopyTexImage1D) = undefined; - var glCopyTexImage2D: FnPtr(function_signatures.glCopyTexImage2D) = undefined; - var glCopyTexSubImage1D: FnPtr(function_signatures.glCopyTexSubImage1D) = undefined; - var glCopyTexSubImage2D: FnPtr(function_signatures.glCopyTexSubImage2D) = undefined; - var glTexSubImage1D: FnPtr(function_signatures.glTexSubImage1D) = undefined; - var glTexSubImage2D: FnPtr(function_signatures.glTexSubImage2D) = undefined; - var glBindTexture: FnPtr(function_signatures.glBindTexture) = undefined; - var glDeleteTextures: FnPtr(function_signatures.glDeleteTextures) = undefined; - var glGenTextures: FnPtr(function_signatures.glGenTextures) = undefined; - var glIsTexture: FnPtr(function_signatures.glIsTexture) = undefined; - var glDrawRangeElements: FnPtr(function_signatures.glDrawRangeElements) = undefined; - var glTexImage3D: FnPtr(function_signatures.glTexImage3D) = undefined; - var glTexSubImage3D: FnPtr(function_signatures.glTexSubImage3D) = undefined; - var glCopyTexSubImage3D: FnPtr(function_signatures.glCopyTexSubImage3D) = undefined; - var glActiveTexture: FnPtr(function_signatures.glActiveTexture) = undefined; - var glSampleCoverage: FnPtr(function_signatures.glSampleCoverage) = undefined; - var glCompressedTexImage3D: FnPtr(function_signatures.glCompressedTexImage3D) = undefined; - var glCompressedTexImage2D: FnPtr(function_signatures.glCompressedTexImage2D) = undefined; - var glCompressedTexImage1D: FnPtr(function_signatures.glCompressedTexImage1D) = undefined; - var glCompressedTexSubImage3D: FnPtr(function_signatures.glCompressedTexSubImage3D) = undefined; - var glCompressedTexSubImage2D: FnPtr(function_signatures.glCompressedTexSubImage2D) = undefined; - var glCompressedTexSubImage1D: FnPtr(function_signatures.glCompressedTexSubImage1D) = undefined; - var glGetCompressedTexImage: FnPtr(function_signatures.glGetCompressedTexImage) = undefined; - var glVertexAttribP4uiv: FnPtr(function_signatures.glVertexAttribP4uiv) = undefined; - var glVertexAttribP4ui: FnPtr(function_signatures.glVertexAttribP4ui) = undefined; - var glVertexAttribP3uiv: FnPtr(function_signatures.glVertexAttribP3uiv) = undefined; - var glVertexAttribP3ui: FnPtr(function_signatures.glVertexAttribP3ui) = undefined; - var glVertexAttribP2uiv: FnPtr(function_signatures.glVertexAttribP2uiv) = undefined; - var glVertexAttribP2ui: FnPtr(function_signatures.glVertexAttribP2ui) = undefined; - var glVertexAttribP1uiv: FnPtr(function_signatures.glVertexAttribP1uiv) = undefined; - var glVertexAttribP1ui: FnPtr(function_signatures.glVertexAttribP1ui) = undefined; - var glVertexAttribDivisor: FnPtr(function_signatures.glVertexAttribDivisor) = undefined; - var glGetQueryObjectui64v: FnPtr(function_signatures.glGetQueryObjectui64v) = undefined; - var glGetQueryObjecti64v: FnPtr(function_signatures.glGetQueryObjecti64v) = undefined; - var glQueryCounter: FnPtr(function_signatures.glQueryCounter) = undefined; - var glGetSamplerParameterIuiv: FnPtr(function_signatures.glGetSamplerParameterIuiv) = undefined; - var glGetSamplerParameterfv: FnPtr(function_signatures.glGetSamplerParameterfv) = undefined; - var glGetSamplerParameterIiv: FnPtr(function_signatures.glGetSamplerParameterIiv) = undefined; - var glGetSamplerParameteriv: FnPtr(function_signatures.glGetSamplerParameteriv) = undefined; - var glSamplerParameterIuiv: FnPtr(function_signatures.glSamplerParameterIuiv) = undefined; - var glSamplerParameterIiv: FnPtr(function_signatures.glSamplerParameterIiv) = undefined; - var glSamplerParameterfv: FnPtr(function_signatures.glSamplerParameterfv) = undefined; - var glSamplerParameterf: FnPtr(function_signatures.glSamplerParameterf) = undefined; - var glSamplerParameteriv: FnPtr(function_signatures.glSamplerParameteriv) = undefined; - var glSamplerParameteri: FnPtr(function_signatures.glSamplerParameteri) = undefined; - var glBindSampler: FnPtr(function_signatures.glBindSampler) = undefined; - var glIsSampler: FnPtr(function_signatures.glIsSampler) = undefined; - var glDeleteSamplers: FnPtr(function_signatures.glDeleteSamplers) = undefined; - var glGenSamplers: FnPtr(function_signatures.glGenSamplers) = undefined; - var glGetFragDataIndex: FnPtr(function_signatures.glGetFragDataIndex) = undefined; - var glBindFragDataLocationIndexed: FnPtr(function_signatures.glBindFragDataLocationIndexed) = undefined; - var glSampleMaski: FnPtr(function_signatures.glSampleMaski) = undefined; - var glGetMultisamplefv: FnPtr(function_signatures.glGetMultisamplefv) = undefined; - var glTexImage3DMultisample: FnPtr(function_signatures.glTexImage3DMultisample) = undefined; - var glTexImage2DMultisample: FnPtr(function_signatures.glTexImage2DMultisample) = undefined; - var glFramebufferTexture: FnPtr(function_signatures.glFramebufferTexture) = undefined; - var glGetBufferParameteri64v: FnPtr(function_signatures.glGetBufferParameteri64v) = undefined; - var glBlendFuncSeparate: FnPtr(function_signatures.glBlendFuncSeparate) = undefined; - var glMultiDrawArrays: FnPtr(function_signatures.glMultiDrawArrays) = undefined; - var glMultiDrawElements: FnPtr(function_signatures.glMultiDrawElements) = undefined; - var glPointParameterf: FnPtr(function_signatures.glPointParameterf) = undefined; - var glPointParameterfv: FnPtr(function_signatures.glPointParameterfv) = undefined; - var glPointParameteri: FnPtr(function_signatures.glPointParameteri) = undefined; - var glPointParameteriv: FnPtr(function_signatures.glPointParameteriv) = undefined; - var glGetInteger64i_v: FnPtr(function_signatures.glGetInteger64i_v) = undefined; - var glGetSynciv: FnPtr(function_signatures.glGetSynciv) = undefined; - var glGetInteger64v: FnPtr(function_signatures.glGetInteger64v) = undefined; - var glWaitSync: FnPtr(function_signatures.glWaitSync) = undefined; - var glClientWaitSync: FnPtr(function_signatures.glClientWaitSync) = undefined; - var glDeleteSync: FnPtr(function_signatures.glDeleteSync) = undefined; - var glIsSync: FnPtr(function_signatures.glIsSync) = undefined; - var glFenceSync: FnPtr(function_signatures.glFenceSync) = undefined; - var glBlendColor: FnPtr(function_signatures.glBlendColor) = undefined; - var glBlendEquation: FnPtr(function_signatures.glBlendEquation) = undefined; - var glProvokingVertex: FnPtr(function_signatures.glProvokingVertex) = undefined; - var glMultiDrawElementsBaseVertex: FnPtr(function_signatures.glMultiDrawElementsBaseVertex) = undefined; - var glDrawElementsInstancedBaseVertex: FnPtr(function_signatures.glDrawElementsInstancedBaseVertex) = undefined; - var glDrawRangeElementsBaseVertex: FnPtr(function_signatures.glDrawRangeElementsBaseVertex) = undefined; - var glDrawElementsBaseVertex: FnPtr(function_signatures.glDrawElementsBaseVertex) = undefined; - var glGenQueries: FnPtr(function_signatures.glGenQueries) = undefined; - var glDeleteQueries: FnPtr(function_signatures.glDeleteQueries) = undefined; - var glIsQuery: FnPtr(function_signatures.glIsQuery) = undefined; - var glBeginQuery: FnPtr(function_signatures.glBeginQuery) = undefined; - var glEndQuery: FnPtr(function_signatures.glEndQuery) = undefined; - var glGetQueryiv: FnPtr(function_signatures.glGetQueryiv) = undefined; - var glGetQueryObjectiv: FnPtr(function_signatures.glGetQueryObjectiv) = undefined; - var glGetQueryObjectuiv: FnPtr(function_signatures.glGetQueryObjectuiv) = undefined; - var glBindBuffer: FnPtr(function_signatures.glBindBuffer) = undefined; - var glDeleteBuffers: FnPtr(function_signatures.glDeleteBuffers) = undefined; - var glGenBuffers: FnPtr(function_signatures.glGenBuffers) = undefined; - var glIsBuffer: FnPtr(function_signatures.glIsBuffer) = undefined; - var glBufferData: FnPtr(function_signatures.glBufferData) = undefined; - var glBufferSubData: FnPtr(function_signatures.glBufferSubData) = undefined; - var glGetBufferSubData: FnPtr(function_signatures.glGetBufferSubData) = undefined; - var glMapBuffer: FnPtr(function_signatures.glMapBuffer) = undefined; - var glUnmapBuffer: FnPtr(function_signatures.glUnmapBuffer) = undefined; - var glGetBufferParameteriv: FnPtr(function_signatures.glGetBufferParameteriv) = undefined; - var glGetBufferPointerv: FnPtr(function_signatures.glGetBufferPointerv) = undefined; - var glBlendEquationSeparate: FnPtr(function_signatures.glBlendEquationSeparate) = undefined; - var glDrawBuffers: FnPtr(function_signatures.glDrawBuffers) = undefined; - var glStencilOpSeparate: FnPtr(function_signatures.glStencilOpSeparate) = undefined; - var glStencilFuncSeparate: FnPtr(function_signatures.glStencilFuncSeparate) = undefined; - var glStencilMaskSeparate: FnPtr(function_signatures.glStencilMaskSeparate) = undefined; - var glAttachShader: FnPtr(function_signatures.glAttachShader) = undefined; - var glBindAttribLocation: FnPtr(function_signatures.glBindAttribLocation) = undefined; - var glCompileShader: FnPtr(function_signatures.glCompileShader) = undefined; - var glCreateProgram: FnPtr(function_signatures.glCreateProgram) = undefined; - var glCreateShader: FnPtr(function_signatures.glCreateShader) = undefined; - var glDeleteProgram: FnPtr(function_signatures.glDeleteProgram) = undefined; - var glDeleteShader: FnPtr(function_signatures.glDeleteShader) = undefined; - var glDetachShader: FnPtr(function_signatures.glDetachShader) = undefined; - var glDisableVertexAttribArray: FnPtr(function_signatures.glDisableVertexAttribArray) = undefined; - var glEnableVertexAttribArray: FnPtr(function_signatures.glEnableVertexAttribArray) = undefined; - var glGetActiveAttrib: FnPtr(function_signatures.glGetActiveAttrib) = undefined; - var glGetActiveUniform: FnPtr(function_signatures.glGetActiveUniform) = undefined; - var glGetAttachedShaders: FnPtr(function_signatures.glGetAttachedShaders) = undefined; - var glGetAttribLocation: FnPtr(function_signatures.glGetAttribLocation) = undefined; - var glGetProgramiv: FnPtr(function_signatures.glGetProgramiv) = undefined; - var glGetProgramInfoLog: FnPtr(function_signatures.glGetProgramInfoLog) = undefined; - var glGetShaderiv: FnPtr(function_signatures.glGetShaderiv) = undefined; - var glGetShaderInfoLog: FnPtr(function_signatures.glGetShaderInfoLog) = undefined; - var glGetShaderSource: FnPtr(function_signatures.glGetShaderSource) = undefined; - var glGetUniformLocation: FnPtr(function_signatures.glGetUniformLocation) = undefined; - var glGetUniformfv: FnPtr(function_signatures.glGetUniformfv) = undefined; - var glGetUniformiv: FnPtr(function_signatures.glGetUniformiv) = undefined; - var glGetVertexAttribdv: FnPtr(function_signatures.glGetVertexAttribdv) = undefined; - var glGetVertexAttribfv: FnPtr(function_signatures.glGetVertexAttribfv) = undefined; - var glGetVertexAttribiv: FnPtr(function_signatures.glGetVertexAttribiv) = undefined; - var glGetVertexAttribPointerv: FnPtr(function_signatures.glGetVertexAttribPointerv) = undefined; - var glIsProgram: FnPtr(function_signatures.glIsProgram) = undefined; - var glIsShader: FnPtr(function_signatures.glIsShader) = undefined; - var glLinkProgram: FnPtr(function_signatures.glLinkProgram) = undefined; - var glShaderSource: FnPtr(function_signatures.glShaderSource) = undefined; - var glUseProgram: FnPtr(function_signatures.glUseProgram) = undefined; - var glUniform1f: FnPtr(function_signatures.glUniform1f) = undefined; - var glUniform2f: FnPtr(function_signatures.glUniform2f) = undefined; - var glUniform3f: FnPtr(function_signatures.glUniform3f) = undefined; - var glUniform4f: FnPtr(function_signatures.glUniform4f) = undefined; - var glUniform1i: FnPtr(function_signatures.glUniform1i) = undefined; - var glUniform2i: FnPtr(function_signatures.glUniform2i) = undefined; - var glUniform3i: FnPtr(function_signatures.glUniform3i) = undefined; - var glUniform4i: FnPtr(function_signatures.glUniform4i) = undefined; - var glUniform1fv: FnPtr(function_signatures.glUniform1fv) = undefined; - var glUniform2fv: FnPtr(function_signatures.glUniform2fv) = undefined; - var glUniform3fv: FnPtr(function_signatures.glUniform3fv) = undefined; - var glUniform4fv: FnPtr(function_signatures.glUniform4fv) = undefined; - var glUniform1iv: FnPtr(function_signatures.glUniform1iv) = undefined; - var glUniform2iv: FnPtr(function_signatures.glUniform2iv) = undefined; - var glUniform3iv: FnPtr(function_signatures.glUniform3iv) = undefined; - var glUniform4iv: FnPtr(function_signatures.glUniform4iv) = undefined; - var glUniformMatrix2fv: FnPtr(function_signatures.glUniformMatrix2fv) = undefined; - var glUniformMatrix3fv: FnPtr(function_signatures.glUniformMatrix3fv) = undefined; - var glUniformMatrix4fv: FnPtr(function_signatures.glUniformMatrix4fv) = undefined; - var glValidateProgram: FnPtr(function_signatures.glValidateProgram) = undefined; - var glVertexAttrib1d: FnPtr(function_signatures.glVertexAttrib1d) = undefined; - var glVertexAttrib1dv: FnPtr(function_signatures.glVertexAttrib1dv) = undefined; - var glVertexAttrib1f: FnPtr(function_signatures.glVertexAttrib1f) = undefined; - var glVertexAttrib1fv: FnPtr(function_signatures.glVertexAttrib1fv) = undefined; - var glVertexAttrib1s: FnPtr(function_signatures.glVertexAttrib1s) = undefined; - var glVertexAttrib1sv: FnPtr(function_signatures.glVertexAttrib1sv) = undefined; - var glVertexAttrib2d: FnPtr(function_signatures.glVertexAttrib2d) = undefined; - var glVertexAttrib2dv: FnPtr(function_signatures.glVertexAttrib2dv) = undefined; - var glVertexAttrib2f: FnPtr(function_signatures.glVertexAttrib2f) = undefined; - var glVertexAttrib2fv: FnPtr(function_signatures.glVertexAttrib2fv) = undefined; - var glVertexAttrib2s: FnPtr(function_signatures.glVertexAttrib2s) = undefined; - var glVertexAttrib2sv: FnPtr(function_signatures.glVertexAttrib2sv) = undefined; - var glVertexAttrib3d: FnPtr(function_signatures.glVertexAttrib3d) = undefined; - var glVertexAttrib3dv: FnPtr(function_signatures.glVertexAttrib3dv) = undefined; - var glVertexAttrib3f: FnPtr(function_signatures.glVertexAttrib3f) = undefined; - var glVertexAttrib3fv: FnPtr(function_signatures.glVertexAttrib3fv) = undefined; - var glVertexAttrib3s: FnPtr(function_signatures.glVertexAttrib3s) = undefined; - var glVertexAttrib3sv: FnPtr(function_signatures.glVertexAttrib3sv) = undefined; - var glVertexAttrib4Nbv: FnPtr(function_signatures.glVertexAttrib4Nbv) = undefined; - var glVertexAttrib4Niv: FnPtr(function_signatures.glVertexAttrib4Niv) = undefined; - var glVertexAttrib4Nsv: FnPtr(function_signatures.glVertexAttrib4Nsv) = undefined; - var glVertexAttrib4Nub: FnPtr(function_signatures.glVertexAttrib4Nub) = undefined; - var glVertexAttrib4Nubv: FnPtr(function_signatures.glVertexAttrib4Nubv) = undefined; - var glVertexAttrib4Nuiv: FnPtr(function_signatures.glVertexAttrib4Nuiv) = undefined; - var glVertexAttrib4Nusv: FnPtr(function_signatures.glVertexAttrib4Nusv) = undefined; - var glVertexAttrib4bv: FnPtr(function_signatures.glVertexAttrib4bv) = undefined; - var glVertexAttrib4d: FnPtr(function_signatures.glVertexAttrib4d) = undefined; - var glVertexAttrib4dv: FnPtr(function_signatures.glVertexAttrib4dv) = undefined; - var glVertexAttrib4f: FnPtr(function_signatures.glVertexAttrib4f) = undefined; - var glVertexAttrib4fv: FnPtr(function_signatures.glVertexAttrib4fv) = undefined; - var glVertexAttrib4iv: FnPtr(function_signatures.glVertexAttrib4iv) = undefined; - var glVertexAttrib4s: FnPtr(function_signatures.glVertexAttrib4s) = undefined; - var glVertexAttrib4sv: FnPtr(function_signatures.glVertexAttrib4sv) = undefined; - var glVertexAttrib4ubv: FnPtr(function_signatures.glVertexAttrib4ubv) = undefined; - var glVertexAttrib4uiv: FnPtr(function_signatures.glVertexAttrib4uiv) = undefined; - var glVertexAttrib4usv: FnPtr(function_signatures.glVertexAttrib4usv) = undefined; - var glVertexAttribPointer: FnPtr(function_signatures.glVertexAttribPointer) = undefined; - var glUniformMatrix2x3fv: FnPtr(function_signatures.glUniformMatrix2x3fv) = undefined; - var glUniformMatrix3x2fv: FnPtr(function_signatures.glUniformMatrix3x2fv) = undefined; - var glUniformMatrix2x4fv: FnPtr(function_signatures.glUniformMatrix2x4fv) = undefined; - var glUniformMatrix4x2fv: FnPtr(function_signatures.glUniformMatrix4x2fv) = undefined; - var glUniformMatrix3x4fv: FnPtr(function_signatures.glUniformMatrix3x4fv) = undefined; - var glUniformMatrix4x3fv: FnPtr(function_signatures.glUniformMatrix4x3fv) = undefined; - var glColorMaski: FnPtr(function_signatures.glColorMaski) = undefined; - var glGetBooleani_v: FnPtr(function_signatures.glGetBooleani_v) = undefined; - var glGetIntegeri_v: FnPtr(function_signatures.glGetIntegeri_v) = undefined; - var glEnablei: FnPtr(function_signatures.glEnablei) = undefined; - var glDisablei: FnPtr(function_signatures.glDisablei) = undefined; - var glIsEnabledi: FnPtr(function_signatures.glIsEnabledi) = undefined; - var glBeginTransformFeedback: FnPtr(function_signatures.glBeginTransformFeedback) = undefined; - var glEndTransformFeedback: FnPtr(function_signatures.glEndTransformFeedback) = undefined; - var glBindBufferRange: FnPtr(function_signatures.glBindBufferRange) = undefined; - var glBindBufferBase: FnPtr(function_signatures.glBindBufferBase) = undefined; - var glTransformFeedbackVaryings: FnPtr(function_signatures.glTransformFeedbackVaryings) = undefined; - var glGetTransformFeedbackVarying: FnPtr(function_signatures.glGetTransformFeedbackVarying) = undefined; - var glClampColor: FnPtr(function_signatures.glClampColor) = undefined; - var glBeginConditionalRender: FnPtr(function_signatures.glBeginConditionalRender) = undefined; - var glEndConditionalRender: FnPtr(function_signatures.glEndConditionalRender) = undefined; - var glVertexAttribIPointer: FnPtr(function_signatures.glVertexAttribIPointer) = undefined; - var glGetVertexAttribIiv: FnPtr(function_signatures.glGetVertexAttribIiv) = undefined; - var glGetVertexAttribIuiv: FnPtr(function_signatures.glGetVertexAttribIuiv) = undefined; - var glVertexAttribI1i: FnPtr(function_signatures.glVertexAttribI1i) = undefined; - var glVertexAttribI2i: FnPtr(function_signatures.glVertexAttribI2i) = undefined; - var glVertexAttribI3i: FnPtr(function_signatures.glVertexAttribI3i) = undefined; - var glVertexAttribI4i: FnPtr(function_signatures.glVertexAttribI4i) = undefined; - var glVertexAttribI1ui: FnPtr(function_signatures.glVertexAttribI1ui) = undefined; - var glVertexAttribI2ui: FnPtr(function_signatures.glVertexAttribI2ui) = undefined; - var glVertexAttribI3ui: FnPtr(function_signatures.glVertexAttribI3ui) = undefined; - var glVertexAttribI4ui: FnPtr(function_signatures.glVertexAttribI4ui) = undefined; - var glVertexAttribI1iv: FnPtr(function_signatures.glVertexAttribI1iv) = undefined; - var glVertexAttribI2iv: FnPtr(function_signatures.glVertexAttribI2iv) = undefined; - var glVertexAttribI3iv: FnPtr(function_signatures.glVertexAttribI3iv) = undefined; - var glVertexAttribI4iv: FnPtr(function_signatures.glVertexAttribI4iv) = undefined; - var glVertexAttribI1uiv: FnPtr(function_signatures.glVertexAttribI1uiv) = undefined; - var glVertexAttribI2uiv: FnPtr(function_signatures.glVertexAttribI2uiv) = undefined; - var glVertexAttribI3uiv: FnPtr(function_signatures.glVertexAttribI3uiv) = undefined; - var glVertexAttribI4uiv: FnPtr(function_signatures.glVertexAttribI4uiv) = undefined; - var glVertexAttribI4bv: FnPtr(function_signatures.glVertexAttribI4bv) = undefined; - var glVertexAttribI4sv: FnPtr(function_signatures.glVertexAttribI4sv) = undefined; - var glVertexAttribI4ubv: FnPtr(function_signatures.glVertexAttribI4ubv) = undefined; - var glVertexAttribI4usv: FnPtr(function_signatures.glVertexAttribI4usv) = undefined; - var glGetUniformuiv: FnPtr(function_signatures.glGetUniformuiv) = undefined; - var glBindFragDataLocation: FnPtr(function_signatures.glBindFragDataLocation) = undefined; - var glGetFragDataLocation: FnPtr(function_signatures.glGetFragDataLocation) = undefined; - var glUniform1ui: FnPtr(function_signatures.glUniform1ui) = undefined; - var glUniform2ui: FnPtr(function_signatures.glUniform2ui) = undefined; - var glUniform3ui: FnPtr(function_signatures.glUniform3ui) = undefined; - var glUniform4ui: FnPtr(function_signatures.glUniform4ui) = undefined; - var glUniform1uiv: FnPtr(function_signatures.glUniform1uiv) = undefined; - var glUniform2uiv: FnPtr(function_signatures.glUniform2uiv) = undefined; - var glUniform3uiv: FnPtr(function_signatures.glUniform3uiv) = undefined; - var glUniform4uiv: FnPtr(function_signatures.glUniform4uiv) = undefined; - var glTexParameterIiv: FnPtr(function_signatures.glTexParameterIiv) = undefined; - var glTexParameterIuiv: FnPtr(function_signatures.glTexParameterIuiv) = undefined; - var glGetTexParameterIiv: FnPtr(function_signatures.glGetTexParameterIiv) = undefined; - var glGetTexParameterIuiv: FnPtr(function_signatures.glGetTexParameterIuiv) = undefined; - var glClearBufferiv: FnPtr(function_signatures.glClearBufferiv) = undefined; - var glClearBufferuiv: FnPtr(function_signatures.glClearBufferuiv) = undefined; - var glClearBufferfv: FnPtr(function_signatures.glClearBufferfv) = undefined; - var glClearBufferfi: FnPtr(function_signatures.glClearBufferfi) = undefined; - var glGetStringi: FnPtr(function_signatures.glGetStringi) = undefined; - var glIsRenderbuffer: FnPtr(function_signatures.glIsRenderbuffer) = undefined; - var glBindRenderbuffer: FnPtr(function_signatures.glBindRenderbuffer) = undefined; - var glDeleteRenderbuffers: FnPtr(function_signatures.glDeleteRenderbuffers) = undefined; - var glGenRenderbuffers: FnPtr(function_signatures.glGenRenderbuffers) = undefined; - var glRenderbufferStorage: FnPtr(function_signatures.glRenderbufferStorage) = undefined; - var glGetRenderbufferParameteriv: FnPtr(function_signatures.glGetRenderbufferParameteriv) = undefined; - var glIsFramebuffer: FnPtr(function_signatures.glIsFramebuffer) = undefined; - var glBindFramebuffer: FnPtr(function_signatures.glBindFramebuffer) = undefined; - var glDeleteFramebuffers: FnPtr(function_signatures.glDeleteFramebuffers) = undefined; - var glGenFramebuffers: FnPtr(function_signatures.glGenFramebuffers) = undefined; - var glCheckFramebufferStatus: FnPtr(function_signatures.glCheckFramebufferStatus) = undefined; - var glFramebufferTexture1D: FnPtr(function_signatures.glFramebufferTexture1D) = undefined; - var glFramebufferTexture2D: FnPtr(function_signatures.glFramebufferTexture2D) = undefined; - var glFramebufferTexture3D: FnPtr(function_signatures.glFramebufferTexture3D) = undefined; - var glFramebufferRenderbuffer: FnPtr(function_signatures.glFramebufferRenderbuffer) = undefined; - var glGetFramebufferAttachmentParameteriv: FnPtr(function_signatures.glGetFramebufferAttachmentParameteriv) = undefined; - var glGenerateMipmap: FnPtr(function_signatures.glGenerateMipmap) = undefined; - var glBlitFramebuffer: FnPtr(function_signatures.glBlitFramebuffer) = undefined; - var glRenderbufferStorageMultisample: FnPtr(function_signatures.glRenderbufferStorageMultisample) = undefined; - var glFramebufferTextureLayer: FnPtr(function_signatures.glFramebufferTextureLayer) = undefined; - var glMapBufferRange: FnPtr(function_signatures.glMapBufferRange) = undefined; - var glFlushMappedBufferRange: FnPtr(function_signatures.glFlushMappedBufferRange) = undefined; - var glBindVertexArray: FnPtr(function_signatures.glBindVertexArray) = undefined; - var glDeleteVertexArrays: FnPtr(function_signatures.glDeleteVertexArrays) = undefined; - var glGenVertexArrays: FnPtr(function_signatures.glGenVertexArrays) = undefined; - var glIsVertexArray: FnPtr(function_signatures.glIsVertexArray) = undefined; - var glDrawArraysInstanced: FnPtr(function_signatures.glDrawArraysInstanced) = undefined; - var glDrawElementsInstanced: FnPtr(function_signatures.glDrawElementsInstanced) = undefined; - var glTexBuffer: FnPtr(function_signatures.glTexBuffer) = undefined; - var glPrimitiveRestartIndex: FnPtr(function_signatures.glPrimitiveRestartIndex) = undefined; - var glCopyBufferSubData: FnPtr(function_signatures.glCopyBufferSubData) = undefined; - var glGetUniformIndices: FnPtr(function_signatures.glGetUniformIndices) = undefined; - var glGetActiveUniformsiv: FnPtr(function_signatures.glGetActiveUniformsiv) = undefined; - var glGetActiveUniformName: FnPtr(function_signatures.glGetActiveUniformName) = undefined; - var glGetUniformBlockIndex: FnPtr(function_signatures.glGetUniformBlockIndex) = undefined; - var glGetActiveUniformBlockiv: FnPtr(function_signatures.glGetActiveUniformBlockiv) = undefined; - var glGetActiveUniformBlockName: FnPtr(function_signatures.glGetActiveUniformBlockName) = undefined; - var glUniformBlockBinding: FnPtr(function_signatures.glUniformBlockBinding) = undefined; -}; - -test { - _ = load; - @setEvalBranchQuota(100_000); // Yes, this is necessary. OpenGL gets quite large! - std.testing.refAllDecls(@This()); -} diff --git a/src/config.zig b/src/config.zig index 2d4b907..954623a 100644 --- a/src/config.zig +++ b/src/config.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const tomlz = @import("tomlz"); +// const tomlz = @import("tomlz"); const Allocator = std.mem.Allocator; @@ -59,5 +59,6 @@ pub fn load(allocator: Allocator, file_path: []const u8) !void { const contents = try config_file.readToEndAlloc(allocator, try config_file.getEndPos()); defer allocator.free(contents); - state = try tomlz.parser.decode(Config, allocator, contents); + // FIXME(2025-09-22): re-enable + // state = try tomlz.parser.decode(Config, allocator, contents); } diff --git a/src/core/Bus.zig b/src/core/Bus.zig index a0fc3bf..3b768e2 100644 --- a/src/core/Bus.zig +++ b/src/core/Bus.zig @@ -13,13 +13,13 @@ const TimerTuple = @import("bus/timer.zig").TimerTuple; const Scheduler = @import("scheduler.zig").Scheduler; const FilePaths = @import("../util.zig").FilePaths; -const io = @import("bus/io.zig"); +const _io = @import("bus/io.zig"); const Allocator = std.mem.Allocator; const log = std.log.scoped(.Bus); const createDmaTuple = @import("bus/dma.zig").create; const createTimerTuple = @import("bus/timer.zig").create; -const rotr = @import("zba-util").rotr; +const rotr = @import("zba_util").rotr; const timings: [2][0x10]u8 = [_][0x10]u8{ // BIOS, Unused, EWRAM, IWRAM, I/0, PALRAM, VRAM, OAM, ROM0, ROM0, ROM1, ROM1, ROM2, ROM2, SRAM, Unused @@ -81,7 +81,7 @@ pub fn init(self: *Self, allocator: Allocator, sched: *Scheduler, cpu: *Arm7tdmi .allocator = allocator, }; - self.fillReadTable(read_table); + self.fillReadTable(@ptrCast(read_table)); // Internal Display Memory behaves differently on 8-bit reads self.fillWriteTable(u32, write_tables[0]); @@ -135,12 +135,10 @@ pub fn replaceGamepak(self: *Self, file_path: []const u8) !void { self.pak = try GamePak.init(self.allocator, self.cpu, file_path, save_path); - const read_ptr: *[table_len]?*const anyopaque = @constCast(self.read_table); - const write_ptrs: [2]*[table_len]?*anyopaque = .{ @constCast(self.write_tables[0]), @constCast(self.write_tables[1]) }; - - self.fillReadTable(read_ptr); - self.fillWriteTable(u32, write_ptrs[0]); - self.fillWriteTable(u8, write_ptrs[1]); + // SAFETY: TODO: why do we know this is safe? + self.fillReadTable(@ptrCast(@constCast(self.read_table))); + self.fillWriteTable(u32, @constCast(self.write_tables[0])); + self.fillWriteTable(u8, @constCast(self.write_tables[1])); } fn fillReadTable(self: *Self, table: *[table_len]?*const anyopaque) void { @@ -169,7 +167,7 @@ fn fillReadTable(self: *Self, table: *[table_len]?*const anyopaque) void { } } -fn fillWriteTable(self: *Self, comptime T: type, table: *[table_len]?*const anyopaque) void { +fn fillWriteTable(self: *Self, comptime T: type, table: *[table_len]?*anyopaque) void { comptime std.debug.assert(T == u32 or T == u16 or T == u8); const vramMirror = @import("ppu/Vram.zig").mirror; @@ -240,11 +238,11 @@ fn fillReadTableExternal(self: *Self, addr: u32) ?*anyopaque { } fn readIo(self: *const Self, comptime T: type, address: u32) T { - return io.read(self, T, address) orelse self.openBus(T, address); + return _io.read(self, T, address) orelse self.openBus(T, address); } fn openBus(self: *const Self, comptime T: type, address: u32) T { - @setCold(true); + @branchHint(.cold); const r15 = self.cpu.r[15]; const word = blk: { @@ -305,7 +303,7 @@ fn openBus(self: *const Self, comptime T: type, address: u32) T { } pub fn read(self: *Self, comptime T: type, unaligned_address: u32) T { - const bits = @typeInfo(std.math.IntFittingRange(0, page_size - 1)).Int.bits; + const bits = @typeInfo(std.math.IntFittingRange(0, page_size - 1)).int.bits; const page = unaligned_address >> bits; const offset = unaligned_address & (page_size - 1); @@ -328,7 +326,7 @@ pub fn read(self: *Self, comptime T: type, unaligned_address: u32) T { } pub fn dbgRead(self: *const Self, comptime T: type, unaligned_address: u32) T { - const bits = @typeInfo(std.math.IntFittingRange(0, page_size - 1)).Int.bits; + const bits = @typeInfo(std.math.IntFittingRange(0, page_size - 1)).int.bits; const page = unaligned_address >> bits; const offset = unaligned_address & (page_size - 1); @@ -348,7 +346,7 @@ pub fn dbgRead(self: *const Self, comptime T: type, unaligned_address: u32) T { } fn slowRead(self: *Self, comptime T: type, unaligned_address: u32) T { - @setCold(true); + @branchHint(.cold); const page: u8 = @truncate(unaligned_address >> 24); const address = forceAlign(T, unaligned_address); @@ -419,7 +417,7 @@ fn readBackup(self: *const Self, comptime T: type, unaligned_address: u32) T { } pub fn write(self: *Self, comptime T: type, unaligned_address: u32, value: T) void { - const bits = @typeInfo(std.math.IntFittingRange(0, page_size - 1)).Int.bits; + const bits = @typeInfo(std.math.IntFittingRange(0, page_size - 1)).int.bits; const page = unaligned_address >> bits; const offset = unaligned_address & (page_size - 1); @@ -446,7 +444,7 @@ pub fn write(self: *Self, comptime T: type, unaligned_address: u32, value: T) vo /// Mostly Identical to `Bus.write`, slowmeme is handled by `Bus.dbgSlowWrite` pub fn dbgWrite(self: *Self, comptime T: type, unaligned_address: u32, value: T) void { - const bits = @typeInfo(std.math.IntFittingRange(0, page_size - 1)).Int.bits; + const bits = @typeInfo(std.math.IntFittingRange(0, page_size - 1)).int.bits; const page = unaligned_address >> bits; const offset = unaligned_address & (page_size - 1); @@ -469,7 +467,7 @@ pub fn dbgWrite(self: *Self, comptime T: type, unaligned_address: u32, value: T) } fn slowWrite(self: *Self, comptime T: type, unaligned_address: u32, value: T) void { - @setCold(true); + @branchHint(.cold); const page: u8 = @truncate(unaligned_address >> 24); const address = forceAlign(T, unaligned_address); @@ -479,7 +477,7 @@ fn slowWrite(self: *Self, comptime T: type, unaligned_address: u32, value: T) vo 0x00 => self.bios.write(T, address, value), 0x02 => unreachable, // completely handled by fastmem 0x03 => unreachable, // completely handled by fastmem - 0x04 => io.write(self, T, address, value), + 0x04 => _io.write(self, T, address, value), // Internal Display Memory 0x05 => self.ppu.palette.write(T, address, value), @@ -494,7 +492,7 @@ fn slowWrite(self: *Self, comptime T: type, unaligned_address: u32, value: T) vo } fn dbgSlowWrite(self: *Self, comptime T: type, unaligned_address: u32, value: T) void { - @setCold(true); + @branchHint(.cold); const page: u8 = @truncate(unaligned_address >> 24); const address = forceAlign(T, unaligned_address); diff --git a/src/core/apu.zig b/src/core/apu.zig index 29eb738..79bf98a 100644 --- a/src/core/apu.zig +++ b/src/core/apu.zig @@ -1,8 +1,9 @@ const std = @import("std"); -const SDL = @import("sdl2"); const io = @import("bus/io.zig"); const util = @import("../util.zig"); +const c = @import("../lib.zig").c; +const LinearFifo = @import("../lib/fifo.zig").LinearFifo; const Arm7tdmi = @import("arm32").Arm7tdmi; const Bus = @import("Bus.zig"); const Scheduler = @import("scheduler.zig").Scheduler; @@ -11,7 +12,7 @@ const Tone = @import("apu/Tone.zig"); const Wave = @import("apu/Wave.zig"); const Noise = @import("apu/Noise.zig"); -const SoundFifo = std.fifo.LinearFifo(u8, .{ .Static = 0x20 }); +const SoundFifo = LinearFifo(u8, .{ .static = 0x20 }); const getHalf = util.getHalf; const setHalf = util.setHalf; @@ -246,7 +247,7 @@ pub const Apu = struct { sampling_cycle: u2, - stream: *SDL.SDL_AudioStream, + stream: *c.SDL_AudioStream, sched: *Scheduler, fs: FrameSequencer, @@ -271,8 +272,8 @@ pub const Apu = struct { .bias = .{ .raw = 0x0200 }, .sampling_cycle = 0b00, - .stream = SDL.SDL_NewAudioStream(SDL.AUDIO_U16, 2, 1 << 15, host_format, 2, host_rate).?, .sched = sched, + .stream = undefined, // FIXME: bad practice .capacitor = 0, .fs = FrameSequencer.init(), @@ -459,21 +460,33 @@ pub const Apu = struct { if (self.sampling_cycle != self.bias.sampling_cycle.read()) self.replaceSDLResampler(); - _ = SDL.SDL_AudioStreamPut(self.stream, &[2]u16{ ext_left, ext_right }, 2 * @sizeOf(u16)); + const ret = c.SDL_PutAudioStreamData(self.stream, &[2]i16{ @bitCast(ext_left ^ 0x8000), @bitCast(ext_right ^ 0x8000) }, 2 * @sizeOf(i16)); + if (!ret) @panic("TODO: Failed to put i16s into SDL Audio Queue"); } fn replaceSDLResampler(self: *Self) void { - @setCold(true); - const sample_rate = Self.sampleRate(self.bias.sampling_cycle.read()); - log.info("Sample Rate changed from {}Hz to {}Hz", .{ Self.sampleRate(self.sampling_cycle), sample_rate }); + @branchHint(.cold); + _ = self; - // Sampling Cycle (Sample Rate) changed, Craete a new SDL Audio Resampler - // FIXME: Replace SDL's Audio Resampler with either a custom or more reliable one - const old_stream = self.stream; - defer SDL.SDL_FreeAudioStream(old_stream); + @panic("TODO: Implement Multiple Sample Rates..."); - self.sampling_cycle = self.bias.sampling_cycle.read(); - self.stream = SDL.SDL_NewAudioStream(SDL.AUDIO_U16, 2, @intCast(sample_rate), host_format, 2, host_rate).?; + // const sample_rate = Self.sampleRate(self.bias.sampling_cycle.read()); + // log.info("Sample Rate changed from {}Hz to {}Hz", .{ Self.sampleRate(self.sampling_cycle), sample_rate }); + + // // Sampling Cycle (Sample Rate) changed, Craete a new SDL Audio Resampler + // // FIXME: Replace SDL's Audio Resampler with either a custom or more reliable one + // const old_stream = self.stream; + // defer c.SDL_DestroyAudioStream(old_stream); + + // self.sampling_cycle = self.bias.sampling_cycle.read(); + + // var desired: c.SDL_AudioSpec = std.mem.zeroes(c.SDL_AudioSpec); + // desired.format = c.SDL_AUDIO_S16; + // desired.channels = 2; + // desired.freq = @intCast(sample_rate); + + // const new_stream = c.SDL_OpenAudioDeviceStream(c.SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &desired, null, null) orelse @panic("TODO: Failed to replace SDL Audio Stream"); + // self.stream = new_stream; } fn interval(self: *const Self) u64 { @@ -569,7 +582,7 @@ pub fn DmaSound(comptime kind: DmaSoundKind) type { } fn enable(self: *Self) void { - @setCold(true); + @branchHint(.cold); self.enabled = true; } diff --git a/src/core/bus/Bios.zig b/src/core/bus/Bios.zig index 3a00a23..98dc4e3 100644 --- a/src/core/bus/Bios.zig +++ b/src/core/bus/Bios.zig @@ -3,7 +3,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const log = std.log.scoped(.Bios); -const rotr = @import("zba-util").rotr; +const rotr = @import("zba_util").rotr; const forceAlign = @import("../Bus.zig").forceAlign; /// Size of the BIOS in bytes @@ -57,7 +57,7 @@ fn _read(self: *const Self, comptime T: type, addr: u32) T { } pub fn write(_: *Self, comptime T: type, addr: u32, value: T) void { - @setCold(true); + @branchHint(.cold); log.debug("Tried to write {} 0x{X:} to 0x{X:0>8} ", .{ T, value, addr }); } diff --git a/src/core/bus/dma.zig b/src/core/bus/dma.zig index 1b036fa..21cc7c1 100644 --- a/src/core/bus/dma.zig +++ b/src/core/bus/dma.zig @@ -13,7 +13,7 @@ const setHalf = util.setHalf; const setQuart = util.setQuart; const handleInterrupt = @import("../cpu_util.zig").handleInterrupt; -const rotr = @import("zba-util").rotr; +const rotr = @import("zba_util").rotr; pub fn create() DmaTuple { return .{ DmaController(0).init(), DmaController(1).init(), DmaController(2).init(), DmaController(3).init() }; @@ -286,17 +286,17 @@ fn DmaController(comptime id: u2) type { if (self._word_count == 0) { if (self.cnt.irq.read()) { switch (id) { - 0 => bus_ptr.io.irq.dma0.set(), - 1 => bus_ptr.io.irq.dma1.set(), - 2 => bus_ptr.io.irq.dma2.set(), - 3 => bus_ptr.io.irq.dma3.set(), + 0 => bus_ptr.io.irq.dma0.write(true), + 1 => bus_ptr.io.irq.dma1.write(true), + 2 => bus_ptr.io.irq.dma2.write(true), + 3 => bus_ptr.io.irq.dma3.write(true), } handleInterrupt(cpu); } // If we're not repeating, Fire the IRQs and disable the DMA - if (!self.cnt.repeat.read()) self.cnt.enabled.unset(); + if (!self.cnt.repeat.read()) self.cnt.enabled.write(false); // We want to disable our internal enabled flag regardless of repeat // because we only want to step A DMA that repeats during it's specific @@ -338,7 +338,7 @@ fn DmaController(comptime id: u2) type { // FIXME: Safe to just assume whatever DAD is set to is the FIFO Address? // self.dad_latch = fifo_addr; - self.cnt.repeat.set(); + self.cnt.repeat.write(true); self._word_count = 4; self.in_progress = true; } diff --git a/src/core/bus/gpio.zig b/src/core/bus/gpio.zig index 9d06c52..b46ef92 100644 --- a/src/core/bus/gpio.zig +++ b/src/core/bus/gpio.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const Bit = @import("bitfield").Bit; +const Bit = @import("bitjuggle").Boolean; const DateTime = @import("datetime").datetime.Datetime; const Arm7tdmi = @import("arm32").Arm7tdmi; @@ -408,7 +408,7 @@ pub const Clock = struct { // TODO: Confirm that this is the right behaviour log.debug("Force GamePak IRQ", .{}); - bus_ptr.io.irq.game_pak.set(); + bus_ptr.io.irq.game_pak.write(true); handleInterrupt(self.cpu); } diff --git a/src/core/bus/io.zig b/src/core/bus/io.zig index 3d69f6c..a90fdad 100644 --- a/src/core/bus/io.zig +++ b/src/core/bus/io.zig @@ -5,8 +5,8 @@ const apu = @import("../apu.zig"); const ppu = @import("../ppu.zig"); const util = @import("../../util.zig"); -const Bit = @import("bitfield").Bit; -const Bitfield = @import("bitfield").Bitfield; +const Bit = @import("bitjuggle").Boolean; +const Bitfield = @import("bitjuggle").Bitfield; const Bus = @import("../Bus.zig"); const getHalf = util.getHalf; diff --git a/src/core/bus/timer.zig b/src/core/bus/timer.zig index 8705f6e..03dccb0 100644 --- a/src/core/bus/timer.zig +++ b/src/core/bus/timer.zig @@ -200,10 +200,10 @@ fn Timer(comptime id: u2) type { if (self.cnt.irq.read()) { switch (id) { - 0 => io.irq.tim0.set(), - 1 => io.irq.tim1.set(), - 2 => io.irq.tim2.set(), - 3 => io.irq.tim3.set(), + 0 => io.irq.tim0.write(true), + 1 => io.irq.tim1.write(true), + 2 => io.irq.tim2.write(true), + 3 => io.irq.tim3.write(true), } handleInterrupt(cpu); diff --git a/src/core/emu.zig b/src/core/emu.zig index bccb5e0..0ae6f1c 100644 --- a/src/core/emu.zig +++ b/src/core/emu.zig @@ -1,6 +1,6 @@ const std = @import("std"); -const SDL = @import("sdl2"); const config = @import("../config.zig"); +const c = @import("../lib.zig").c; const Scheduler = @import("scheduler.zig").Scheduler; const Arm7tdmi = @import("arm32").Arm7tdmi; @@ -18,8 +18,8 @@ pub const Synchro = struct { // FIXME: This Enum ends up being really LARGE!!! pub const Message = union(enum) { - rom_path: [std.fs.MAX_PATH_BYTES]u8, - bios_path: [std.fs.MAX_PATH_BYTES]u8, + rom_path: [std.fs.max_path_bytes]u8, + bios_path: [std.fs.max_path_bytes]u8, restart: void, }; @@ -160,26 +160,35 @@ pub fn runFrame(sched: *Scheduler, cpu: *Arm7tdmi) void { } } -fn audioSync(audio_sync: bool, stream: *SDL.SDL_AudioStream, is_buffer_full: *bool) void { - comptime std.debug.assert(@import("../platform.zig").sample_format == SDL.AUDIO_U16); +fn audioSync(audio_sync: bool, stream: *c.SDL_AudioStream, is_buffer_full: *bool) void { + // comptime std.debug.assert(@import("../platform.zig").sample_format == SDL.AUDIO_U16); const sample_size = 2 * @sizeOf(u16); const max_buf_size: c_int = 0x400; - // Determine whether the APU is busy right at this moment - var still_full: bool = SDL.SDL_AudioStreamAvailable(stream) > sample_size * if (is_buffer_full.*) max_buf_size >> 1 else max_buf_size; - defer is_buffer_full.* = still_full; // Update APU Busy status right before exiting scope + _ = audio_sync; + _ = stream; + _ = is_buffer_full; - // If Busy is false, there's no need to sync here - if (!still_full) return; + _ = sample_size; + _ = max_buf_size; - // TODO: Refactor!!!! - // while (SDL.SDL_AudioStreamAvailable(stream) > sample_size * max_buf_size >> 1) - // std.atomic.spinLoopHint(); + // TODO(paoda): re-enable - while (true) { - still_full = SDL.SDL_AudioStreamAvailable(stream) > sample_size * max_buf_size >> 1; - if (!audio_sync or !still_full) break; - } + // // Determine whether the APU is busy right at this moment + // var still_full: bool = SDL.SDL_AudioStreamAvailable(stream) > sample_size * if (is_buffer_full.*) max_buf_size >> 1 else max_buf_size; + // defer is_buffer_full.* = still_full; // Update APU Busy status right before exiting scope + + // // If Busy is false, there's no need to sync here + // if (!still_full) return; + + // // TODO: Refactor!!!! + // // while (SDL.SDL_AudioStreamAvailable(stream) > sample_size * max_buf_size >> 1) + // // std.atomic.spinLoopHint(); + + // while (true) { + // still_full = SDL.SDL_AudioStreamAvailable(stream) > sample_size * max_buf_size >> 1; + // if (!audio_sync or !still_full) break; + // } } fn videoSync(timer: *Timer, wake_time: u64) u64 { @@ -208,7 +217,7 @@ fn sleep(timer: *Timer, wake_time: u64) ?u64 { const times = sleep_for / step; for (0..times) |_| { - std.time.sleep(step); + std.Thread.sleep(step); // Upon wakeup, check to see if this particular sleep was longer than expected // if so we should exit early, but probably not skip a whole frame period @@ -279,8 +288,8 @@ pub const EmuThing = struct { return .{ .cpu = cpu, .scheduler = scheduler }; } - pub fn interface(self: *Self, allocator: Allocator) Interface { - return Interface.init(allocator, self); + pub fn interface(self: *Self) Interface { + return Interface.init(self); } pub fn read(self: *const Self, addr: u32) u8 { diff --git a/src/core/ppu.zig b/src/core/ppu.zig index 1db04d1..5e575ee 100644 --- a/src/core/ppu.zig +++ b/src/core/ppu.zig @@ -2,8 +2,8 @@ const std = @import("std"); const io = @import("bus/io.zig"); const util = @import("../util.zig"); -const Bit = @import("bitfield").Bit; -const Bitfield = @import("bitfield").Bitfield; +const Bit = @import("bitjuggle").Boolean; +const Bitfield = @import("bitjuggle").Bitfield; const dma = @import("bus/dma.zig"); const Oam = @import("ppu/Oam.zig"); @@ -1007,7 +1007,7 @@ pub const Ppu = struct { // Transitioning to a Hblank if (self.dispstat.hblank_irq.read()) { - bus_ptr.io.irq.hblank.set(); + bus_ptr.io.irq.hblank.write(true); handleInterrupt(cpu); } @@ -1015,7 +1015,7 @@ pub const Ppu = struct { if (!self.dispstat.vblank.read()) dma.onBlanking(bus_ptr, .HBlank); - self.dispstat.hblank.set(); + self.dispstat.hblank.write(true); self.sched.push(.HBlank, 68 * 4 -| late); } @@ -1027,14 +1027,14 @@ pub const Ppu = struct { const scanline = (old_scanline + 1) % 228; self.vcount.scanline.write(scanline); - self.dispstat.hblank.unset(); + self.dispstat.hblank.write(false); // Perform Vc == VcT check const coincidence = scanline == self.dispstat.vcount_trigger.read(); self.dispstat.coincidence.write(coincidence); if (coincidence and self.dispstat.vcount_irq.read()) { - bus_ptr.io.irq.coincidence.set(); + bus_ptr.io.irq.coincidence.write(true); handleInterrupt(cpu); } @@ -1046,10 +1046,10 @@ pub const Ppu = struct { if (scanline == 160) { self.framebuf.swap(); // Swap FrameBuffers - self.dispstat.vblank.set(); + self.dispstat.vblank.write(true); if (self.dispstat.vblank_irq.read()) { - bus_ptr.io.irq.vblank.set(); + bus_ptr.io.irq.vblank.write(true); handleInterrupt(cpu); } @@ -1060,7 +1060,7 @@ pub const Ppu = struct { dma.onBlanking(bus_ptr, .VBlank); } - if (scanline == 227) self.dispstat.vblank.unset(); + if (scanline == 227) self.dispstat.vblank.write(false); self.sched.push(.VBlank, 240 * 4 -| late); } } diff --git a/src/imgui.zig b/src/imgui.zig index 67b0f49..569e534 100644 --- a/src/imgui.zig +++ b/src/imgui.zig @@ -15,11 +15,11 @@ const Scheduler = @import("core/scheduler.zig").Scheduler; const Bus = @import("core/Bus.zig"); const Synchro = @import("core/emu.zig").Synchro; -const RingBuffer = @import("zba-util").RingBuffer; +const RingBuffer = @import("zba_util").RingBuffer; const Dimensions = @import("platform.zig").Dimensions; const Allocator = std.mem.Allocator; -const GLuint = gl.GLuint; +const GLuint = gl.uint; const gba_width = @import("core/ppu.zig").width; const gba_height = @import("core/ppu.zig").height; @@ -75,7 +75,7 @@ pub fn draw(state: *State, sync: *Synchro, dim: Dimensions, cpu: *const Arm7tdmi const scn_scale = config.config().host.win_scale; const bus_ptr: *Bus = @ptrCast(@alignCast(cpu.bus.ptr)); - zgui.backend.newFrame(@floatFromInt(dim.width), @floatFromInt(dim.height)); + zgui.backend.newFrame(dim.width, dim.height); state.title = handleTitle(&bus_ptr.pak.title); @@ -195,7 +195,8 @@ pub fn draw(state: *State, sync: *Synchro, dim: Dimensions, cpu: *const Arm7tdmi _ = zgui.begin(window_title, .{ .flags = .{ .no_resize = true, .always_auto_resize = true } }); defer zgui.end(); - zgui.image(@ptrFromInt(tex_id), .{ .w = w, .h = h }); + // FIXME(paoda): go look at some documentation here + zgui.image(.{ .tex_data = null, .tex_id = @enumFromInt(tex_id) }, .{ .w = w, .h = h }); } // TODO: Any other steps to respect the copyright of the libraries I use? @@ -204,7 +205,7 @@ pub fn draw(state: *State, sync: *Synchro, dim: Dimensions, cpu: *const Arm7tdmi defer zgui.end(); zgui.bulletText("known-folders by ziglibs", .{}); - zgui.bulletText("nfd-zig by Fabio Arnold", .{}); + zgui.bulletText("nfd-zig ported by Fabio Arnold", .{}); { zgui.indent(.{}); defer zgui.unindent(.{}); @@ -212,7 +213,7 @@ pub fn draw(state: *State, sync: *Synchro, dim: Dimensions, cpu: *const Arm7tdmi zgui.bulletText("nativefiledialog by Michael Labbe", .{}); } - zgui.bulletText("SDL.zig by Felix Queißner", .{}); + zgui.bulletText("SDL ported by Carl Åstholm", .{}); { zgui.indent(.{}); defer zgui.unindent(.{}); @@ -220,10 +221,10 @@ pub fn draw(state: *State, sync: *Synchro, dim: Dimensions, cpu: *const Arm7tdmi zgui.bulletText("SDL by Sam Lantinga", .{}); } - zgui.bulletText("tomlz by Matthew Hall", .{}); + // zgui.bulletText("tomlz by Matthew Hall", .{}); zgui.bulletText("zba-gdbstub by Rekai Musuka", .{}); zgui.bulletText("zba-util by Rekai Musuka", .{}); - zgui.bulletText("zgui by Michal Ziulek", .{}); + zgui.bulletText("zgui ported by Michal Ziulek et al.", .{}); { zgui.indent(.{}); defer zgui.unindent(.{}); @@ -234,8 +235,8 @@ pub fn draw(state: *State, sync: *Synchro, dim: Dimensions, cpu: *const Arm7tdmi zgui.bulletText("zig-datetime by Jairus Martin", .{}); zgui.newLine(); - zgui.bulletText("bitfield.zig by Hannes Bredberg and FlorenceOS contributors", .{}); - zgui.bulletText("zig-opengl by Felix Queißner", .{}); + zgui.bulletText("bitfield.zig by Hannes Bredberg et al.", .{}); + zgui.bulletText("zigglgen ported by Carl Åstholm", .{}); { zgui.indent(.{}); defer zgui.unindent(.{}); @@ -272,63 +273,63 @@ pub fn draw(state: *State, sync: *Synchro, dim: Dimensions, cpu: *const Arm7tdmi _ = zgui.begin("Performance", .{ .popen = &state.win_stat.show_perf }); defer zgui.end(); - const tmp = blk: { - var buf: [histogram_len]u32 = undefined; - const len = state.fps_hist.copy(&buf); + // const tmp = blk: { + // var buf: [histogram_len]u32 = undefined; + // const len = state.fps_hist.copy(&buf); - break :blk .{ buf, len }; - }; - const values = tmp[0]; - const len = tmp[1]; + // break :blk .{ buf, len }; + // }; + // const values = tmp[0]; + // const len = tmp[1]; - if (len == values.len) _ = state.fps_hist.pop(); + // if (len == values.len) _ = state.fps_hist.pop(); - const sorted = blk: { - var buf: @TypeOf(values) = undefined; + // const sorted = blk: { + // var buf: @TypeOf(values) = undefined; - @memcpy(buf[0..len], values[0..len]); - std.mem.sort(u32, buf[0..len], {}, std.sort.asc(u32)); + // @memcpy(buf[0..len], values[0..len]); + // std.mem.sort(u32, buf[0..len], {}, std.sort.asc(u32)); - break :blk buf; - }; + // break :blk buf; + // }; - const y_max: f64 = 2 * if (len != 0) @as(f64, @floatFromInt(sorted[len - 1])) else emu.frame_rate; - const x_max: f64 = @floatFromInt(values.len); + // const y_max: f64 = 2 * if (len != 0) @as(f64, @floatFromInt(sorted[len - 1])) else emu.frame_rate; + // const x_max: f64 = @floatFromInt(values.len); - const y_args = .{ .flags = .{ .no_grid_lines = true } }; - const x_args = .{ .flags = .{ .no_grid_lines = true, .no_tick_labels = true, .no_tick_marks = true } }; + // const y_args = .{ .flags = .{ .no_grid_lines = true } }; + // const x_args = .{ .flags = .{ .no_grid_lines = true, .no_tick_labels = true, .no_tick_marks = true } }; - if (zgui.plot.beginPlot("Emulation FPS", .{ .w = 0.0, .flags = .{ .no_title = true, .no_frame = true } })) { - defer zgui.plot.endPlot(); + // if (zgui.plot.beginPlot("Emulation FPS", .{ .w = 0.0, .flags = .{ .no_title = true, .no_frame = true } })) { + // defer zgui.plot.endPlot(); - zgui.plot.setupLegend(.{ .north = true, .east = true }, .{}); - zgui.plot.setupAxis(.x1, x_args); - zgui.plot.setupAxis(.y1, y_args); - zgui.plot.setupAxisLimits(.y1, .{ .min = 0.0, .max = y_max, .cond = .always }); - zgui.plot.setupAxisLimits(.x1, .{ .min = 0.0, .max = x_max, .cond = .always }); - zgui.plot.setupFinish(); + // zgui.plot.setupLegend(.{ .north = true, .east = true }, .{}); + // zgui.plot.setupAxis(.x1, x_args); + // zgui.plot.setupAxis(.y1, y_args); + // zgui.plot.setupAxisLimits(.y1, .{ .min = 0.0, .max = y_max, .cond = .always }); + // zgui.plot.setupAxisLimits(.x1, .{ .min = 0.0, .max = x_max, .cond = .always }); + // zgui.plot.setupFinish(); - zgui.plot.plotLineValues("FPS", u32, .{ .v = values[0..len] }); - } + // zgui.plot.plotLineValues("FPS", u32, .{ .v = values[0..len] }); + // } - const stats: struct { u32, u32, u32 } = blk: { - if (len == 0) break :blk .{ 0, 0, 0 }; + // const stats: struct { u32, u32, u32 } = blk: { + // if (len == 0) break :blk .{ 0, 0, 0 }; - const average: u32 = average: { - var sum: u32 = 0; - for (sorted[0..len]) |value| sum += value; + // const average: u32 = average: { + // var sum: u32 = 0; + // for (sorted[0..len]) |value| sum += value; - break :average @intCast(sum / len); - }; - const median = sorted[len / 2]; - const low = sorted[len / 100]; // 1% Low + // break :average @intCast(sum / len); + // }; + // const median = sorted[len / 2]; + // const low = sorted[len / 100]; // 1% Low - break :blk .{ average, median, low }; - }; + // break :blk .{ average, median, low }; + // }; - zgui.text("Average: {:0>3} fps", .{stats[0]}); - zgui.text(" Median: {:0>3} fps", .{stats[1]}); - zgui.text(" 1% Low: {:0>3} fps", .{stats[2]}); + // zgui.text("Average: {:0>3} fps", .{stats[0]}); + // zgui.text(" Median: {:0>3} fps", .{stats[1]}); + // zgui.text(" 1% Low: {:0>3} fps", .{stats[2]}); } if (state.win_stat.show_schedule) { @@ -336,8 +337,10 @@ pub fn draw(state: *State, sync: *Synchro, dim: Dimensions, cpu: *const Arm7tdmi defer zgui.end(); const scheduler = cpu.sched; + _ = scheduler; - zgui.text("tick: {X:0>16}", .{scheduler.now()}); + // zgui.text("tick: {X:0>16}", .{scheduler.now()}); + zgui.text("tick: (TODO: FIX THIS)", .{}); zgui.separator(); const sched_ptr: *Scheduler = @ptrCast(@alignCast(cpu.sched.ptr)); @@ -350,7 +353,9 @@ pub fn draw(state: *State, sync: *Synchro, dim: Dimensions, cpu: *const Arm7tdmi std.mem.sort(Event, items[0..len], {}, widgets.eventDesc(Event)); for (items[0..len]) |event| { - zgui.text("{X:0>16} | {?}", .{ event.tick, event.kind }); + // zgui.text("{X:0>16} | {?}", .{ event.tick, event.kind }); + _ = event; + zgui.text("TODO: Fix This", .{}); } } diff --git a/src/lib.zig b/src/lib.zig new file mode 100644 index 0000000..dcaa485 --- /dev/null +++ b/src/lib.zig @@ -0,0 +1,28 @@ +pub const c = @cImport({ + @cDefine("SDL_DISABLE_OLD_NAMES", {}); + @cDefine("SDL_MAIN_HANDLED", {}); + + @cInclude("SDL3/SDL.h"); + @cInclude("SDL3/SDL_main.h"); +}); + +// https://github.com/castholm/zig-examples/blob/77a829c85b5ddbad673026d504626015db4093ac/opengl-sdl/main.zig#L200-L219 +pub inline fn errify(value: anytype) error{sdl_error}!switch (@typeInfo(@TypeOf(value))) { + .bool => void, + .pointer, .optional => @TypeOf(value.?), + .int => |info| switch (info.signedness) { + .signed => @TypeOf(@max(0, value)), + .unsigned => @TypeOf(value), + }, + else => @compileError("unerrifiable type: " ++ @typeName(@TypeOf(value))), +} { + return switch (@typeInfo(@TypeOf(value))) { + .bool => if (!value) error.sdl_error, + .pointer, .optional => value orelse error.sdl_error, + .int => |info| switch (info.signedness) { + .signed => if (value >= 0) @max(0, value) else error.sdl_error, + .unsigned => if (value != 0) value else error.sdl_error, + }, + else => comptime unreachable, + }; +} diff --git a/src/lib/fifo.zig b/src/lib/fifo.zig new file mode 100644 index 0000000..f7456d3 --- /dev/null +++ b/src/lib/fifo.zig @@ -0,0 +1,548 @@ +// FIFO of fixed size items +// Usually used for e.g. byte buffers + +const std = @import("std"); +const math = std.math; +const mem = std.mem; +const Allocator = mem.Allocator; +const assert = std.debug.assert; +const testing = std.testing; + +pub const LinearFifoBufferType = union(enum) { + /// The buffer is internal to the fifo; it is of the specified size. + static: usize, + + /// The buffer is passed as a slice to the initialiser. + slice, + + /// The buffer is managed dynamically using a `mem.Allocator`. + dynamic, +}; + +pub fn LinearFifo( + comptime T: type, + comptime buffer_type: LinearFifoBufferType, +) type { + const autoalign = false; + + const powers_of_two = switch (buffer_type) { + .static => std.math.isPowerOfTwo(buffer_type.static), + .slice => false, // Any size slice could be passed in + .dynamic => true, // This could be configurable in future + }; + + return struct { + allocator: if (buffer_type == .dynamic) Allocator else void, + buf: if (buffer_type == .static) [buffer_type.static]T else []T, + head: usize, + count: usize, + + const Self = @This(); + pub const Reader = std.io.Reader(*Self, error{}, readFn); + pub const Writer = std.io.Writer(*Self, error{OutOfMemory}, appendWrite); + + // Type of Self argument for slice operations. + // If buffer is inline (Static) then we need to ensure we haven't + // returned a slice into a copy on the stack + const SliceSelfArg = if (buffer_type == .static) *Self else Self; + + pub const init = switch (buffer_type) { + .static => initStatic, + .slice => initSlice, + .dynamic => initDynamic, + }; + + fn initStatic() Self { + comptime assert(buffer_type == .static); + return .{ + .allocator = {}, + .buf = undefined, + .head = 0, + .count = 0, + }; + } + + fn initSlice(buf: []T) Self { + comptime assert(buffer_type == .slice); + return .{ + .allocator = {}, + .buf = buf, + .head = 0, + .count = 0, + }; + } + + fn initDynamic(allocator: Allocator) Self { + comptime assert(buffer_type == .dynamic); + return .{ + .allocator = allocator, + .buf = &.{}, + .head = 0, + .count = 0, + }; + } + + pub fn deinit(self: Self) void { + if (buffer_type == .dynamic) self.allocator.free(self.buf); + } + + pub fn realign(self: *Self) void { + if (self.buf.len - self.head >= self.count) { + mem.copyForwards(T, self.buf[0..self.count], self.buf[self.head..][0..self.count]); + self.head = 0; + } else { + var tmp: [4096 / 2 / @sizeOf(T)]T = undefined; + + while (self.head != 0) { + const n = @min(self.head, tmp.len); + const m = self.buf.len - n; + @memcpy(tmp[0..n], self.buf[0..n]); + mem.copyForwards(T, self.buf[0..m], self.buf[n..][0..m]); + @memcpy(self.buf[m..][0..n], tmp[0..n]); + self.head -= n; + } + } + { // set unused area to undefined + const unused = mem.sliceAsBytes(self.buf[self.count..]); + @memset(unused, undefined); + } + } + + /// Reduce allocated capacity to `size`. + pub fn shrink(self: *Self, size: usize) void { + assert(size >= self.count); + if (buffer_type == .dynamic) { + self.realign(); + self.buf = self.allocator.realloc(self.buf, size) catch |e| switch (e) { + error.OutOfMemory => return, // no problem, capacity is still correct then. + }; + } + } + + /// Ensure that the buffer can fit at least `size` items + pub fn ensureTotalCapacity(self: *Self, size: usize) !void { + if (self.buf.len >= size) return; + if (buffer_type == .dynamic) { + self.realign(); + const new_size = if (powers_of_two) math.ceilPowerOfTwo(usize, size) catch return error.OutOfMemory else size; + self.buf = try self.allocator.realloc(self.buf, new_size); + } else { + return error.OutOfMemory; + } + } + + /// Makes sure at least `size` items are unused + pub fn ensureUnusedCapacity(self: *Self, size: usize) error{OutOfMemory}!void { + if (self.writableLength() >= size) return; + + return try self.ensureTotalCapacity(math.add(usize, self.count, size) catch return error.OutOfMemory); + } + + /// Returns number of items currently in fifo + pub fn readableLength(self: Self) usize { + return self.count; + } + + /// Returns a writable slice from the 'read' end of the fifo + fn readableSliceMut(self: SliceSelfArg, offset: usize) []T { + if (offset > self.count) return &[_]T{}; + + var start = self.head + offset; + if (start >= self.buf.len) { + start -= self.buf.len; + return self.buf[start .. start + (self.count - offset)]; + } else { + const end = @min(self.head + self.count, self.buf.len); + return self.buf[start..end]; + } + } + + /// Returns a readable slice from `offset` + pub fn readableSlice(self: SliceSelfArg, offset: usize) []const T { + return self.readableSliceMut(offset); + } + + pub fn readableSliceOfLen(self: *Self, len: usize) []const T { + assert(len <= self.count); + const buf = self.readableSlice(0); + if (buf.len >= len) { + return buf[0..len]; + } else { + self.realign(); + return self.readableSlice(0)[0..len]; + } + } + + /// Discard first `count` items in the fifo + pub fn discard(self: *Self, count: usize) void { + assert(count <= self.count); + { // set old range to undefined. Note: may be wrapped around + const slice = self.readableSliceMut(0); + if (slice.len >= count) { + const unused = mem.sliceAsBytes(slice[0..count]); + @memset(unused, undefined); + } else { + const unused = mem.sliceAsBytes(slice[0..]); + @memset(unused, undefined); + const unused2 = mem.sliceAsBytes(self.readableSliceMut(slice.len)[0 .. count - slice.len]); + @memset(unused2, undefined); + } + } + if (autoalign and self.count == count) { + self.head = 0; + self.count = 0; + } else { + var head = self.head + count; + if (powers_of_two) { + // Note it is safe to do a wrapping subtract as + // bitwise & with all 1s is a noop + head &= self.buf.len -% 1; + } else { + head %= self.buf.len; + } + self.head = head; + self.count -= count; + } + } + + /// Read the next item from the fifo + pub fn readItem(self: *Self) ?T { + if (self.count == 0) return null; + + const c = self.buf[self.head]; + self.discard(1); + return c; + } + + /// Read data from the fifo into `dst`, returns number of items copied. + pub fn read(self: *Self, dst: []T) usize { + var dst_left = dst; + + while (dst_left.len > 0) { + const slice = self.readableSlice(0); + if (slice.len == 0) break; + const n = @min(slice.len, dst_left.len); + @memcpy(dst_left[0..n], slice[0..n]); + self.discard(n); + dst_left = dst_left[n..]; + } + + return dst.len - dst_left.len; + } + + /// Same as `read` except it returns an error union + /// The purpose of this function existing is to match `std.io.Reader` API. + fn readFn(self: *Self, dest: []u8) error{}!usize { + return self.read(dest); + } + + pub fn reader(self: *Self) Reader { + return .{ .context = self }; + } + + /// Returns number of items available in fifo + pub fn writableLength(self: Self) usize { + return self.buf.len - self.count; + } + + /// Returns the first section of writable buffer. + /// Note that this may be of length 0 + pub fn writableSlice(self: SliceSelfArg, offset: usize) []T { + if (offset > self.buf.len) return &[_]T{}; + + const tail = self.head + offset + self.count; + if (tail < self.buf.len) { + return self.buf[tail..]; + } else { + return self.buf[tail - self.buf.len ..][0 .. self.writableLength() - offset]; + } + } + + /// Returns a writable buffer of at least `size` items, allocating memory as needed. + /// Use `fifo.update` once you've written data to it. + pub fn writableWithSize(self: *Self, size: usize) ![]T { + try self.ensureUnusedCapacity(size); + + // try to avoid realigning buffer + var slice = self.writableSlice(0); + if (slice.len < size) { + self.realign(); + slice = self.writableSlice(0); + } + return slice; + } + + /// Update the tail location of the buffer (usually follows use of writable/writableWithSize) + pub fn update(self: *Self, count: usize) void { + assert(self.count + count <= self.buf.len); + self.count += count; + } + + /// Appends the data in `src` to the fifo. + /// You must have ensured there is enough space. + pub fn writeAssumeCapacity(self: *Self, src: []const T) void { + assert(self.writableLength() >= src.len); + + var src_left = src; + while (src_left.len > 0) { + const writable_slice = self.writableSlice(0); + assert(writable_slice.len != 0); + const n = @min(writable_slice.len, src_left.len); + @memcpy(writable_slice[0..n], src_left[0..n]); + self.update(n); + src_left = src_left[n..]; + } + } + + /// Write a single item to the fifo + pub fn writeItem(self: *Self, item: T) !void { + try self.ensureUnusedCapacity(1); + return self.writeItemAssumeCapacity(item); + } + + pub fn writeItemAssumeCapacity(self: *Self, item: T) void { + var tail = self.head + self.count; + if (powers_of_two) { + tail &= self.buf.len - 1; + } else { + tail %= self.buf.len; + } + self.buf[tail] = item; + self.update(1); + } + + /// Appends the data in `src` to the fifo. + /// Allocates more memory as necessary + pub fn write(self: *Self, src: []const T) !void { + try self.ensureUnusedCapacity(src.len); + + return self.writeAssumeCapacity(src); + } + + /// Same as `write` except it returns the number of bytes written, which is always the same + /// as `bytes.len`. The purpose of this function existing is to match `std.io.Writer` API. + fn appendWrite(self: *Self, bytes: []const u8) error{OutOfMemory}!usize { + try self.write(bytes); + return bytes.len; + } + + pub fn writer(self: *Self) Writer { + return .{ .context = self }; + } + + /// Make `count` items available before the current read location + fn rewind(self: *Self, count: usize) void { + assert(self.writableLength() >= count); + + var head = self.head + (self.buf.len - count); + if (powers_of_two) { + head &= self.buf.len - 1; + } else { + head %= self.buf.len; + } + self.head = head; + self.count += count; + } + + /// Place data back into the read stream + pub fn unget(self: *Self, src: []const T) !void { + try self.ensureUnusedCapacity(src.len); + + self.rewind(src.len); + + const slice = self.readableSliceMut(0); + if (src.len < slice.len) { + @memcpy(slice[0..src.len], src); + } else { + @memcpy(slice, src[0..slice.len]); + const slice2 = self.readableSliceMut(slice.len); + @memcpy(slice2[0 .. src.len - slice.len], src[slice.len..]); + } + } + + /// Returns the item at `offset`. + /// Asserts offset is within bounds. + pub fn peekItem(self: Self, offset: usize) T { + assert(offset < self.count); + + var index = self.head + offset; + if (powers_of_two) { + index &= self.buf.len - 1; + } else { + index %= self.buf.len; + } + return self.buf[index]; + } + + /// Pump data from a reader into a writer. + /// Stops when reader returns 0 bytes (EOF). + /// Buffer size must be set before calling; a buffer length of 0 is invalid. + pub fn pump(self: *Self, src_reader: anytype, dest_writer: anytype) !void { + assert(self.buf.len > 0); + while (true) { + if (self.writableLength() > 0) { + const n = try src_reader.read(self.writableSlice(0)); + if (n == 0) break; // EOF + self.update(n); + } + self.discard(try dest_writer.write(self.readableSlice(0))); + } + // flush remaining data + while (self.readableLength() > 0) { + self.discard(try dest_writer.write(self.readableSlice(0))); + } + } + + pub fn toOwnedSlice(self: *Self) Allocator.Error![]T { + if (self.head != 0) self.realign(); + assert(self.head == 0); + assert(self.count <= self.buf.len); + const allocator = self.allocator; + if (allocator.resize(self.buf, self.count)) { + const result = self.buf[0..self.count]; + self.* = Self.init(allocator); + return result; + } + const new_memory = try allocator.dupe(T, self.buf[0..self.count]); + allocator.free(self.buf); + self.* = Self.init(allocator); + return new_memory; + } + }; +} + +test "LinearFifo(u8, .Dynamic) discard(0) from empty buffer should not error on overflow" { + var fifo = LinearFifo(u8, .dynamic).init(testing.allocator); + defer fifo.deinit(); + + // If overflow is not explicitly allowed this will crash in debug / safe mode + fifo.discard(0); +} + +test "LinearFifo(u8, .Dynamic)" { + var fifo = LinearFifo(u8, .dynamic).init(testing.allocator); + defer fifo.deinit(); + + try fifo.write("HELLO"); + try testing.expectEqual(@as(usize, 5), fifo.readableLength()); + try testing.expectEqualSlices(u8, "HELLO", fifo.readableSlice(0)); + + { + var i: usize = 0; + while (i < 5) : (i += 1) { + try fifo.write(&[_]u8{fifo.peekItem(i)}); + } + try testing.expectEqual(@as(usize, 10), fifo.readableLength()); + try testing.expectEqualSlices(u8, "HELLOHELLO", fifo.readableSlice(0)); + } + + { + try testing.expectEqual(@as(u8, 'H'), fifo.readItem().?); + try testing.expectEqual(@as(u8, 'E'), fifo.readItem().?); + try testing.expectEqual(@as(u8, 'L'), fifo.readItem().?); + try testing.expectEqual(@as(u8, 'L'), fifo.readItem().?); + try testing.expectEqual(@as(u8, 'O'), fifo.readItem().?); + } + try testing.expectEqual(@as(usize, 5), fifo.readableLength()); + + { // Writes that wrap around + try testing.expectEqual(@as(usize, 11), fifo.writableLength()); + try testing.expectEqual(@as(usize, 6), fifo.writableSlice(0).len); + fifo.writeAssumeCapacity("6 FifoType.init(), + .slice => FifoType.init(buf[0..]), + .dynamic => FifoType.init(testing.allocator), + }; + defer fifo.deinit(); + + try fifo.write(&[_]T{ 0, 1, 1, 0, 1 }); + try testing.expectEqual(@as(usize, 5), fifo.readableLength()); + + { + try testing.expectEqual(@as(T, 0), fifo.readItem().?); + try testing.expectEqual(@as(T, 1), fifo.readItem().?); + try testing.expectEqual(@as(T, 1), fifo.readItem().?); + try testing.expectEqual(@as(T, 0), fifo.readItem().?); + try testing.expectEqual(@as(T, 1), fifo.readItem().?); + try testing.expectEqual(@as(usize, 0), fifo.readableLength()); + } + + { + try fifo.writeItem(1); + try fifo.writeItem(1); + try fifo.writeItem(1); + try testing.expectEqual(@as(usize, 3), fifo.readableLength()); + } + + { + var readBuf: [3]T = undefined; + const n = fifo.read(&readBuf); + try testing.expectEqual(@as(usize, 3), n); // NOTE: It should be the number of items. + } + } + } +} diff --git a/src/main.zig b/src/main.zig index ac1ba98..e891ab6 100644 --- a/src/main.zig +++ b/src/main.zig @@ -128,8 +128,8 @@ pub fn main() void { const EmuThing = @import("core/emu.zig").EmuThing; var wrapper = EmuThing.init(&cpu, &scheduler); - var emulator = wrapper.interface(allocator); - defer emulator.deinit(); + var emulator = wrapper.interface(); + defer emulator.deinit(allocator); log.info("Ready to connect", .{}); @@ -197,7 +197,9 @@ fn configFilePath(allocator: Allocator, config_path: []const u8) ![]const u8 { const config_file = std.fs.createFileAbsolute(path, .{}) catch |err| exitln("failed to create \"{s}\": {}", .{ path, err }); defer config_file.close(); - try config_file.writeAll(@embedFile("example.toml")); + // FIXME(2025-09-22): re-enable + // try config_file.writeAll(@embedFile("example.toml")); + try config_file.writeAll(""); }; return path; @@ -221,13 +223,15 @@ fn ensureConfigDirExists(config_path: []const u8) !void { fn romPath(allocator: Allocator, result: *const clap.Result(clap.Help, ¶ms, clap.parsers.default)) !?[]const u8 { return switch (result.positionals.len) { 0 => null, - 1 => try allocator.dupe(u8, result.positionals[0]), + 1 => if (result.positionals[0]) |path| try allocator.dupe(u8, path) else null, else => exitln("ZBA received too many positional arguments.", .{}), }; } fn exitln(comptime format: []const u8, args: anytype) noreturn { - const stderr = std.io.getStdErr().writer(); + var buf: [1024]u8 = undefined; + var stderr = std.fs.File.stderr().writer(&buf).interface; + stderr.print(format, args) catch {}; // Just exit already... stderr.writeByte('\n') catch {}; std.process.exit(1); diff --git a/src/platform.zig b/src/platform.zig index 5518ea0..4836ee7 100644 --- a/src/platform.zig +++ b/src/platform.zig @@ -1,7 +1,7 @@ const std = @import("std"); -const SDL = @import("sdl2"); const gl = @import("gl"); const zgui = @import("zgui"); +const c = @import("lib.zig").c; const emu = @import("core/emu.zig"); const config = @import("config.zig"); @@ -18,24 +18,27 @@ const KeyInput = @import("core/bus/io.zig").KeyInput; const gba_width = @import("core/ppu.zig").width; const gba_height = @import("core/ppu.zig").height; -const GLuint = gl.GLuint; -const GLsizei = gl.GLsizei; -const SDL_GLContext = *anyopaque; +const GLsizei = gl.sizei; +const SDL_GLContext = *c.SDL_GLContextState; const Allocator = std.mem.Allocator; pub const Dimensions = struct { width: u32, height: u32 }; const default_dim: Dimensions = .{ .width = 1280, .height = 720 }; pub const sample_rate = 1 << 15; -pub const sample_format = SDL.AUDIO_U16; +// pub const sample_format = SDL.AUDIO_U16; const window_title = "ZBA"; +const errify = @import("lib.zig").errify; + +var gl_procs: gl.ProcTable = undefined; + pub const Gui = struct { const Self = @This(); const log = std.log.scoped(.Gui); - window: *SDL.SDL_Window, + window: *c.SDL_Window, ctx: SDL_GLContext, audio: Audio, @@ -43,36 +46,42 @@ pub const Gui = struct { allocator: Allocator, pub fn init(allocator: Allocator, apu: *Apu, title_opt: ?*const [12]u8) !Self { - if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO | SDL.SDL_INIT_EVENTS | SDL.SDL_INIT_AUDIO) < 0) panic(); - if (SDL.SDL_GL_SetAttribute(SDL.SDL_GL_CONTEXT_PROFILE_MASK, SDL.SDL_GL_CONTEXT_PROFILE_CORE) < 0) panic(); - if (SDL.SDL_GL_SetAttribute(SDL.SDL_GL_CONTEXT_MAJOR_VERSION, 3) < 0) panic(); - if (SDL.SDL_GL_SetAttribute(SDL.SDL_GL_CONTEXT_MAJOR_VERSION, 3) < 0) panic(); + c.SDL_SetMainReady(); - const window = SDL.SDL_CreateWindow( - window_title, - SDL.SDL_WINDOWPOS_CENTERED, - SDL.SDL_WINDOWPOS_CENTERED, - default_dim.width, - default_dim.height, - SDL.SDL_WINDOW_OPENGL | SDL.SDL_WINDOW_SHOWN | SDL.SDL_WINDOW_RESIZABLE, - ) orelse panic(); + try errify(c.SDL_Init(c.SDL_INIT_VIDEO | c.SDL_INIT_AUDIO | c.SDL_INIT_EVENTS)); - const ctx = SDL.SDL_GL_CreateContext(window) orelse panic(); - if (SDL.SDL_GL_MakeCurrent(window, ctx) < 0) panic(); + try errify(c.SDL_SetAppMetadata(window_title, "0.1.0", "moe.paoda.zba")); + try errify(c.SDL_GL_SetAttribute(c.SDL_GL_CONTEXT_MAJOR_VERSION, gl.info.version_major)); + try errify(c.SDL_GL_SetAttribute(c.SDL_GL_CONTEXT_MINOR_VERSION, gl.info.version_minor)); + try errify(c.SDL_GL_SetAttribute(c.SDL_GL_CONTEXT_PROFILE_MASK, c.SDL_GL_CONTEXT_PROFILE_CORE)); + try errify(c.SDL_GL_SetAttribute(c.SDL_GL_CONTEXT_FLAGS, c.SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG)); - gl.load(ctx, Self.glGetProcAddress) catch {}; - if (SDL.SDL_GL_SetSwapInterval(@intFromBool(config.config().host.vsync)) < 0) panic(); + const window: *c.SDL_Window = try errify(c.SDL_CreateWindow(window_title, default_dim.width, default_dim.height, c.SDL_WINDOW_OPENGL | c.SDL_WINDOW_RESIZABLE)); + errdefer c.SDL_DestroyWindow(window); + + const gl_ctx = try errify(c.SDL_GL_CreateContext(window)); + errdefer errify(c.SDL_GL_DestroyContext(gl_ctx)) catch {}; + + try errify(c.SDL_GL_MakeCurrent(window, gl_ctx)); + errdefer errify(c.SDL_GL_MakeCurrent(window, null)) catch {}; + + if (!gl_procs.init(c.SDL_GL_GetProcAddress)) return error.gl_init_failed; + + gl.makeProcTableCurrent(&gl_procs); + errdefer gl.makeProcTableCurrent(null); + + try errify(c.SDL_GL_SetSwapInterval(@intFromBool(config.config().host.vsync))); zgui.init(allocator); zgui.plot.init(); - zgui.backend.init(window, ctx, "#version 330 core"); + zgui.backend.init(window, gl_ctx); // zgui.io.setIniFilename(null); return Self{ .window = window, - .ctx = ctx, - .audio = Audio.init(apu), + .ctx = gl_ctx, + .audio = try Audio.init(apu), .allocator = allocator, .state = try imgui.State.init(allocator, title_opt), @@ -87,9 +96,9 @@ pub const Gui = struct { zgui.plot.deinit(); zgui.deinit(); - SDL.SDL_GL_DeleteContext(self.ctx); - SDL.SDL_DestroyWindow(self.window); - SDL.SDL_Quit(); + errify(c.SDL_GL_DestroyContext(self.ctx)) catch {}; + c.SDL_DestroyWindow(self.window); + c.SDL_Quit(); self.* = undefined; } @@ -109,17 +118,19 @@ pub const Gui = struct { const bus_ptr: *Bus = @ptrCast(@alignCast(cpu.bus.ptr)); const vao_id = opengl_impl.vao(); - defer gl.deleteVertexArrays(1, &[_]GLuint{vao_id}); + defer gl.DeleteVertexArrays(1, vao_id[0..]); const emu_tex = opengl_impl.screenTex(bus_ptr.ppu.framebuf.get(.Renderer)); - const out_tex = opengl_impl.outTex(); - defer gl.deleteTextures(2, &[_]GLuint{ emu_tex, out_tex }); + defer gl.DeleteTextures(1, emu_tex[0..]); - const fbo_id = try opengl_impl.frameBuffer(out_tex); - defer gl.deleteFramebuffers(1, &fbo_id); + const out_tex = opengl_impl.outTex(); + defer gl.DeleteTextures(1, out_tex[0..]); + + const fbo_id = try opengl_impl.frameBuffer(out_tex[0]); + defer gl.DeleteFramebuffers(1, fbo_id[0..]); const prog_id = try opengl_impl.program(); // Dynamic Shaders? - defer gl.deleteProgram(prog_id); + defer gl.DeleteProgram(prog_id); var win_dim: Dimensions = default_dim; @@ -128,61 +139,59 @@ pub const Gui = struct { // should exit, in which case we should also handle this if (self.state.should_quit or sync.should_quit.load(.monotonic)) break :emu_loop; - var event: SDL.SDL_Event = undefined; - while (SDL.SDL_PollEvent(&event) != 0) { + var event: c.SDL_Event = undefined; + + while (c.SDL_PollEvent(&event)) { _ = zgui.backend.processEvent(&event); switch (event.type) { - SDL.SDL_QUIT => break :emu_loop, - SDL.SDL_KEYDOWN => { + c.SDL_EVENT_QUIT => break :emu_loop, + c.SDL_EVENT_KEY_DOWN => { // TODO: Make use of compare_and_xor? - const key_code = event.key.keysym.sym; var keyinput: KeyInput = .{ .raw = 0x0000 }; - switch (key_code) { - SDL.SDLK_UP => keyinput.up.set(), - SDL.SDLK_DOWN => keyinput.down.set(), - SDL.SDLK_LEFT => keyinput.left.set(), - SDL.SDLK_RIGHT => keyinput.right.set(), - SDL.SDLK_x => keyinput.a.set(), - SDL.SDLK_z => keyinput.b.set(), - SDL.SDLK_a => keyinput.shoulder_l.set(), - SDL.SDLK_s => keyinput.shoulder_r.set(), - SDL.SDLK_RETURN => keyinput.start.set(), - SDL.SDLK_RSHIFT => keyinput.select.set(), + switch (event.key.scancode) { + c.SDL_SCANCODE_UP => keyinput.up.write(true), + c.SDL_SCANCODE_DOWN => keyinput.down.write(true), + c.SDL_SCANCODE_LEFT => keyinput.left.write(true), + c.SDL_SCANCODE_RIGHT => keyinput.right.write(true), + c.SDL_SCANCODE_X => keyinput.a.write(true), + c.SDL_SCANCODE_Z => keyinput.b.write(true), + c.SDL_SCANCODE_A => keyinput.shoulder_l.write(true), + c.SDL_SCANCODE_S => keyinput.shoulder_r.write(true), + c.SDL_SCANCODE_RETURN => keyinput.start.write(true), + c.SDL_SCANCODE_RSHIFT => keyinput.select.write(true), else => {}, } bus_ptr.io.keyinput.fetchAnd(~keyinput.raw, .monotonic); }, - SDL.SDL_KEYUP => { + c.SDL_EVENT_KEY_UP => { + // FIXME(paoda): merge with above? // TODO: Make use of compare_and_xor? - const key_code = event.key.keysym.sym; var keyinput: KeyInput = .{ .raw = 0x0000 }; - switch (key_code) { - SDL.SDLK_UP => keyinput.up.set(), - SDL.SDLK_DOWN => keyinput.down.set(), - SDL.SDLK_LEFT => keyinput.left.set(), - SDL.SDLK_RIGHT => keyinput.right.set(), - SDL.SDLK_x => keyinput.a.set(), - SDL.SDLK_z => keyinput.b.set(), - SDL.SDLK_a => keyinput.shoulder_l.set(), - SDL.SDLK_s => keyinput.shoulder_r.set(), - SDL.SDLK_RETURN => keyinput.start.set(), - SDL.SDLK_RSHIFT => keyinput.select.set(), + switch (event.key.scancode) { + c.SDL_SCANCODE_UP => keyinput.up.write(true), + c.SDL_SCANCODE_DOWN => keyinput.down.write(true), + c.SDL_SCANCODE_LEFT => keyinput.left.write(true), + c.SDL_SCANCODE_RIGHT => keyinput.right.write(true), + c.SDL_SCANCODE_X => keyinput.a.write(true), + c.SDL_SCANCODE_Z => keyinput.b.write(true), + c.SDL_SCANCODE_A => keyinput.shoulder_l.write(true), + c.SDL_SCANCODE_S => keyinput.shoulder_r.write(true), + c.SDL_SCANCODE_RETURN => keyinput.start.write(true), + c.SDL_SCANCODE_RSHIFT => keyinput.select.write(true), else => {}, } bus_ptr.io.keyinput.fetchOr(keyinput.raw, .monotonic); }, - SDL.SDL_WINDOWEVENT => { - if (event.window.event == SDL.SDL_WINDOWEVENT_RESIZED) { - log.debug("window resized to: {}x{}", .{ event.window.data1, event.window.data2 }); + c.SDL_EVENT_WINDOW_RESIZED => { + log.debug("window resized to: {}x{}", .{ event.window.data1, event.window.data2 }); - win_dim.width = @intCast(event.window.data1); - win_dim.height = @intCast(event.window.data2); - } + win_dim.width = @intCast(event.window.data1); + win_dim.height = @intCast(event.window.data2); }, else => {}, } @@ -194,13 +203,13 @@ pub const Gui = struct { .Transition => |inner| switch (inner) { .Active => { sync.paused.store(false, .monotonic); - if (!config.config().host.mute) SDL.SDL_PauseAudioDevice(self.audio.device, 0); + if (!config.config().host.mute) try errify(c.SDL_PauseAudioDevice(c.SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK)); self.state.emulation = .Active; }, .Inactive => { // Assert that double pausing is impossible - SDL.SDL_PauseAudioDevice(self.audio.device, 1); + try errify(c.SDL_ResumeAudioDevice(c.SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK)); sync.paused.store(true, .monotonic); self.state.emulation = .Inactive; @@ -212,182 +221,163 @@ pub const Gui = struct { // Draw GBA Screen to Texture { - gl.bindFramebuffer(gl.FRAMEBUFFER, fbo_id); - defer gl.bindFramebuffer(gl.FRAMEBUFFER, 0); + gl.BindFramebuffer(gl.FRAMEBUFFER, fbo_id[0]); + defer gl.BindFramebuffer(gl.FRAMEBUFFER, 0); - gl.viewport(0, 0, gba_width, gba_height); - opengl_impl.drawScreen(emu_tex, prog_id, vao_id, bus_ptr.ppu.framebuf.get(.Renderer)); + gl.Viewport(0, 0, gba_width, gba_height); + opengl_impl.drawScreen(emu_tex[0], prog_id, vao_id[0], bus_ptr.ppu.framebuf.get(.Renderer)); } // FIXME: We only really care about locking the audio device (and therefore writing silence) // since if nfd-zig is used the emu may be paused for way too long. Perhaps we should try and limit // spurious calls to SDL_LockAudioDevice? - SDL.SDL_LockAudioDevice(self.audio.device); - defer SDL.SDL_UnlockAudioDevice(self.audio.device); - zgui_redraw = imgui.draw(&self.state, sync, win_dim, cpu, out_tex); + try errify(c.SDL_LockAudioStream(self.audio.stream)); + defer errify(c.SDL_UnlockAudioStream(self.audio.stream)) catch @panic("TODO: FIXME"); + + zgui_redraw = imgui.draw(&self.state, sync, win_dim, cpu, out_tex[0]); }, - .Inactive => zgui_redraw = imgui.draw(&self.state, sync, win_dim, cpu, out_tex), + .Inactive => zgui_redraw = imgui.draw(&self.state, sync, win_dim, cpu, out_tex[0]), } if (zgui_redraw) { // Background Colour const size = zgui.io.getDisplaySize(); - gl.viewport(0, 0, @intFromFloat(size[0]), @intFromFloat(size[1])); - gl.clearColor(0, 0, 0, 1.0); - gl.clear(gl.COLOR_BUFFER_BIT); + gl.Viewport(0, 0, @intFromFloat(size[0]), @intFromFloat(size[1])); + gl.ClearColor(0, 0, 0, 1.0); + gl.Clear(gl.COLOR_BUFFER_BIT); zgui.backend.draw(); } - SDL.SDL_GL_SwapWindow(self.window); + try errify(c.SDL_GL_SwapWindow(self.window)); } sync.should_quit.store(true, .monotonic); } - - fn glGetProcAddress(ctx: SDL.SDL_GLContext, proc: [:0]const u8) ?*anyopaque { - _ = ctx; - return SDL.SDL_GL_GetProcAddress(proc.ptr); - } }; const Audio = struct { const Self = @This(); const log = std.log.scoped(.PlatformAudio); - device: SDL.SDL_AudioDeviceID, + stream: *c.SDL_AudioStream, - fn init(apu: *Apu) Self { - var have: SDL.SDL_AudioSpec = undefined; - var want: SDL.SDL_AudioSpec = std.mem.zeroes(SDL.SDL_AudioSpec); - want.freq = sample_rate; - want.format = sample_format; - want.channels = 2; - want.samples = 0x100; - want.callback = Self.callback; - want.userdata = apu; + fn init(apu: *Apu) !Self { + var desired: c.SDL_AudioSpec = std.mem.zeroes(c.SDL_AudioSpec); + desired.freq = sample_rate; + desired.format = c.SDL_AUDIO_S16LE; + desired.channels = 2; - std.debug.assert(sample_format == SDL.AUDIO_U16); - log.info("Host Sample Rate: {}Hz, Host Format: SDL.AUDIO_U16", .{sample_rate}); + log.info("Host Sample Rate: {}Hz, Host Format: SDL_AUDIO_S16LE", .{sample_rate}); - const device = SDL.SDL_OpenAudioDevice(null, 0, &want, &have, 0); - if (device == 0) panic(); + const stream = try errify(c.SDL_OpenAudioDeviceStream(c.SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &desired, null, null)); + errdefer c.SDL_DestroyAudioStream(stream); - return .{ .device = device }; + apu.stream = stream; + return .{ .stream = stream }; } fn deinit(self: *Self) void { - SDL.SDL_CloseAudioDevice(self.device); + c.SDL_DestroyAudioStream(self.stream); self.* = undefined; } - - export fn callback(userdata: ?*anyopaque, stream: [*c]u8, len: c_int) void { - const apu: *Apu = @ptrCast(@alignCast(userdata)); - - _ = SDL.SDL_AudioStreamGet(apu.stream, stream, len); - } }; -fn panic() noreturn { - const str = @as(?[*:0]const u8, SDL.SDL_GetError()) orelse "unknown error"; - @panic(std.mem.sliceTo(str, 0)); -} - const opengl_impl = struct { - fn drawScreen(tex_id: GLuint, prog_id: GLuint, vao_id: GLuint, buf: []const u8) void { - gl.bindTexture(gl.TEXTURE_2D, tex_id); - defer gl.bindTexture(gl.TEXTURE_2D, 0); + fn drawScreen(tex_id: gl.uint, prog_id: gl.uint, vao_id: gl.uint, buf: []const u8) void { + gl.BindTexture(gl.TEXTURE_2D, tex_id); + defer gl.BindTexture(gl.TEXTURE_2D, 0); - gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gba_width, gba_height, gl.RGBA, gl.UNSIGNED_INT_8_8_8_8, buf.ptr); + gl.TexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gba_width, gba_height, gl.RGBA, gl.UNSIGNED_INT_8_8_8_8, buf.ptr); // Bind VAO - gl.bindVertexArray(vao_id); - defer gl.bindVertexArray(0); + gl.BindVertexArray(vao_id); + defer gl.BindVertexArray(0); // Use compiled frag + vertex shader - gl.useProgram(prog_id); - defer gl.useProgram(0); + gl.UseProgram(prog_id); + defer gl.UseProgram(0); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 3); + gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 3); } - fn program() !GLuint { - const vert_shader = @embedFile("shader/pixelbuf.vert"); - const frag_shader = @embedFile("shader/pixelbuf.frag"); + fn program() !gl.uint { + const vert_shader: [1][*]const u8 = .{@embedFile("shader/pixelbuf.vert")}; + const frag_shader: [1][*]const u8 = .{@embedFile("shader/pixelbuf.frag")}; - const vs = gl.createShader(gl.VERTEX_SHADER); - defer gl.deleteShader(vs); + const vs = gl.CreateShader(gl.VERTEX_SHADER); + defer gl.DeleteShader(vs); - gl.shaderSource(vs, 1, &[_][*c]const u8{vert_shader}, 0); - gl.compileShader(vs); + gl.ShaderSource(vs, 1, vert_shader[0..], null); + gl.CompileShader(vs); if (!shader.didCompile(vs)) return error.VertexCompileError; - const fs = gl.createShader(gl.FRAGMENT_SHADER); - defer gl.deleteShader(fs); + const fs = gl.CreateShader(gl.FRAGMENT_SHADER); + defer gl.DeleteShader(fs); - gl.shaderSource(fs, 1, &[_][*c]const u8{frag_shader}, 0); - gl.compileShader(fs); + gl.ShaderSource(fs, 1, frag_shader[0..], null); + gl.CompileShader(fs); if (!shader.didCompile(fs)) return error.FragmentCompileError; - const prog = gl.createProgram(); - gl.attachShader(prog, vs); - gl.attachShader(prog, fs); - gl.linkProgram(prog); + const prog = gl.CreateProgram(); + gl.AttachShader(prog, vs); + gl.AttachShader(prog, fs); + gl.LinkProgram(prog); return prog; } - fn vao() GLuint { - var vao_id: GLuint = undefined; - gl.genVertexArrays(1, &vao_id); + fn vao() [1]gl.uint { + var vao_id: [1]gl.uint = undefined; + gl.GenVertexArrays(1, vao_id[0..]); return vao_id; } - fn screenTex(buf: []const u8) GLuint { - var tex_id: GLuint = undefined; - gl.genTextures(1, &tex_id); + fn screenTex(buf: []const u8) [1]gl.uint { + var tex_id: [1]gl.uint = undefined; + gl.GenTextures(1, tex_id[0..]); - gl.bindTexture(gl.TEXTURE_2D, tex_id); - defer gl.bindTexture(gl.TEXTURE_2D, 0); + gl.BindTexture(gl.TEXTURE_2D, tex_id[0]); + defer gl.BindTexture(gl.TEXTURE_2D, 0); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gba_width, gba_height, 0, gl.RGBA, gl.UNSIGNED_INT_8_8_8_8, buf.ptr); + gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gba_width, gba_height, 0, gl.RGBA, gl.UNSIGNED_INT_8_8_8_8, buf.ptr); return tex_id; } - fn outTex() GLuint { - var tex_id: GLuint = undefined; - gl.genTextures(1, &tex_id); + fn outTex() [1]gl.uint { + var tex_id: [1]gl.uint = undefined; + gl.GenTextures(1, tex_id[0..]); - gl.bindTexture(gl.TEXTURE_2D, tex_id); - defer gl.bindTexture(gl.TEXTURE_2D, 0); + gl.BindTexture(gl.TEXTURE_2D, tex_id[0]); + defer gl.BindTexture(gl.TEXTURE_2D, 0); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gba_width, gba_height, 0, gl.RGBA, gl.UNSIGNED_INT_8_8_8_8, null); + gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gba_width, gba_height, 0, gl.RGBA, gl.UNSIGNED_INT_8_8_8_8, null); return tex_id; } - fn frameBuffer(tex_id: GLuint) !GLuint { - var fbo_id: GLuint = undefined; - gl.genFramebuffers(1, &fbo_id); + fn frameBuffer(tex_id: gl.uint) ![1]gl.uint { + var fbo_id: [1]gl.uint = undefined; + gl.GenFramebuffers(1, fbo_id[0..]); - gl.bindFramebuffer(gl.FRAMEBUFFER, fbo_id); - defer gl.bindFramebuffer(gl.FRAMEBUFFER, 0); + gl.BindFramebuffer(gl.FRAMEBUFFER, fbo_id[0]); + defer gl.BindFramebuffer(gl.FRAMEBUFFER, 0); - gl.framebufferTexture(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, tex_id, 0); - gl.drawBuffers(1, &@as(GLuint, gl.COLOR_ATTACHMENT0)); + gl.FramebufferTexture(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, tex_id, 0); + gl.DrawBuffers(1, &.{gl.COLOR_ATTACHMENT0}); - if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) + if (gl.CheckFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) return error.FrameBufferObejctInitFailed; return fbo_id; @@ -396,20 +386,20 @@ const opengl_impl = struct { const shader = struct { const log = std.log.scoped(.shader); - fn didCompile(id: gl.GLuint) bool { - var success: gl.GLint = undefined; - gl.getShaderiv(id, gl.COMPILE_STATUS, &success); + fn didCompile(id: gl.uint) bool { + var success: [1]gl.int = undefined; + gl.GetShaderiv(id, gl.COMPILE_STATUS, success[0..]); - if (success == 0) err(id); + if (success[0] == 0) err(id); - return success == 1; + return success[0] == 1; } - fn err(id: gl.GLuint) void { + fn err(id: gl.uint) void { const buf_len = 512; var error_msg: [buf_len]u8 = undefined; - gl.getShaderInfoLog(id, buf_len, 0, &error_msg); + gl.GetShaderInfoLog(id, buf_len, null, &error_msg); log.err("{s}", .{std.mem.sliceTo(&error_msg, 0)}); } }; diff --git a/src/util.zig b/src/util.zig index c8184a4..777f3ed 100644 --- a/src/util.zig +++ b/src/util.zig @@ -69,7 +69,7 @@ pub const io = struct { } pub fn undef(comptime T: type, comptime log: anytype, comptime format: []const u8, args: anytype) ?T { - @setCold(true); + @branchHint(.cold); const unhandled_io = config.config().debug.unhandled_io; @@ -80,7 +80,7 @@ pub const io = struct { } pub fn err(comptime T: type, comptime log: anytype, comptime format: []const u8, args: anytype) ?T { - @setCold(true); + @branchHint(.cold); log.err(format, args); return null; @@ -245,10 +245,10 @@ pub inline fn setHalf(comptime T: type, left: T, addr: u8, right: HalfInt(T)) T /// The Integer type which corresponds to T with exactly half the amount of bits fn HalfInt(comptime T: type) type { const type_info = @typeInfo(T); - comptime std.debug.assert(type_info == .Int); // Type must be an integer - comptime std.debug.assert(type_info.Int.bits % 2 == 0); // Type must have an even amount of bits + comptime std.debug.assert(type_info == .int); // Type must be an integer + comptime std.debug.assert(type_info.int.bits % 2 == 0); // Type must have an even amount of bits - return std.meta.Int(type_info.Int.signedness, type_info.Int.bits >> 1); + return std.meta.Int(type_info.int.signedness, type_info.int.bits >> 1); } /// Double Buffering Implementation @@ -296,7 +296,7 @@ pub const FrameBuffer = struct { } }; -const RingBuffer = @import("zba-util").RingBuffer; +const RingBuffer = @import("zba_util").RingBuffer; // TODO: Lock Free Queue? pub fn Queue(comptime T: type) type {