Browse Source

Begin transition to Jai-like syntax

Ginger Bill 8 years ago
parent
commit
a48e0c7179
20 changed files with 2368 additions and 2385 deletions
  1. 5 2
      code/demo.odin
  2. 15 15
      core/_preload.odin
  3. 7 7
      core/atomic.odin
  4. 60 60
      core/fmt.odin
  5. 40 40
      core/hash.odin
  6. 89 91
      core/math.odin
  7. 34 34
      core/mem.odin
  8. 59 61
      core/opengl.odin
  9. 1367 1367
      core/opengl_constants.odin
  10. 84 89
      core/os_windows.odin
  11. 5 5
      core/sync.odin
  12. 108 121
      core/sys/windows.odin
  13. 71 77
      core/utf8.odin
  14. 95 111
      src/checker/checker.c
  15. 11 11
      src/checker/decl.c
  16. 44 57
      src/checker/expr.c
  17. 102 111
      src/checker/stmt.c
  18. 117 67
      src/parser.c
  19. 53 57
      src/ssa.c
  20. 2 2
      src/tokenizer.c

+ 5 - 2
code/demo.odin

@@ -11,7 +11,7 @@ import {
 	win32 "sys/windows.odin";
 }
 
-const Thing = enum f64 {
+Thing :: enum f64 {
 	_, // Ignore first value
 	A = 1<<(10*iota),
 	B,
@@ -19,6 +19,9 @@ const Thing = enum f64 {
 	D,
 };
 
-const main = proc() {
+main :: proc() {
 	fmt.println(Thing.A, Thing.B, Thing.C, Thing.D);
+
+	x := 123;
+	fmt.println(x);
 }

+ 15 - 15
core/_preload.odin

@@ -83,7 +83,7 @@ proc type_info_base(info ^Type_Info) -> ^Type_Info {
 	if info == nil {
 		return nil;
 	}
-	var base = info;
+	base := info;
 	match type i : base {
 	case Type_Info.Named:
 		base = i.base;
@@ -140,14 +140,14 @@ type {
 	}
 }
 
-#thread_local var __context Context;
+#thread_local __context: Context;
 
 
-const DEFAULT_ALIGNMENT = align_of([vector 4]f32);
+DEFAULT_ALIGNMENT :: align_of([vector 4]f32);
 
 
 proc __check_context() {
-	var c = ^__context;
+	c := ^__context;
 
 	if c.allocator.procedure == nil {
 		c.allocator = default_allocator();
@@ -161,20 +161,20 @@ proc alloc(size int) -> rawptr #inline { return alloc_align(size, DEFAULT_ALIGNM
 
 proc alloc_align(size, alignment int) -> rawptr #inline {
 	__check_context();
-	var a = context.allocator;
+	a := context.allocator;
 	return a.procedure(a.data, Allocator_Mode.ALLOC, size, alignment, nil, 0, 0);
 }
 
 proc free(ptr rawptr) #inline {
 	__check_context();
-	var a = context.allocator;
+	a := context.allocator;
 	if ptr != nil {
 		a.procedure(a.data, Allocator_Mode.FREE, 0, 0, ptr, 0, 0);
 	}
 }
 proc free_all() #inline {
 	__check_context();
-	var a = context.allocator;
+	a := context.allocator;
 	a.procedure(a.data, Allocator_Mode.FREE_ALL, 0, 0, nil, 0, 0);
 }
 
@@ -182,7 +182,7 @@ proc free_all() #inline {
 proc resize      (ptr rawptr, old_size, new_size int) -> rawptr #inline { return resize_align(ptr, old_size, new_size, DEFAULT_ALIGNMENT); }
 proc resize_align(ptr rawptr, old_size, new_size, alignment int) -> rawptr #inline {
 	__check_context();
-	var a = context.allocator;
+	a := context.allocator;
 	return a.procedure(a.data, Allocator_Mode.RESIZE, new_size, alignment, ptr, old_size, 0);
 }
 
@@ -202,7 +202,7 @@ proc default_resize_align(old_memory rawptr, old_size, new_size, alignment int)
 		return old_memory;
 	}
 
-	var new_memory = alloc_align(new_size, alignment);
+	new_memory := alloc_align(new_size, alignment);
 	if new_memory == nil {
 		return nil;
 	}
@@ -221,9 +221,9 @@ proc default_allocator_proc(allocator_data rawptr, mode Allocator_Mode,
 	when false {
 		match mode {
 		case ALLOC:
-			var total_size = size + alignment + size_of(mem.AllocationHeader);
-			var ptr = os.heap_alloc(total_size);
-			var header = ptr as ^mem.AllocationHeader;
+			total_size := size + alignment + size_of(mem.AllocationHeader);
+			ptr := os.heap_alloc(total_size);
+			header := ptr as ^mem.AllocationHeader;
 			ptr = mem.align_forward(header+1, alignment);
 			mem.allocation_header_fill(header, ptr, size);
 			return mem.zero(ptr, size);
@@ -236,9 +236,9 @@ proc default_allocator_proc(allocator_data rawptr, mode Allocator_Mode,
 			// NOTE(bill): Does nothing
 
 		case RESIZE:
-			var total_size = size + alignment + size_of(mem.AllocationHeader);
-			var ptr = os.heap_resize(mem.allocation_header(old_memory), total_size);
-			var header = ptr as ^mem.AllocationHeader;
+			total_size := size + alignment + size_of(mem.AllocationHeader);
+			ptr := os.heap_resize(mem.allocation_header(old_memory), total_size);
+			header := ptr as ^mem.AllocationHeader;
 			ptr = mem.align_forward(header+1, alignment);
 			mem.allocation_header_fill(header, ptr, size);
 			return mem.zero(ptr, size);

+ 7 - 7
core/atomic.odin

@@ -2,7 +2,7 @@
 // Inline vs external file?
 
 import win32 "sys/windows.odin" when ODIN_OS == "windows";
-var _ = compile_assert(ODIN_ARCH == "amd64"); // TODO(bill): x86 version
+_ := compile_assert(ODIN_ARCH == "amd64"); // TODO(bill): x86 version
 
 
 proc yield_thread() { win32._mm_pause(); }
@@ -35,8 +35,8 @@ proc fetch_or32(a ^i32, operand i32) -> i32 {
 	return win32.InterlockedOr(a, operand);
 }
 proc spin_lock32(a ^i32, time_out int) -> bool { // NOTE(bill) time_out = -1 as default
-	var old_value = compare_exchange32(a, 1, 0);
-	var counter = 0;
+	old_value := compare_exchange32(a, 1, 0);
+	counter := 0;
 	for old_value != 0 && (time_out < 0 || counter < time_out) {
 		counter++;
 		yield_thread();
@@ -51,7 +51,7 @@ proc spin_unlock32(a ^i32) {
 }
 proc try_acquire_lock32(a ^i32) -> bool {
 	yield_thread();
-	var old_value = compare_exchange32(a, 1, 0);
+	old_value := compare_exchange32(a, 1, 0);
 	mfence();
 	return old_value == 0;
 }
@@ -79,8 +79,8 @@ proc fetch_or64(a ^i64, operand i64) -> i64 {
 	return win32.InterlockedOr64(a, operand);
 }
 proc spin_lock64(a ^i64, time_out int) -> bool { // NOTE(bill) time_out = -1 as default
-	var old_value = compare_exchange64(a, 1, 0);
-	var counter = 0;
+	old_value := compare_exchange64(a, 1, 0);
+	counter := 0;
 	for old_value != 0 && (time_out < 0 || counter < time_out) {
 		counter++;
 		yield_thread();
@@ -95,7 +95,7 @@ proc spin_unlock64(a ^i64) {
 }
 proc try_acquire_lock64(a ^i64) -> bool {
 	yield_thread();
-	var old_value = compare_exchange64(a, 1, 0);
+	old_value := compare_exchange64(a, 1, 0);
 	mfence();
 	return old_value == 0;
 }

+ 60 - 60
core/fmt.odin

@@ -4,26 +4,26 @@ import {
 	"utf8.odin";
 }
 
-const PRINT_BUF_SIZE = 1<<12;
+PRINT_BUF_SIZE :: 1<<12;
 
 proc fprint(fd os.Handle, args ..any) -> int {
-	var data [PRINT_BUF_SIZE]byte;
-	var buf = data[:0];
+	data :[PRINT_BUF_SIZE]byte;
+	buf := data[:0];
 	bprint(^buf, ..args);
 	os.write(fd, buf);
 	return buf.count;
 }
 
 proc fprintln(fd os.Handle, args ..any) -> int {
-	var data [PRINT_BUF_SIZE]byte;
-	var buf = data[:0];
+	data :[PRINT_BUF_SIZE]byte;
+	buf := data[:0];
 	bprintln(^buf, ..args);
 	os.write(fd, buf);
 	return buf.count;
 }
 proc fprintf(fd os.Handle, fmt string, args ..any) -> int {
-	var data [PRINT_BUF_SIZE]byte;
-	var buf = data[:0];
+	data :[PRINT_BUF_SIZE]byte;
+	buf := data[:0];
 	bprintf(^buf, fmt, ..args);
 	os.write(fd, buf);
 	return buf.count;
@@ -43,8 +43,8 @@ proc printf(fmt string, args ..any) -> int {
 
 
 proc fprint_type(fd os.Handle, info ^Type_Info) {
-	var data [PRINT_BUF_SIZE]byte;
-	var buf = data[:0];
+	data :[PRINT_BUF_SIZE]byte;
+	buf := data[:0];
 	bprint_type(^buf, info);
 	os.write(fd, buf);
 }
@@ -53,7 +53,7 @@ proc fprint_type(fd os.Handle, info ^Type_Info) {
 
 proc print_byte_buffer(buf ^[]byte, b []byte) {
 	if buf.count < buf.capacity {
-		var n = min(buf.capacity-buf.count, b.count);
+		n := min(buf.capacity-buf.count, b.count);
 		if n > 0 {
 			mem.copy(buf.data + buf.count, b.data, n);
 			buf.count += n;
@@ -67,21 +67,21 @@ proc bprint_string(buf ^[]byte, s string) {
 
 
 proc byte_reverse(b []byte) {
-	var n = b.count;
-	for var i = 0; i < n/2; i++ {
+	n := b.count;
+	for i := 0; i < n/2; i++ {
 		b[i], b[n-1-i] = b[n-1-i], b[i];
 	}
 }
 
 proc bprint_rune(buf ^[]byte, r rune) {
-	var b, n = utf8.encode_rune(r);
+	b, n := utf8.encode_rune(r);
 	bprint_string(buf, b[:n] as string);
 }
 
 proc bprint_space(buf ^[]byte) { bprint_rune(buf, ' '); }
 proc bprint_nl   (buf ^[]byte) { bprint_rune(buf, '\n'); }
 
-var __NUM_TO_CHAR_TABLE = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@$";
+__NUM_TO_CHAR_TABLE := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@$";
 
 proc bprint_bool(buffer ^[]byte, b bool) {
 	if b {
@@ -100,9 +100,9 @@ proc bprint_f16 (buffer ^[]byte, f f32)  #inline { print__f64(buffer, f as f64,
 proc bprint_f32 (buffer ^[]byte, f f32)  #inline { print__f64(buffer, f as f64, 7); }
 proc bprint_f64 (buffer ^[]byte, f f64)  #inline { print__f64(buffer, f as f64, 16); }
 proc bprint_u64(buffer ^[]byte, value u64) {
-	var i = value;
-	var buf [20]byte;
-	var len = 0;
+	i := value;
+	buf :[20]byte;
+	len := 0;
 	if i == 0 {
 		buf[len] = '0';
 		len++;
@@ -117,7 +117,7 @@ proc bprint_u64(buffer ^[]byte, value u64) {
 }
 proc bprint_i64(buffer ^[]byte, value i64) {
 	// TODO(bill): Cleanup printing
-	var i = value;
+	i := value;
 	if i < 0 {
 		i = -i;
 		bprint_rune(buffer, '-');
@@ -127,14 +127,14 @@ proc bprint_i64(buffer ^[]byte, value i64) {
 
 /*
 proc bprint_u128(buffer ^[]byte, value u128) {
-	var a = value transmute [2]u64;
+	a := value transmute [2]u64;
 	if a[1] != 0 {
 		bprint_u64(buffer, a[1]);
 	}
 	bprint_u64(buffer, a[0]);
 }
 proc bprint_i128(buffer ^[]byte, value i128) {
-	var i = value;
+	i := value;
 	if i < 0 {
 		i = -i;
 		bprint_rune(buffer, '-');
@@ -145,7 +145,7 @@ proc bprint_i128(buffer ^[]byte, value i128) {
 
 
 proc print__f64(buffer ^[]byte, value f64, decimal_places int) {
-	var f = value;
+	f := value;
 	if f == 0 {
 		bprint_rune(buffer, '0');
 		return;
@@ -155,13 +155,13 @@ proc print__f64(buffer ^[]byte, value f64, decimal_places int) {
 		f = -f;
 	}
 
-	var i = f as u64;
+	i := f as u64;
 	bprint_u64(buffer, i);
 	f -= i as f64;
 
 	bprint_rune(buffer, '.');
 
-	var mult f64 = 10.0;
+	mult :f64 = 10.0;
 	for ; decimal_places >= 0; decimal_places-- {
 		i = (f * mult) as u64;
 		bprint_u64(buffer, i as u64);
@@ -214,7 +214,7 @@ proc bprint_type(buf ^[]byte, ti ^Type_Info) {
 		if info.params == nil {
 			bprint_string(buf, "()");
 		} else {
-			var count = (info.params as ^Tuple).fields.count;
+			count := (info.params as ^Tuple).fields.count;
 			if count == 1 { bprint_string(buf, "("); }
 			bprint_type(buf, info.params);
 			if count == 1 { bprint_string(buf, ")"); }
@@ -224,12 +224,12 @@ proc bprint_type(buf ^[]byte, ti ^Type_Info) {
 			bprint_type(buf, info.results);
 		}
 	case Tuple:
-		var count = info.fields.count;
+		count := info.fields.count;
 		if count != 1 { bprint_string(buf, "("); }
-		for var i = 0; i < count; i++ {
+		for i := 0; i < count; i++ {
 			if i > 0 { bprint_string(buf, ", "); }
 
-			var f = info.fields[i];
+			f := info.fields[i];
 
 			if f.name.count > 0 {
 				bprint_string(buf, f.name);
@@ -259,7 +259,7 @@ proc bprint_type(buf ^[]byte, ti ^Type_Info) {
 		if info.packed  { bprint_string(buf, "#packed "); }
 		if info.ordered { bprint_string(buf, "#ordered "); }
 		bprint_string(buf, "{");
-		for var i = 0; i < info.fields.count; i++ {
+		for i := 0; i < info.fields.count; i++ {
 			if i > 0 {
 				bprint_string(buf, ", ");
 			}
@@ -271,7 +271,7 @@ proc bprint_type(buf ^[]byte, ti ^Type_Info) {
 
 	case Union:
 		bprint_string(buf, "union {");
-		for var i = 0; i < info.fields.count; i++ {
+		for i := 0; i < info.fields.count; i++ {
 			if i > 0 {
 				bprint_string(buf, ", ");
 			}
@@ -283,7 +283,7 @@ proc bprint_type(buf ^[]byte, ti ^Type_Info) {
 
 	case Raw_Union:
 		bprint_string(buf, "raw_union {");
-		for var i = 0; i < info.fields.count; i++ {
+		for i := 0; i < info.fields.count; i++ {
 			if i > 0 {
 				bprint_string(buf, ", ");
 			}
@@ -303,7 +303,7 @@ proc bprint_type(buf ^[]byte, ti ^Type_Info) {
 
 
 proc make_any(type_info ^Type_Info, data rawptr) -> any {
-	var a any;
+	a :any;
 	a.type_info = type_info;
 	a.data = data;
 	return a;
@@ -323,20 +323,20 @@ proc bprint_any(buf ^[]byte, arg any) {
 	using Type_Info;
 	match type info : arg.type_info {
 	case Named:
-		var a = make_any(info.base, arg.data);
+		a := make_any(info.base, arg.data);
 		match type b : info.base {
 		case Struct:
 			bprint_string(buf, info.name);
 			bprint_string(buf, "{");
-			for var i = 0; i < b.fields.count; i++ {
-				var f = b.fields[i];
+			for i := 0; i < b.fields.count; i++ {
+				f := b.fields[i];
 				if i > 0 {
 					bprint_string(buf, ", ");
 				}
 				bprint_string(buf, f.name);
 				// bprint_any(buf, f.offset);
 				bprint_string(buf, " = ");
-				var data = arg.data as ^byte + f.offset;
+				data := arg.data as ^byte + f.offset;
 				bprint_any(buf, make_any(f.type_info, data));
 			}
 			bprint_string(buf, "}");
@@ -387,8 +387,8 @@ proc bprint_any(buf ^[]byte, arg any) {
 		}
 
 	case Maybe:
-		var size = mem.size_of_type_info(info.elem);
-		var data = slice_ptr(arg.data as ^byte, size+1);
+		size := mem.size_of_type_info(info.elem);
+		data := slice_ptr(arg.data as ^byte, size+1);
 		if data[size] != 0 {
 			bprint_any(buf, make_any(info.elem, arg.data));
 		} else {
@@ -399,26 +399,26 @@ proc bprint_any(buf ^[]byte, arg any) {
 		bprintf(buf, "[%]%{", info.count, info.elem);
 		defer bprint_string(buf, "}");
 
-		for var i = 0; i < info.count; i++ {
+		for i := 0; i < info.count; i++ {
 			if i > 0 {
 				bprint_string(buf, ", ");
 			}
 
-			var data = arg.data as ^byte + i*info.elem_size;
+			data := arg.data as ^byte + i*info.elem_size;
 			bprint_any(buf, make_any(info.elem, data));
 		}
 
 	case Slice:
-		var slice = arg.data as ^[]byte;
+		slice := arg.data as ^[]byte;
 		bprintf(buf, "[]%{", info.elem);
 		defer bprint_string(buf, "}");
 
-		for var i = 0; i < slice.count; i++ {
+		for i := 0; i < slice.count; i++ {
 			if i > 0 {
 				bprint_string(buf, ", ");
 			}
 
-			var data = slice.data + i*info.elem_size;
+			data := slice.data + i*info.elem_size;
 			bprint_any(buf, make_any(info.elem, data));
 		}
 
@@ -440,12 +440,12 @@ proc bprint_any(buf ^[]byte, arg any) {
 			return;
 		}
 
-		for var i = 0; i < info.count; i++ {
+		for i := 0; i < info.count; i++ {
 			if i > 0 {
 				bprint_string(buf, ", ");
 			}
 
-			var data = arg.data as ^byte + i*info.elem_size;
+			data := arg.data as ^byte + i*info.elem_size;
 			bprint_any(buf, make_any(info.elem, data));
 		}
 
@@ -454,14 +454,14 @@ proc bprint_any(buf ^[]byte, arg any) {
 		bprintf(buf, "%{", arg.type_info);
 		defer bprint_string(buf, "}");
 
-		for var i = 0; i < info.fields.count; i++ {
+		for i := 0; i < info.fields.count; i++ {
 			if i > 0 {
 				bprint_string(buf, ", ");
 			}
 			bprint_string(buf, info.fields[i].name);
 			bprint_string(buf, " = ");
-			var data = arg.data as ^byte + info.fields[i].offset;
-			var ti = info.fields[i].type_info;
+			data := arg.data as ^byte + info.fields[i].offset;
+			ti := info.fields[i].type_info;
 			bprint_any(buf, make_any(ti, data));
 		}
 
@@ -487,10 +487,10 @@ proc bprintf(buf ^[]byte, fmt string, args ..any) -> int {
 	}
 
 	proc parse_int(s string, offset int) -> (int, int) {
-		var result = 0;
+		result := 0;
 
 		for ; offset < s.count; offset++ {
-			var c = s[offset] as rune;
+			c := s[offset] as rune;
 			if !is_digit(c) {
 				break;
 			}
@@ -502,12 +502,12 @@ proc bprintf(buf ^[]byte, fmt string, args ..any) -> int {
 		return result, offset;
 	}
 
-	var prev = 0;
-	var implicit_index = 0;
+	prev := 0;
+	implicit_index := 0;
 
-	for var i = 0; i < fmt.count; i++ {
-		var r = fmt[i] as rune;
-		var index = implicit_index;
+	for i := 0; i < fmt.count; i++ {
+		r := fmt[i] as rune;
+		index := implicit_index;
 
 		if r != '%' {
 			continue;
@@ -516,7 +516,7 @@ proc bprintf(buf ^[]byte, fmt string, args ..any) -> int {
 		bprint_string(buf, fmt[prev:i]);
 		i++; // Skip %
 		if i < fmt.count {
-			var next = fmt[i] as rune;
+			next := fmt[i] as rune;
 
 			if next == '%' {
 				bprint_string(buf, "%");
@@ -561,10 +561,10 @@ proc bprint(buf ^[]byte, args ..any) -> int {
 	}
 
 
-	var prev_string = false;
-	for var i = 0; i < args.count; i++ {
-		var arg = args[i];
-		var is_string = arg.data != nil && is_type_string(arg.type_info);
+	prev_string := false;
+	for i := 0; i < args.count; i++ {
+		arg := args[i];
+		is_string := arg.data != nil && is_type_string(arg.type_info);
 		if i > 0 && !is_string && !prev_string {
 			bprint_space(buf);
 		}
@@ -575,7 +575,7 @@ proc bprint(buf ^[]byte, args ..any) -> int {
 }
 
 proc bprintln(buf ^[]byte, args ..any) -> int {
-	for var i = 0; i < args.count; i++ {
+	for i := 0; i < args.count; i++ {
 		if i > 0 {
 			append(buf, ' ');
 		}

+ 40 - 40
core/hash.odin

@@ -1,57 +1,57 @@
 proc crc32(data rawptr, len int) -> u32 {
-	var result = ~(0 as u32);
-	var s = slice_ptr(data as ^u8, len);
-	for var i = 0; i < len; i++ {
-		var b = s[i] as u32;
+	result := ~(0 as u32);
+	s := slice_ptr(data as ^u8, len);
+	for i := 0; i < len; i++ {
+		b := s[i] as u32;
 		result = result>>8 ~ __CRC32_TABLE[(result ~ b) & 0xff];
 	}
 	return ~result;
 }
 proc crc64(data rawptr, len int) -> u64 {
-	var result = ~(0 as u64);
-	var s = slice_ptr(data as ^u8, len);
-	for var i = 0; i < len; i++ {
-		var b = s[i] as u64;
+	result := ~(0 as u64);
+	s := slice_ptr(data as ^u8, len);
+	for i := 0; i < len; i++ {
+		b := s[i] as u64;
 		result = result>>8 ~ __CRC64_TABLE[(result ~ b) & 0xff];
 	}
 	return ~result;
 }
 
 proc fnv32(data rawptr, len int) -> u32 {
-	var s = slice_ptr(data as ^u8, len);
+	s := slice_ptr(data as ^u8, len);
 
-	var h u32 = 0x811c9dc5;
-	for var i = 0; i < len; i++ {
+	h :u32 = 0x811c9dc5;
+	for i := 0; i < len; i++ {
 		h = (h * 0x01000193) ~ s[i] as u32;
 	}
 	return h;
 }
 
 proc fnv64(data rawptr, len int) -> u64 {
-	var s = slice_ptr(data as ^u8, len);
+	s := slice_ptr(data as ^u8, len);
 
-	var h u64 = 0xcbf29ce484222325;
-	for var i = 0; i < len; i++ {
+	h :u64 = 0xcbf29ce484222325;
+	for i := 0; i < len; i++ {
 		h = (h * 0x100000001b3) ~ s[i] as u64;
 	}
 	return h;
 }
 
 proc fnv32a(data rawptr, len int) -> u32 {
-	var s = slice_ptr(data as ^u8, len);
+	s := slice_ptr(data as ^u8, len);
 
-	var h u32 = 0x811c9dc5;
-	for var i = 0; i < len; i++ {
+	h :u32 = 0x811c9dc5;
+	for i := 0; i < len; i++ {
 		h = (h ~ s[i] as u32) * 0x01000193;
 	}
 	return h;
 }
 
 proc fnv64a(data rawptr, len int) -> u64 {
-	var s = slice_ptr(data as ^u8, len);
+	s := slice_ptr(data as ^u8, len);
 
-	var h u64 = 0xcbf29ce484222325;
-	for var i = 0; i < len; i++ {
+	h :u64 = 0xcbf29ce484222325;
+	for i := 0; i < len; i++ {
 		h = (h ~ s[i] as u64) * 0x100000001b3;
 	}
 	return h;
@@ -59,19 +59,19 @@ proc fnv64a(data rawptr, len int) -> u64 {
 
 
 proc murmur64(data_ rawptr, len int) -> u64 {
-	const SEED = 0x9747b28c;
+	SEED :: 0x9747b28c;
 
 	when size_of(int) == 8 {
-		const m = 0xc6a4a7935bd1e995;
-		const r = 47;
+		m :: 0xc6a4a7935bd1e995;
+		r :: 47;
 
-		var h u64 = SEED ~ (len as u64 * m);
+		h: u64 = SEED ~ (len as u64 * m);
 
-		var data = slice_ptr(data_ as ^u64, len/size_of(u64));
-		var data2 = slice_ptr(data_ as ^u8, len);
+		data := slice_ptr(data_ as ^u64, len/size_of(u64));
+		data2 := slice_ptr(data_ as ^u8, len);
 
-		for var i = 0; i < data.count; i++ {
-			var k = data[i];
+		for i := 0; i < data.count; i++ {
+			k := data[i];
 
 			k *= m;
 			k ~= k>>r;
@@ -99,17 +99,17 @@ proc murmur64(data_ rawptr, len int) -> u64 {
 
 		return h;
 	} else {
-		const m = 0x5bd1e995;
-		const r = 24;
+		m :: 0x5bd1e995;
+		r :: 24;
 
-		var h1 u32 = SEED as u32 ~ len as u32;
-		var h2 u32 = SEED >> 32;
+		h1: u32 = SEED as u32 ~ len as u32;
+		h2: u32 = SEED >> 32;
 
-		var data = slice_ptr(data_ as ^u32, len/size_of(u32));
+		data := slice_ptr(data_ as ^u32, len/size_of(u32));
 
-		var i = 0;
+		i := 0;
 		for len >= 8 {
-			var k1, k2 u32;
+			k1, k2: u32;
 			k1 = data[i]; i++;
 			k1 *= m;
 			k1 ~= k1>>r;
@@ -128,7 +128,7 @@ proc murmur64(data_ rawptr, len int) -> u64 {
 		}
 
 		if (len >= 4) {
-			var k1 u32;
+			k1: u32;
 			k1 = data[i]; i++;
 			k1 *= m;
 			k1 ~= k1>>r;
@@ -138,7 +138,7 @@ proc murmur64(data_ rawptr, len int) -> u64 {
 			len -= 4;
 		}
 
-		var data8 = slice_ptr((data.data+i) as ^u8, 3); // NOTE(bill): This is unsafe
+		data8 := slice_ptr((data.data+i) as ^u8, 3); // NOTE(bill): This is unsafe
 
 		match len {
 		case 3: h2 ~= data8[2] as u32 << 16; fallthrough;
@@ -157,14 +157,14 @@ proc murmur64(data_ rawptr, len int) -> u64 {
 		h2 ~= h1>>19;
 		h2 *= m;
 
-		var h = (h1 as u64)<<32 | h2 as u64;
+		h := (h1 as u64)<<32 | h2 as u64;
 		return h;
 	}
 }
 
 
 
-var __CRC32_TABLE = [256]u32{
+__CRC32_TABLE := [256]u32{
 	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
 	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
 	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
@@ -230,7 +230,7 @@ var __CRC32_TABLE = [256]u32{
 	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
 	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
 };
-var __CRC64_TABLE = [256]u64{
+__CRC64_TABLE := [256]u64{
 	0x0000000000000000, 0x42f0e1eba9ea3693, 0x85e1c3d753d46d26, 0xc711223cfa3e5bb5,
 	0x493366450e42ecdf, 0x0bc387aea7a8da4c, 0xccd2a5925d9681f9, 0x8e224479f47cb76a,
 	0x9266cc8a1c85d9be, 0xd0962d61b56fef2d, 0x17870f5d4f51b498, 0x5577eeb6e6bb820b,

+ 89 - 91
core/math.odin

@@ -1,22 +1,20 @@
-const {
-	TAU          = 6.28318530717958647692528676655900576;
-	PI           = 3.14159265358979323846264338327950288;
-	ONE_OVER_TAU = 0.636619772367581343075535053490057448;
-	ONE_OVER_PI  = 0.159154943091895335768883763372514362;
+TAU          :: 6.28318530717958647692528676655900576;
+PI           :: 3.14159265358979323846264338327950288;
+ONE_OVER_TAU :: 0.636619772367581343075535053490057448;
+ONE_OVER_PI  :: 0.159154943091895335768883763372514362;
 
-	E            = 2.71828182845904523536;
-	SQRT_TWO     = 1.41421356237309504880168872420969808;
-	SQRT_THREE   = 1.73205080756887729352744634150587236;
-	SQRT_FIVE    = 2.23606797749978969640917366873127623;
+E            :: 2.71828182845904523536;
+SQRT_TWO     :: 1.41421356237309504880168872420969808;
+SQRT_THREE   :: 1.73205080756887729352744634150587236;
+SQRT_FIVE    :: 2.23606797749978969640917366873127623;
 
-	LOG_TWO      = 0.693147180559945309417232121458176568;
-	LOG_TEN      = 2.30258509299404568401799145468436421;
+LOG_TWO      :: 0.693147180559945309417232121458176568;
+LOG_TEN      :: 2.30258509299404568401799145468436421;
 
-	EPSILON      = 1.19209290e-7;
+EPSILON      :: 1.19209290e-7;
 
-	τ = TAU;
-	π = PI;
-}
+τ :: TAU;
+π :: PI;
 
 type {
 	Vec2 [vector 2]f32;
@@ -49,8 +47,8 @@ proc sign64(x f64) -> f64 { if x >= 0 { return +1; } return -1; }
 
 
 proc copy_sign32(x, y f32) -> f32 {
-	var ix = x transmute u32;
-	var iy = y transmute u32;
+	ix := x transmute u32;
+	iy := y transmute u32;
 	ix &= 0x7fffffff;
 	ix |= iy & 0x80000000;
 	return ix transmute f32;
@@ -80,7 +78,7 @@ proc remainder32(x, y f32) -> f32 {
 
 proc fmod32(x, y f32) -> f32 {
 	y = abs(y);
-	var result = remainder32(abs(x), y);
+	result := remainder32(abs(x), y);
 	if sign32(result) < 0 {
 		result += y;
 	}
@@ -94,13 +92,13 @@ proc to_degrees(radians f32) -> f32 { return radians * 360 / TAU; }
 
 
 
-proc dot2(a, b Vec2) -> f32 { var c = a*b; return c.x + c.y; }
-proc dot3(a, b Vec3) -> f32 { var c = a*b; return c.x + c.y + c.z; }
-proc dot4(a, b Vec4) -> f32 { var c = a*b; return c.x + c.y + c.z + c.w; }
+proc dot2(a, b Vec2) -> f32 { c := a*b; return c.x + c.y; }
+proc dot3(a, b Vec3) -> f32 { c := a*b; return c.x + c.y + c.z; }
+proc dot4(a, b Vec4) -> f32 { c := a*b; return c.x + c.y + c.z + c.w; }
 
 proc cross3(x, y Vec3) -> Vec3 {
-	var a = swizzle(x, 1, 2, 0) * swizzle(y, 2, 0, 1);
-	var b = swizzle(x, 2, 0, 1) * swizzle(y, 1, 2, 0);
+	a := swizzle(x, 1, 2, 0) * swizzle(y, 2, 0, 1);
+	b := swizzle(x, 2, 0, 1) * swizzle(y, 1, 2, 0);
 	return a - b;
 }
 
@@ -114,7 +112,7 @@ proc vec3_norm(v Vec3) -> Vec3 { return v / Vec3{vec3_mag(v)}; }
 proc vec4_norm(v Vec4) -> Vec4 { return v / Vec4{vec4_mag(v)}; }
 
 proc vec2_norm0(v Vec2) -> Vec2 {
-	var m = vec2_mag(v);
+	m := vec2_mag(v);
 	if m == 0 {
 		return Vec2{0};
 	}
@@ -122,7 +120,7 @@ proc vec2_norm0(v Vec2) -> Vec2 {
 }
 
 proc vec3_norm0(v Vec3) -> Vec3 {
-	var m = vec3_mag(v);
+	m := vec3_mag(v);
 	if m == 0 {
 		return Vec3{0};
 	}
@@ -130,7 +128,7 @@ proc vec3_norm0(v Vec3) -> Vec3 {
 }
 
 proc vec4_norm0(v Vec4) -> Vec4 {
-	var m = vec4_mag(v);
+	m := vec4_mag(v);
 	if m == 0 {
 		return Vec4{0};
 	}
@@ -149,8 +147,8 @@ proc mat4_identity() -> Mat4 {
 }
 
 proc mat4_transpose(m Mat4) -> Mat4 {
-	for var j = 0; j < 4; j++ {
-		for var i = 0; i < 4; i++ {
+	for j := 0; j < 4; j++ {
+		for i := 0; i < 4; i++ {
 			m[i][j], m[j][i] = m[j][i], m[i][j];
 		}
 	}
@@ -158,9 +156,9 @@ proc mat4_transpose(m Mat4) -> Mat4 {
 }
 
 proc mat4_mul(a, b Mat4) -> Mat4 {
-	var c Mat4;
-	for var j = 0; j < 4; j++ {
-		for var i = 0; i < 4; i++ {
+	c: Mat4;
+	for j := 0; j < 4; j++ {
+		for i := 0; i < 4; i++ {
 			c[j][i] = a[0][i]*b[j][0] +
 			          a[1][i]*b[j][1] +
 			          a[2][i]*b[j][2] +
@@ -180,27 +178,27 @@ proc mat4_mul_vec4(m Mat4, v Vec4) -> Vec4 {
 }
 
 proc mat4_inverse(m Mat4) -> Mat4 {
-	var o Mat4;
-
-	var sf00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
-	var sf01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
-	var sf02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
-	var sf03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
-	var sf04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
-	var sf05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
-	var sf06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
-	var sf07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
-	var sf08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
-	var sf09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
-	var sf10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
-	var sf11 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
-	var sf12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
-	var sf13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
-	var sf14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
-	var sf15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
-	var sf16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
-	var sf17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
-	var sf18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
+	o: Mat4;
+
+	sf00 := m[2][2] * m[3][3] - m[3][2] * m[2][3];
+	sf01 := m[2][1] * m[3][3] - m[3][1] * m[2][3];
+	sf02 := m[2][1] * m[3][2] - m[3][1] * m[2][2];
+	sf03 := m[2][0] * m[3][3] - m[3][0] * m[2][3];
+	sf04 := m[2][0] * m[3][2] - m[3][0] * m[2][2];
+	sf05 := m[2][0] * m[3][1] - m[3][0] * m[2][1];
+	sf06 := m[1][2] * m[3][3] - m[3][2] * m[1][3];
+	sf07 := m[1][1] * m[3][3] - m[3][1] * m[1][3];
+	sf08 := m[1][1] * m[3][2] - m[3][1] * m[1][2];
+	sf09 := m[1][0] * m[3][3] - m[3][0] * m[1][3];
+	sf10 := m[1][0] * m[3][2] - m[3][0] * m[1][2];
+	sf11 := m[1][1] * m[3][3] - m[3][1] * m[1][3];
+	sf12 := m[1][0] * m[3][1] - m[3][0] * m[1][1];
+	sf13 := m[1][2] * m[2][3] - m[2][2] * m[1][3];
+	sf14 := m[1][1] * m[2][3] - m[2][1] * m[1][3];
+	sf15 := m[1][1] * m[2][2] - m[2][1] * m[1][2];
+	sf16 := m[1][0] * m[2][3] - m[2][0] * m[1][3];
+	sf17 := m[1][0] * m[2][2] - m[2][0] * m[1][2];
+	sf18 := m[1][0] * m[2][1] - m[2][0] * m[1][1];
 
 	o[0][0] = +(m[1][1] * sf00 - m[1][2] * sf01 + m[1][3] * sf02);
 	o[0][1] = -(m[1][0] * sf00 - m[1][2] * sf03 + m[1][3] * sf04);
@@ -222,7 +220,7 @@ proc mat4_inverse(m Mat4) -> Mat4 {
 	o[3][2] = -(m[0][0] * sf14 - m[0][1] * sf16 + m[0][3] * sf18);
 	o[3][3] = +(m[0][0] * sf15 - m[0][1] * sf17 + m[0][2] * sf18);
 
-	var ood = 1.0 / (m[0][0] * o[0][0] +
+	ood := 1.0 / (m[0][0] * o[0][0] +
 	              m[0][1] * o[0][1] +
 	              m[0][2] * o[0][2] +
 	              m[0][3] * o[0][3]);
@@ -249,7 +247,7 @@ proc mat4_inverse(m Mat4) -> Mat4 {
 
 
 proc mat4_translate(v Vec3) -> Mat4 {
-	var m = mat4_identity();
+	m := mat4_identity();
 	m[3][0] = v.x;
 	m[3][1] = v.y;
 	m[3][2] = v.z;
@@ -258,13 +256,13 @@ proc mat4_translate(v Vec3) -> Mat4 {
 }
 
 proc mat4_rotate(v Vec3, angle_radians f32) -> Mat4 {
-	var c = cos32(angle_radians);
-	var s = sin32(angle_radians);
+	c := cos32(angle_radians);
+	s := sin32(angle_radians);
 
-	var a = vec3_norm(v);
-	var t = a * Vec3{1-c};
+	a := vec3_norm(v);
+	t := a * Vec3{1-c};
 
-	var rot = mat4_identity();
+	rot := mat4_identity();
 
 	rot[0][0] = c + t.x*a.x;
 	rot[0][1] = 0 + t.x*a.y + s*a.z;
@@ -300,11 +298,11 @@ proc mat4_scalef(m Mat4, s f32) -> Mat4 {
 
 
 proc mat4_look_at(eye, centre, up Vec3) -> Mat4 {
-	var f = vec3_norm(centre - eye);
-	var s = vec3_norm(cross3(f, up));
-	var u = cross3(s, f);
+	f := vec3_norm(centre - eye);
+	s := vec3_norm(cross3(f, up));
+	u := cross3(s, f);
 
-	var m Mat4;
+	m: Mat4;
 
 	m[0] = Vec4{+s.x, +s.y, +s.z, 0};
 	m[1] = Vec4{+u.x, +u.y, +u.z, 0};
@@ -314,8 +312,8 @@ proc mat4_look_at(eye, centre, up Vec3) -> Mat4 {
 	return m;
 }
 proc mat4_perspective(fovy, aspect, near, far f32) -> Mat4 {
-	var m Mat4;
-	var tan_half_fovy = tan32(0.5 * fovy);
+	m: Mat4;
+	tan_half_fovy := tan32(0.5 * fovy);
 	m[0][0] = 1.0 / (aspect*tan_half_fovy);
 	m[1][1] = 1.0 / (tan_half_fovy);
 	m[2][2] = -(far + near) / (far - near);
@@ -326,7 +324,7 @@ proc mat4_perspective(fovy, aspect, near, far f32) -> Mat4 {
 
 
 proc mat4_ortho3d(left, right, bottom, top, near, far f32) -> Mat4 {
-	var m = mat4_identity();
+	m := mat4_identity();
 	m[0][0] = +2.0 / (right - left);
 	m[1][1] = +2.0 / (top - bottom);
 	m[2][2] = -2.0 / (far - near);
@@ -340,31 +338,31 @@ proc mat4_ortho3d(left, right, bottom, top, near, far f32) -> Mat4 {
 
 
 
-const F32_DIG        = 6;
-const F32_EPSILON    = 1.192092896e-07;
-const F32_GUARD      = 0;
-const F32_MANT_DIG   = 24;
-const F32_MAX        = 3.402823466e+38;
-const F32_MAX_10_EXP = 38;
-const F32_MAX_EXP    = 128;
-const F32_MIN        = 1.175494351e-38;
-const F32_MIN_10_EXP = -37;
-const F32_MIN_EXP    = -125;
-const F32_NORMALIZE  = 0;
-const F32_RADIX      = 2;
-const F32_ROUNDS     = 1;
-
-const F64_DIG        = 15;                       // # of decimal digits of precision
-const F64_EPSILON    = 2.2204460492503131e-016;  // smallest such that 1.0+F64_EPSILON != 1.0
-const F64_MANT_DIG   = 53;                       // # of bits in mantissa
-const F64_MAX        = 1.7976931348623158e+308;  // max value
-const F64_MAX_10_EXP = 308;                      // max decimal exponent
-const F64_MAX_EXP    = 1024;                     // max binary exponent
-const F64_MIN        = 2.2250738585072014e-308;  // min positive value
-const F64_MIN_10_EXP = -307;                     // min decimal exponent
-const F64_MIN_EXP    = -1021;                    // min binary exponent
-const F64_RADIX      = 2;                        // exponent radix
-const F64_ROUNDS     = 1;                        // addition rounding: near
+F32_DIG        :: 6;
+F32_EPSILON    :: 1.192092896e-07;
+F32_GUARD      :: 0;
+F32_MANT_DIG   :: 24;
+F32_MAX        :: 3.402823466e+38;
+F32_MAX_10_EXP :: 38;
+F32_MAX_EXP    :: 128;
+F32_MIN        :: 1.175494351e-38;
+F32_MIN_10_EXP :: -37;
+F32_MIN_EXP    :: -125;
+F32_NORMALIZE  :: 0;
+F32_RADIX      :: 2;
+F32_ROUNDS     :: 1;
+
+F64_DIG        :: 15;                       // # of decimal digits of precision
+F64_EPSILON    :: 2.2204460492503131e-016;  // smallest such that 1.0+F64_EPSILON != 1.0
+F64_MANT_DIG   :: 53;                       // # of bits in mantissa
+F64_MAX        :: 1.7976931348623158e+308;  // max value
+F64_MAX_10_EXP :: 308;                      // max decimal exponent
+F64_MAX_EXP    :: 1024;                     // max binary exponent
+F64_MIN        :: 2.2250738585072014e-308;  // min positive value
+F64_MIN_10_EXP :: -307;                     // min decimal exponent
+F64_MIN_EXP    :: -1021;                    // min binary exponent
+F64_RADIX      :: 2;                        // exponent radix
+F64_ROUNDS     :: 1;                        // addition rounding: near
 
 
 

+ 34 - 34
core/mem.odin

@@ -30,22 +30,22 @@ proc copy_non_overlapping(dst, src rawptr, len int) -> rawptr #link_name "__mem_
 
 proc compare(dst, src rawptr, n int) -> int #link_name "__mem_compare" {
 	// Translation of http://mgronhol.github.io/fast-strcmp/
-	var a = slice_ptr(dst as ^byte, n);
-	var b = slice_ptr(src as ^byte, n);
+	a := slice_ptr(dst as ^byte, n);
+	b := slice_ptr(src as ^byte, n);
 
-	var fast = n/size_of(int) + 1;
-	var offset = (fast-1)*size_of(int);
-	var curr_block = 0;
+	fast := n/size_of(int) + 1;
+	offset := (fast-1)*size_of(int);
+	curr_block := 0;
 	if n <= size_of(int) {
 		fast = 0;
 	}
 
-	var la = slice_ptr(^a[0] as ^int, fast);
-	var lb = slice_ptr(^b[0] as ^int, fast);
+	la := slice_ptr(^a[0] as ^int, fast);
+	lb := slice_ptr(^b[0] as ^int, fast);
 
 	for ; curr_block < fast; curr_block++ {
 		if (la[curr_block] ~ lb[curr_block]) != 0 {
-			for var pos = curr_block*size_of(int); pos < n; pos++ {
+			for pos := curr_block*size_of(int); pos < n; pos++ {
 				if (a[pos] ~ b[pos]) != 0 {
 					return a[pos] as int - b[pos] as int;
 				}
@@ -80,9 +80,9 @@ proc is_power_of_two(x int) -> bool {
 proc align_forward(ptr rawptr, align int) -> rawptr {
 	assert(is_power_of_two(align));
 
-	var a = align as uint;
-	var p = ptr as uint;
-	var modulo = p & (a-1);
+	a := align as uint;
+	p := ptr as uint;
+	modulo := p & (a-1);
 	if modulo != 0 {
 		p += a - modulo;
 	}
@@ -97,14 +97,14 @@ type Allocation_Header struct {
 
 proc allocation_header_fill(header ^Allocation_Header, data rawptr, size int) {
 	header.size = size;
-	var ptr = (header+1) as ^int;
+	ptr := (header+1) as ^int;
 
-	for var i = 0; ptr as rawptr < data; i++ {
+	for i := 0; ptr as rawptr < data; i++ {
 		(ptr+i)^ = -1;
 	}
 }
 proc allocation_header(data rawptr) -> ^Allocation_Header {
-	var p = data as ^int;
+	p := data as ^int;
 	for (p-1)^ == -1 {
 		p = (p-1);
 	}
@@ -164,20 +164,20 @@ proc arena_allocator_proc(allocator_data rawptr, mode Allocator_Mode,
                           size, alignment int,
                           old_memory rawptr, old_size int, flags u64) -> rawptr {
 	using Allocator_Mode;
-	var arena = allocator_data as ^Arena;
+	arena := allocator_data as ^Arena;
 
 	match mode {
 	case ALLOC:
-		var total_size = size + alignment;
+		total_size := size + alignment;
 
 		if arena.memory.count + total_size > arena.memory.capacity {
 			fmt.fprintln(os.stderr, "Arena out of memory");
 			return nil;
 		}
 
-		#no_bounds_check var end = ^arena.memory[arena.memory.count];
+		#no_bounds_check end := ^arena.memory[arena.memory.count];
 
-		var ptr = align_forward(end, alignment);
+		ptr := align_forward(end, alignment);
 		arena.memory.count += total_size;
 		return zero(ptr, size);
 
@@ -196,7 +196,7 @@ proc arena_allocator_proc(allocator_data rawptr, mode Allocator_Mode,
 }
 
 proc begin_arena_temp_memory(a ^Arena) -> Arena_Temp_Memory {
-	var tmp Arena_Temp_Memory;
+	tmp: Arena_Temp_Memory;
 	tmp.arena = a;
 	tmp.original_count = a.memory.count;
 	a.temp_count++;
@@ -230,8 +230,8 @@ proc align_of_type_info(type_info ^Type_Info) -> int {
 		return n - (n >> 1);
 	}
 
-	const WORD_SIZE = size_of(int);
-	const MAX_ALIGN = size_of([vector 64]f64); // TODO(bill): Should these constants be builtin constants?
+	WORD_SIZE :: size_of(int);
+	MAX_ALIGN :: size_of([vector 64]f64); // TODO(bill): Should these constants be builtin constants?
 	using Type_Info;
 
 	match type info : type_info {
@@ -256,9 +256,9 @@ proc align_of_type_info(type_info ^Type_Info) -> int {
 	case Slice:
 		return WORD_SIZE;
 	case Vector:
-		var size = size_of_type_info(info.elem);
-		var count = max(prev_pow2(info.count as i64), 1) as int;
-		var total = size * count;
+		size := size_of_type_info(info.elem);
+		count := max(prev_pow2(info.count as i64), 1) as int;
+		total := size * count;
 		return clamp(total, 1, MAX_ALIGN);
 	case Struct:
 		return info.align;
@@ -272,12 +272,12 @@ proc align_of_type_info(type_info ^Type_Info) -> int {
 }
 
 proc align_formula(size, align int) -> int {
-	var result = size + align-1;
+	result := size + align-1;
 	return result - result%align;
 }
 
 proc size_of_type_info(type_info ^Type_Info) -> int {
-	const WORD_SIZE = size_of(int);
+	WORD_SIZE :: size_of(int);
 	using Type_Info;
 	match type info : type_info {
 	case Named:
@@ -299,13 +299,13 @@ proc size_of_type_info(type_info ^Type_Info) -> int {
 	case Procedure:
 		return WORD_SIZE;
 	case Array:
-		var count = info.count;
+		count := info.count;
 		if count == 0 {
 			return 0;
 		}
-		var size      = size_of_type_info(info.elem);
-		var align     = align_of_type_info(info.elem);
-		var alignment = align_formula(size, align);
+		size      := size_of_type_info(info.elem);
+		align     := align_of_type_info(info.elem);
+		alignment := align_formula(size, align);
 		return alignment*(count-1) + size;
 	case Slice:
 		return 3*WORD_SIZE;
@@ -320,18 +320,18 @@ proc size_of_type_info(type_info ^Type_Info) -> int {
 			return false;
 		}
 
-		var count = info.count;
+		count := info.count;
 		if count == 0 {
 			return 0;
 		}
-		var bit_size = 8*size_of_type_info(info.elem);
+		bit_size := 8*size_of_type_info(info.elem);
 		if is_bool(info.elem) {
 			// NOTE(bill): LLVM can store booleans as 1 bit because a boolean _is_ an `i1`
 			// Silly LLVM spec
 			bit_size = 1;
 		}
-		var total_size_in_bits = bit_size * count;
-		var total_size = (total_size_in_bits+7)/8;
+		total_size_in_bits := bit_size * count;
+		total_size := (total_size_in_bits+7)/8;
 		return total_size;
 
 	case Struct:

+ 59 - 61
core/opengl.odin

@@ -30,76 +30,74 @@ proc GetIntegerv(name i32, v ^i32) #foreign "glGetIntegerv"
 
 
 
-var _libgl = win32.LoadLibraryA(("opengl32.dll\x00" as string).data);
+_libgl := win32.LoadLibraryA(("opengl32.dll\x00" as string).data);
 
 proc GetProcAddress(name string) -> proc() #cc_c {
 	assert(name[name.count-1] == 0);
-	var res = win32.wglGetProcAddress(name.data);
+	res := win32.wglGetProcAddress(name.data);
 	if res == nil {
 		res = win32.GetProcAddress(_libgl, name.data);
 	}
 	return res;
 }
 
-var {
-	GenBuffers      proc(count i32, buffers ^u32) #cc_c;
-	GenVertexArrays proc(count i32, buffers ^u32) #cc_c;
-	GenSamplers     proc(count i32, buffers ^u32) #cc_c;
-	BindBuffer      proc(target i32, buffer u32) #cc_c;
-	BindVertexArray proc(buffer u32) #cc_c;
-	BindSampler     proc(position i32, sampler u32) #cc_c;
-	BufferData      proc(target i32, size int, data rawptr, usage i32) #cc_c;
-	BufferSubData   proc(target i32, offset, size int, data rawptr) #cc_c;
-
-	DrawArrays      proc(mode, first i32, count u32) #cc_c;
-	DrawElements    proc(mode i32, count u32, type_ i32, indices rawptr) #cc_c;
-
-	MapBuffer       proc(target, access i32) -> rawptr #cc_c;
-	UnmapBuffer     proc(target i32) #cc_c;
-
-	VertexAttribPointer proc(index u32, size, type_ i32, normalized i32, stride u32, pointer rawptr) #cc_c;
-	EnableVertexAttribArray proc(index u32) #cc_c;
-
-	CreateShader  proc(shader_type i32) -> u32 #cc_c;
-	ShaderSource  proc(shader u32, count u32, str ^^byte, length ^i32) #cc_c;
-	CompileShader proc(shader u32) #cc_c;
-	CreateProgram proc() -> u32 #cc_c;
-	AttachShader  proc(program, shader u32) #cc_c;
-	DetachShader  proc(program, shader u32) #cc_c;
-	DeleteShader  proc(shader u32) #cc_c;
-	LinkProgram   proc(program u32) #cc_c;
-	UseProgram    proc(program u32) #cc_c;
-	DeleteProgram proc(program u32) #cc_c;
-
-
-	GetShaderiv       proc(shader  u32, pname i32, params ^i32) #cc_c;
-	GetProgramiv      proc(program u32, pname i32, params ^i32) #cc_c;
-	GetShaderInfoLog  proc(shader  u32, max_length u32, length ^u32, info_long ^byte) #cc_c;
-	GetProgramInfoLog proc(program u32, max_length u32, length ^u32, info_long ^byte) #cc_c;
-
-	ActiveTexture  proc(texture i32) #cc_c;
-	GenerateMipmap proc(target i32) #cc_c;
-
-	SamplerParameteri    proc(sampler u32, pname i32, param i32) #cc_c;
-	SamplerParameterf    proc(sampler u32, pname i32, param f32) #cc_c;
-	SamplerParameteriv   proc(sampler u32, pname i32, params ^i32) #cc_c;
-	SamplerParameterfv   proc(sampler u32, pname i32, params ^f32) #cc_c;
-	SamplerParameterIiv  proc(sampler u32, pname i32, params ^i32) #cc_c;
-	SamplerParameterIuiv proc(sampler u32, pname i32, params ^u32) #cc_c;
-
-
-	Uniform1i        proc(loc i32, v0 i32) #cc_c;
-	Uniform2i        proc(loc i32, v0, v1 i32) #cc_c;
-	Uniform3i        proc(loc i32, v0, v1, v2 i32) #cc_c;
-	Uniform4i        proc(loc i32, v0, v1, v2, v3 i32) #cc_c;
-	Uniform1f        proc(loc i32, v0 f32) #cc_c;
-	Uniform2f        proc(loc i32, v0, v1 f32) #cc_c;
-	Uniform3f        proc(loc i32, v0, v1, v2 f32) #cc_c;
-	Uniform4f        proc(loc i32, v0, v1, v2, v3 f32) #cc_c;
-	UniformMatrix4fv proc(loc i32, count u32, transpose i32, value ^f32) #cc_c;
-
-	GetUniformLocation proc(program u32, name ^byte) -> i32 #cc_c;
-}
+GenBuffers:       proc(count i32, buffers ^u32) #cc_c;
+GenVertexArrays:  proc(count i32, buffers ^u32) #cc_c;
+GenSamplers:      proc(count i32, buffers ^u32) #cc_c;
+BindBuffer:       proc(target i32, buffer u32) #cc_c;
+BindVertexArray:  proc(buffer u32) #cc_c;
+BindSampler:      proc(position i32, sampler u32) #cc_c;
+BufferData:       proc(target i32, size int, data rawptr, usage i32) #cc_c;
+BufferSubData:    proc(target i32, offset, size int, data rawptr) #cc_c;
+
+DrawArrays:       proc(mode, first i32, count u32) #cc_c;
+DrawElements:     proc(mode i32, count u32, type_ i32, indices rawptr) #cc_c;
+
+MapBuffer:        proc(target, access i32) -> rawptr #cc_c;
+UnmapBuffer:      proc(target i32) #cc_c;
+
+VertexAttribPointer:  proc(index u32, size, type_ i32, normalized i32, stride u32, pointer rawptr) #cc_c;
+EnableVertexAttribArray:  proc(index u32) #cc_c;
+
+CreateShader:   proc(shader_type i32) -> u32 #cc_c;
+ShaderSource:   proc(shader u32, count u32, str ^^byte, length ^i32) #cc_c;
+CompileShader:  proc(shader u32) #cc_c;
+CreateProgram:  proc() -> u32 #cc_c;
+AttachShader:   proc(program, shader u32) #cc_c;
+DetachShader:   proc(program, shader u32) #cc_c;
+DeleteShader:   proc(shader u32) #cc_c;
+LinkProgram:    proc(program u32) #cc_c;
+UseProgram:     proc(program u32) #cc_c;
+DeleteProgram:  proc(program u32) #cc_c;
+
+
+GetShaderiv:        proc(shader  u32, pname i32, params ^i32) #cc_c;
+GetProgramiv:       proc(program u32, pname i32, params ^i32) #cc_c;
+GetShaderInfoLog:   proc(shader  u32, max_length u32, length ^u32, info_long ^byte) #cc_c;
+GetProgramInfoLog:  proc(program u32, max_length u32, length ^u32, info_long ^byte) #cc_c;
+
+ActiveTexture:   proc(texture i32) #cc_c;
+GenerateMipmap:  proc(target i32) #cc_c;
+
+SamplerParameteri:     proc(sampler u32, pname i32, param i32) #cc_c;
+SamplerParameterf:     proc(sampler u32, pname i32, param f32) #cc_c;
+SamplerParameteriv:    proc(sampler u32, pname i32, params ^i32) #cc_c;
+SamplerParameterfv:    proc(sampler u32, pname i32, params ^f32) #cc_c;
+SamplerParameterIiv:   proc(sampler u32, pname i32, params ^i32) #cc_c;
+SamplerParameterIuiv:  proc(sampler u32, pname i32, params ^u32) #cc_c;
+
+
+Uniform1i:         proc(loc i32, v0 i32) #cc_c;
+Uniform2i:         proc(loc i32, v0, v1 i32) #cc_c;
+Uniform3i:         proc(loc i32, v0, v1, v2 i32) #cc_c;
+Uniform4i:         proc(loc i32, v0, v1, v2, v3 i32) #cc_c;
+Uniform1f:         proc(loc i32, v0 f32) #cc_c;
+Uniform2f:         proc(loc i32, v0, v1 f32) #cc_c;
+Uniform3f:         proc(loc i32, v0, v1, v2 f32) #cc_c;
+Uniform4f:         proc(loc i32, v0, v1, v2, v3 f32) #cc_c;
+UniformMatrix4fv:  proc(loc i32, count u32, transpose i32, value ^f32) #cc_c;
+
+GetUniformLocation:  proc(program u32, name ^byte) -> i32 #cc_c;
 
 proc init() {
 	proc set_proc_address(p rawptr, name string) #inline { (p as ^(proc() #cc_c))^ = GetProcAddress(name); }

+ 1367 - 1367
core/opengl_constants.odin

@@ -1,1385 +1,1385 @@
-const {
-	FALSE                          = 0;
-	TRUE                           = 1;
 
-	DEPTH_BUFFER_BIT               = 0x00000100;
-	STENCIL_BUFFER_BIT             = 0x00000400;
-	COLOR_BUFFER_BIT               = 0x00004000;
-	POINTS                         = 0x0000;
-	LINES                          = 0x0001;
-	LINE_LOOP                      = 0x0002;
-	LINE_STRIP                     = 0x0003;
-	TRIANGLES                      = 0x0004;
-	TRIANGLE_STRIP                 = 0x0005;
-	TRIANGLE_FAN                   = 0x0006;
-	QUADS                          = 0x0007;
-	NEVER                          = 0x0200;
-	LESS                           = 0x0201;
-	EQUAL                          = 0x0202;
-	LEQUAL                         = 0x0203;
-	GREATER                        = 0x0204;
-	NOTEQUAL                       = 0x0205;
-	GEQUAL                         = 0x0206;
-	ALWAYS                         = 0x0207;
-	ZERO                           = 0;
-	ONE                            = 1;
-	SRC_COLOR                      = 0x0300;
-	ONE_MINUS_SRC_COLOR            = 0x0301;
-	SRC_ALPHA                      = 0x0302;
-	ONE_MINUS_SRC_ALPHA            = 0x0303;
-	DST_ALPHA                      = 0x0304;
-	ONE_MINUS_DST_ALPHA            = 0x0305;
-	DST_COLOR                      = 0x0306;
-	ONE_MINUS_DST_COLOR            = 0x0307;
-	SRC_ALPHA_SATURATE             = 0x0308;
-	NONE                           = 0;
-	FRONT_LEFT                     = 0x0400;
-	FRONT_RIGHT                    = 0x0401;
-	BACK_LEFT                      = 0x0402;
-	BACK_RIGHT                     = 0x0403;
-	FRONT                          = 0x0404;
-	BACK                           = 0x0405;
-	LEFT                           = 0x0406;
-	RIGHT                          = 0x0407;
-	FRONT_AND_BACK                 = 0x0408;
-	NO_ERROR                       = 0;
-	INVALID_ENUM                   = 0x0500;
-	INVALID_VALUE                  = 0x0501;
-	INVALID_OPERATION              = 0x0502;
-	OUT_OF_MEMORY                  = 0x0505;
-	CW                             = 0x0900;
-	CCW                            = 0x0901;
-	POINT_SIZE                     = 0x0B11;
-	POINT_SIZE_RANGE               = 0x0B12;
-	POINT_SIZE_GRANULARITY         = 0x0B13;
-	LINE_SMOOTH                    = 0x0B20;
-	LINE_WIDTH                     = 0x0B21;
-	LINE_WIDTH_RANGE               = 0x0B22;
-	LINE_WIDTH_GRANULARITY         = 0x0B23;
-	POLYGON_MODE                   = 0x0B40;
-	POLYGON_SMOOTH                 = 0x0B41;
-	CULL_FACE                      = 0x0B44;
-	CULL_FACE_MODE                 = 0x0B45;
-	FRONT_FACE                     = 0x0B46;
-	DEPTH_RANGE                    = 0x0B70;
-	DEPTH_TEST                     = 0x0B71;
-	DEPTH_WRITEMASK                = 0x0B72;
-	DEPTH_CLEAR_VALUE              = 0x0B73;
-	DEPTH_FUNC                     = 0x0B74;
-	STENCIL_TEST                   = 0x0B90;
-	STENCIL_CLEAR_VALUE            = 0x0B91;
-	STENCIL_FUNC                   = 0x0B92;
-	STENCIL_VALUE_MASK             = 0x0B93;
-	STENCIL_FAIL                   = 0x0B94;
-	STENCIL_PASS_DEPTH_FAIL        = 0x0B95;
-	STENCIL_PASS_DEPTH_PASS        = 0x0B96;
-	STENCIL_REF                    = 0x0B97;
-	STENCIL_WRITEMASK              = 0x0B98;
-	VIEWPORT                       = 0x0BA2;
-	DITHER                         = 0x0BD0;
-	BLEND_DST                      = 0x0BE0;
-	BLEND_SRC                      = 0x0BE1;
-	BLEND                          = 0x0BE2;
-	LOGIC_OP_MODE                  = 0x0BF0;
-	COLOR_LOGIC_OP                 = 0x0BF2;
-	DRAW_BUFFER                    = 0x0C01;
-	READ_BUFFER                    = 0x0C02;
-	SCISSOR_BOX                    = 0x0C10;
-	SCISSOR_TEST                   = 0x0C11;
-	COLOR_CLEAR_VALUE              = 0x0C22;
-	COLOR_WRITEMASK                = 0x0C23;
-	DOUBLEBUFFER                   = 0x0C32;
-	STEREO                         = 0x0C33;
-	LINE_SMOOTH_HINT               = 0x0C52;
-	POLYGON_SMOOTH_HINT            = 0x0C53;
-	UNPACK_SWAP_BYTES              = 0x0CF0;
-	UNPACK_LSB_FIRST               = 0x0CF1;
-	UNPACK_ROW_LENGTH              = 0x0CF2;
-	UNPACK_SKIP_ROWS               = 0x0CF3;
-	UNPACK_SKIP_PIXELS             = 0x0CF4;
-	UNPACK_ALIGNMENT               = 0x0CF5;
-	PACK_SWAP_BYTES                = 0x0D00;
-	PACK_LSB_FIRST                 = 0x0D01;
-	PACK_ROW_LENGTH                = 0x0D02;
-	PACK_SKIP_ROWS                 = 0x0D03;
-	PACK_SKIP_PIXELS               = 0x0D04;
-	PACK_ALIGNMENT                 = 0x0D05;
-	MAX_TEXTURE_SIZE               = 0x0D33;
-	MAX_VIEWPORT_DIMS              = 0x0D3A;
-	SUBPIXEL_BITS                  = 0x0D50;
-	TEXTURE_1D                     = 0x0DE0;
-	TEXTURE_2D                     = 0x0DE1;
-	POLYGON_OFFSET_UNITS           = 0x2A00;
-	POLYGON_OFFSET_POINT           = 0x2A01;
-	POLYGON_OFFSET_LINE            = 0x2A02;
-	POLYGON_OFFSET_FILL            = 0x8037;
-	POLYGON_OFFSET_FACTOR          = 0x8038;
-	TEXTURE_BINDING_1D             = 0x8068;
-	TEXTURE_BINDING_2D             = 0x8069;
-	TEXTURE_WIDTH                  = 0x1000;
-	TEXTURE_HEIGHT                 = 0x1001;
-	TEXTURE_INTERNAL_FORMAT        = 0x1003;
-	TEXTURE_BORDER_COLOR           = 0x1004;
-	TEXTURE_RED_SIZE               = 0x805C;
-	TEXTURE_GREEN_SIZE             = 0x805D;
-	TEXTURE_BLUE_SIZE              = 0x805E;
-	TEXTURE_ALPHA_SIZE             = 0x805F;
-	DONT_CARE                      = 0x1100;
-	FASTEST                        = 0x1101;
-	NICEST                         = 0x1102;
-	BYTE                           = 0x1400;
-	UNSIGNED_BYTE                  = 0x1401;
-	SHORT                          = 0x1402;
-	UNSIGNED_SHORT                 = 0x1403;
-	INT                            = 0x1404;
-	UNSIGNED_INT                   = 0x1405;
-	FLOAT                          = 0x1406;
-	DOUBLE                         = 0x140A;
-	STACK_OVERFLOW                 = 0x0503;
-	STACK_UNDERFLOW                = 0x0504;
-	CLEAR                          = 0x1500;
-	AND                            = 0x1501;
-	AND_REVERSE                    = 0x1502;
-	COPY                           = 0x1503;
-	AND_INVERTED                   = 0x1504;
-	NOOP                           = 0x1505;
-	XOR                            = 0x1506;
-	OR                             = 0x1507;
-	NOR                            = 0x1508;
-	EQUIV                          = 0x1509;
-	INVERT                         = 0x150A;
-	OR_REVERSE                     = 0x150B;
-	COPY_INVERTED                  = 0x150C;
-	OR_INVERTED                    = 0x150D;
-	NAND                           = 0x150E;
-	SET                            = 0x150F;
-	TEXTURE                        = 0x1702;
-	COLOR                          = 0x1800;
-	DEPTH                          = 0x1801;
-	STENCIL                        = 0x1802;
-	STENCIL_INDEX                  = 0x1901;
-	DEPTH_COMPONENT                = 0x1902;
-	RED                            = 0x1903;
-	GREEN                          = 0x1904;
-	BLUE                           = 0x1905;
-	ALPHA                          = 0x1906;
-	RGB                            = 0x1907;
-	RGBA                           = 0x1908;
-	POINT                          = 0x1B00;
-	LINE                           = 0x1B01;
-	FILL                           = 0x1B02;
-	KEEP                           = 0x1E00;
-	REPLACE                        = 0x1E01;
-	INCR                           = 0x1E02;
-	DECR                           = 0x1E03;
-	VENDOR                         = 0x1F00;
-	RENDERER                       = 0x1F01;
-	VERSION                        = 0x1F02;
-	EXTENSIONS                     = 0x1F03;
-	NEAREST                        = 0x2600;
-	LINEAR                         = 0x2601;
-	NEAREST_MIPMAP_NEAREST         = 0x2700;
-	LINEAR_MIPMAP_NEAREST          = 0x2701;
-	NEAREST_MIPMAP_LINEAR          = 0x2702;
-	LINEAR_MIPMAP_LINEAR           = 0x2703;
-	TEXTURE_MAG_FILTER             = 0x2800;
-	TEXTURE_MIN_FILTER             = 0x2801;
-	TEXTURE_WRAP_S                 = 0x2802;
-	TEXTURE_WRAP_T                 = 0x2803;
-	PROXY_TEXTURE_1D               = 0x8063;
-	PROXY_TEXTURE_2D               = 0x8064;
-	REPEAT                         = 0x2901;
-	R3_G3_B2                       = 0x2A10;
-	RGB4                           = 0x804F;
-	RGB5                           = 0x8050;
-	RGB8                           = 0x8051;
-	RGB10                          = 0x8052;
-	RGB12                          = 0x8053;
-	RGB16                          = 0x8054;
-	RGBA2                          = 0x8055;
-	RGBA4                          = 0x8056;
-	RGB5_A1                        = 0x8057;
-	RGBA8                          = 0x8058;
-	RGB10_A2                       = 0x8059;
-	RGBA12                         = 0x805A;
-	RGBA16                         = 0x805B;
-	VERTEX_ARRAY                   = 0x8074;
+FALSE                          :: 0;
+TRUE                           :: 1;
 
-	UNSIGNED_BYTE_3_3_2            = 0x8032;
-	UNSIGNED_SHORT_4_4_4_4         = 0x8033;
-	UNSIGNED_SHORT_5_5_5_1         = 0x8034;
-	UNSIGNED_INT_8_8_8_8           = 0x8035;
-	UNSIGNED_INT_10_10_10_2        = 0x8036;
-	TEXTURE_BINDING_3D             = 0x806A;
-	PACK_SKIP_IMAGES               = 0x806B;
-	PACK_IMAGE_HEIGHT              = 0x806C;
-	UNPACK_SKIP_IMAGES             = 0x806D;
-	UNPACK_IMAGE_HEIGHT            = 0x806E;
-	TEXTURE_3D                     = 0x806F;
-	PROXY_TEXTURE_3D               = 0x8070;
-	TEXTURE_DEPTH                  = 0x8071;
-	TEXTURE_WRAP_R                 = 0x8072;
-	MAX_3D_TEXTURE_SIZE            = 0x8073;
-	UNSIGNED_BYTE_2_3_3_REV        = 0x8362;
-	UNSIGNED_SHORT_5_6_5           = 0x8363;
-	UNSIGNED_SHORT_5_6_5_REV       = 0x8364;
-	UNSIGNED_SHORT_4_4_4_4_REV     = 0x8365;
-	UNSIGNED_SHORT_1_5_5_5_REV     = 0x8366;
-	UNSIGNED_INT_8_8_8_8_REV       = 0x8367;
-	UNSIGNED_INT_2_10_10_10_REV    = 0x8368;
-	BGR                            = 0x80E0;
-	BGRA                           = 0x80E1;
-	MAX_ELEMENTS_VERTICES          = 0x80E8;
-	MAX_ELEMENTS_INDICES           = 0x80E9;
-	CLAMP_TO_EDGE                  = 0x812F;
-	TEXTURE_MIN_LOD                = 0x813A;
-	TEXTURE_MAX_LOD                = 0x813B;
-	TEXTURE_BASE_LEVEL             = 0x813C;
-	TEXTURE_MAX_LEVEL              = 0x813D;
-	SMOOTH_POINT_SIZE_RANGE        = 0x0B12;
-	SMOOTH_POINT_SIZE_GRANULARITY  = 0x0B13;
-	SMOOTH_LINE_WIDTH_RANGE        = 0x0B22;
-	SMOOTH_LINE_WIDTH_GRANULARITY  = 0x0B23;
-	ALIASED_LINE_WIDTH_RANGE       = 0x846E;
+DEPTH_BUFFER_BIT               :: 0x00000100;
+STENCIL_BUFFER_BIT             :: 0x00000400;
+COLOR_BUFFER_BIT               :: 0x00004000;
+POINTS                         :: 0x0000;
+LINES                          :: 0x0001;
+LINE_LOOP                      :: 0x0002;
+LINE_STRIP                     :: 0x0003;
+TRIANGLES                      :: 0x0004;
+TRIANGLE_STRIP                 :: 0x0005;
+TRIANGLE_FAN                   :: 0x0006;
+QUADS                          :: 0x0007;
+NEVER                          :: 0x0200;
+LESS                           :: 0x0201;
+EQUAL                          :: 0x0202;
+LEQUAL                         :: 0x0203;
+GREATER                        :: 0x0204;
+NOTEQUAL                       :: 0x0205;
+GEQUAL                         :: 0x0206;
+ALWAYS                         :: 0x0207;
+ZERO                           :: 0;
+ONE                            :: 1;
+SRC_COLOR                      :: 0x0300;
+ONE_MINUS_SRC_COLOR            :: 0x0301;
+SRC_ALPHA                      :: 0x0302;
+ONE_MINUS_SRC_ALPHA            :: 0x0303;
+DST_ALPHA                      :: 0x0304;
+ONE_MINUS_DST_ALPHA            :: 0x0305;
+DST_COLOR                      :: 0x0306;
+ONE_MINUS_DST_COLOR            :: 0x0307;
+SRC_ALPHA_SATURATE             :: 0x0308;
+NONE                           :: 0;
+FRONT_LEFT                     :: 0x0400;
+FRONT_RIGHT                    :: 0x0401;
+BACK_LEFT                      :: 0x0402;
+BACK_RIGHT                     :: 0x0403;
+FRONT                          :: 0x0404;
+BACK                           :: 0x0405;
+LEFT                           :: 0x0406;
+RIGHT                          :: 0x0407;
+FRONT_AND_BACK                 :: 0x0408;
+NO_ERROR                       :: 0;
+INVALID_ENUM                   :: 0x0500;
+INVALID_VALUE                  :: 0x0501;
+INVALID_OPERATION              :: 0x0502;
+OUT_OF_MEMORY                  :: 0x0505;
+CW                             :: 0x0900;
+CCW                            :: 0x0901;
+POINT_SIZE                     :: 0x0B11;
+POINT_SIZE_RANGE               :: 0x0B12;
+POINT_SIZE_GRANULARITY         :: 0x0B13;
+LINE_SMOOTH                    :: 0x0B20;
+LINE_WIDTH                     :: 0x0B21;
+LINE_WIDTH_RANGE               :: 0x0B22;
+LINE_WIDTH_GRANULARITY         :: 0x0B23;
+POLYGON_MODE                   :: 0x0B40;
+POLYGON_SMOOTH                 :: 0x0B41;
+CULL_FACE                      :: 0x0B44;
+CULL_FACE_MODE                 :: 0x0B45;
+FRONT_FACE                     :: 0x0B46;
+DEPTH_RANGE                    :: 0x0B70;
+DEPTH_TEST                     :: 0x0B71;
+DEPTH_WRITEMASK                :: 0x0B72;
+DEPTH_CLEAR_VALUE              :: 0x0B73;
+DEPTH_FUNC                     :: 0x0B74;
+STENCIL_TEST                   :: 0x0B90;
+STENCIL_CLEAR_VALUE            :: 0x0B91;
+STENCIL_FUNC                   :: 0x0B92;
+STENCIL_VALUE_MASK             :: 0x0B93;
+STENCIL_FAIL                   :: 0x0B94;
+STENCIL_PASS_DEPTH_FAIL        :: 0x0B95;
+STENCIL_PASS_DEPTH_PASS        :: 0x0B96;
+STENCIL_REF                    :: 0x0B97;
+STENCIL_WRITEMASK              :: 0x0B98;
+VIEWPORT                       :: 0x0BA2;
+DITHER                         :: 0x0BD0;
+BLEND_DST                      :: 0x0BE0;
+BLEND_SRC                      :: 0x0BE1;
+BLEND                          :: 0x0BE2;
+LOGIC_OP_MODE                  :: 0x0BF0;
+COLOR_LOGIC_OP                 :: 0x0BF2;
+DRAW_BUFFER                    :: 0x0C01;
+READ_BUFFER                    :: 0x0C02;
+SCISSOR_BOX                    :: 0x0C10;
+SCISSOR_TEST                   :: 0x0C11;
+COLOR_CLEAR_VALUE              :: 0x0C22;
+COLOR_WRITEMASK                :: 0x0C23;
+DOUBLEBUFFER                   :: 0x0C32;
+STEREO                         :: 0x0C33;
+LINE_SMOOTH_HINT               :: 0x0C52;
+POLYGON_SMOOTH_HINT            :: 0x0C53;
+UNPACK_SWAP_BYTES              :: 0x0CF0;
+UNPACK_LSB_FIRST               :: 0x0CF1;
+UNPACK_ROW_LENGTH              :: 0x0CF2;
+UNPACK_SKIP_ROWS               :: 0x0CF3;
+UNPACK_SKIP_PIXELS             :: 0x0CF4;
+UNPACK_ALIGNMENT               :: 0x0CF5;
+PACK_SWAP_BYTES                :: 0x0D00;
+PACK_LSB_FIRST                 :: 0x0D01;
+PACK_ROW_LENGTH                :: 0x0D02;
+PACK_SKIP_ROWS                 :: 0x0D03;
+PACK_SKIP_PIXELS               :: 0x0D04;
+PACK_ALIGNMENT                 :: 0x0D05;
+MAX_TEXTURE_SIZE               :: 0x0D33;
+MAX_VIEWPORT_DIMS              :: 0x0D3A;
+SUBPIXEL_BITS                  :: 0x0D50;
+TEXTURE_1D                     :: 0x0DE0;
+TEXTURE_2D                     :: 0x0DE1;
+POLYGON_OFFSET_UNITS           :: 0x2A00;
+POLYGON_OFFSET_POINT           :: 0x2A01;
+POLYGON_OFFSET_LINE            :: 0x2A02;
+POLYGON_OFFSET_FILL            :: 0x8037;
+POLYGON_OFFSET_FACTOR          :: 0x8038;
+TEXTURE_BINDING_1D             :: 0x8068;
+TEXTURE_BINDING_2D             :: 0x8069;
+TEXTURE_WIDTH                  :: 0x1000;
+TEXTURE_HEIGHT                 :: 0x1001;
+TEXTURE_INTERNAL_FORMAT        :: 0x1003;
+TEXTURE_BORDER_COLOR           :: 0x1004;
+TEXTURE_RED_SIZE               :: 0x805C;
+TEXTURE_GREEN_SIZE             :: 0x805D;
+TEXTURE_BLUE_SIZE              :: 0x805E;
+TEXTURE_ALPHA_SIZE             :: 0x805F;
+DONT_CARE                      :: 0x1100;
+FASTEST                        :: 0x1101;
+NICEST                         :: 0x1102;
+BYTE                           :: 0x1400;
+UNSIGNED_BYTE                  :: 0x1401;
+SHORT                          :: 0x1402;
+UNSIGNED_SHORT                 :: 0x1403;
+INT                            :: 0x1404;
+UNSIGNED_INT                   :: 0x1405;
+FLOAT                          :: 0x1406;
+DOUBLE                         :: 0x140A;
+STACK_OVERFLOW                 :: 0x0503;
+STACK_UNDERFLOW                :: 0x0504;
+CLEAR                          :: 0x1500;
+AND                            :: 0x1501;
+AND_REVERSE                    :: 0x1502;
+COPY                           :: 0x1503;
+AND_INVERTED                   :: 0x1504;
+NOOP                           :: 0x1505;
+XOR                            :: 0x1506;
+OR                             :: 0x1507;
+NOR                            :: 0x1508;
+EQUIV                          :: 0x1509;
+INVERT                         :: 0x150A;
+OR_REVERSE                     :: 0x150B;
+COPY_INVERTED                  :: 0x150C;
+OR_INVERTED                    :: 0x150D;
+NAND                           :: 0x150E;
+SET                            :: 0x150F;
+TEXTURE                        :: 0x1702;
+COLOR                          :: 0x1800;
+DEPTH                          :: 0x1801;
+STENCIL                        :: 0x1802;
+STENCIL_INDEX                  :: 0x1901;
+DEPTH_COMPONENT                :: 0x1902;
+RED                            :: 0x1903;
+GREEN                          :: 0x1904;
+BLUE                           :: 0x1905;
+ALPHA                          :: 0x1906;
+RGB                            :: 0x1907;
+RGBA                           :: 0x1908;
+POINT                          :: 0x1B00;
+LINE                           :: 0x1B01;
+FILL                           :: 0x1B02;
+KEEP                           :: 0x1E00;
+REPLACE                        :: 0x1E01;
+INCR                           :: 0x1E02;
+DECR                           :: 0x1E03;
+VENDOR                         :: 0x1F00;
+RENDERER                       :: 0x1F01;
+VERSION                        :: 0x1F02;
+EXTENSIONS                     :: 0x1F03;
+NEAREST                        :: 0x2600;
+LINEAR                         :: 0x2601;
+NEAREST_MIPMAP_NEAREST         :: 0x2700;
+LINEAR_MIPMAP_NEAREST          :: 0x2701;
+NEAREST_MIPMAP_LINEAR          :: 0x2702;
+LINEAR_MIPMAP_LINEAR           :: 0x2703;
+TEXTURE_MAG_FILTER             :: 0x2800;
+TEXTURE_MIN_FILTER             :: 0x2801;
+TEXTURE_WRAP_S                 :: 0x2802;
+TEXTURE_WRAP_T                 :: 0x2803;
+PROXY_TEXTURE_1D               :: 0x8063;
+PROXY_TEXTURE_2D               :: 0x8064;
+REPEAT                         :: 0x2901;
+R3_G3_B2                       :: 0x2A10;
+RGB4                           :: 0x804F;
+RGB5                           :: 0x8050;
+RGB8                           :: 0x8051;
+RGB10                          :: 0x8052;
+RGB12                          :: 0x8053;
+RGB16                          :: 0x8054;
+RGBA2                          :: 0x8055;
+RGBA4                          :: 0x8056;
+RGB5_A1                        :: 0x8057;
+RGBA8                          :: 0x8058;
+RGB10_A2                       :: 0x8059;
+RGBA12                         :: 0x805A;
+RGBA16                         :: 0x805B;
+VERTEX_ARRAY                   :: 0x8074;
 
-	TEXTURE0                       = 0x84C0;
-	TEXTURE1                       = 0x84C1;
-	TEXTURE2                       = 0x84C2;
-	TEXTURE3                       = 0x84C3;
-	TEXTURE4                       = 0x84C4;
-	TEXTURE5                       = 0x84C5;
-	TEXTURE6                       = 0x84C6;
-	TEXTURE7                       = 0x84C7;
-	TEXTURE8                       = 0x84C8;
-	TEXTURE9                       = 0x84C9;
-	TEXTURE10                      = 0x84CA;
-	TEXTURE11                      = 0x84CB;
-	TEXTURE12                      = 0x84CC;
-	TEXTURE13                      = 0x84CD;
-	TEXTURE14                      = 0x84CE;
-	TEXTURE15                      = 0x84CF;
-	TEXTURE16                      = 0x84D0;
-	TEXTURE17                      = 0x84D1;
-	TEXTURE18                      = 0x84D2;
-	TEXTURE19                      = 0x84D3;
-	TEXTURE20                      = 0x84D4;
-	TEXTURE21                      = 0x84D5;
-	TEXTURE22                      = 0x84D6;
-	TEXTURE23                      = 0x84D7;
-	TEXTURE24                      = 0x84D8;
-	TEXTURE25                      = 0x84D9;
-	TEXTURE26                      = 0x84DA;
-	TEXTURE27                      = 0x84DB;
-	TEXTURE28                      = 0x84DC;
-	TEXTURE29                      = 0x84DD;
-	TEXTURE30                      = 0x84DE;
-	TEXTURE31                      = 0x84DF;
-	ACTIVE_TEXTURE                 = 0x84E0;
-	MULTISAMPLE                    = 0x809D;
-	SAMPLE_ALPHA_TO_COVERAGE       = 0x809E;
-	SAMPLE_ALPHA_TO_ONE            = 0x809F;
-	SAMPLE_COVERAGE                = 0x80A0;
-	SAMPLE_BUFFERS                 = 0x80A8;
-	SAMPLES                        = 0x80A9;
-	SAMPLE_COVERAGE_VALUE          = 0x80AA;
-	SAMPLE_COVERAGE_INVERT         = 0x80AB;
-	TEXTURE_CUBE_MAP               = 0x8513;
-	TEXTURE_BINDING_CUBE_MAP       = 0x8514;
-	TEXTURE_CUBE_MAP_POSITIVE_X    = 0x8515;
-	TEXTURE_CUBE_MAP_NEGATIVE_X    = 0x8516;
-	TEXTURE_CUBE_MAP_POSITIVE_Y    = 0x8517;
-	TEXTURE_CUBE_MAP_NEGATIVE_Y    = 0x8518;
-	TEXTURE_CUBE_MAP_POSITIVE_Z    = 0x8519;
-	TEXTURE_CUBE_MAP_NEGATIVE_Z    = 0x851A;
-	PROXY_TEXTURE_CUBE_MAP         = 0x851B;
-	MAX_CUBE_MAP_TEXTURE_SIZE      = 0x851C;
-	COMPRESSED_RGB                 = 0x84ED;
-	COMPRESSED_RGBA                = 0x84EE;
-	TEXTURE_COMPRESSION_HINT       = 0x84EF;
-	TEXTURE_COMPRESSED_IMAGE_SIZE  = 0x86A0;
-	TEXTURE_COMPRESSED             = 0x86A1;
-	NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2;
-	COMPRESSED_TEXTURE_FORMATS     = 0x86A3;
-	CLAMP_TO_BORDER                = 0x812D;
+UNSIGNED_BYTE_3_3_2            :: 0x8032;
+UNSIGNED_SHORT_4_4_4_4         :: 0x8033;
+UNSIGNED_SHORT_5_5_5_1         :: 0x8034;
+UNSIGNED_INT_8_8_8_8           :: 0x8035;
+UNSIGNED_INT_10_10_10_2        :: 0x8036;
+TEXTURE_BINDING_3D             :: 0x806A;
+PACK_SKIP_IMAGES               :: 0x806B;
+PACK_IMAGE_HEIGHT              :: 0x806C;
+UNPACK_SKIP_IMAGES             :: 0x806D;
+UNPACK_IMAGE_HEIGHT            :: 0x806E;
+TEXTURE_3D                     :: 0x806F;
+PROXY_TEXTURE_3D               :: 0x8070;
+TEXTURE_DEPTH                  :: 0x8071;
+TEXTURE_WRAP_R                 :: 0x8072;
+MAX_3D_TEXTURE_SIZE            :: 0x8073;
+UNSIGNED_BYTE_2_3_3_REV        :: 0x8362;
+UNSIGNED_SHORT_5_6_5           :: 0x8363;
+UNSIGNED_SHORT_5_6_5_REV       :: 0x8364;
+UNSIGNED_SHORT_4_4_4_4_REV     :: 0x8365;
+UNSIGNED_SHORT_1_5_5_5_REV     :: 0x8366;
+UNSIGNED_INT_8_8_8_8_REV       :: 0x8367;
+UNSIGNED_INT_2_10_10_10_REV    :: 0x8368;
+BGR                            :: 0x80E0;
+BGRA                           :: 0x80E1;
+MAX_ELEMENTS_VERTICES          :: 0x80E8;
+MAX_ELEMENTS_INDICES           :: 0x80E9;
+CLAMP_TO_EDGE                  :: 0x812F;
+TEXTURE_MIN_LOD                :: 0x813A;
+TEXTURE_MAX_LOD                :: 0x813B;
+TEXTURE_BASE_LEVEL             :: 0x813C;
+TEXTURE_MAX_LEVEL              :: 0x813D;
+SMOOTH_POINT_SIZE_RANGE        :: 0x0B12;
+SMOOTH_POINT_SIZE_GRANULARITY  :: 0x0B13;
+SMOOTH_LINE_WIDTH_RANGE        :: 0x0B22;
+SMOOTH_LINE_WIDTH_GRANULARITY  :: 0x0B23;
+ALIASED_LINE_WIDTH_RANGE       :: 0x846E;
 
-	BLEND_DST_RGB                  = 0x80C8;
-	BLEND_SRC_RGB                  = 0x80C9;
-	BLEND_DST_ALPHA                = 0x80CA;
-	BLEND_SRC_ALPHA                = 0x80CB;
-	POINT_FADE_THRESHOLD_SIZE      = 0x8128;
-	DEPTH_COMPONENT16              = 0x81A5;
-	DEPTH_COMPONENT24              = 0x81A6;
-	DEPTH_COMPONENT32              = 0x81A7;
-	MIRRORED_REPEAT                = 0x8370;
-	MAX_TEXTURE_LOD_BIAS           = 0x84FD;
-	TEXTURE_LOD_BIAS               = 0x8501;
-	INCR_WRAP                      = 0x8507;
-	DECR_WRAP                      = 0x8508;
-	TEXTURE_DEPTH_SIZE             = 0x884A;
-	TEXTURE_COMPARE_MODE           = 0x884C;
-	TEXTURE_COMPARE_FUNC           = 0x884D;
-	FUNC_ADD                       = 0x8006;
-	FUNC_SUBTRACT                  = 0x800A;
-	FUNC_REVERSE_SUBTRACT          = 0x800B;
-	MIN                            = 0x8007;
-	MAX                            = 0x8008;
-	CONSTANT_COLOR                 = 0x8001;
-	ONE_MINUS_CONSTANT_COLOR       = 0x8002;
-	CONSTANT_ALPHA                 = 0x8003;
-	ONE_MINUS_CONSTANT_ALPHA       = 0x8004;
+TEXTURE0                       :: 0x84C0;
+TEXTURE1                       :: 0x84C1;
+TEXTURE2                       :: 0x84C2;
+TEXTURE3                       :: 0x84C3;
+TEXTURE4                       :: 0x84C4;
+TEXTURE5                       :: 0x84C5;
+TEXTURE6                       :: 0x84C6;
+TEXTURE7                       :: 0x84C7;
+TEXTURE8                       :: 0x84C8;
+TEXTURE9                       :: 0x84C9;
+TEXTURE10                      :: 0x84CA;
+TEXTURE11                      :: 0x84CB;
+TEXTURE12                      :: 0x84CC;
+TEXTURE13                      :: 0x84CD;
+TEXTURE14                      :: 0x84CE;
+TEXTURE15                      :: 0x84CF;
+TEXTURE16                      :: 0x84D0;
+TEXTURE17                      :: 0x84D1;
+TEXTURE18                      :: 0x84D2;
+TEXTURE19                      :: 0x84D3;
+TEXTURE20                      :: 0x84D4;
+TEXTURE21                      :: 0x84D5;
+TEXTURE22                      :: 0x84D6;
+TEXTURE23                      :: 0x84D7;
+TEXTURE24                      :: 0x84D8;
+TEXTURE25                      :: 0x84D9;
+TEXTURE26                      :: 0x84DA;
+TEXTURE27                      :: 0x84DB;
+TEXTURE28                      :: 0x84DC;
+TEXTURE29                      :: 0x84DD;
+TEXTURE30                      :: 0x84DE;
+TEXTURE31                      :: 0x84DF;
+ACTIVE_TEXTURE                 :: 0x84E0;
+MULTISAMPLE                    :: 0x809D;
+SAMPLE_ALPHA_TO_COVERAGE       :: 0x809E;
+SAMPLE_ALPHA_TO_ONE            :: 0x809F;
+SAMPLE_COVERAGE                :: 0x80A0;
+SAMPLE_BUFFERS                 :: 0x80A8;
+SAMPLES                        :: 0x80A9;
+SAMPLE_COVERAGE_VALUE          :: 0x80AA;
+SAMPLE_COVERAGE_INVERT         :: 0x80AB;
+TEXTURE_CUBE_MAP               :: 0x8513;
+TEXTURE_BINDING_CUBE_MAP       :: 0x8514;
+TEXTURE_CUBE_MAP_POSITIVE_X    :: 0x8515;
+TEXTURE_CUBE_MAP_NEGATIVE_X    :: 0x8516;
+TEXTURE_CUBE_MAP_POSITIVE_Y    :: 0x8517;
+TEXTURE_CUBE_MAP_NEGATIVE_Y    :: 0x8518;
+TEXTURE_CUBE_MAP_POSITIVE_Z    :: 0x8519;
+TEXTURE_CUBE_MAP_NEGATIVE_Z    :: 0x851A;
+PROXY_TEXTURE_CUBE_MAP         :: 0x851B;
+MAX_CUBE_MAP_TEXTURE_SIZE      :: 0x851C;
+COMPRESSED_RGB                 :: 0x84ED;
+COMPRESSED_RGBA                :: 0x84EE;
+TEXTURE_COMPRESSION_HINT       :: 0x84EF;
+TEXTURE_COMPRESSED_IMAGE_SIZE  :: 0x86A0;
+TEXTURE_COMPRESSED             :: 0x86A1;
+NUM_COMPRESSED_TEXTURE_FORMATS :: 0x86A2;
+COMPRESSED_TEXTURE_FORMATS     :: 0x86A3;
+CLAMP_TO_BORDER                :: 0x812D;
 
-	BUFFER_SIZE                    = 0x8764;
-	BUFFER_USAGE                   = 0x8765;
-	QUERY_COUNTER_BITS             = 0x8864;
-	CURRENT_QUERY                  = 0x8865;
-	QUERY_RESULT                   = 0x8866;
-	QUERY_RESULT_AVAILABLE         = 0x8867;
-	ARRAY_BUFFER                   = 0x8892;
-	ELEMENT_ARRAY_BUFFER           = 0x8893;
-	ARRAY_BUFFER_BINDING           = 0x8894;
-	ELEMENT_ARRAY_BUFFER_BINDING   = 0x8895;
-	VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
-	READ_ONLY                      = 0x88B8;
-	WRITE_ONLY                     = 0x88B9;
-	READ_WRITE                     = 0x88BA;
-	BUFFER_ACCESS                  = 0x88BB;
-	BUFFER_MAPPED                  = 0x88BC;
-	BUFFER_MAP_POINTER             = 0x88BD;
-	STREAM_DRAW                    = 0x88E0;
-	STREAM_READ                    = 0x88E1;
-	STREAM_COPY                    = 0x88E2;
-	STATIC_DRAW                    = 0x88E4;
-	STATIC_READ                    = 0x88E5;
-	STATIC_COPY                    = 0x88E6;
-	DYNAMIC_DRAW                   = 0x88E8;
-	DYNAMIC_READ                   = 0x88E9;
-	DYNAMIC_COPY                   = 0x88EA;
-	SAMPLES_PASSED                 = 0x8914;
-	SRC1_ALPHA                     = 0x8589;
+BLEND_DST_RGB                  :: 0x80C8;
+BLEND_SRC_RGB                  :: 0x80C9;
+BLEND_DST_ALPHA                :: 0x80CA;
+BLEND_SRC_ALPHA                :: 0x80CB;
+POINT_FADE_THRESHOLD_SIZE      :: 0x8128;
+DEPTH_COMPONENT16              :: 0x81A5;
+DEPTH_COMPONENT24              :: 0x81A6;
+DEPTH_COMPONENT32              :: 0x81A7;
+MIRRORED_REPEAT                :: 0x8370;
+MAX_TEXTURE_LOD_BIAS           :: 0x84FD;
+TEXTURE_LOD_BIAS               :: 0x8501;
+INCR_WRAP                      :: 0x8507;
+DECR_WRAP                      :: 0x8508;
+TEXTURE_DEPTH_SIZE             :: 0x884A;
+TEXTURE_COMPARE_MODE           :: 0x884C;
+TEXTURE_COMPARE_FUNC           :: 0x884D;
+FUNC_ADD                       :: 0x8006;
+FUNC_SUBTRACT                  :: 0x800A;
+FUNC_REVERSE_SUBTRACT          :: 0x800B;
+MIN                            :: 0x8007;
+MAX                            :: 0x8008;
+CONSTANT_COLOR                 :: 0x8001;
+ONE_MINUS_CONSTANT_COLOR       :: 0x8002;
+CONSTANT_ALPHA                 :: 0x8003;
+ONE_MINUS_CONSTANT_ALPHA       :: 0x8004;
 
-	BLEND_EQUATION_RGB             = 0x8009;
-	VERTEX_ATTRIB_ARRAY_ENABLED    = 0x8622;
-	VERTEX_ATTRIB_ARRAY_SIZE       = 0x8623;
-	VERTEX_ATTRIB_ARRAY_STRIDE     = 0x8624;
-	VERTEX_ATTRIB_ARRAY_TYPE       = 0x8625;
-	CURRENT_VERTEX_ATTRIB          = 0x8626;
-	VERTEX_PROGRAM_POINT_SIZE      = 0x8642;
-	VERTEX_ATTRIB_ARRAY_POINTER    = 0x8645;
-	STENCIL_BACK_FUNC              = 0x8800;
-	STENCIL_BACK_FAIL              = 0x8801;
-	STENCIL_BACK_PASS_DEPTH_FAIL   = 0x8802;
-	STENCIL_BACK_PASS_DEPTH_PASS   = 0x8803;
-	MAX_DRAW_BUFFERS               = 0x8824;
-	DRAW_BUFFER0                   = 0x8825;
-	DRAW_BUFFER1                   = 0x8826;
-	DRAW_BUFFER2                   = 0x8827;
-	DRAW_BUFFER3                   = 0x8828;
-	DRAW_BUFFER4                   = 0x8829;
-	DRAW_BUFFER5                   = 0x882A;
-	DRAW_BUFFER6                   = 0x882B;
-	DRAW_BUFFER7                   = 0x882C;
-	DRAW_BUFFER8                   = 0x882D;
-	DRAW_BUFFER9                   = 0x882E;
-	DRAW_BUFFER10                  = 0x882F;
-	DRAW_BUFFER11                  = 0x8830;
-	DRAW_BUFFER12                  = 0x8831;
-	DRAW_BUFFER13                  = 0x8832;
-	DRAW_BUFFER14                  = 0x8833;
-	DRAW_BUFFER15                  = 0x8834;
-	BLEND_EQUATION_ALPHA           = 0x883D;
-	MAX_VERTEX_ATTRIBS             = 0x8869;
-	VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
-	MAX_TEXTURE_IMAGE_UNITS        = 0x8872;
-	FRAGMENT_SHADER                = 0x8B30;
-	VERTEX_SHADER                  = 0x8B31;
-	MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49;
-	MAX_VERTEX_UNIFORM_COMPONENTS  = 0x8B4A;
-	MAX_VARYING_FLOATS             = 0x8B4B;
-	MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
-	MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
-	SHADER_TYPE                    = 0x8B4F;
-	FLOAT_VEC2                     = 0x8B50;
-	FLOAT_VEC3                     = 0x8B51;
-	FLOAT_VEC4                     = 0x8B52;
-	INT_VEC2                       = 0x8B53;
-	INT_VEC3                       = 0x8B54;
-	INT_VEC4                       = 0x8B55;
-	BOOL                           = 0x8B56;
-	BOOL_VEC2                      = 0x8B57;
-	BOOL_VEC3                      = 0x8B58;
-	BOOL_VEC4                      = 0x8B59;
-	FLOAT_MAT2                     = 0x8B5A;
-	FLOAT_MAT3                     = 0x8B5B;
-	FLOAT_MAT4                     = 0x8B5C;
-	SAMPLER_1D                     = 0x8B5D;
-	SAMPLER_2D                     = 0x8B5E;
-	SAMPLER_3D                     = 0x8B5F;
-	SAMPLER_CUBE                   = 0x8B60;
-	SAMPLER_1D_SHADOW              = 0x8B61;
-	SAMPLER_2D_SHADOW              = 0x8B62;
-	DELETE_STATUS                  = 0x8B80;
-	COMPILE_STATUS                 = 0x8B81;
-	LINK_STATUS                    = 0x8B82;
-	VALIDATE_STATUS                = 0x8B83;
-	INFO_LOG_LENGTH                = 0x8B84;
-	ATTACHED_SHADERS               = 0x8B85;
-	ACTIVE_UNIFORMS                = 0x8B86;
-	ACTIVE_UNIFORM_MAX_LENGTH      = 0x8B87;
-	SHADER_SOURCE_LENGTH           = 0x8B88;
-	ACTIVE_ATTRIBUTES              = 0x8B89;
-	ACTIVE_ATTRIBUTE_MAX_LENGTH    = 0x8B8A;
-	FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B;
-	SHADING_LANGUAGE_VERSION       = 0x8B8C;
-	CURRENT_PROGRAM                = 0x8B8D;
-	POINT_SPRITE_COORD_ORIGIN      = 0x8CA0;
-	LOWER_LEFT                     = 0x8CA1;
-	UPPER_LEFT                     = 0x8CA2;
-	STENCIL_BACK_REF               = 0x8CA3;
-	STENCIL_BACK_VALUE_MASK        = 0x8CA4;
-	STENCIL_BACK_WRITEMASK         = 0x8CA5;
+BUFFER_SIZE                    :: 0x8764;
+BUFFER_USAGE                   :: 0x8765;
+QUERY_COUNTER_BITS             :: 0x8864;
+CURRENT_QUERY                  :: 0x8865;
+QUERY_RESULT                   :: 0x8866;
+QUERY_RESULT_AVAILABLE         :: 0x8867;
+ARRAY_BUFFER                   :: 0x8892;
+ELEMENT_ARRAY_BUFFER           :: 0x8893;
+ARRAY_BUFFER_BINDING           :: 0x8894;
+ELEMENT_ARRAY_BUFFER_BINDING   :: 0x8895;
+VERTEX_ATTRIB_ARRAY_BUFFER_BINDING :: 0x889F;
+READ_ONLY                      :: 0x88B8;
+WRITE_ONLY                     :: 0x88B9;
+READ_WRITE                     :: 0x88BA;
+BUFFER_ACCESS                  :: 0x88BB;
+BUFFER_MAPPED                  :: 0x88BC;
+BUFFER_MAP_POINTER             :: 0x88BD;
+STREAM_DRAW                    :: 0x88E0;
+STREAM_READ                    :: 0x88E1;
+STREAM_COPY                    :: 0x88E2;
+STATIC_DRAW                    :: 0x88E4;
+STATIC_READ                    :: 0x88E5;
+STATIC_COPY                    :: 0x88E6;
+DYNAMIC_DRAW                   :: 0x88E8;
+DYNAMIC_READ                   :: 0x88E9;
+DYNAMIC_COPY                   :: 0x88EA;
+SAMPLES_PASSED                 :: 0x8914;
+SRC1_ALPHA                     :: 0x8589;
 
-	PIXEL_PACK_BUFFER              = 0x88EB;
-	PIXEL_UNPACK_BUFFER            = 0x88EC;
-	PIXEL_PACK_BUFFER_BINDING      = 0x88ED;
-	PIXEL_UNPACK_BUFFER_BINDING    = 0x88EF;
-	FLOAT_MAT2x3                   = 0x8B65;
-	FLOAT_MAT2x4                   = 0x8B66;
-	FLOAT_MAT3x2                   = 0x8B67;
-	FLOAT_MAT3x4                   = 0x8B68;
-	FLOAT_MAT4x2                   = 0x8B69;
-	FLOAT_MAT4x3                   = 0x8B6A;
-	SRGB                           = 0x8C40;
-	SRGB8                          = 0x8C41;
-	SRGB_ALPHA                     = 0x8C42;
-	SRGB8_ALPHA8                   = 0x8C43;
-	COMPRESSED_SRGB                = 0x8C48;
-	COMPRESSED_SRGB_ALPHA          = 0x8C49;
+BLEND_EQUATION_RGB             :: 0x8009;
+VERTEX_ATTRIB_ARRAY_ENABLED    :: 0x8622;
+VERTEX_ATTRIB_ARRAY_SIZE       :: 0x8623;
+VERTEX_ATTRIB_ARRAY_STRIDE     :: 0x8624;
+VERTEX_ATTRIB_ARRAY_TYPE       :: 0x8625;
+CURRENT_VERTEX_ATTRIB          :: 0x8626;
+VERTEX_PROGRAM_POINT_SIZE      :: 0x8642;
+VERTEX_ATTRIB_ARRAY_POINTER    :: 0x8645;
+STENCIL_BACK_FUNC              :: 0x8800;
+STENCIL_BACK_FAIL              :: 0x8801;
+STENCIL_BACK_PASS_DEPTH_FAIL   :: 0x8802;
+STENCIL_BACK_PASS_DEPTH_PASS   :: 0x8803;
+MAX_DRAW_BUFFERS               :: 0x8824;
+DRAW_BUFFER0                   :: 0x8825;
+DRAW_BUFFER1                   :: 0x8826;
+DRAW_BUFFER2                   :: 0x8827;
+DRAW_BUFFER3                   :: 0x8828;
+DRAW_BUFFER4                   :: 0x8829;
+DRAW_BUFFER5                   :: 0x882A;
+DRAW_BUFFER6                   :: 0x882B;
+DRAW_BUFFER7                   :: 0x882C;
+DRAW_BUFFER8                   :: 0x882D;
+DRAW_BUFFER9                   :: 0x882E;
+DRAW_BUFFER10                  :: 0x882F;
+DRAW_BUFFER11                  :: 0x8830;
+DRAW_BUFFER12                  :: 0x8831;
+DRAW_BUFFER13                  :: 0x8832;
+DRAW_BUFFER14                  :: 0x8833;
+DRAW_BUFFER15                  :: 0x8834;
+BLEND_EQUATION_ALPHA           :: 0x883D;
+MAX_VERTEX_ATTRIBS             :: 0x8869;
+VERTEX_ATTRIB_ARRAY_NORMALIZED :: 0x886A;
+MAX_TEXTURE_IMAGE_UNITS        :: 0x8872;
+FRAGMENT_SHADER                :: 0x8B30;
+VERTEX_SHADER                  :: 0x8B31;
+MAX_FRAGMENT_UNIFORM_COMPONENTS :: 0x8B49;
+MAX_VERTEX_UNIFORM_COMPONENTS  :: 0x8B4A;
+MAX_VARYING_FLOATS             :: 0x8B4B;
+MAX_VERTEX_TEXTURE_IMAGE_UNITS :: 0x8B4C;
+MAX_COMBINED_TEXTURE_IMAGE_UNITS :: 0x8B4D;
+SHADER_TYPE                    :: 0x8B4F;
+FLOAT_VEC2                     :: 0x8B50;
+FLOAT_VEC3                     :: 0x8B51;
+FLOAT_VEC4                     :: 0x8B52;
+INT_VEC2                       :: 0x8B53;
+INT_VEC3                       :: 0x8B54;
+INT_VEC4                       :: 0x8B55;
+BOOL                           :: 0x8B56;
+BOOL_VEC2                      :: 0x8B57;
+BOOL_VEC3                      :: 0x8B58;
+BOOL_VEC4                      :: 0x8B59;
+FLOAT_MAT2                     :: 0x8B5A;
+FLOAT_MAT3                     :: 0x8B5B;
+FLOAT_MAT4                     :: 0x8B5C;
+SAMPLER_1D                     :: 0x8B5D;
+SAMPLER_2D                     :: 0x8B5E;
+SAMPLER_3D                     :: 0x8B5F;
+SAMPLER_CUBE                   :: 0x8B60;
+SAMPLER_1D_SHADOW              :: 0x8B61;
+SAMPLER_2D_SHADOW              :: 0x8B62;
+DELETE_STATUS                  :: 0x8B80;
+COMPILE_STATUS                 :: 0x8B81;
+LINK_STATUS                    :: 0x8B82;
+VALIDATE_STATUS                :: 0x8B83;
+INFO_LOG_LENGTH                :: 0x8B84;
+ATTACHED_SHADERS               :: 0x8B85;
+ACTIVE_UNIFORMS                :: 0x8B86;
+ACTIVE_UNIFORM_MAX_LENGTH      :: 0x8B87;
+SHADER_SOURCE_LENGTH           :: 0x8B88;
+ACTIVE_ATTRIBUTES              :: 0x8B89;
+ACTIVE_ATTRIBUTE_MAX_LENGTH    :: 0x8B8A;
+FRAGMENT_SHADER_DERIVATIVE_HINT :: 0x8B8B;
+SHADING_LANGUAGE_VERSION       :: 0x8B8C;
+CURRENT_PROGRAM                :: 0x8B8D;
+POINT_SPRITE_COORD_ORIGIN      :: 0x8CA0;
+LOWER_LEFT                     :: 0x8CA1;
+UPPER_LEFT                     :: 0x8CA2;
+STENCIL_BACK_REF               :: 0x8CA3;
+STENCIL_BACK_VALUE_MASK        :: 0x8CA4;
+STENCIL_BACK_WRITEMASK         :: 0x8CA5;
 
-	COMPARE_REF_TO_TEXTURE         = 0x884E;
-	CLIP_DISTANCE0                 = 0x3000;
-	CLIP_DISTANCE1                 = 0x3001;
-	CLIP_DISTANCE2                 = 0x3002;
-	CLIP_DISTANCE3                 = 0x3003;
-	CLIP_DISTANCE4                 = 0x3004;
-	CLIP_DISTANCE5                 = 0x3005;
-	CLIP_DISTANCE6                 = 0x3006;
-	CLIP_DISTANCE7                 = 0x3007;
-	MAX_CLIP_DISTANCES             = 0x0D32;
-	MAJOR_VERSION                  = 0x821B;
-	MINOR_VERSION                  = 0x821C;
-	NUM_EXTENSIONS                 = 0x821D;
-	CONTEXT_FLAGS                  = 0x821E;
-	COMPRESSED_RED                 = 0x8225;
-	COMPRESSED_RG                  = 0x8226;
-	CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = 0x00000001;
-	RGBA32F                        = 0x8814;
-	RGB32F                         = 0x8815;
-	RGBA16F                        = 0x881A;
-	RGB16F                         = 0x881B;
-	VERTEX_ATTRIB_ARRAY_INTEGER    = 0x88FD;
-	MAX_ARRAY_TEXTURE_LAYERS       = 0x88FF;
-	MIN_PROGRAM_TEXEL_OFFSET       = 0x8904;
-	MAX_PROGRAM_TEXEL_OFFSET       = 0x8905;
-	CLAMP_READ_COLOR               = 0x891C;
-	FIXED_ONLY                     = 0x891D;
-	MAX_VARYING_COMPONENTS         = 0x8B4B;
-	TEXTURE_1D_ARRAY               = 0x8C18;
-	PROXY_TEXTURE_1D_ARRAY         = 0x8C19;
-	TEXTURE_2D_ARRAY               = 0x8C1A;
-	PROXY_TEXTURE_2D_ARRAY         = 0x8C1B;
-	TEXTURE_BINDING_1D_ARRAY       = 0x8C1C;
-	TEXTURE_BINDING_2D_ARRAY       = 0x8C1D;
-	R11F_G11F_B10F                 = 0x8C3A;
-	UNSIGNED_INT_10F_11F_11F_REV   = 0x8C3B;
-	RGB9_E5                        = 0x8C3D;
-	UNSIGNED_INT_5_9_9_9_REV       = 0x8C3E;
-	TEXTURE_SHARED_SIZE            = 0x8C3F;
-	TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76;
-	TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F;
-	MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80;
-	TRANSFORM_FEEDBACK_VARYINGS    = 0x8C83;
-	TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84;
-	TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85;
-	PRIMITIVES_GENERATED           = 0x8C87;
-	TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88;
-	RASTERIZER_DISCARD             = 0x8C89;
-	MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A;
-	MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B;
-	INTERLEAVED_ATTRIBS            = 0x8C8C;
-	SEPARATE_ATTRIBS               = 0x8C8D;
-	TRANSFORM_FEEDBACK_BUFFER      = 0x8C8E;
-	TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F;
-	RGBA32UI                       = 0x8D70;
-	RGB32UI                        = 0x8D71;
-	RGBA16UI                       = 0x8D76;
-	RGB16UI                        = 0x8D77;
-	RGBA8UI                        = 0x8D7C;
-	RGB8UI                         = 0x8D7D;
-	RGBA32I                        = 0x8D82;
-	RGB32I                         = 0x8D83;
-	RGBA16I                        = 0x8D88;
-	RGB16I                         = 0x8D89;
-	RGBA8I                         = 0x8D8E;
-	RGB8I                          = 0x8D8F;
-	RED_INTEGER                    = 0x8D94;
-	GREEN_INTEGER                  = 0x8D95;
-	BLUE_INTEGER                   = 0x8D96;
-	RGB_INTEGER                    = 0x8D98;
-	RGBA_INTEGER                   = 0x8D99;
-	BGR_INTEGER                    = 0x8D9A;
-	BGRA_INTEGER                   = 0x8D9B;
-	SAMPLER_1D_ARRAY               = 0x8DC0;
-	SAMPLER_2D_ARRAY               = 0x8DC1;
-	SAMPLER_1D_ARRAY_SHADOW        = 0x8DC3;
-	SAMPLER_2D_ARRAY_SHADOW        = 0x8DC4;
-	SAMPLER_CUBE_SHADOW            = 0x8DC5;
-	UNSIGNED_INT_VEC2              = 0x8DC6;
-	UNSIGNED_INT_VEC3              = 0x8DC7;
-	UNSIGNED_INT_VEC4              = 0x8DC8;
-	INT_SAMPLER_1D                 = 0x8DC9;
-	INT_SAMPLER_2D                 = 0x8DCA;
-	INT_SAMPLER_3D                 = 0x8DCB;
-	INT_SAMPLER_CUBE               = 0x8DCC;
-	INT_SAMPLER_1D_ARRAY           = 0x8DCE;
-	INT_SAMPLER_2D_ARRAY           = 0x8DCF;
-	UNSIGNED_INT_SAMPLER_1D        = 0x8DD1;
-	UNSIGNED_INT_SAMPLER_2D        = 0x8DD2;
-	UNSIGNED_INT_SAMPLER_3D        = 0x8DD3;
-	UNSIGNED_INT_SAMPLER_CUBE      = 0x8DD4;
-	UNSIGNED_INT_SAMPLER_1D_ARRAY  = 0x8DD6;
-	UNSIGNED_INT_SAMPLER_2D_ARRAY  = 0x8DD7;
-	QUERY_WAIT                     = 0x8E13;
-	QUERY_NO_WAIT                  = 0x8E14;
-	QUERY_BY_REGION_WAIT           = 0x8E15;
-	QUERY_BY_REGION_NO_WAIT        = 0x8E16;
-	BUFFER_ACCESS_FLAGS            = 0x911F;
-	BUFFER_MAP_LENGTH              = 0x9120;
-	BUFFER_MAP_OFFSET              = 0x9121;
-	DEPTH_COMPONENT32F             = 0x8CAC;
-	DEPTH32F_STENCIL8              = 0x8CAD;
-	FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD;
-	INVALID_FRAMEBUFFER_OPERATION  = 0x0506;
-	FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210;
-	FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211;
-	FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212;
-	FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213;
-	FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214;
-	FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215;
-	FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216;
-	FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217;
-	FRAMEBUFFER_DEFAULT            = 0x8218;
-	FRAMEBUFFER_UNDEFINED          = 0x8219;
-	DEPTH_STENCIL_ATTACHMENT       = 0x821A;
-	MAX_RENDERBUFFER_SIZE          = 0x84E8;
-	DEPTH_STENCIL                  = 0x84F9;
-	UNSIGNED_INT_24_8              = 0x84FA;
-	DEPTH24_STENCIL8               = 0x88F0;
-	TEXTURE_STENCIL_SIZE           = 0x88F1;
-	TEXTURE_RED_TYPE               = 0x8C10;
-	TEXTURE_GREEN_TYPE             = 0x8C11;
-	TEXTURE_BLUE_TYPE              = 0x8C12;
-	TEXTURE_ALPHA_TYPE             = 0x8C13;
-	TEXTURE_DEPTH_TYPE             = 0x8C16;
-	UNSIGNED_NORMALIZED            = 0x8C17;
-	FRAMEBUFFER_BINDING            = 0x8CA6;
-	DRAW_FRAMEBUFFER_BINDING       = 0x8CA6;
-	RENDERBUFFER_BINDING           = 0x8CA7;
-	READ_FRAMEBUFFER               = 0x8CA8;
-	DRAW_FRAMEBUFFER               = 0x8CA9;
-	READ_FRAMEBUFFER_BINDING       = 0x8CAA;
-	RENDERBUFFER_SAMPLES           = 0x8CAB;
-	FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
-	FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
-	FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
-	FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
-	FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4;
-	FRAMEBUFFER_COMPLETE           = 0x8CD5;
-	FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
-	FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
-	FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB;
-	FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC;
-	FRAMEBUFFER_UNSUPPORTED        = 0x8CDD;
-	MAX_COLOR_ATTACHMENTS          = 0x8CDF;
-	COLOR_ATTACHMENT0              = 0x8CE0;
-	COLOR_ATTACHMENT1              = 0x8CE1;
-	COLOR_ATTACHMENT2              = 0x8CE2;
-	COLOR_ATTACHMENT3              = 0x8CE3;
-	COLOR_ATTACHMENT4              = 0x8CE4;
-	COLOR_ATTACHMENT5              = 0x8CE5;
-	COLOR_ATTACHMENT6              = 0x8CE6;
-	COLOR_ATTACHMENT7              = 0x8CE7;
-	COLOR_ATTACHMENT8              = 0x8CE8;
-	COLOR_ATTACHMENT9              = 0x8CE9;
-	COLOR_ATTACHMENT10             = 0x8CEA;
-	COLOR_ATTACHMENT11             = 0x8CEB;
-	COLOR_ATTACHMENT12             = 0x8CEC;
-	COLOR_ATTACHMENT13             = 0x8CED;
-	COLOR_ATTACHMENT14             = 0x8CEE;
-	COLOR_ATTACHMENT15             = 0x8CEF;
-	COLOR_ATTACHMENT16             = 0x8CF0;
-	COLOR_ATTACHMENT17             = 0x8CF1;
-	COLOR_ATTACHMENT18             = 0x8CF2;
-	COLOR_ATTACHMENT19             = 0x8CF3;
-	COLOR_ATTACHMENT20             = 0x8CF4;
-	COLOR_ATTACHMENT21             = 0x8CF5;
-	COLOR_ATTACHMENT22             = 0x8CF6;
-	COLOR_ATTACHMENT23             = 0x8CF7;
-	COLOR_ATTACHMENT24             = 0x8CF8;
-	COLOR_ATTACHMENT25             = 0x8CF9;
-	COLOR_ATTACHMENT26             = 0x8CFA;
-	COLOR_ATTACHMENT27             = 0x8CFB;
-	COLOR_ATTACHMENT28             = 0x8CFC;
-	COLOR_ATTACHMENT29             = 0x8CFD;
-	COLOR_ATTACHMENT30             = 0x8CFE;
-	COLOR_ATTACHMENT31             = 0x8CFF;
-	DEPTH_ATTACHMENT               = 0x8D00;
-	STENCIL_ATTACHMENT             = 0x8D20;
-	FRAMEBUFFER                    = 0x8D40;
-	RENDERBUFFER                   = 0x8D41;
-	RENDERBUFFER_WIDTH             = 0x8D42;
-	RENDERBUFFER_HEIGHT            = 0x8D43;
-	RENDERBUFFER_INTERNAL_FORMAT   = 0x8D44;
-	STENCIL_INDEX1                 = 0x8D46;
-	STENCIL_INDEX4                 = 0x8D47;
-	STENCIL_INDEX8                 = 0x8D48;
-	STENCIL_INDEX16                = 0x8D49;
-	RENDERBUFFER_RED_SIZE          = 0x8D50;
-	RENDERBUFFER_GREEN_SIZE        = 0x8D51;
-	RENDERBUFFER_BLUE_SIZE         = 0x8D52;
-	RENDERBUFFER_ALPHA_SIZE        = 0x8D53;
-	RENDERBUFFER_DEPTH_SIZE        = 0x8D54;
-	RENDERBUFFER_STENCIL_SIZE      = 0x8D55;
-	FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56;
-	MAX_SAMPLES                    = 0x8D57;
-	FRAMEBUFFER_SRGB               = 0x8DB9;
-	HALF_FLOAT                     = 0x140B;
-	MAP_READ_BIT                   = 0x0001;
-	MAP_WRITE_BIT                  = 0x0002;
-	MAP_INVALIDATE_RANGE_BIT       = 0x0004;
-	MAP_INVALIDATE_BUFFER_BIT      = 0x0008;
-	MAP_FLUSH_EXPLICIT_BIT         = 0x0010;
-	MAP_UNSYNCHRONIZED_BIT         = 0x0020;
-	COMPRESSED_RED_RGTC1           = 0x8DBB;
-	COMPRESSED_SIGNED_RED_RGTC1    = 0x8DBC;
-	COMPRESSED_RG_RGTC2            = 0x8DBD;
-	COMPRESSED_SIGNED_RG_RGTC2     = 0x8DBE;
-	RG                             = 0x8227;
-	RG_INTEGER                     = 0x8228;
-	R8                             = 0x8229;
-	R16                            = 0x822A;
-	RG8                            = 0x822B;
-	RG16                           = 0x822C;
-	R16F                           = 0x822D;
-	R32F                           = 0x822E;
-	RG16F                          = 0x822F;
-	RG32F                          = 0x8230;
-	R8I                            = 0x8231;
-	R8UI                           = 0x8232;
-	R16I                           = 0x8233;
-	R16UI                          = 0x8234;
-	R32I                           = 0x8235;
-	R32UI                          = 0x8236;
-	RG8I                           = 0x8237;
-	RG8UI                          = 0x8238;
-	RG16I                          = 0x8239;
-	RG16UI                         = 0x823A;
-	RG32I                          = 0x823B;
-	RG32UI                         = 0x823C;
-	VERTEX_ARRAY_BINDING           = 0x85B5;
+PIXEL_PACK_BUFFER              :: 0x88EB;
+PIXEL_UNPACK_BUFFER            :: 0x88EC;
+PIXEL_PACK_BUFFER_BINDING      :: 0x88ED;
+PIXEL_UNPACK_BUFFER_BINDING    :: 0x88EF;
+FLOAT_MAT2x3                   :: 0x8B65;
+FLOAT_MAT2x4                   :: 0x8B66;
+FLOAT_MAT3x2                   :: 0x8B67;
+FLOAT_MAT3x4                   :: 0x8B68;
+FLOAT_MAT4x2                   :: 0x8B69;
+FLOAT_MAT4x3                   :: 0x8B6A;
+SRGB                           :: 0x8C40;
+SRGB8                          :: 0x8C41;
+SRGB_ALPHA                     :: 0x8C42;
+SRGB8_ALPHA8                   :: 0x8C43;
+COMPRESSED_SRGB                :: 0x8C48;
+COMPRESSED_SRGB_ALPHA          :: 0x8C49;
 
-	SAMPLER_2D_RECT                = 0x8B63;
-	SAMPLER_2D_RECT_SHADOW         = 0x8B64;
-	SAMPLER_BUFFER                 = 0x8DC2;
-	INT_SAMPLER_2D_RECT            = 0x8DCD;
-	INT_SAMPLER_BUFFER             = 0x8DD0;
-	UNSIGNED_INT_SAMPLER_2D_RECT   = 0x8DD5;
-	UNSIGNED_INT_SAMPLER_BUFFER    = 0x8DD8;
-	TEXTURE_BUFFER                 = 0x8C2A;
-	MAX_TEXTURE_BUFFER_SIZE        = 0x8C2B;
-	TEXTURE_BINDING_BUFFER         = 0x8C2C;
-	TEXTURE_BUFFER_DATA_STORE_BINDING = 0x8C2D;
-	TEXTURE_RECTANGLE              = 0x84F5;
-	TEXTURE_BINDING_RECTANGLE      = 0x84F6;
-	PROXY_TEXTURE_RECTANGLE        = 0x84F7;
-	MAX_RECTANGLE_TEXTURE_SIZE     = 0x84F8;
-	R8_SNORM                       = 0x8F94;
-	RG8_SNORM                      = 0x8F95;
-	RGB8_SNORM                     = 0x8F96;
-	RGBA8_SNORM                    = 0x8F97;
-	R16_SNORM                      = 0x8F98;
-	RG16_SNORM                     = 0x8F99;
-	RGB16_SNORM                    = 0x8F9A;
-	RGBA16_SNORM                   = 0x8F9B;
-	SIGNED_NORMALIZED              = 0x8F9C;
-	PRIMITIVE_RESTART              = 0x8F9D;
-	PRIMITIVE_RESTART_INDEX        = 0x8F9E;
-	COPY_READ_BUFFER               = 0x8F36;
-	COPY_WRITE_BUFFER              = 0x8F37;
-	UNIFORM_BUFFER                 = 0x8A11;
-	UNIFORM_BUFFER_BINDING         = 0x8A28;
-	UNIFORM_BUFFER_START           = 0x8A29;
-	UNIFORM_BUFFER_SIZE            = 0x8A2A;
-	MAX_VERTEX_UNIFORM_BLOCKS      = 0x8A2B;
-	MAX_GEOMETRY_UNIFORM_BLOCKS    = 0x8A2C;
-	MAX_FRAGMENT_UNIFORM_BLOCKS    = 0x8A2D;
-	MAX_COMBINED_UNIFORM_BLOCKS    = 0x8A2E;
-	MAX_UNIFORM_BUFFER_BINDINGS    = 0x8A2F;
-	MAX_UNIFORM_BLOCK_SIZE         = 0x8A30;
-	MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31;
-	MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32;
-	MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33;
-	UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34;
-	ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35;
-	ACTIVE_UNIFORM_BLOCKS          = 0x8A36;
-	UNIFORM_TYPE                   = 0x8A37;
-	UNIFORM_SIZE                   = 0x8A38;
-	UNIFORM_NAME_LENGTH            = 0x8A39;
-	UNIFORM_BLOCK_INDEX            = 0x8A3A;
-	UNIFORM_OFFSET                 = 0x8A3B;
-	UNIFORM_ARRAY_STRIDE           = 0x8A3C;
-	UNIFORM_MATRIX_STRIDE          = 0x8A3D;
-	UNIFORM_IS_ROW_MAJOR           = 0x8A3E;
-	UNIFORM_BLOCK_BINDING          = 0x8A3F;
-	UNIFORM_BLOCK_DATA_SIZE        = 0x8A40;
-	UNIFORM_BLOCK_NAME_LENGTH      = 0x8A41;
-	UNIFORM_BLOCK_ACTIVE_UNIFORMS  = 0x8A42;
-	UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43;
-	UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44;
-	UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45;
-	UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46;
-	INVALID_INDEX                  = 0xFFFFFFFF;
+COMPARE_REF_TO_TEXTURE         :: 0x884E;
+CLIP_DISTANCE0                 :: 0x3000;
+CLIP_DISTANCE1                 :: 0x3001;
+CLIP_DISTANCE2                 :: 0x3002;
+CLIP_DISTANCE3                 :: 0x3003;
+CLIP_DISTANCE4                 :: 0x3004;
+CLIP_DISTANCE5                 :: 0x3005;
+CLIP_DISTANCE6                 :: 0x3006;
+CLIP_DISTANCE7                 :: 0x3007;
+MAX_CLIP_DISTANCES             :: 0x0D32;
+MAJOR_VERSION                  :: 0x821B;
+MINOR_VERSION                  :: 0x821C;
+NUM_EXTENSIONS                 :: 0x821D;
+CONTEXT_FLAGS                  :: 0x821E;
+COMPRESSED_RED                 :: 0x8225;
+COMPRESSED_RG                  :: 0x8226;
+CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT :: 0x00000001;
+RGBA32F                        :: 0x8814;
+RGB32F                         :: 0x8815;
+RGBA16F                        :: 0x881A;
+RGB16F                         :: 0x881B;
+VERTEX_ATTRIB_ARRAY_INTEGER    :: 0x88FD;
+MAX_ARRAY_TEXTURE_LAYERS       :: 0x88FF;
+MIN_PROGRAM_TEXEL_OFFSET       :: 0x8904;
+MAX_PROGRAM_TEXEL_OFFSET       :: 0x8905;
+CLAMP_READ_COLOR               :: 0x891C;
+FIXED_ONLY                     :: 0x891D;
+MAX_VARYING_COMPONENTS         :: 0x8B4B;
+TEXTURE_1D_ARRAY               :: 0x8C18;
+PROXY_TEXTURE_1D_ARRAY         :: 0x8C19;
+TEXTURE_2D_ARRAY               :: 0x8C1A;
+PROXY_TEXTURE_2D_ARRAY         :: 0x8C1B;
+TEXTURE_BINDING_1D_ARRAY       :: 0x8C1C;
+TEXTURE_BINDING_2D_ARRAY       :: 0x8C1D;
+R11F_G11F_B10F                 :: 0x8C3A;
+UNSIGNED_INT_10F_11F_11F_REV   :: 0x8C3B;
+RGB9_E5                        :: 0x8C3D;
+UNSIGNED_INT_5_9_9_9_REV       :: 0x8C3E;
+TEXTURE_SHARED_SIZE            :: 0x8C3F;
+TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH :: 0x8C76;
+TRANSFORM_FEEDBACK_BUFFER_MODE :: 0x8C7F;
+MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS :: 0x8C80;
+TRANSFORM_FEEDBACK_VARYINGS    :: 0x8C83;
+TRANSFORM_FEEDBACK_BUFFER_START :: 0x8C84;
+TRANSFORM_FEEDBACK_BUFFER_SIZE :: 0x8C85;
+PRIMITIVES_GENERATED           :: 0x8C87;
+TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN :: 0x8C88;
+RASTERIZER_DISCARD             :: 0x8C89;
+MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS :: 0x8C8A;
+MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS :: 0x8C8B;
+INTERLEAVED_ATTRIBS            :: 0x8C8C;
+SEPARATE_ATTRIBS               :: 0x8C8D;
+TRANSFORM_FEEDBACK_BUFFER      :: 0x8C8E;
+TRANSFORM_FEEDBACK_BUFFER_BINDING :: 0x8C8F;
+RGBA32UI                       :: 0x8D70;
+RGB32UI                        :: 0x8D71;
+RGBA16UI                       :: 0x8D76;
+RGB16UI                        :: 0x8D77;
+RGBA8UI                        :: 0x8D7C;
+RGB8UI                         :: 0x8D7D;
+RGBA32I                        :: 0x8D82;
+RGB32I                         :: 0x8D83;
+RGBA16I                        :: 0x8D88;
+RGB16I                         :: 0x8D89;
+RGBA8I                         :: 0x8D8E;
+RGB8I                          :: 0x8D8F;
+RED_INTEGER                    :: 0x8D94;
+GREEN_INTEGER                  :: 0x8D95;
+BLUE_INTEGER                   :: 0x8D96;
+RGB_INTEGER                    :: 0x8D98;
+RGBA_INTEGER                   :: 0x8D99;
+BGR_INTEGER                    :: 0x8D9A;
+BGRA_INTEGER                   :: 0x8D9B;
+SAMPLER_1D_ARRAY               :: 0x8DC0;
+SAMPLER_2D_ARRAY               :: 0x8DC1;
+SAMPLER_1D_ARRAY_SHADOW        :: 0x8DC3;
+SAMPLER_2D_ARRAY_SHADOW        :: 0x8DC4;
+SAMPLER_CUBE_SHADOW            :: 0x8DC5;
+UNSIGNED_INT_VEC2              :: 0x8DC6;
+UNSIGNED_INT_VEC3              :: 0x8DC7;
+UNSIGNED_INT_VEC4              :: 0x8DC8;
+INT_SAMPLER_1D                 :: 0x8DC9;
+INT_SAMPLER_2D                 :: 0x8DCA;
+INT_SAMPLER_3D                 :: 0x8DCB;
+INT_SAMPLER_CUBE               :: 0x8DCC;
+INT_SAMPLER_1D_ARRAY           :: 0x8DCE;
+INT_SAMPLER_2D_ARRAY           :: 0x8DCF;
+UNSIGNED_INT_SAMPLER_1D        :: 0x8DD1;
+UNSIGNED_INT_SAMPLER_2D        :: 0x8DD2;
+UNSIGNED_INT_SAMPLER_3D        :: 0x8DD3;
+UNSIGNED_INT_SAMPLER_CUBE      :: 0x8DD4;
+UNSIGNED_INT_SAMPLER_1D_ARRAY  :: 0x8DD6;
+UNSIGNED_INT_SAMPLER_2D_ARRAY  :: 0x8DD7;
+QUERY_WAIT                     :: 0x8E13;
+QUERY_NO_WAIT                  :: 0x8E14;
+QUERY_BY_REGION_WAIT           :: 0x8E15;
+QUERY_BY_REGION_NO_WAIT        :: 0x8E16;
+BUFFER_ACCESS_FLAGS            :: 0x911F;
+BUFFER_MAP_LENGTH              :: 0x9120;
+BUFFER_MAP_OFFSET              :: 0x9121;
+DEPTH_COMPONENT32F             :: 0x8CAC;
+DEPTH32F_STENCIL8              :: 0x8CAD;
+FLOAT_32_UNSIGNED_INT_24_8_REV :: 0x8DAD;
+INVALID_FRAMEBUFFER_OPERATION  :: 0x0506;
+FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING :: 0x8210;
+FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE :: 0x8211;
+FRAMEBUFFER_ATTACHMENT_RED_SIZE :: 0x8212;
+FRAMEBUFFER_ATTACHMENT_GREEN_SIZE :: 0x8213;
+FRAMEBUFFER_ATTACHMENT_BLUE_SIZE :: 0x8214;
+FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE :: 0x8215;
+FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE :: 0x8216;
+FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE :: 0x8217;
+FRAMEBUFFER_DEFAULT            :: 0x8218;
+FRAMEBUFFER_UNDEFINED          :: 0x8219;
+DEPTH_STENCIL_ATTACHMENT       :: 0x821A;
+MAX_RENDERBUFFER_SIZE          :: 0x84E8;
+DEPTH_STENCIL                  :: 0x84F9;
+UNSIGNED_INT_24_8              :: 0x84FA;
+DEPTH24_STENCIL8               :: 0x88F0;
+TEXTURE_STENCIL_SIZE           :: 0x88F1;
+TEXTURE_RED_TYPE               :: 0x8C10;
+TEXTURE_GREEN_TYPE             :: 0x8C11;
+TEXTURE_BLUE_TYPE              :: 0x8C12;
+TEXTURE_ALPHA_TYPE             :: 0x8C13;
+TEXTURE_DEPTH_TYPE             :: 0x8C16;
+UNSIGNED_NORMALIZED            :: 0x8C17;
+FRAMEBUFFER_BINDING            :: 0x8CA6;
+DRAW_FRAMEBUFFER_BINDING       :: 0x8CA6;
+RENDERBUFFER_BINDING           :: 0x8CA7;
+READ_FRAMEBUFFER               :: 0x8CA8;
+DRAW_FRAMEBUFFER               :: 0x8CA9;
+READ_FRAMEBUFFER_BINDING       :: 0x8CAA;
+RENDERBUFFER_SAMPLES           :: 0x8CAB;
+FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE :: 0x8CD0;
+FRAMEBUFFER_ATTACHMENT_OBJECT_NAME :: 0x8CD1;
+FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL :: 0x8CD2;
+FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE :: 0x8CD3;
+FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER :: 0x8CD4;
+FRAMEBUFFER_COMPLETE           :: 0x8CD5;
+FRAMEBUFFER_INCOMPLETE_ATTACHMENT :: 0x8CD6;
+FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT :: 0x8CD7;
+FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER :: 0x8CDB;
+FRAMEBUFFER_INCOMPLETE_READ_BUFFER :: 0x8CDC;
+FRAMEBUFFER_UNSUPPORTED        :: 0x8CDD;
+MAX_COLOR_ATTACHMENTS          :: 0x8CDF;
+COLOR_ATTACHMENT0              :: 0x8CE0;
+COLOR_ATTACHMENT1              :: 0x8CE1;
+COLOR_ATTACHMENT2              :: 0x8CE2;
+COLOR_ATTACHMENT3              :: 0x8CE3;
+COLOR_ATTACHMENT4              :: 0x8CE4;
+COLOR_ATTACHMENT5              :: 0x8CE5;
+COLOR_ATTACHMENT6              :: 0x8CE6;
+COLOR_ATTACHMENT7              :: 0x8CE7;
+COLOR_ATTACHMENT8              :: 0x8CE8;
+COLOR_ATTACHMENT9              :: 0x8CE9;
+COLOR_ATTACHMENT10             :: 0x8CEA;
+COLOR_ATTACHMENT11             :: 0x8CEB;
+COLOR_ATTACHMENT12             :: 0x8CEC;
+COLOR_ATTACHMENT13             :: 0x8CED;
+COLOR_ATTACHMENT14             :: 0x8CEE;
+COLOR_ATTACHMENT15             :: 0x8CEF;
+COLOR_ATTACHMENT16             :: 0x8CF0;
+COLOR_ATTACHMENT17             :: 0x8CF1;
+COLOR_ATTACHMENT18             :: 0x8CF2;
+COLOR_ATTACHMENT19             :: 0x8CF3;
+COLOR_ATTACHMENT20             :: 0x8CF4;
+COLOR_ATTACHMENT21             :: 0x8CF5;
+COLOR_ATTACHMENT22             :: 0x8CF6;
+COLOR_ATTACHMENT23             :: 0x8CF7;
+COLOR_ATTACHMENT24             :: 0x8CF8;
+COLOR_ATTACHMENT25             :: 0x8CF9;
+COLOR_ATTACHMENT26             :: 0x8CFA;
+COLOR_ATTACHMENT27             :: 0x8CFB;
+COLOR_ATTACHMENT28             :: 0x8CFC;
+COLOR_ATTACHMENT29             :: 0x8CFD;
+COLOR_ATTACHMENT30             :: 0x8CFE;
+COLOR_ATTACHMENT31             :: 0x8CFF;
+DEPTH_ATTACHMENT               :: 0x8D00;
+STENCIL_ATTACHMENT             :: 0x8D20;
+FRAMEBUFFER                    :: 0x8D40;
+RENDERBUFFER                   :: 0x8D41;
+RENDERBUFFER_WIDTH             :: 0x8D42;
+RENDERBUFFER_HEIGHT            :: 0x8D43;
+RENDERBUFFER_INTERNAL_FORMAT   :: 0x8D44;
+STENCIL_INDEX1                 :: 0x8D46;
+STENCIL_INDEX4                 :: 0x8D47;
+STENCIL_INDEX8                 :: 0x8D48;
+STENCIL_INDEX16                :: 0x8D49;
+RENDERBUFFER_RED_SIZE          :: 0x8D50;
+RENDERBUFFER_GREEN_SIZE        :: 0x8D51;
+RENDERBUFFER_BLUE_SIZE         :: 0x8D52;
+RENDERBUFFER_ALPHA_SIZE        :: 0x8D53;
+RENDERBUFFER_DEPTH_SIZE        :: 0x8D54;
+RENDERBUFFER_STENCIL_SIZE      :: 0x8D55;
+FRAMEBUFFER_INCOMPLETE_MULTISAMPLE :: 0x8D56;
+MAX_SAMPLES                    :: 0x8D57;
+FRAMEBUFFER_SRGB               :: 0x8DB9;
+HALF_FLOAT                     :: 0x140B;
+MAP_READ_BIT                   :: 0x0001;
+MAP_WRITE_BIT                  :: 0x0002;
+MAP_INVALIDATE_RANGE_BIT       :: 0x0004;
+MAP_INVALIDATE_BUFFER_BIT      :: 0x0008;
+MAP_FLUSH_EXPLICIT_BIT         :: 0x0010;
+MAP_UNSYNCHRONIZED_BIT         :: 0x0020;
+COMPRESSED_RED_RGTC1           :: 0x8DBB;
+COMPRESSED_SIGNED_RED_RGTC1    :: 0x8DBC;
+COMPRESSED_RG_RGTC2            :: 0x8DBD;
+COMPRESSED_SIGNED_RG_RGTC2     :: 0x8DBE;
+RG                             :: 0x8227;
+RG_INTEGER                     :: 0x8228;
+R8                             :: 0x8229;
+R16                            :: 0x822A;
+RG8                            :: 0x822B;
+RG16                           :: 0x822C;
+R16F                           :: 0x822D;
+R32F                           :: 0x822E;
+RG16F                          :: 0x822F;
+RG32F                          :: 0x8230;
+R8I                            :: 0x8231;
+R8UI                           :: 0x8232;
+R16I                           :: 0x8233;
+R16UI                          :: 0x8234;
+R32I                           :: 0x8235;
+R32UI                          :: 0x8236;
+RG8I                           :: 0x8237;
+RG8UI                          :: 0x8238;
+RG16I                          :: 0x8239;
+RG16UI                         :: 0x823A;
+RG32I                          :: 0x823B;
+RG32UI                         :: 0x823C;
+VERTEX_ARRAY_BINDING           :: 0x85B5;
 
-	CONTEXT_CORE_PROFILE_BIT       = 0x00000001;
-	CONTEXT_COMPATIBILITY_PROFILE_BIT = 0x00000002;
-	LINES_ADJACENCY                = 0x000A;
-	LINE_STRIP_ADJACENCY           = 0x000B;
-	TRIANGLES_ADJACENCY            = 0x000C;
-	TRIANGLE_STRIP_ADJACENCY       = 0x000D;
-	PROGRAM_POINT_SIZE             = 0x8642;
-	MAX_GEOMETRY_TEXTURE_IMAGE_UNITS = 0x8C29;
-	FRAMEBUFFER_ATTACHMENT_LAYERED = 0x8DA7;
-	FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0x8DA8;
-	GEOMETRY_SHADER                = 0x8DD9;
-	GEOMETRY_VERTICES_OUT          = 0x8916;
-	GEOMETRY_INPUT_TYPE            = 0x8917;
-	GEOMETRY_OUTPUT_TYPE           = 0x8918;
-	MAX_GEOMETRY_UNIFORM_COMPONENTS = 0x8DDF;
-	MAX_GEOMETRY_OUTPUT_VERTICES   = 0x8DE0;
-	MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 0x8DE1;
-	MAX_VERTEX_OUTPUT_COMPONENTS   = 0x9122;
-	MAX_GEOMETRY_INPUT_COMPONENTS  = 0x9123;
-	MAX_GEOMETRY_OUTPUT_COMPONENTS = 0x9124;
-	MAX_FRAGMENT_INPUT_COMPONENTS  = 0x9125;
-	CONTEXT_PROFILE_MASK           = 0x9126;
-	DEPTH_CLAMP                    = 0x864F;
-	QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C;
-	FIRST_VERTEX_CONVENTION        = 0x8E4D;
-	LAST_VERTEX_CONVENTION         = 0x8E4E;
-	PROVOKING_VERTEX               = 0x8E4F;
-	TEXTURE_CUBE_MAP_SEAMLESS      = 0x884F;
-	MAX_SERVER_WAIT_TIMEOUT        = 0x9111;
-	OBJECT_TYPE                    = 0x9112;
-	SYNC_CONDITION                 = 0x9113;
-	SYNC_STATUS                    = 0x9114;
-	SYNC_FLAGS                     = 0x9115;
-	SYNC_FENCE                     = 0x9116;
-	SYNC_GPU_COMMANDS_COMPLETE     = 0x9117;
-	UNSIGNALED                     = 0x9118;
-	SIGNALED                       = 0x9119;
-	ALREADY_SIGNALED               = 0x911A;
-	TIMEOUT_EXPIRED                = 0x911B;
-	CONDITION_SATISFIED            = 0x911C;
-	WAIT_FAILED                    = 0x911D;
-	TIMEOUT_IGNORED                = 0xFFFFFFFFFFFFFFFF;
-	SYNC_FLUSH_COMMANDS_BIT        = 0x00000001;
-	SAMPLE_POSITION                = 0x8E50;
-	SAMPLE_MASK                    = 0x8E51;
-	SAMPLE_MASK_VALUE              = 0x8E52;
-	MAX_SAMPLE_MASK_WORDS          = 0x8E59;
-	TEXTURE_2D_MULTISAMPLE         = 0x9100;
-	PROXY_TEXTURE_2D_MULTISAMPLE   = 0x9101;
-	TEXTURE_2D_MULTISAMPLE_ARRAY   = 0x9102;
-	PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103;
-	TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104;
-	TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105;
-	TEXTURE_SAMPLES                = 0x9106;
-	TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107;
-	SAMPLER_2D_MULTISAMPLE         = 0x9108;
-	INT_SAMPLER_2D_MULTISAMPLE     = 0x9109;
-	UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A;
-	SAMPLER_2D_MULTISAMPLE_ARRAY   = 0x910B;
-	INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C;
-	UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D;
-	MAX_COLOR_TEXTURE_SAMPLES      = 0x910E;
-	MAX_DEPTH_TEXTURE_SAMPLES      = 0x910F;
-	MAX_INTEGER_SAMPLES            = 0x9110;
+SAMPLER_2D_RECT                :: 0x8B63;
+SAMPLER_2D_RECT_SHADOW         :: 0x8B64;
+SAMPLER_BUFFER                 :: 0x8DC2;
+INT_SAMPLER_2D_RECT            :: 0x8DCD;
+INT_SAMPLER_BUFFER             :: 0x8DD0;
+UNSIGNED_INT_SAMPLER_2D_RECT   :: 0x8DD5;
+UNSIGNED_INT_SAMPLER_BUFFER    :: 0x8DD8;
+TEXTURE_BUFFER                 :: 0x8C2A;
+MAX_TEXTURE_BUFFER_SIZE        :: 0x8C2B;
+TEXTURE_BINDING_BUFFER         :: 0x8C2C;
+TEXTURE_BUFFER_DATA_STORE_BINDING :: 0x8C2D;
+TEXTURE_RECTANGLE              :: 0x84F5;
+TEXTURE_BINDING_RECTANGLE      :: 0x84F6;
+PROXY_TEXTURE_RECTANGLE        :: 0x84F7;
+MAX_RECTANGLE_TEXTURE_SIZE     :: 0x84F8;
+R8_SNORM                       :: 0x8F94;
+RG8_SNORM                      :: 0x8F95;
+RGB8_SNORM                     :: 0x8F96;
+RGBA8_SNORM                    :: 0x8F97;
+R16_SNORM                      :: 0x8F98;
+RG16_SNORM                     :: 0x8F99;
+RGB16_SNORM                    :: 0x8F9A;
+RGBA16_SNORM                   :: 0x8F9B;
+SIGNED_NORMALIZED              :: 0x8F9C;
+PRIMITIVE_RESTART              :: 0x8F9D;
+PRIMITIVE_RESTART_INDEX        :: 0x8F9E;
+COPY_READ_BUFFER               :: 0x8F36;
+COPY_WRITE_BUFFER              :: 0x8F37;
+UNIFORM_BUFFER                 :: 0x8A11;
+UNIFORM_BUFFER_BINDING         :: 0x8A28;
+UNIFORM_BUFFER_START           :: 0x8A29;
+UNIFORM_BUFFER_SIZE            :: 0x8A2A;
+MAX_VERTEX_UNIFORM_BLOCKS      :: 0x8A2B;
+MAX_GEOMETRY_UNIFORM_BLOCKS    :: 0x8A2C;
+MAX_FRAGMENT_UNIFORM_BLOCKS    :: 0x8A2D;
+MAX_COMBINED_UNIFORM_BLOCKS    :: 0x8A2E;
+MAX_UNIFORM_BUFFER_BINDINGS    :: 0x8A2F;
+MAX_UNIFORM_BLOCK_SIZE         :: 0x8A30;
+MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS :: 0x8A31;
+MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS :: 0x8A32;
+MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS :: 0x8A33;
+UNIFORM_BUFFER_OFFSET_ALIGNMENT :: 0x8A34;
+ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH :: 0x8A35;
+ACTIVE_UNIFORM_BLOCKS          :: 0x8A36;
+UNIFORM_TYPE                   :: 0x8A37;
+UNIFORM_SIZE                   :: 0x8A38;
+UNIFORM_NAME_LENGTH            :: 0x8A39;
+UNIFORM_BLOCK_INDEX            :: 0x8A3A;
+UNIFORM_OFFSET                 :: 0x8A3B;
+UNIFORM_ARRAY_STRIDE           :: 0x8A3C;
+UNIFORM_MATRIX_STRIDE          :: 0x8A3D;
+UNIFORM_IS_ROW_MAJOR           :: 0x8A3E;
+UNIFORM_BLOCK_BINDING          :: 0x8A3F;
+UNIFORM_BLOCK_DATA_SIZE        :: 0x8A40;
+UNIFORM_BLOCK_NAME_LENGTH      :: 0x8A41;
+UNIFORM_BLOCK_ACTIVE_UNIFORMS  :: 0x8A42;
+UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES :: 0x8A43;
+UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER :: 0x8A44;
+UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER :: 0x8A45;
+UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER :: 0x8A46;
+INVALID_INDEX                  :: 0xFFFFFFFF;
 
-	VERTEX_ATTRIB_ARRAY_DIVISOR    = 0x88FE;
-	SRC1_COLOR                     = 0x88F9;
-	ONE_MINUS_SRC1_COLOR           = 0x88FA;
-	ONE_MINUS_SRC1_ALPHA           = 0x88FB;
-	MAX_DUAL_SOURCE_DRAW_BUFFERS   = 0x88FC;
-	ANY_SAMPLES_PASSED             = 0x8C2F;
-	SAMPLER_BINDING                = 0x8919;
-	RGB10_A2UI                     = 0x906F;
-	TEXTURE_SWIZZLE_R              = 0x8E42;
-	TEXTURE_SWIZZLE_G              = 0x8E43;
-	TEXTURE_SWIZZLE_B              = 0x8E44;
-	TEXTURE_SWIZZLE_A              = 0x8E45;
-	TEXTURE_SWIZZLE_RGBA           = 0x8E46;
-	TIME_ELAPSED                   = 0x88BF;
-	TIMESTAMP                      = 0x8E28;
-	INT_2_10_10_10_REV             = 0x8D9F;
+CONTEXT_CORE_PROFILE_BIT       :: 0x00000001;
+CONTEXT_COMPATIBILITY_PROFILE_BIT :: 0x00000002;
+LINES_ADJACENCY                :: 0x000A;
+LINE_STRIP_ADJACENCY           :: 0x000B;
+TRIANGLES_ADJACENCY            :: 0x000C;
+TRIANGLE_STRIP_ADJACENCY       :: 0x000D;
+PROGRAM_POINT_SIZE             :: 0x8642;
+MAX_GEOMETRY_TEXTURE_IMAGE_UNITS :: 0x8C29;
+FRAMEBUFFER_ATTACHMENT_LAYERED :: 0x8DA7;
+FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS :: 0x8DA8;
+GEOMETRY_SHADER                :: 0x8DD9;
+GEOMETRY_VERTICES_OUT          :: 0x8916;
+GEOMETRY_INPUT_TYPE            :: 0x8917;
+GEOMETRY_OUTPUT_TYPE           :: 0x8918;
+MAX_GEOMETRY_UNIFORM_COMPONENTS :: 0x8DDF;
+MAX_GEOMETRY_OUTPUT_VERTICES   :: 0x8DE0;
+MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS :: 0x8DE1;
+MAX_VERTEX_OUTPUT_COMPONENTS   :: 0x9122;
+MAX_GEOMETRY_INPUT_COMPONENTS  :: 0x9123;
+MAX_GEOMETRY_OUTPUT_COMPONENTS :: 0x9124;
+MAX_FRAGMENT_INPUT_COMPONENTS  :: 0x9125;
+CONTEXT_PROFILE_MASK           :: 0x9126;
+DEPTH_CLAMP                    :: 0x864F;
+QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION :: 0x8E4C;
+FIRST_VERTEX_CONVENTION        :: 0x8E4D;
+LAST_VERTEX_CONVENTION         :: 0x8E4E;
+PROVOKING_VERTEX               :: 0x8E4F;
+TEXTURE_CUBE_MAP_SEAMLESS      :: 0x884F;
+MAX_SERVER_WAIT_TIMEOUT        :: 0x9111;
+OBJECT_TYPE                    :: 0x9112;
+SYNC_CONDITION                 :: 0x9113;
+SYNC_STATUS                    :: 0x9114;
+SYNC_FLAGS                     :: 0x9115;
+SYNC_FENCE                     :: 0x9116;
+SYNC_GPU_COMMANDS_COMPLETE     :: 0x9117;
+UNSIGNALED                     :: 0x9118;
+SIGNALED                       :: 0x9119;
+ALREADY_SIGNALED               :: 0x911A;
+TIMEOUT_EXPIRED                :: 0x911B;
+CONDITION_SATISFIED            :: 0x911C;
+WAIT_FAILED                    :: 0x911D;
+TIMEOUT_IGNORED                :: 0xFFFFFFFFFFFFFFFF;
+SYNC_FLUSH_COMMANDS_BIT        :: 0x00000001;
+SAMPLE_POSITION                :: 0x8E50;
+SAMPLE_MASK                    :: 0x8E51;
+SAMPLE_MASK_VALUE              :: 0x8E52;
+MAX_SAMPLE_MASK_WORDS          :: 0x8E59;
+TEXTURE_2D_MULTISAMPLE         :: 0x9100;
+PROXY_TEXTURE_2D_MULTISAMPLE   :: 0x9101;
+TEXTURE_2D_MULTISAMPLE_ARRAY   :: 0x9102;
+PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY :: 0x9103;
+TEXTURE_BINDING_2D_MULTISAMPLE :: 0x9104;
+TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY :: 0x9105;
+TEXTURE_SAMPLES                :: 0x9106;
+TEXTURE_FIXED_SAMPLE_LOCATIONS :: 0x9107;
+SAMPLER_2D_MULTISAMPLE         :: 0x9108;
+INT_SAMPLER_2D_MULTISAMPLE     :: 0x9109;
+UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE :: 0x910A;
+SAMPLER_2D_MULTISAMPLE_ARRAY   :: 0x910B;
+INT_SAMPLER_2D_MULTISAMPLE_ARRAY :: 0x910C;
+UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY :: 0x910D;
+MAX_COLOR_TEXTURE_SAMPLES      :: 0x910E;
+MAX_DEPTH_TEXTURE_SAMPLES      :: 0x910F;
+MAX_INTEGER_SAMPLES            :: 0x9110;
 
-	SAMPLE_SHADING                 = 0x8C36;
-	MIN_SAMPLE_SHADING_VALUE       = 0x8C37;
-	MIN_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5E;
-	MAX_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5F;
-	TEXTURE_CUBE_MAP_ARRAY         = 0x9009;
-	TEXTURE_BINDING_CUBE_MAP_ARRAY = 0x900A;
-	PROXY_TEXTURE_CUBE_MAP_ARRAY   = 0x900B;
-	SAMPLER_CUBE_MAP_ARRAY         = 0x900C;
-	SAMPLER_CUBE_MAP_ARRAY_SHADOW  = 0x900D;
-	INT_SAMPLER_CUBE_MAP_ARRAY     = 0x900E;
-	UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900F;
-	DRAW_INDIRECT_BUFFER           = 0x8F3F;
-	DRAW_INDIRECT_BUFFER_BINDING   = 0x8F43;
-	GEOMETRY_SHADER_INVOCATIONS    = 0x887F;
-	MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A;
-	MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B;
-	MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C;
-	FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D;
-	MAX_VERTEX_STREAMS             = 0x8E71;
-	DOUBLE_VEC2                    = 0x8FFC;
-	DOUBLE_VEC3                    = 0x8FFD;
-	DOUBLE_VEC4                    = 0x8FFE;
-	DOUBLE_MAT2                    = 0x8F46;
-	DOUBLE_MAT3                    = 0x8F47;
-	DOUBLE_MAT4                    = 0x8F48;
-	DOUBLE_MAT2x3                  = 0x8F49;
-	DOUBLE_MAT2x4                  = 0x8F4A;
-	DOUBLE_MAT3x2                  = 0x8F4B;
-	DOUBLE_MAT3x4                  = 0x8F4C;
-	DOUBLE_MAT4x2                  = 0x8F4D;
-	DOUBLE_MAT4x3                  = 0x8F4E;
-	ACTIVE_SUBROUTINES             = 0x8DE5;
-	ACTIVE_SUBROUTINE_UNIFORMS     = 0x8DE6;
-	ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = 0x8E47;
-	ACTIVE_SUBROUTINE_MAX_LENGTH   = 0x8E48;
-	ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = 0x8E49;
-	MAX_SUBROUTINES                = 0x8DE7;
-	MAX_SUBROUTINE_UNIFORM_LOCATIONS = 0x8DE8;
-	NUM_COMPATIBLE_SUBROUTINES     = 0x8E4A;
-	COMPATIBLE_SUBROUTINES         = 0x8E4B;
-	PATCHES                        = 0x000E;
-	PATCH_VERTICES                 = 0x8E72;
-	PATCH_DEFAULT_INNER_LEVEL      = 0x8E73;
-	PATCH_DEFAULT_OUTER_LEVEL      = 0x8E74;
-	TESS_CONTROL_OUTPUT_VERTICES   = 0x8E75;
-	TESS_GEN_MODE                  = 0x8E76;
-	TESS_GEN_SPACING               = 0x8E77;
-	TESS_GEN_VERTEX_ORDER          = 0x8E78;
-	TESS_GEN_POINT_MODE            = 0x8E79;
-	ISOLINES                       = 0x8E7A;
-	FRACTIONAL_ODD                 = 0x8E7B;
-	FRACTIONAL_EVEN                = 0x8E7C;
-	MAX_PATCH_VERTICES             = 0x8E7D;
-	MAX_TESS_GEN_LEVEL             = 0x8E7E;
-	MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F;
-	MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80;
-	MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81;
-	MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82;
-	MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83;
-	MAX_TESS_PATCH_COMPONENTS      = 0x8E84;
-	MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85;
-	MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86;
-	MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89;
-	MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A;
-	MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C;
-	MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D;
-	MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E;
-	MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F;
-	UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0;
-	UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1;
-	TESS_EVALUATION_SHADER         = 0x8E87;
-	TESS_CONTROL_SHADER            = 0x8E88;
-	TRANSFORM_FEEDBACK             = 0x8E22;
-	TRANSFORM_FEEDBACK_BUFFER_PAUSED = 0x8E23;
-	TRANSFORM_FEEDBACK_BUFFER_ACTIVE = 0x8E24;
-	TRANSFORM_FEEDBACK_BINDING     = 0x8E25;
-	MAX_TRANSFORM_FEEDBACK_BUFFERS = 0x8E70;
+VERTEX_ATTRIB_ARRAY_DIVISOR    :: 0x88FE;
+SRC1_COLOR                     :: 0x88F9;
+ONE_MINUS_SRC1_COLOR           :: 0x88FA;
+ONE_MINUS_SRC1_ALPHA           :: 0x88FB;
+MAX_DUAL_SOURCE_DRAW_BUFFERS   :: 0x88FC;
+ANY_SAMPLES_PASSED             :: 0x8C2F;
+SAMPLER_BINDING                :: 0x8919;
+RGB10_A2UI                     :: 0x906F;
+TEXTURE_SWIZZLE_R              :: 0x8E42;
+TEXTURE_SWIZZLE_G              :: 0x8E43;
+TEXTURE_SWIZZLE_B              :: 0x8E44;
+TEXTURE_SWIZZLE_A              :: 0x8E45;
+TEXTURE_SWIZZLE_RGBA           :: 0x8E46;
+TIME_ELAPSED                   :: 0x88BF;
+TIMESTAMP                      :: 0x8E28;
+INT_2_10_10_10_REV             :: 0x8D9F;
 
-	FIXED                          = 0x140C;
-	IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;
-	IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
-	LOW_FLOAT                      = 0x8DF0;
-	MEDIUM_FLOAT                   = 0x8DF1;
-	HIGH_FLOAT                     = 0x8DF2;
-	LOW_INT                        = 0x8DF3;
-	MEDIUM_INT                     = 0x8DF4;
-	HIGH_INT                       = 0x8DF5;
-	SHADER_COMPILER                = 0x8DFA;
-	SHADER_BINARY_FORMATS          = 0x8DF8;
-	NUM_SHADER_BINARY_FORMATS      = 0x8DF9;
-	MAX_VERTEX_UNIFORM_VECTORS     = 0x8DFB;
-	MAX_VARYING_VECTORS            = 0x8DFC;
-	MAX_FRAGMENT_UNIFORM_VECTORS   = 0x8DFD;
-	RGB565                         = 0x8D62;
-	PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257;
-	PROGRAM_BINARY_LENGTH          = 0x8741;
-	NUM_PROGRAM_BINARY_FORMATS     = 0x87FE;
-	PROGRAM_BINARY_FORMATS         = 0x87FF;
-	VERTEX_SHADER_BIT              = 0x00000001;
-	FRAGMENT_SHADER_BIT            = 0x00000002;
-	GEOMETRY_SHADER_BIT            = 0x00000004;
-	TESS_CONTROL_SHADER_BIT        = 0x00000008;
-	TESS_EVALUATION_SHADER_BIT     = 0x00000010;
-	ALL_SHADER_BITS                = 0xFFFFFFFF;
-	PROGRAM_SEPARABLE              = 0x8258;
-	ACTIVE_PROGRAM                 = 0x8259;
-	PROGRAM_PIPELINE_BINDING       = 0x825A;
-	MAX_VIEWPORTS                  = 0x825B;
-	VIEWPORT_SUBPIXEL_BITS         = 0x825C;
-	VIEWPORT_BOUNDS_RANGE          = 0x825D;
-	LAYER_PROVOKING_VERTEX         = 0x825E;
-	VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F;
-	UNDEFINED_VERTEX               = 0x8260;
+SAMPLE_SHADING                 :: 0x8C36;
+MIN_SAMPLE_SHADING_VALUE       :: 0x8C37;
+MIN_PROGRAM_TEXTURE_GATHER_OFFSET :: 0x8E5E;
+MAX_PROGRAM_TEXTURE_GATHER_OFFSET :: 0x8E5F;
+TEXTURE_CUBE_MAP_ARRAY         :: 0x9009;
+TEXTURE_BINDING_CUBE_MAP_ARRAY :: 0x900A;
+PROXY_TEXTURE_CUBE_MAP_ARRAY   :: 0x900B;
+SAMPLER_CUBE_MAP_ARRAY         :: 0x900C;
+SAMPLER_CUBE_MAP_ARRAY_SHADOW  :: 0x900D;
+INT_SAMPLER_CUBE_MAP_ARRAY     :: 0x900E;
+UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY :: 0x900F;
+DRAW_INDIRECT_BUFFER           :: 0x8F3F;
+DRAW_INDIRECT_BUFFER_BINDING   :: 0x8F43;
+GEOMETRY_SHADER_INVOCATIONS    :: 0x887F;
+MAX_GEOMETRY_SHADER_INVOCATIONS :: 0x8E5A;
+MIN_FRAGMENT_INTERPOLATION_OFFSET :: 0x8E5B;
+MAX_FRAGMENT_INTERPOLATION_OFFSET :: 0x8E5C;
+FRAGMENT_INTERPOLATION_OFFSET_BITS :: 0x8E5D;
+MAX_VERTEX_STREAMS             :: 0x8E71;
+DOUBLE_VEC2                    :: 0x8FFC;
+DOUBLE_VEC3                    :: 0x8FFD;
+DOUBLE_VEC4                    :: 0x8FFE;
+DOUBLE_MAT2                    :: 0x8F46;
+DOUBLE_MAT3                    :: 0x8F47;
+DOUBLE_MAT4                    :: 0x8F48;
+DOUBLE_MAT2x3                  :: 0x8F49;
+DOUBLE_MAT2x4                  :: 0x8F4A;
+DOUBLE_MAT3x2                  :: 0x8F4B;
+DOUBLE_MAT3x4                  :: 0x8F4C;
+DOUBLE_MAT4x2                  :: 0x8F4D;
+DOUBLE_MAT4x3                  :: 0x8F4E;
+ACTIVE_SUBROUTINES             :: 0x8DE5;
+ACTIVE_SUBROUTINE_UNIFORMS     :: 0x8DE6;
+ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS :: 0x8E47;
+ACTIVE_SUBROUTINE_MAX_LENGTH   :: 0x8E48;
+ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH :: 0x8E49;
+MAX_SUBROUTINES                :: 0x8DE7;
+MAX_SUBROUTINE_UNIFORM_LOCATIONS :: 0x8DE8;
+NUM_COMPATIBLE_SUBROUTINES     :: 0x8E4A;
+COMPATIBLE_SUBROUTINES         :: 0x8E4B;
+PATCHES                        :: 0x000E;
+PATCH_VERTICES                 :: 0x8E72;
+PATCH_DEFAULT_INNER_LEVEL      :: 0x8E73;
+PATCH_DEFAULT_OUTER_LEVEL      :: 0x8E74;
+TESS_CONTROL_OUTPUT_VERTICES   :: 0x8E75;
+TESS_GEN_MODE                  :: 0x8E76;
+TESS_GEN_SPACING               :: 0x8E77;
+TESS_GEN_VERTEX_ORDER          :: 0x8E78;
+TESS_GEN_POINT_MODE            :: 0x8E79;
+ISOLINES                       :: 0x8E7A;
+FRACTIONAL_ODD                 :: 0x8E7B;
+FRACTIONAL_EVEN                :: 0x8E7C;
+MAX_PATCH_VERTICES             :: 0x8E7D;
+MAX_TESS_GEN_LEVEL             :: 0x8E7E;
+MAX_TESS_CONTROL_UNIFORM_COMPONENTS :: 0x8E7F;
+MAX_TESS_EVALUATION_UNIFORM_COMPONENTS :: 0x8E80;
+MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS :: 0x8E81;
+MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS :: 0x8E82;
+MAX_TESS_CONTROL_OUTPUT_COMPONENTS :: 0x8E83;
+MAX_TESS_PATCH_COMPONENTS      :: 0x8E84;
+MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS :: 0x8E85;
+MAX_TESS_EVALUATION_OUTPUT_COMPONENTS :: 0x8E86;
+MAX_TESS_CONTROL_UNIFORM_BLOCKS :: 0x8E89;
+MAX_TESS_EVALUATION_UNIFORM_BLOCKS :: 0x8E8A;
+MAX_TESS_CONTROL_INPUT_COMPONENTS :: 0x886C;
+MAX_TESS_EVALUATION_INPUT_COMPONENTS :: 0x886D;
+MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS :: 0x8E1E;
+MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS :: 0x8E1F;
+UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER :: 0x84F0;
+UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER :: 0x84F1;
+TESS_EVALUATION_SHADER         :: 0x8E87;
+TESS_CONTROL_SHADER            :: 0x8E88;
+TRANSFORM_FEEDBACK             :: 0x8E22;
+TRANSFORM_FEEDBACK_BUFFER_PAUSED :: 0x8E23;
+TRANSFORM_FEEDBACK_BUFFER_ACTIVE :: 0x8E24;
+TRANSFORM_FEEDBACK_BINDING     :: 0x8E25;
+MAX_TRANSFORM_FEEDBACK_BUFFERS :: 0x8E70;
 
-	COPY_READ_BUFFER_BINDING       = 0x8F36;
-	COPY_WRITE_BUFFER_BINDING      = 0x8F37;
-	TRANSFORM_FEEDBACK_ACTIVE      = 0x8E24;
-	TRANSFORM_FEEDBACK_PAUSED      = 0x8E23;
-	UNPACK_COMPRESSED_BLOCK_WIDTH  = 0x9127;
-	UNPACK_COMPRESSED_BLOCK_HEIGHT = 0x9128;
-	UNPACK_COMPRESSED_BLOCK_DEPTH  = 0x9129;
-	UNPACK_COMPRESSED_BLOCK_SIZE   = 0x912A;
-	PACK_COMPRESSED_BLOCK_WIDTH    = 0x912B;
-	PACK_COMPRESSED_BLOCK_HEIGHT   = 0x912C;
-	PACK_COMPRESSED_BLOCK_DEPTH    = 0x912D;
-	PACK_COMPRESSED_BLOCK_SIZE     = 0x912E;
-	NUM_SAMPLE_COUNTS              = 0x9380;
-	MIN_MAP_BUFFER_ALIGNMENT       = 0x90BC;
-	ATOMIC_COUNTER_BUFFER          = 0x92C0;
-	ATOMIC_COUNTER_BUFFER_BINDING  = 0x92C1;
-	ATOMIC_COUNTER_BUFFER_START    = 0x92C2;
-	ATOMIC_COUNTER_BUFFER_SIZE     = 0x92C3;
-	ATOMIC_COUNTER_BUFFER_DATA_SIZE = 0x92C4;
-	ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = 0x92C5;
-	ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = 0x92C6;
-	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = 0x92C7;
-	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = 0x92C8;
-	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x92C9;
-	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = 0x92CA;
-	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = 0x92CB;
-	MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC;
-	MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD;
-	MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE;
-	MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF;
-	MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0;
-	MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1;
-	MAX_VERTEX_ATOMIC_COUNTERS     = 0x92D2;
-	MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3;
-	MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4;
-	MAX_GEOMETRY_ATOMIC_COUNTERS   = 0x92D5;
-	MAX_FRAGMENT_ATOMIC_COUNTERS   = 0x92D6;
-	MAX_COMBINED_ATOMIC_COUNTERS   = 0x92D7;
-	MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8;
-	MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC;
-	ACTIVE_ATOMIC_COUNTER_BUFFERS  = 0x92D9;
-	UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = 0x92DA;
-	UNSIGNED_INT_ATOMIC_COUNTER    = 0x92DB;
-	VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x00000001;
-	ELEMENT_ARRAY_BARRIER_BIT      = 0x00000002;
-	UNIFORM_BARRIER_BIT            = 0x00000004;
-	TEXTURE_FETCH_BARRIER_BIT      = 0x00000008;
-	SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x00000020;
-	COMMAND_BARRIER_BIT            = 0x00000040;
-	PIXEL_BUFFER_BARRIER_BIT       = 0x00000080;
-	TEXTURE_UPDATE_BARRIER_BIT     = 0x00000100;
-	BUFFER_UPDATE_BARRIER_BIT      = 0x00000200;
-	FRAMEBUFFER_BARRIER_BIT        = 0x00000400;
-	TRANSFORM_FEEDBACK_BARRIER_BIT = 0x00000800;
-	ATOMIC_COUNTER_BARRIER_BIT     = 0x00001000;
-	ALL_BARRIER_BITS               = 0xFFFFFFFF;
-	MAX_IMAGE_UNITS                = 0x8F38;
-	MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39;
-	IMAGE_BINDING_NAME             = 0x8F3A;
-	IMAGE_BINDING_LEVEL            = 0x8F3B;
-	IMAGE_BINDING_LAYERED          = 0x8F3C;
-	IMAGE_BINDING_LAYER            = 0x8F3D;
-	IMAGE_BINDING_ACCESS           = 0x8F3E;
-	IMAGE_1D                       = 0x904C;
-	IMAGE_2D                       = 0x904D;
-	IMAGE_3D                       = 0x904E;
-	IMAGE_2D_RECT                  = 0x904F;
-	IMAGE_CUBE                     = 0x9050;
-	IMAGE_BUFFER                   = 0x9051;
-	IMAGE_1D_ARRAY                 = 0x9052;
-	IMAGE_2D_ARRAY                 = 0x9053;
-	IMAGE_CUBE_MAP_ARRAY           = 0x9054;
-	IMAGE_2D_MULTISAMPLE           = 0x9055;
-	IMAGE_2D_MULTISAMPLE_ARRAY     = 0x9056;
-	INT_IMAGE_1D                   = 0x9057;
-	INT_IMAGE_2D                   = 0x9058;
-	INT_IMAGE_3D                   = 0x9059;
-	INT_IMAGE_2D_RECT              = 0x905A;
-	INT_IMAGE_CUBE                 = 0x905B;
-	INT_IMAGE_BUFFER               = 0x905C;
-	INT_IMAGE_1D_ARRAY             = 0x905D;
-	INT_IMAGE_2D_ARRAY             = 0x905E;
-	INT_IMAGE_CUBE_MAP_ARRAY       = 0x905F;
-	INT_IMAGE_2D_MULTISAMPLE       = 0x9060;
-	INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061;
-	UNSIGNED_INT_IMAGE_1D          = 0x9062;
-	UNSIGNED_INT_IMAGE_2D          = 0x9063;
-	UNSIGNED_INT_IMAGE_3D          = 0x9064;
-	UNSIGNED_INT_IMAGE_2D_RECT     = 0x9065;
-	UNSIGNED_INT_IMAGE_CUBE        = 0x9066;
-	UNSIGNED_INT_IMAGE_BUFFER      = 0x9067;
-	UNSIGNED_INT_IMAGE_1D_ARRAY    = 0x9068;
-	UNSIGNED_INT_IMAGE_2D_ARRAY    = 0x9069;
-	UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A;
-	UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B;
-	UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C;
-	MAX_IMAGE_SAMPLES              = 0x906D;
-	IMAGE_BINDING_FORMAT           = 0x906E;
-	IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7;
-	IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8;
-	IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9;
-	MAX_VERTEX_IMAGE_UNIFORMS      = 0x90CA;
-	MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB;
-	MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC;
-	MAX_GEOMETRY_IMAGE_UNIFORMS    = 0x90CD;
-	MAX_FRAGMENT_IMAGE_UNIFORMS    = 0x90CE;
-	MAX_COMBINED_IMAGE_UNIFORMS    = 0x90CF;
-	COMPRESSED_RGBA_BPTC_UNORM     = 0x8E8C;
-	COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D;
-	COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E;
-	COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F;
-	TEXTURE_IMMUTABLE_FORMAT       = 0x912F;
+FIXED                          :: 0x140C;
+IMPLEMENTATION_COLOR_READ_TYPE :: 0x8B9A;
+IMPLEMENTATION_COLOR_READ_FORMAT :: 0x8B9B;
+LOW_FLOAT                      :: 0x8DF0;
+MEDIUM_FLOAT                   :: 0x8DF1;
+HIGH_FLOAT                     :: 0x8DF2;
+LOW_INT                        :: 0x8DF3;
+MEDIUM_INT                     :: 0x8DF4;
+HIGH_INT                       :: 0x8DF5;
+SHADER_COMPILER                :: 0x8DFA;
+SHADER_BINARY_FORMATS          :: 0x8DF8;
+NUM_SHADER_BINARY_FORMATS      :: 0x8DF9;
+MAX_VERTEX_UNIFORM_VECTORS     :: 0x8DFB;
+MAX_VARYING_VECTORS            :: 0x8DFC;
+MAX_FRAGMENT_UNIFORM_VECTORS   :: 0x8DFD;
+RGB565                         :: 0x8D62;
+PROGRAM_BINARY_RETRIEVABLE_HINT :: 0x8257;
+PROGRAM_BINARY_LENGTH          :: 0x8741;
+NUM_PROGRAM_BINARY_FORMATS     :: 0x87FE;
+PROGRAM_BINARY_FORMATS         :: 0x87FF;
+VERTEX_SHADER_BIT              :: 0x00000001;
+FRAGMENT_SHADER_BIT            :: 0x00000002;
+GEOMETRY_SHADER_BIT            :: 0x00000004;
+TESS_CONTROL_SHADER_BIT        :: 0x00000008;
+TESS_EVALUATION_SHADER_BIT     :: 0x00000010;
+ALL_SHADER_BITS                :: 0xFFFFFFFF;
+PROGRAM_SEPARABLE              :: 0x8258;
+ACTIVE_PROGRAM                 :: 0x8259;
+PROGRAM_PIPELINE_BINDING       :: 0x825A;
+MAX_VIEWPORTS                  :: 0x825B;
+VIEWPORT_SUBPIXEL_BITS         :: 0x825C;
+VIEWPORT_BOUNDS_RANGE          :: 0x825D;
+LAYER_PROVOKING_VERTEX         :: 0x825E;
+VIEWPORT_INDEX_PROVOKING_VERTEX :: 0x825F;
+UNDEFINED_VERTEX               :: 0x8260;
 
-	NUM_SHADING_LANGUAGE_VERSIONS  = 0x82E9;
-	VERTEX_ATTRIB_ARRAY_LONG       = 0x874E;
-	COMPRESSED_RGB8_ETC2           = 0x9274;
-	COMPRESSED_SRGB8_ETC2          = 0x9275;
-	COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276;
-	COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277;
-	COMPRESSED_RGBA8_ETC2_EAC      = 0x9278;
-	COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279;
-	COMPRESSED_R11_EAC             = 0x9270;
-	COMPRESSED_SIGNED_R11_EAC      = 0x9271;
-	COMPRESSED_RG11_EAC            = 0x9272;
-	COMPRESSED_SIGNED_RG11_EAC     = 0x9273;
-	PRIMITIVE_RESTART_FIXED_INDEX  = 0x8D69;
-	ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A;
-	MAX_ELEMENT_INDEX              = 0x8D6B;
-	COMPUTE_SHADER                 = 0x91B9;
-	MAX_COMPUTE_UNIFORM_BLOCKS     = 0x91BB;
-	MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC;
-	MAX_COMPUTE_IMAGE_UNIFORMS     = 0x91BD;
-	MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262;
-	MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263;
-	MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264;
-	MAX_COMPUTE_ATOMIC_COUNTERS    = 0x8265;
-	MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266;
-	MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB;
-	MAX_COMPUTE_WORK_GROUP_COUNT   = 0x91BE;
-	MAX_COMPUTE_WORK_GROUP_SIZE    = 0x91BF;
-	COMPUTE_WORK_GROUP_SIZE        = 0x8267;
-	UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC;
-	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED;
-	DISPATCH_INDIRECT_BUFFER       = 0x90EE;
-	DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF;
-	COMPUTE_SHADER_BIT             = 0x00000020;
-	DEBUG_OUTPUT_SYNCHRONOUS       = 0x8242;
-	DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243;
-	DEBUG_CALLBACK_FUNCTION        = 0x8244;
-	DEBUG_CALLBACK_USER_PARAM      = 0x8245;
-	DEBUG_SOURCE_API               = 0x8246;
-	DEBUG_SOURCE_WINDOW_SYSTEM     = 0x8247;
-	DEBUG_SOURCE_SHADER_COMPILER   = 0x8248;
-	DEBUG_SOURCE_THIRD_PARTY       = 0x8249;
-	DEBUG_SOURCE_APPLICATION       = 0x824A;
-	DEBUG_SOURCE_OTHER             = 0x824B;
-	DEBUG_TYPE_ERROR               = 0x824C;
-	DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D;
-	DEBUG_TYPE_UNDEFINED_BEHAVIOR  = 0x824E;
-	DEBUG_TYPE_PORTABILITY         = 0x824F;
-	DEBUG_TYPE_PERFORMANCE         = 0x8250;
-	DEBUG_TYPE_OTHER               = 0x8251;
-	MAX_DEBUG_MESSAGE_LENGTH       = 0x9143;
-	MAX_DEBUG_LOGGED_MESSAGES      = 0x9144;
-	DEBUG_LOGGED_MESSAGES          = 0x9145;
-	DEBUG_SEVERITY_HIGH            = 0x9146;
-	DEBUG_SEVERITY_MEDIUM          = 0x9147;
-	DEBUG_SEVERITY_LOW             = 0x9148;
-	DEBUG_TYPE_MARKER              = 0x8268;
-	DEBUG_TYPE_PUSH_GROUP          = 0x8269;
-	DEBUG_TYPE_POP_GROUP           = 0x826A;
-	DEBUG_SEVERITY_NOTIFICATION    = 0x826B;
-	MAX_DEBUG_GROUP_STACK_DEPTH    = 0x826C;
-	DEBUG_GROUP_STACK_DEPTH        = 0x826D;
-	BUFFER                         = 0x82E0;
-	SHADER                         = 0x82E1;
-	PROGRAM                        = 0x82E2;
-	QUERY                          = 0x82E3;
-	PROGRAM_PIPELINE               = 0x82E4;
-	SAMPLER                        = 0x82E6;
-	MAX_LABEL_LENGTH               = 0x82E8;
-	DEBUG_OUTPUT                   = 0x92E0;
-	CONTEXT_FLAG_DEBUG_BIT         = 0x00000002;
-	MAX_UNIFORM_LOCATIONS          = 0x826E;
-	FRAMEBUFFER_DEFAULT_WIDTH      = 0x9310;
-	FRAMEBUFFER_DEFAULT_HEIGHT     = 0x9311;
-	FRAMEBUFFER_DEFAULT_LAYERS     = 0x9312;
-	FRAMEBUFFER_DEFAULT_SAMPLES    = 0x9313;
-	FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314;
-	MAX_FRAMEBUFFER_WIDTH          = 0x9315;
-	MAX_FRAMEBUFFER_HEIGHT         = 0x9316;
-	MAX_FRAMEBUFFER_LAYERS         = 0x9317;
-	MAX_FRAMEBUFFER_SAMPLES        = 0x9318;
-	INTERNALFORMAT_SUPPORTED       = 0x826F;
-	INTERNALFORMAT_PREFERRED       = 0x8270;
-	INTERNALFORMAT_RED_SIZE        = 0x8271;
-	INTERNALFORMAT_GREEN_SIZE      = 0x8272;
-	INTERNALFORMAT_BLUE_SIZE       = 0x8273;
-	INTERNALFORMAT_ALPHA_SIZE      = 0x8274;
-	INTERNALFORMAT_DEPTH_SIZE      = 0x8275;
-	INTERNALFORMAT_STENCIL_SIZE    = 0x8276;
-	INTERNALFORMAT_SHARED_SIZE     = 0x8277;
-	INTERNALFORMAT_RED_TYPE        = 0x8278;
-	INTERNALFORMAT_GREEN_TYPE      = 0x8279;
-	INTERNALFORMAT_BLUE_TYPE       = 0x827A;
-	INTERNALFORMAT_ALPHA_TYPE      = 0x827B;
-	INTERNALFORMAT_DEPTH_TYPE      = 0x827C;
-	INTERNALFORMAT_STENCIL_TYPE    = 0x827D;
-	MAX_WIDTH                      = 0x827E;
-	MAX_HEIGHT                     = 0x827F;
-	MAX_DEPTH                      = 0x8280;
-	MAX_LAYERS                     = 0x8281;
-	MAX_COMBINED_DIMENSIONS        = 0x8282;
-	COLOR_COMPONENTS               = 0x8283;
-	DEPTH_COMPONENTS               = 0x8284;
-	STENCIL_COMPONENTS             = 0x8285;
-	COLOR_RENDERABLE               = 0x8286;
-	DEPTH_RENDERABLE               = 0x8287;
-	STENCIL_RENDERABLE             = 0x8288;
-	FRAMEBUFFER_RENDERABLE         = 0x8289;
-	FRAMEBUFFER_RENDERABLE_LAYERED = 0x828A;
-	FRAMEBUFFER_BLEND              = 0x828B;
-	READ_PIXELS                    = 0x828C;
-	READ_PIXELS_FORMAT             = 0x828D;
-	READ_PIXELS_TYPE               = 0x828E;
-	TEXTURE_IMAGE_FORMAT           = 0x828F;
-	TEXTURE_IMAGE_TYPE             = 0x8290;
-	GET_TEXTURE_IMAGE_FORMAT       = 0x8291;
-	GET_TEXTURE_IMAGE_TYPE         = 0x8292;
-	MIPMAP                         = 0x8293;
-	MANUAL_GENERATE_MIPMAP         = 0x8294;
-	AUTO_GENERATE_MIPMAP           = 0x8295;
-	COLOR_ENCODING                 = 0x8296;
-	SRGB_READ                      = 0x8297;
-	SRGB_WRITE                     = 0x8298;
-	FILTER                         = 0x829A;
-	VERTEX_TEXTURE                 = 0x829B;
-	TESS_CONTROL_TEXTURE           = 0x829C;
-	TESS_EVALUATION_TEXTURE        = 0x829D;
-	GEOMETRY_TEXTURE               = 0x829E;
-	FRAGMENT_TEXTURE               = 0x829F;
-	COMPUTE_TEXTURE                = 0x82A0;
-	TEXTURE_SHADOW                 = 0x82A1;
-	TEXTURE_GATHER                 = 0x82A2;
-	TEXTURE_GATHER_SHADOW          = 0x82A3;
-	SHADER_IMAGE_LOAD              = 0x82A4;
-	SHADER_IMAGE_STORE             = 0x82A5;
-	SHADER_IMAGE_ATOMIC            = 0x82A6;
-	IMAGE_TEXEL_SIZE               = 0x82A7;
-	IMAGE_COMPATIBILITY_CLASS      = 0x82A8;
-	IMAGE_PIXEL_FORMAT             = 0x82A9;
-	IMAGE_PIXEL_TYPE               = 0x82AA;
-	SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = 0x82AC;
-	SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = 0x82AD;
-	SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = 0x82AE;
-	SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = 0x82AF;
-	TEXTURE_COMPRESSED_BLOCK_WIDTH = 0x82B1;
-	TEXTURE_COMPRESSED_BLOCK_HEIGHT = 0x82B2;
-	TEXTURE_COMPRESSED_BLOCK_SIZE  = 0x82B3;
-	CLEAR_BUFFER                   = 0x82B4;
-	TEXTURE_VIEW                   = 0x82B5;
-	VIEW_COMPATIBILITY_CLASS       = 0x82B6;
-	FULL_SUPPORT                   = 0x82B7;
-	CAVEAT_SUPPORT                 = 0x82B8;
-	IMAGE_CLASS_4_X_32             = 0x82B9;
-	IMAGE_CLASS_2_X_32             = 0x82BA;
-	IMAGE_CLASS_1_X_32             = 0x82BB;
-	IMAGE_CLASS_4_X_16             = 0x82BC;
-	IMAGE_CLASS_2_X_16             = 0x82BD;
-	IMAGE_CLASS_1_X_16             = 0x82BE;
-	IMAGE_CLASS_4_X_8              = 0x82BF;
-	IMAGE_CLASS_2_X_8              = 0x82C0;
-	IMAGE_CLASS_1_X_8              = 0x82C1;
-	IMAGE_CLASS_11_11_10           = 0x82C2;
-	IMAGE_CLASS_10_10_10_2         = 0x82C3;
-	VIEW_CLASS_128_BITS            = 0x82C4;
-	VIEW_CLASS_96_BITS             = 0x82C5;
-	VIEW_CLASS_64_BITS             = 0x82C6;
-	VIEW_CLASS_48_BITS             = 0x82C7;
-	VIEW_CLASS_32_BITS             = 0x82C8;
-	VIEW_CLASS_24_BITS             = 0x82C9;
-	VIEW_CLASS_16_BITS             = 0x82CA;
-	VIEW_CLASS_8_BITS              = 0x82CB;
-	VIEW_CLASS_S3TC_DXT1_RGB       = 0x82CC;
-	VIEW_CLASS_S3TC_DXT1_RGBA      = 0x82CD;
-	VIEW_CLASS_S3TC_DXT3_RGBA      = 0x82CE;
-	VIEW_CLASS_S3TC_DXT5_RGBA      = 0x82CF;
-	VIEW_CLASS_RGTC1_RED           = 0x82D0;
-	VIEW_CLASS_RGTC2_RG            = 0x82D1;
-	VIEW_CLASS_BPTC_UNORM          = 0x82D2;
-	VIEW_CLASS_BPTC_FLOAT          = 0x82D3;
-	UNIFORM                        = 0x92E1;
-	UNIFORM_BLOCK                  = 0x92E2;
-	PROGRAM_INPUT                  = 0x92E3;
-	PROGRAM_OUTPUT                 = 0x92E4;
-	BUFFER_VARIABLE                = 0x92E5;
-	SHADER_STORAGE_BLOCK           = 0x92E6;
-	VERTEX_SUBROUTINE              = 0x92E8;
-	TESS_CONTROL_SUBROUTINE        = 0x92E9;
-	TESS_EVALUATION_SUBROUTINE     = 0x92EA;
-	GEOMETRY_SUBROUTINE            = 0x92EB;
-	FRAGMENT_SUBROUTINE            = 0x92EC;
-	COMPUTE_SUBROUTINE             = 0x92ED;
-	VERTEX_SUBROUTINE_UNIFORM      = 0x92EE;
-	TESS_CONTROL_SUBROUTINE_UNIFORM = 0x92EF;
-	TESS_EVALUATION_SUBROUTINE_UNIFORM = 0x92F0;
-	GEOMETRY_SUBROUTINE_UNIFORM    = 0x92F1;
-	FRAGMENT_SUBROUTINE_UNIFORM    = 0x92F2;
-	COMPUTE_SUBROUTINE_UNIFORM     = 0x92F3;
-	TRANSFORM_FEEDBACK_VARYING     = 0x92F4;
-	ACTIVE_RESOURCES               = 0x92F5;
-	MAX_NAME_LENGTH                = 0x92F6;
-	MAX_NUM_ACTIVE_VARIABLES       = 0x92F7;
-	MAX_NUM_COMPATIBLE_SUBROUTINES = 0x92F8;
-	NAME_LENGTH                    = 0x92F9;
-	TYPE                           = 0x92FA;
-	ARRAY_SIZE                     = 0x92FB;
-	OFFSET                         = 0x92FC;
-	BLOCK_INDEX                    = 0x92FD;
-	ARRAY_STRIDE                   = 0x92FE;
-	MATRIX_STRIDE                  = 0x92FF;
-	IS_ROW_MAJOR                   = 0x9300;
-	ATOMIC_COUNTER_BUFFER_INDEX    = 0x9301;
-	BUFFER_BINDING                 = 0x9302;
-	BUFFER_DATA_SIZE               = 0x9303;
-	NUM_ACTIVE_VARIABLES           = 0x9304;
-	ACTIVE_VARIABLES               = 0x9305;
-	REFERENCED_BY_VERTEX_SHADER    = 0x9306;
-	REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307;
-	REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308;
-	REFERENCED_BY_GEOMETRY_SHADER  = 0x9309;
-	REFERENCED_BY_FRAGMENT_SHADER  = 0x930A;
-	REFERENCED_BY_COMPUTE_SHADER   = 0x930B;
-	TOP_LEVEL_ARRAY_SIZE           = 0x930C;
-	TOP_LEVEL_ARRAY_STRIDE         = 0x930D;
-	LOCATION                       = 0x930E;
-	LOCATION_INDEX                 = 0x930F;
-	IS_PER_PATCH                   = 0x92E7;
-	SHADER_STORAGE_BUFFER          = 0x90D2;
-	SHADER_STORAGE_BUFFER_BINDING  = 0x90D3;
-	SHADER_STORAGE_BUFFER_START    = 0x90D4;
-	SHADER_STORAGE_BUFFER_SIZE     = 0x90D5;
-	MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6;
-	MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7;
-	MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8;
-	MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9;
-	MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA;
-	MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB;
-	MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC;
-	MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD;
-	MAX_SHADER_STORAGE_BLOCK_SIZE  = 0x90DE;
-	SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF;
-	SHADER_STORAGE_BARRIER_BIT     = 0x00002000;
-	MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39;
-	DEPTH_STENCIL_TEXTURE_MODE     = 0x90EA;
-	TEXTURE_BUFFER_OFFSET          = 0x919D;
-	TEXTURE_BUFFER_SIZE            = 0x919E;
-	TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F;
-	TEXTURE_VIEW_MIN_LEVEL         = 0x82DB;
-	TEXTURE_VIEW_NUM_LEVELS        = 0x82DC;
-	TEXTURE_VIEW_MIN_LAYER         = 0x82DD;
-	TEXTURE_VIEW_NUM_LAYERS        = 0x82DE;
-	TEXTURE_IMMUTABLE_LEVELS       = 0x82DF;
-	VERTEX_ATTRIB_BINDING          = 0x82D4;
-	VERTEX_ATTRIB_RELATIVE_OFFSET  = 0x82D5;
-	VERTEX_BINDING_DIVISOR         = 0x82D6;
-	VERTEX_BINDING_OFFSET          = 0x82D7;
-	VERTEX_BINDING_STRIDE          = 0x82D8;
-	MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9;
-	MAX_VERTEX_ATTRIB_BINDINGS     = 0x82DA;
-	VERTEX_BINDING_BUFFER          = 0x8F4F;
+COPY_READ_BUFFER_BINDING       :: 0x8F36;
+COPY_WRITE_BUFFER_BINDING      :: 0x8F37;
+TRANSFORM_FEEDBACK_ACTIVE      :: 0x8E24;
+TRANSFORM_FEEDBACK_PAUSED      :: 0x8E23;
+UNPACK_COMPRESSED_BLOCK_WIDTH  :: 0x9127;
+UNPACK_COMPRESSED_BLOCK_HEIGHT :: 0x9128;
+UNPACK_COMPRESSED_BLOCK_DEPTH  :: 0x9129;
+UNPACK_COMPRESSED_BLOCK_SIZE   :: 0x912A;
+PACK_COMPRESSED_BLOCK_WIDTH    :: 0x912B;
+PACK_COMPRESSED_BLOCK_HEIGHT   :: 0x912C;
+PACK_COMPRESSED_BLOCK_DEPTH    :: 0x912D;
+PACK_COMPRESSED_BLOCK_SIZE     :: 0x912E;
+NUM_SAMPLE_COUNTS              :: 0x9380;
+MIN_MAP_BUFFER_ALIGNMENT       :: 0x90BC;
+ATOMIC_COUNTER_BUFFER          :: 0x92C0;
+ATOMIC_COUNTER_BUFFER_BINDING  :: 0x92C1;
+ATOMIC_COUNTER_BUFFER_START    :: 0x92C2;
+ATOMIC_COUNTER_BUFFER_SIZE     :: 0x92C3;
+ATOMIC_COUNTER_BUFFER_DATA_SIZE :: 0x92C4;
+ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS :: 0x92C5;
+ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES :: 0x92C6;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER :: 0x92C7;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER :: 0x92C8;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER :: 0x92C9;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER :: 0x92CA;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER :: 0x92CB;
+MAX_VERTEX_ATOMIC_COUNTER_BUFFERS :: 0x92CC;
+MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS :: 0x92CD;
+MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS :: 0x92CE;
+MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS :: 0x92CF;
+MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS :: 0x92D0;
+MAX_COMBINED_ATOMIC_COUNTER_BUFFERS :: 0x92D1;
+MAX_VERTEX_ATOMIC_COUNTERS     :: 0x92D2;
+MAX_TESS_CONTROL_ATOMIC_COUNTERS :: 0x92D3;
+MAX_TESS_EVALUATION_ATOMIC_COUNTERS :: 0x92D4;
+MAX_GEOMETRY_ATOMIC_COUNTERS   :: 0x92D5;
+MAX_FRAGMENT_ATOMIC_COUNTERS   :: 0x92D6;
+MAX_COMBINED_ATOMIC_COUNTERS   :: 0x92D7;
+MAX_ATOMIC_COUNTER_BUFFER_SIZE :: 0x92D8;
+MAX_ATOMIC_COUNTER_BUFFER_BINDINGS :: 0x92DC;
+ACTIVE_ATOMIC_COUNTER_BUFFERS  :: 0x92D9;
+UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX :: 0x92DA;
+UNSIGNED_INT_ATOMIC_COUNTER    :: 0x92DB;
+VERTEX_ATTRIB_ARRAY_BARRIER_BIT :: 0x00000001;
+ELEMENT_ARRAY_BARRIER_BIT      :: 0x00000002;
+UNIFORM_BARRIER_BIT            :: 0x00000004;
+TEXTURE_FETCH_BARRIER_BIT      :: 0x00000008;
+SHADER_IMAGE_ACCESS_BARRIER_BIT :: 0x00000020;
+COMMAND_BARRIER_BIT            :: 0x00000040;
+PIXEL_BUFFER_BARRIER_BIT       :: 0x00000080;
+TEXTURE_UPDATE_BARRIER_BIT     :: 0x00000100;
+BUFFER_UPDATE_BARRIER_BIT      :: 0x00000200;
+FRAMEBUFFER_BARRIER_BIT        :: 0x00000400;
+TRANSFORM_FEEDBACK_BARRIER_BIT :: 0x00000800;
+ATOMIC_COUNTER_BARRIER_BIT     :: 0x00001000;
+ALL_BARRIER_BITS               :: 0xFFFFFFFF;
+MAX_IMAGE_UNITS                :: 0x8F38;
+MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS :: 0x8F39;
+IMAGE_BINDING_NAME             :: 0x8F3A;
+IMAGE_BINDING_LEVEL            :: 0x8F3B;
+IMAGE_BINDING_LAYERED          :: 0x8F3C;
+IMAGE_BINDING_LAYER            :: 0x8F3D;
+IMAGE_BINDING_ACCESS           :: 0x8F3E;
+IMAGE_1D                       :: 0x904C;
+IMAGE_2D                       :: 0x904D;
+IMAGE_3D                       :: 0x904E;
+IMAGE_2D_RECT                  :: 0x904F;
+IMAGE_CUBE                     :: 0x9050;
+IMAGE_BUFFER                   :: 0x9051;
+IMAGE_1D_ARRAY                 :: 0x9052;
+IMAGE_2D_ARRAY                 :: 0x9053;
+IMAGE_CUBE_MAP_ARRAY           :: 0x9054;
+IMAGE_2D_MULTISAMPLE           :: 0x9055;
+IMAGE_2D_MULTISAMPLE_ARRAY     :: 0x9056;
+INT_IMAGE_1D                   :: 0x9057;
+INT_IMAGE_2D                   :: 0x9058;
+INT_IMAGE_3D                   :: 0x9059;
+INT_IMAGE_2D_RECT              :: 0x905A;
+INT_IMAGE_CUBE                 :: 0x905B;
+INT_IMAGE_BUFFER               :: 0x905C;
+INT_IMAGE_1D_ARRAY             :: 0x905D;
+INT_IMAGE_2D_ARRAY             :: 0x905E;
+INT_IMAGE_CUBE_MAP_ARRAY       :: 0x905F;
+INT_IMAGE_2D_MULTISAMPLE       :: 0x9060;
+INT_IMAGE_2D_MULTISAMPLE_ARRAY :: 0x9061;
+UNSIGNED_INT_IMAGE_1D          :: 0x9062;
+UNSIGNED_INT_IMAGE_2D          :: 0x9063;
+UNSIGNED_INT_IMAGE_3D          :: 0x9064;
+UNSIGNED_INT_IMAGE_2D_RECT     :: 0x9065;
+UNSIGNED_INT_IMAGE_CUBE        :: 0x9066;
+UNSIGNED_INT_IMAGE_BUFFER      :: 0x9067;
+UNSIGNED_INT_IMAGE_1D_ARRAY    :: 0x9068;
+UNSIGNED_INT_IMAGE_2D_ARRAY    :: 0x9069;
+UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY :: 0x906A;
+UNSIGNED_INT_IMAGE_2D_MULTISAMPLE :: 0x906B;
+UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY :: 0x906C;
+MAX_IMAGE_SAMPLES              :: 0x906D;
+IMAGE_BINDING_FORMAT           :: 0x906E;
+IMAGE_FORMAT_COMPATIBILITY_TYPE :: 0x90C7;
+IMAGE_FORMAT_COMPATIBILITY_BY_SIZE :: 0x90C8;
+IMAGE_FORMAT_COMPATIBILITY_BY_CLASS :: 0x90C9;
+MAX_VERTEX_IMAGE_UNIFORMS      :: 0x90CA;
+MAX_TESS_CONTROL_IMAGE_UNIFORMS :: 0x90CB;
+MAX_TESS_EVALUATION_IMAGE_UNIFORMS :: 0x90CC;
+MAX_GEOMETRY_IMAGE_UNIFORMS    :: 0x90CD;
+MAX_FRAGMENT_IMAGE_UNIFORMS    :: 0x90CE;
+MAX_COMBINED_IMAGE_UNIFORMS    :: 0x90CF;
+COMPRESSED_RGBA_BPTC_UNORM     :: 0x8E8C;
+COMPRESSED_SRGB_ALPHA_BPTC_UNORM :: 0x8E8D;
+COMPRESSED_RGB_BPTC_SIGNED_FLOAT :: 0x8E8E;
+COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT :: 0x8E8F;
+TEXTURE_IMMUTABLE_FORMAT       :: 0x912F;
 
-	MAX_VERTEX_ATTRIB_STRIDE       = 0x82E5;
-	PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED = 0x8221;
-	TEXTURE_BUFFER_BINDING         = 0x8C2A;
-	MAP_PERSISTENT_BIT             = 0x0040;
-	MAP_COHERENT_BIT               = 0x0080;
-	DYNAMIC_STORAGE_BIT            = 0x0100;
-	CLIENT_STORAGE_BIT             = 0x0200;
-	CLIENT_MAPPED_BUFFER_BARRIER_BIT = 0x00004000;
-	BUFFER_IMMUTABLE_STORAGE       = 0x821F;
-	BUFFER_STORAGE_FLAGS           = 0x8220;
-	CLEAR_TEXTURE                  = 0x9365;
-	LOCATION_COMPONENT             = 0x934A;
-	TRANSFORM_FEEDBACK_BUFFER_INDEX = 0x934B;
-	TRANSFORM_FEEDBACK_BUFFER_STRIDE = 0x934C;
-	QUERY_BUFFER                   = 0x9192;
-	QUERY_BUFFER_BARRIER_BIT       = 0x00008000;
-	QUERY_BUFFER_BINDING           = 0x9193;
-	QUERY_RESULT_NO_WAIT           = 0x9194;
-	MIRROR_CLAMP_TO_EDGE           = 0x8743;
+NUM_SHADING_LANGUAGE_VERSIONS  :: 0x82E9;
+VERTEX_ATTRIB_ARRAY_LONG       :: 0x874E;
+COMPRESSED_RGB8_ETC2           :: 0x9274;
+COMPRESSED_SRGB8_ETC2          :: 0x9275;
+COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 :: 0x9276;
+COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 :: 0x9277;
+COMPRESSED_RGBA8_ETC2_EAC      :: 0x9278;
+COMPRESSED_SRGB8_ALPHA8_ETC2_EAC :: 0x9279;
+COMPRESSED_R11_EAC             :: 0x9270;
+COMPRESSED_SIGNED_R11_EAC      :: 0x9271;
+COMPRESSED_RG11_EAC            :: 0x9272;
+COMPRESSED_SIGNED_RG11_EAC     :: 0x9273;
+PRIMITIVE_RESTART_FIXED_INDEX  :: 0x8D69;
+ANY_SAMPLES_PASSED_CONSERVATIVE :: 0x8D6A;
+MAX_ELEMENT_INDEX              :: 0x8D6B;
+COMPUTE_SHADER                 :: 0x91B9;
+MAX_COMPUTE_UNIFORM_BLOCKS     :: 0x91BB;
+MAX_COMPUTE_TEXTURE_IMAGE_UNITS :: 0x91BC;
+MAX_COMPUTE_IMAGE_UNIFORMS     :: 0x91BD;
+MAX_COMPUTE_SHARED_MEMORY_SIZE :: 0x8262;
+MAX_COMPUTE_UNIFORM_COMPONENTS :: 0x8263;
+MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS :: 0x8264;
+MAX_COMPUTE_ATOMIC_COUNTERS    :: 0x8265;
+MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS :: 0x8266;
+MAX_COMPUTE_WORK_GROUP_INVOCATIONS :: 0x90EB;
+MAX_COMPUTE_WORK_GROUP_COUNT   :: 0x91BE;
+MAX_COMPUTE_WORK_GROUP_SIZE    :: 0x91BF;
+COMPUTE_WORK_GROUP_SIZE        :: 0x8267;
+UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER :: 0x90EC;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER :: 0x90ED;
+DISPATCH_INDIRECT_BUFFER       :: 0x90EE;
+DISPATCH_INDIRECT_BUFFER_BINDING :: 0x90EF;
+COMPUTE_SHADER_BIT             :: 0x00000020;
+DEBUG_OUTPUT_SYNCHRONOUS       :: 0x8242;
+DEBUG_NEXT_LOGGED_MESSAGE_LENGTH :: 0x8243;
+DEBUG_CALLBACK_FUNCTION        :: 0x8244;
+DEBUG_CALLBACK_USER_PARAM      :: 0x8245;
+DEBUG_SOURCE_API               :: 0x8246;
+DEBUG_SOURCE_WINDOW_SYSTEM     :: 0x8247;
+DEBUG_SOURCE_SHADER_COMPILER   :: 0x8248;
+DEBUG_SOURCE_THIRD_PARTY       :: 0x8249;
+DEBUG_SOURCE_APPLICATION       :: 0x824A;
+DEBUG_SOURCE_OTHER             :: 0x824B;
+DEBUG_TYPE_ERROR               :: 0x824C;
+DEBUG_TYPE_DEPRECATED_BEHAVIOR :: 0x824D;
+DEBUG_TYPE_UNDEFINED_BEHAVIOR  :: 0x824E;
+DEBUG_TYPE_PORTABILITY         :: 0x824F;
+DEBUG_TYPE_PERFORMANCE         :: 0x8250;
+DEBUG_TYPE_OTHER               :: 0x8251;
+MAX_DEBUG_MESSAGE_LENGTH       :: 0x9143;
+MAX_DEBUG_LOGGED_MESSAGES      :: 0x9144;
+DEBUG_LOGGED_MESSAGES          :: 0x9145;
+DEBUG_SEVERITY_HIGH            :: 0x9146;
+DEBUG_SEVERITY_MEDIUM          :: 0x9147;
+DEBUG_SEVERITY_LOW             :: 0x9148;
+DEBUG_TYPE_MARKER              :: 0x8268;
+DEBUG_TYPE_PUSH_GROUP          :: 0x8269;
+DEBUG_TYPE_POP_GROUP           :: 0x826A;
+DEBUG_SEVERITY_NOTIFICATION    :: 0x826B;
+MAX_DEBUG_GROUP_STACK_DEPTH    :: 0x826C;
+DEBUG_GROUP_STACK_DEPTH        :: 0x826D;
+BUFFER                         :: 0x82E0;
+SHADER                         :: 0x82E1;
+PROGRAM                        :: 0x82E2;
+QUERY                          :: 0x82E3;
+PROGRAM_PIPELINE               :: 0x82E4;
+SAMPLER                        :: 0x82E6;
+MAX_LABEL_LENGTH               :: 0x82E8;
+DEBUG_OUTPUT                   :: 0x92E0;
+CONTEXT_FLAG_DEBUG_BIT         :: 0x00000002;
+MAX_UNIFORM_LOCATIONS          :: 0x826E;
+FRAMEBUFFER_DEFAULT_WIDTH      :: 0x9310;
+FRAMEBUFFER_DEFAULT_HEIGHT     :: 0x9311;
+FRAMEBUFFER_DEFAULT_LAYERS     :: 0x9312;
+FRAMEBUFFER_DEFAULT_SAMPLES    :: 0x9313;
+FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS :: 0x9314;
+MAX_FRAMEBUFFER_WIDTH          :: 0x9315;
+MAX_FRAMEBUFFER_HEIGHT         :: 0x9316;
+MAX_FRAMEBUFFER_LAYERS         :: 0x9317;
+MAX_FRAMEBUFFER_SAMPLES        :: 0x9318;
+INTERNALFORMAT_SUPPORTED       :: 0x826F;
+INTERNALFORMAT_PREFERRED       :: 0x8270;
+INTERNALFORMAT_RED_SIZE        :: 0x8271;
+INTERNALFORMAT_GREEN_SIZE      :: 0x8272;
+INTERNALFORMAT_BLUE_SIZE       :: 0x8273;
+INTERNALFORMAT_ALPHA_SIZE      :: 0x8274;
+INTERNALFORMAT_DEPTH_SIZE      :: 0x8275;
+INTERNALFORMAT_STENCIL_SIZE    :: 0x8276;
+INTERNALFORMAT_SHARED_SIZE     :: 0x8277;
+INTERNALFORMAT_RED_TYPE        :: 0x8278;
+INTERNALFORMAT_GREEN_TYPE      :: 0x8279;
+INTERNALFORMAT_BLUE_TYPE       :: 0x827A;
+INTERNALFORMAT_ALPHA_TYPE      :: 0x827B;
+INTERNALFORMAT_DEPTH_TYPE      :: 0x827C;
+INTERNALFORMAT_STENCIL_TYPE    :: 0x827D;
+MAX_WIDTH                      :: 0x827E;
+MAX_HEIGHT                     :: 0x827F;
+MAX_DEPTH                      :: 0x8280;
+MAX_LAYERS                     :: 0x8281;
+MAX_COMBINED_DIMENSIONS        :: 0x8282;
+COLOR_COMPONENTS               :: 0x8283;
+DEPTH_COMPONENTS               :: 0x8284;
+STENCIL_COMPONENTS             :: 0x8285;
+COLOR_RENDERABLE               :: 0x8286;
+DEPTH_RENDERABLE               :: 0x8287;
+STENCIL_RENDERABLE             :: 0x8288;
+FRAMEBUFFER_RENDERABLE         :: 0x8289;
+FRAMEBUFFER_RENDERABLE_LAYERED :: 0x828A;
+FRAMEBUFFER_BLEND              :: 0x828B;
+READ_PIXELS                    :: 0x828C;
+READ_PIXELS_FORMAT             :: 0x828D;
+READ_PIXELS_TYPE               :: 0x828E;
+TEXTURE_IMAGE_FORMAT           :: 0x828F;
+TEXTURE_IMAGE_TYPE             :: 0x8290;
+GET_TEXTURE_IMAGE_FORMAT       :: 0x8291;
+GET_TEXTURE_IMAGE_TYPE         :: 0x8292;
+MIPMAP                         :: 0x8293;
+MANUAL_GENERATE_MIPMAP         :: 0x8294;
+AUTO_GENERATE_MIPMAP           :: 0x8295;
+COLOR_ENCODING                 :: 0x8296;
+SRGB_READ                      :: 0x8297;
+SRGB_WRITE                     :: 0x8298;
+FILTER                         :: 0x829A;
+VERTEX_TEXTURE                 :: 0x829B;
+TESS_CONTROL_TEXTURE           :: 0x829C;
+TESS_EVALUATION_TEXTURE        :: 0x829D;
+GEOMETRY_TEXTURE               :: 0x829E;
+FRAGMENT_TEXTURE               :: 0x829F;
+COMPUTE_TEXTURE                :: 0x82A0;
+TEXTURE_SHADOW                 :: 0x82A1;
+TEXTURE_GATHER                 :: 0x82A2;
+TEXTURE_GATHER_SHADOW          :: 0x82A3;
+SHADER_IMAGE_LOAD              :: 0x82A4;
+SHADER_IMAGE_STORE             :: 0x82A5;
+SHADER_IMAGE_ATOMIC            :: 0x82A6;
+IMAGE_TEXEL_SIZE               :: 0x82A7;
+IMAGE_COMPATIBILITY_CLASS      :: 0x82A8;
+IMAGE_PIXEL_FORMAT             :: 0x82A9;
+IMAGE_PIXEL_TYPE               :: 0x82AA;
+SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST :: 0x82AC;
+SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST :: 0x82AD;
+SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE :: 0x82AE;
+SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE :: 0x82AF;
+TEXTURE_COMPRESSED_BLOCK_WIDTH :: 0x82B1;
+TEXTURE_COMPRESSED_BLOCK_HEIGHT :: 0x82B2;
+TEXTURE_COMPRESSED_BLOCK_SIZE  :: 0x82B3;
+CLEAR_BUFFER                   :: 0x82B4;
+TEXTURE_VIEW                   :: 0x82B5;
+VIEW_COMPATIBILITY_CLASS       :: 0x82B6;
+FULL_SUPPORT                   :: 0x82B7;
+CAVEAT_SUPPORT                 :: 0x82B8;
+IMAGE_CLASS_4_X_32             :: 0x82B9;
+IMAGE_CLASS_2_X_32             :: 0x82BA;
+IMAGE_CLASS_1_X_32             :: 0x82BB;
+IMAGE_CLASS_4_X_16             :: 0x82BC;
+IMAGE_CLASS_2_X_16             :: 0x82BD;
+IMAGE_CLASS_1_X_16             :: 0x82BE;
+IMAGE_CLASS_4_X_8              :: 0x82BF;
+IMAGE_CLASS_2_X_8              :: 0x82C0;
+IMAGE_CLASS_1_X_8              :: 0x82C1;
+IMAGE_CLASS_11_11_10           :: 0x82C2;
+IMAGE_CLASS_10_10_10_2         :: 0x82C3;
+VIEW_CLASS_128_BITS            :: 0x82C4;
+VIEW_CLASS_96_BITS             :: 0x82C5;
+VIEW_CLASS_64_BITS             :: 0x82C6;
+VIEW_CLASS_48_BITS             :: 0x82C7;
+VIEW_CLASS_32_BITS             :: 0x82C8;
+VIEW_CLASS_24_BITS             :: 0x82C9;
+VIEW_CLASS_16_BITS             :: 0x82CA;
+VIEW_CLASS_8_BITS              :: 0x82CB;
+VIEW_CLASS_S3TC_DXT1_RGB       :: 0x82CC;
+VIEW_CLASS_S3TC_DXT1_RGBA      :: 0x82CD;
+VIEW_CLASS_S3TC_DXT3_RGBA      :: 0x82CE;
+VIEW_CLASS_S3TC_DXT5_RGBA      :: 0x82CF;
+VIEW_CLASS_RGTC1_RED           :: 0x82D0;
+VIEW_CLASS_RGTC2_RG            :: 0x82D1;
+VIEW_CLASS_BPTC_UNORM          :: 0x82D2;
+VIEW_CLASS_BPTC_FLOAT          :: 0x82D3;
+UNIFORM                        :: 0x92E1;
+UNIFORM_BLOCK                  :: 0x92E2;
+PROGRAM_INPUT                  :: 0x92E3;
+PROGRAM_OUTPUT                 :: 0x92E4;
+BUFFER_VARIABLE                :: 0x92E5;
+SHADER_STORAGE_BLOCK           :: 0x92E6;
+VERTEX_SUBROUTINE              :: 0x92E8;
+TESS_CONTROL_SUBROUTINE        :: 0x92E9;
+TESS_EVALUATION_SUBROUTINE     :: 0x92EA;
+GEOMETRY_SUBROUTINE            :: 0x92EB;
+FRAGMENT_SUBROUTINE            :: 0x92EC;
+COMPUTE_SUBROUTINE             :: 0x92ED;
+VERTEX_SUBROUTINE_UNIFORM      :: 0x92EE;
+TESS_CONTROL_SUBROUTINE_UNIFORM :: 0x92EF;
+TESS_EVALUATION_SUBROUTINE_UNIFORM :: 0x92F0;
+GEOMETRY_SUBROUTINE_UNIFORM    :: 0x92F1;
+FRAGMENT_SUBROUTINE_UNIFORM    :: 0x92F2;
+COMPUTE_SUBROUTINE_UNIFORM     :: 0x92F3;
+TRANSFORM_FEEDBACK_VARYING     :: 0x92F4;
+ACTIVE_RESOURCES               :: 0x92F5;
+MAX_NAME_LENGTH                :: 0x92F6;
+MAX_NUM_ACTIVE_VARIABLES       :: 0x92F7;
+MAX_NUM_COMPATIBLE_SUBROUTINES :: 0x92F8;
+NAME_LENGTH                    :: 0x92F9;
+TYPE                           :: 0x92FA;
+ARRAY_SIZE                     :: 0x92FB;
+OFFSET                         :: 0x92FC;
+BLOCK_INDEX                    :: 0x92FD;
+ARRAY_STRIDE                   :: 0x92FE;
+MATRIX_STRIDE                  :: 0x92FF;
+IS_ROW_MAJOR                   :: 0x9300;
+ATOMIC_COUNTER_BUFFER_INDEX    :: 0x9301;
+BUFFER_BINDING                 :: 0x9302;
+BUFFER_DATA_SIZE               :: 0x9303;
+NUM_ACTIVE_VARIABLES           :: 0x9304;
+ACTIVE_VARIABLES               :: 0x9305;
+REFERENCED_BY_VERTEX_SHADER    :: 0x9306;
+REFERENCED_BY_TESS_CONTROL_SHADER :: 0x9307;
+REFERENCED_BY_TESS_EVALUATION_SHADER :: 0x9308;
+REFERENCED_BY_GEOMETRY_SHADER  :: 0x9309;
+REFERENCED_BY_FRAGMENT_SHADER  :: 0x930A;
+REFERENCED_BY_COMPUTE_SHADER   :: 0x930B;
+TOP_LEVEL_ARRAY_SIZE           :: 0x930C;
+TOP_LEVEL_ARRAY_STRIDE         :: 0x930D;
+LOCATION                       :: 0x930E;
+LOCATION_INDEX                 :: 0x930F;
+IS_PER_PATCH                   :: 0x92E7;
+SHADER_STORAGE_BUFFER          :: 0x90D2;
+SHADER_STORAGE_BUFFER_BINDING  :: 0x90D3;
+SHADER_STORAGE_BUFFER_START    :: 0x90D4;
+SHADER_STORAGE_BUFFER_SIZE     :: 0x90D5;
+MAX_VERTEX_SHADER_STORAGE_BLOCKS :: 0x90D6;
+MAX_GEOMETRY_SHADER_STORAGE_BLOCKS :: 0x90D7;
+MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS :: 0x90D8;
+MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS :: 0x90D9;
+MAX_FRAGMENT_SHADER_STORAGE_BLOCKS :: 0x90DA;
+MAX_COMPUTE_SHADER_STORAGE_BLOCKS :: 0x90DB;
+MAX_COMBINED_SHADER_STORAGE_BLOCKS :: 0x90DC;
+MAX_SHADER_STORAGE_BUFFER_BINDINGS :: 0x90DD;
+MAX_SHADER_STORAGE_BLOCK_SIZE  :: 0x90DE;
+SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT :: 0x90DF;
+SHADER_STORAGE_BARRIER_BIT     :: 0x00002000;
+MAX_COMBINED_SHADER_OUTPUT_RESOURCES :: 0x8F39;
+DEPTH_STENCIL_TEXTURE_MODE     :: 0x90EA;
+TEXTURE_BUFFER_OFFSET          :: 0x919D;
+TEXTURE_BUFFER_SIZE            :: 0x919E;
+TEXTURE_BUFFER_OFFSET_ALIGNMENT :: 0x919F;
+TEXTURE_VIEW_MIN_LEVEL         :: 0x82DB;
+TEXTURE_VIEW_NUM_LEVELS        :: 0x82DC;
+TEXTURE_VIEW_MIN_LAYER         :: 0x82DD;
+TEXTURE_VIEW_NUM_LAYERS        :: 0x82DE;
+TEXTURE_IMMUTABLE_LEVELS       :: 0x82DF;
+VERTEX_ATTRIB_BINDING          :: 0x82D4;
+VERTEX_ATTRIB_RELATIVE_OFFSET  :: 0x82D5;
+VERTEX_BINDING_DIVISOR         :: 0x82D6;
+VERTEX_BINDING_OFFSET          :: 0x82D7;
+VERTEX_BINDING_STRIDE          :: 0x82D8;
+MAX_VERTEX_ATTRIB_RELATIVE_OFFSET :: 0x82D9;
+MAX_VERTEX_ATTRIB_BINDINGS     :: 0x82DA;
+VERTEX_BINDING_BUFFER          :: 0x8F4F;
 
-	CONTEXT_LOST                   = 0x0507;
-	NEGATIVE_ONE_TO_ONE            = 0x935E;
-	ZERO_TO_ONE                    = 0x935F;
-	CLIP_ORIGIN                    = 0x935C;
-	CLIP_DEPTH_MODE                = 0x935D;
-	QUERY_WAIT_INVERTED            = 0x8E17;
-	QUERY_NO_WAIT_INVERTED         = 0x8E18;
-	QUERY_BY_REGION_WAIT_INVERTED  = 0x8E19;
-	QUERY_BY_REGION_NO_WAIT_INVERTED = 0x8E1A;
-	MAX_CULL_DISTANCES             = 0x82F9;
-	MAX_COMBINED_CLIP_AND_CULL_DISTANCES = 0x82FA;
-	TEXTURE_TARGET                 = 0x1006;
-	QUERY_TARGET                   = 0x82EA;
-	GUILTY_CONTEXT_RESET           = 0x8253;
-	INNOCENT_CONTEXT_RESET         = 0x8254;
-	UNKNOWN_CONTEXT_RESET          = 0x8255;
-	RESET_NOTIFICATION_STRATEGY    = 0x8256;
-	LOSE_CONTEXT_ON_RESET          = 0x8252;
-	NO_RESET_NOTIFICATION          = 0x8261;
-	CONTEXT_FLAG_ROBUST_ACCESS_BIT = 0x00000004;
-	CONTEXT_RELEASE_BEHAVIOR       = 0x82FB;
-	CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x82FC;
+MAX_VERTEX_ATTRIB_STRIDE       :: 0x82E5;
+PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED :: 0x8221;
+TEXTURE_BUFFER_BINDING         :: 0x8C2A;
+MAP_PERSISTENT_BIT             :: 0x0040;
+MAP_COHERENT_BIT               :: 0x0080;
+DYNAMIC_STORAGE_BIT            :: 0x0100;
+CLIENT_STORAGE_BIT             :: 0x0200;
+CLIENT_MAPPED_BUFFER_BARRIER_BIT :: 0x00004000;
+BUFFER_IMMUTABLE_STORAGE       :: 0x821F;
+BUFFER_STORAGE_FLAGS           :: 0x8220;
+CLEAR_TEXTURE                  :: 0x9365;
+LOCATION_COMPONENT             :: 0x934A;
+TRANSFORM_FEEDBACK_BUFFER_INDEX :: 0x934B;
+TRANSFORM_FEEDBACK_BUFFER_STRIDE :: 0x934C;
+QUERY_BUFFER                   :: 0x9192;
+QUERY_BUFFER_BARRIER_BIT       :: 0x00008000;
+QUERY_BUFFER_BINDING           :: 0x9193;
+QUERY_RESULT_NO_WAIT           :: 0x9194;
+MIRROR_CLAMP_TO_EDGE           :: 0x8743;
+
+CONTEXT_LOST                   :: 0x0507;
+NEGATIVE_ONE_TO_ONE            :: 0x935E;
+ZERO_TO_ONE                    :: 0x935F;
+CLIP_ORIGIN                    :: 0x935C;
+CLIP_DEPTH_MODE                :: 0x935D;
+QUERY_WAIT_INVERTED            :: 0x8E17;
+QUERY_NO_WAIT_INVERTED         :: 0x8E18;
+QUERY_BY_REGION_WAIT_INVERTED  :: 0x8E19;
+QUERY_BY_REGION_NO_WAIT_INVERTED :: 0x8E1A;
+MAX_CULL_DISTANCES             :: 0x82F9;
+MAX_COMBINED_CLIP_AND_CULL_DISTANCES :: 0x82FA;
+TEXTURE_TARGET                 :: 0x1006;
+QUERY_TARGET                   :: 0x82EA;
+GUILTY_CONTEXT_RESET           :: 0x8253;
+INNOCENT_CONTEXT_RESET         :: 0x8254;
+UNKNOWN_CONTEXT_RESET          :: 0x8255;
+RESET_NOTIFICATION_STRATEGY    :: 0x8256;
+LOSE_CONTEXT_ON_RESET          :: 0x8252;
+NO_RESET_NOTIFICATION          :: 0x8261;
+CONTEXT_FLAG_ROBUST_ACCESS_BIT :: 0x00000004;
+CONTEXT_RELEASE_BEHAVIOR       :: 0x82FB;
+CONTEXT_RELEASE_BEHAVIOR_FLUSH :: 0x82FC;
+
+DEBUG_OUTPUT_SYNCHRONOUS_ARB   :: 0x8242;
+DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB :: 0x8243;
+DEBUG_CALLBACK_FUNCTION_ARB    :: 0x8244;
+DEBUG_CALLBACK_USER_PARAM_ARB  :: 0x8245;
+DEBUG_SOURCE_API_ARB           :: 0x8246;
+DEBUG_SOURCE_WINDOW_SYSTEM_ARB :: 0x8247;
+DEBUG_SOURCE_SHADER_COMPILER_ARB :: 0x8248;
+DEBUG_SOURCE_THIRD_PARTY_ARB   :: 0x8249;
+DEBUG_SOURCE_APPLICATION_ARB   :: 0x824A;
+DEBUG_SOURCE_OTHER_ARB         :: 0x824B;
+DEBUG_TYPE_ERROR_ARB           :: 0x824C;
+DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB :: 0x824D;
+DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB :: 0x824E;
+DEBUG_TYPE_PORTABILITY_ARB     :: 0x824F;
+DEBUG_TYPE_PERFORMANCE_ARB     :: 0x8250;
+DEBUG_TYPE_OTHER_ARB           :: 0x8251;
+MAX_DEBUG_MESSAGE_LENGTH_ARB   :: 0x9143;
+MAX_DEBUG_LOGGED_MESSAGES_ARB  :: 0x9144;
+DEBUG_LOGGED_MESSAGES_ARB      :: 0x9145;
+DEBUG_SEVERITY_HIGH_ARB        :: 0x9146;
+DEBUG_SEVERITY_MEDIUM_ARB      :: 0x9147;
+DEBUG_SEVERITY_LOW_ARB         :: 0x9148;
 
-	DEBUG_OUTPUT_SYNCHRONOUS_ARB   = 0x8242;
-	DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB = 0x8243;
-	DEBUG_CALLBACK_FUNCTION_ARB    = 0x8244;
-	DEBUG_CALLBACK_USER_PARAM_ARB  = 0x8245;
-	DEBUG_SOURCE_API_ARB           = 0x8246;
-	DEBUG_SOURCE_WINDOW_SYSTEM_ARB = 0x8247;
-	DEBUG_SOURCE_SHADER_COMPILER_ARB = 0x8248;
-	DEBUG_SOURCE_THIRD_PARTY_ARB   = 0x8249;
-	DEBUG_SOURCE_APPLICATION_ARB   = 0x824A;
-	DEBUG_SOURCE_OTHER_ARB         = 0x824B;
-	DEBUG_TYPE_ERROR_ARB           = 0x824C;
-	DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB = 0x824D;
-	DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB = 0x824E;
-	DEBUG_TYPE_PORTABILITY_ARB     = 0x824F;
-	DEBUG_TYPE_PERFORMANCE_ARB     = 0x8250;
-	DEBUG_TYPE_OTHER_ARB           = 0x8251;
-	MAX_DEBUG_MESSAGE_LENGTH_ARB   = 0x9143;
-	MAX_DEBUG_LOGGED_MESSAGES_ARB  = 0x9144;
-	DEBUG_LOGGED_MESSAGES_ARB      = 0x9145;
-	DEBUG_SEVERITY_HIGH_ARB        = 0x9146;
-	DEBUG_SEVERITY_MEDIUM_ARB      = 0x9147;
-	DEBUG_SEVERITY_LOW_ARB         = 0x9148;
-}

+ 84 - 89
core/os_windows.odin

@@ -10,52 +10,48 @@ type {
 	Error     int;
 }
 
-const INVALID_HANDLE Handle = ~(0 as Handle);
-
-const {
-	O_RDONLY   = 0x00000;
-	O_WRONLY   = 0x00001;
-	O_RDWR     = 0x00002;
-	O_CREAT    = 0x00040;
-	O_EXCL     = 0x00080;
-	O_NOCTTY   = 0x00100;
-	O_TRUNC    = 0x00200;
-	O_NONBLOCK = 0x00800;
-	O_APPEND   = 0x00400;
-	O_SYNC     = 0x01000;
-	O_ASYNC    = 0x02000;
-	O_CLOEXEC  = 0x80000;
-}
-
-const {
-	ERROR_NONE                Error = 0;
-	ERROR_FILE_NOT_FOUND      Error = 2;
-	ERROR_PATH_NOT_FOUND      Error = 3;
-	ERROR_ACCESS_DENIED       Error = 5;
-	ERROR_NO_MORE_FILES       Error = 18;
-	ERROR_HANDLE_EOF          Error = 38;
-	ERROR_NETNAME_DELETED     Error = 64;
-	ERROR_FILE_EXISTS         Error = 80;
-	ERROR_BROKEN_PIPE         Error = 109;
-	ERROR_BUFFER_OVERFLOW     Error = 111;
-	ERROR_INSUFFICIENT_BUFFER Error = 122;
-	ERROR_MOD_NOT_FOUND       Error = 126;
-	ERROR_PROC_NOT_FOUND      Error = 127;
-	ERROR_DIR_NOT_EMPTY       Error = 145;
-	ERROR_ALREADY_EXISTS      Error = 183;
-	ERROR_ENVVAR_NOT_FOUND    Error = 203;
-	ERROR_MORE_DATA           Error = 234;
-	ERROR_OPERATION_ABORTED   Error = 995;
-	ERROR_IO_PENDING          Error = 997;
-	ERROR_NOT_FOUND           Error = 1168;
-	ERROR_PRIVILEGE_NOT_HELD  Error = 1314;
-	WSAEACCES                 Error = 10013;
-	WSAECONNRESET             Error = 10054;
-}
-
-const { // Windows reserves errors >= 1<<29 for application use
-	ERROR_FILE_IS_PIPE Error = 1<<29 + 0;
-}
+INVALID_HANDLE: Handle : ~(0 as Handle);
+
+
+O_RDONLY   :: 0x00000;
+O_WRONLY   :: 0x00001;
+O_RDWR     :: 0x00002;
+O_CREAT    :: 0x00040;
+O_EXCL     :: 0x00080;
+O_NOCTTY   :: 0x00100;
+O_TRUNC    :: 0x00200;
+O_NONBLOCK :: 0x00800;
+O_APPEND   :: 0x00400;
+O_SYNC     :: 0x01000;
+O_ASYNC    :: 0x02000;
+O_CLOEXEC  :: 0x80000;
+
+ERROR_NONE                 : Error : 0;
+ERROR_FILE_NOT_FOUND       : Error : 2;
+ERROR_PATH_NOT_FOUND       : Error : 3;
+ERROR_ACCESS_DENIED        : Error : 5;
+ERROR_NO_MORE_FILES        : Error : 18;
+ERROR_HANDLE_EOF           : Error : 38;
+ERROR_NETNAME_DELETED      : Error : 64;
+ERROR_FILE_EXISTS          : Error : 80;
+ERROR_BROKEN_PIPE          : Error : 109;
+ERROR_BUFFER_OVERFLOW      : Error : 111;
+ERROR_INSUFFICIENT_BUFFER  : Error : 122;
+ERROR_MOD_NOT_FOUND        : Error : 126;
+ERROR_PROC_NOT_FOUND       : Error : 127;
+ERROR_DIR_NOT_EMPTY        : Error : 145;
+ERROR_ALREADY_EXISTS       : Error : 183;
+ERROR_ENVVAR_NOT_FOUND     : Error : 203;
+ERROR_MORE_DATA            : Error : 234;
+ERROR_OPERATION_ABORTED    : Error : 995;
+ERROR_IO_PENDING           : Error : 997;
+ERROR_NOT_FOUND            : Error : 1168;
+ERROR_PRIVILEGE_NOT_HELD   : Error : 1314;
+WSAEACCES                  : Error : 10013;
+WSAECONNRESET              : Error : 10054;
+
+// Windows reserves errors >= 1<<29 for application use
+ERROR_FILE_IS_PIPE : Error : 1<<29 + 0;
 
 
 
@@ -66,7 +62,7 @@ proc open(path string, mode int, perm u32) -> (Handle, Error) {
 		return INVALID_HANDLE, ERROR_FILE_NOT_FOUND;
 	}
 
-	var access u32;
+	access: u32;
 	match mode & (O_RDONLY|O_WRONLY|O_RDWR) {
 	case O_RDONLY: access = FILE_GENERIC_READ;
 	case O_WRONLY: access = FILE_GENERIC_WRITE;
@@ -81,14 +77,14 @@ proc open(path string, mode int, perm u32) -> (Handle, Error) {
 		access |= FILE_APPEND_DATA;
 	}
 
-	var share_mode = (FILE_SHARE_READ|FILE_SHARE_WRITE) as u32;
-	var sa ^SECURITY_ATTRIBUTES = nil;
-	var sa_inherit = SECURITY_ATTRIBUTES{length = size_of(SECURITY_ATTRIBUTES), inherit_handle = 1};
+	share_mode := (FILE_SHARE_READ|FILE_SHARE_WRITE) as u32;
+	sa: ^SECURITY_ATTRIBUTES = nil;
+	sa_inherit := SECURITY_ATTRIBUTES{length = size_of(SECURITY_ATTRIBUTES), inherit_handle = 1};
 	if mode&O_CLOEXEC == 0 {
 		sa = ^sa_inherit;
 	}
 
-	var create_mode u32;
+	create_mode: u32;
 	match {
 	case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL):
 		create_mode = CREATE_NEW;
@@ -102,14 +98,14 @@ proc open(path string, mode int, perm u32) -> (Handle, Error) {
 		create_mode = OPEN_EXISTING;
 	}
 
-	var buf [300]byte;
+	buf: [300]byte;
 	copy(buf[:], path as []byte);
 
-	var handle = CreateFileA(^buf[0], access, share_mode, sa, create_mode, FILE_ATTRIBUTE_NORMAL, nil) as Handle;
+	handle := CreateFileA(^buf[0], access, share_mode, sa, create_mode, FILE_ATTRIBUTE_NORMAL, nil) as Handle;
 	if handle == INVALID_HANDLE {
 		return handle, ERROR_NONE;
 	}
-	var err = GetLastError();
+	err := GetLastError();
 	return INVALID_HANDLE, err as Error;
 }
 
@@ -118,8 +114,8 @@ proc close(fd Handle) {
 }
 
 proc write(fd Handle, data []byte) -> (int, Error) {
-	var bytes_written i32;
-	var e = win32.WriteFile(fd as win32.HANDLE, data.data, data.count as i32, ^bytes_written, nil);
+	bytes_written: i32;
+	e := win32.WriteFile(fd as win32.HANDLE, data.data, data.count as i32, ^bytes_written, nil);
 	if e != 0 {
 		return 0, e as Error;
 	}
@@ -127,10 +123,10 @@ proc write(fd Handle, data []byte) -> (int, Error) {
 }
 
 proc read(fd Handle, data []byte) -> (int, Error) {
-	var bytes_read i32;
-	var e = win32.ReadFile(fd as win32.HANDLE, data.data, data.count as u32, ^bytes_read, nil);
+	bytes_read: i32;
+	e := win32.ReadFile(fd as win32.HANDLE, data.data, data.count as u32, ^bytes_read, nil);
 	if e != win32.FALSE {
-		var err = win32.GetLastError();
+		err := win32.GetLastError();
 		return 0, err as Error;
 	}
 	return bytes_read as int, ERROR_NONE;
@@ -138,21 +134,21 @@ proc read(fd Handle, data []byte) -> (int, Error) {
 
 proc seek(fd Handle, offset i64, whence int) -> (i64, Error) {
 	using win32;
-	var w u32;
+	w: u32;
 	match whence {
 	case 0: w = FILE_BEGIN;
 	case 1: w = FILE_CURRENT;
 	case 2: w = FILE_END;
 	}
-	var hi = (offset>>32) as i32;
-	var lo = offset as i32;
-	var ft = GetFileType(fd as HANDLE);
+	hi := (offset>>32) as i32;
+	lo := offset as i32;
+	ft := GetFileType(fd as HANDLE);
 	if ft == FILE_TYPE_PIPE {
 		return 0, ERROR_FILE_IS_PIPE;
 	}
-	var dw_ptr = SetFilePointer(fd as HANDLE, lo, ^hi, w);
+	dw_ptr := SetFilePointer(fd as HANDLE, lo, ^hi, w);
 	if dw_ptr == INVALID_SET_FILE_POINTER {
-		var err = GetLastError();
+		err := GetLastError();
 		return 0, err as Error;
 	}
 	return (hi as i64)<<32 + (dw_ptr as i64), ERROR_NONE;
@@ -160,14 +156,13 @@ proc seek(fd Handle, offset i64, whence int) -> (i64, Error) {
 
 
 // NOTE(bill): Uses startup to initialize it
-var {
-	stdin  = get_std_handle(win32.STD_INPUT_HANDLE);
-	stdout = get_std_handle(win32.STD_OUTPUT_HANDLE);
-	stderr = get_std_handle(win32.STD_ERROR_HANDLE);
-}
+stdin  := get_std_handle(win32.STD_INPUT_HANDLE);
+stdout := get_std_handle(win32.STD_OUTPUT_HANDLE);
+stderr := get_std_handle(win32.STD_ERROR_HANDLE);
+
 
 proc get_std_handle(h int) -> Handle {
-	var fd = win32.GetStdHandle(h as i32);
+	fd := win32.GetStdHandle(h as i32);
 	win32.SetHandleInformation(fd, win32.HANDLE_FLAG_INHERIT, 0);
 	return fd as Handle;
 }
@@ -178,17 +173,17 @@ proc get_std_handle(h int) -> Handle {
 
 
 proc last_write_time(fd Handle) -> File_Time {
-	var file_info win32.BY_HANDLE_FILE_INFORMATION;
+	file_info: win32.BY_HANDLE_FILE_INFORMATION;
 	win32.GetFileInformationByHandle(fd as win32.HANDLE, ^file_info);
-	var lo = file_info.last_write_time.lo as File_Time;
-	var hi = file_info.last_write_time.hi as File_Time;
+	lo := file_info.last_write_time.lo as File_Time;
+	hi := file_info.last_write_time.hi as File_Time;
 	return lo | hi << 32;
 }
 
 proc last_write_time_by_name(name string) -> File_Time {
-	var last_write_time win32.FILETIME;
-	var data win32.FILE_ATTRIBUTE_DATA;
-	var buf [1024]byte;
+	last_write_time: win32.FILETIME;
+	data: win32.FILE_ATTRIBUTE_DATA;
+	buf: [1024]byte;
 
 	assert(buf.count > name.count);
 
@@ -198,8 +193,8 @@ proc last_write_time_by_name(name string) -> File_Time {
 		last_write_time = data.last_write_time;
 	}
 
-	var l = last_write_time.lo as File_Time;
-	var h = last_write_time.hi as File_Time;
+	l := last_write_time.lo as File_Time;
+	h := last_write_time.hi as File_Time;
 	return l | h << 32;
 }
 
@@ -208,33 +203,33 @@ proc last_write_time_by_name(name string) -> File_Time {
 
 
 proc read_entire_file(name string) -> ([]byte, bool) {
-	var buf [300]byte;
+	buf: [300]byte;
 	copy(buf[:], name as []byte);
 
-	var fd, err = open(name, O_RDONLY, 0);
+	fd, err := open(name, O_RDONLY, 0);
 	if err != ERROR_NONE {
 		return nil, false;
 	}
 	defer close(fd);
 
-	var length i64;
-	var file_size_ok = win32.GetFileSizeEx(fd as win32.HANDLE, ^length) != 0;
+	length: i64;
+	file_size_ok := win32.GetFileSizeEx(fd as win32.HANDLE, ^length) != 0;
 	if !file_size_ok {
 		return nil, false;
 	}
 
-	var data = new_slice(u8, length);
+	data := new_slice(u8, length);
 	if data.data == nil {
 		return nil, false;
 	}
 
-	var single_read_length i32;
-	var total_read i64;
+	single_read_length: i32;
+	total_read: i64;
 
 	for total_read < length {
-		var remaining = length - total_read;
-		var to_read u32;
-		const MAX = 1<<32-1;
+		remaining := length - total_read;
+		to_read: u32;
+		MAX :: 1<<32-1;
 		if remaining <= MAX {
 			to_read = remaining as u32;
 		} else {

+ 5 - 5
core/sync.odin

@@ -49,7 +49,7 @@ proc mutex_destroy(m ^Mutex) {
 	semaphore_destroy(^m.semaphore);
 }
 proc mutex_lock(m ^Mutex) {
-	var thread_id = current_thread_id();
+	thread_id := current_thread_id();
 	if atomic.fetch_add32(^m.counter, 1) > 0 {
 		if thread_id != atomic.load32(^m.owner) {
 			semaphore_wait(^m.semaphore);
@@ -59,11 +59,11 @@ proc mutex_lock(m ^Mutex) {
 	m.recursion++;
 }
 proc mutex_try_lock(m ^Mutex) -> bool {
-	var thread_id = current_thread_id();
+	thread_id := current_thread_id();
 	if atomic.load32(^m.owner) == thread_id {
 		atomic.fetch_add32(^m.counter, 1);
 	} else {
-		var expected i32 = 0;
+		expected: i32 = 0;
 		if atomic.load32(^m.counter) != 0 {
 			return false;
 		}
@@ -76,8 +76,8 @@ proc mutex_try_lock(m ^Mutex) -> bool {
 	return true;
 }
 proc mutex_unlock(m ^Mutex) {
-	var recursion i32;
-	var thread_id = current_thread_id();
+	recursion: i32;
+	thread_id := current_thread_id();
 	assert(thread_id == atomic.load32(^m.owner));
 
 	m.recursion--;

+ 108 - 121
core/sys/windows.odin

@@ -20,42 +20,42 @@ type {
 	WNDPROC   proc(hwnd HWND, msg u32, wparam WPARAM, lparam LPARAM) -> LRESULT;
 }
 
-const {
-	INVALID_HANDLE_VALUE = (-1 as int) as HANDLE;
 
-	FALSE BOOL = 0;
-	TRUE  BOOL = 1;
+INVALID_HANDLE_VALUE :: (-1 as int) as HANDLE;
 
-	CS_VREDRAW    = 0x0001;
-	CS_HREDRAW    = 0x0002;
-	CS_OWNDC      = 0x0020;
-	CW_USEDEFAULT = -0x80000000;
+FALSE: BOOL : 0;
+TRUE:  BOOL : 1;
 
-	WS_OVERLAPPED       = 0;
-	WS_MAXIMIZEBOX      = 0x00010000;
-	WS_MINIMIZEBOX      = 0x00020000;
-	WS_THICKFRAME       = 0x00040000;
-	WS_SYSMENU          = 0x00080000;
-	WS_CAPTION          = 0x00C00000;
-	WS_VISIBLE          = 0x10000000;
-	WS_OVERLAPPEDWINDOW = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
+CS_VREDRAW    :: 0x0001;
+CS_HREDRAW    :: 0x0002;
+CS_OWNDC      :: 0x0020;
+CW_USEDEFAULT :: -0x80000000;
 
-	WM_DESTROY = 0x0002;
-	WM_CLOSE   = 0x0010;
-	WM_QUIT    = 0x0012;
-	WM_KEYDOWN = 0x0100;
-	WM_KEYUP   = 0x0101;
+WS_OVERLAPPED       :: 0;
+WS_MAXIMIZEBOX      :: 0x00010000;
+WS_MINIMIZEBOX      :: 0x00020000;
+WS_THICKFRAME       :: 0x00040000;
+WS_SYSMENU          :: 0x00080000;
+WS_CAPTION          :: 0x00C00000;
+WS_VISIBLE          :: 0x10000000;
+WS_OVERLAPPEDWINDOW :: WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
 
-	PM_REMOVE = 1;
+WM_DESTROY :: 0x0002;
+WM_CLOSE   :: 0x0010;
+WM_QUIT    :: 0x0012;
+WM_KEYDOWN :: 0x0100;
+WM_KEYUP   :: 0x0101;
 
-	COLOR_BACKGROUND = 1 as HBRUSH;
-	BLACK_BRUSH = 4;
+PM_REMOVE :: 1;
 
-	SM_CXSCREEN = 0;
-	SM_CYSCREEN = 1;
+COLOR_BACKGROUND :: 1 as HBRUSH;
+BLACK_BRUSH :: 4;
+
+SM_CXSCREEN :: 0;
+SM_CYSCREEN :: 1;
+
+SW_SHOW :: 5;
 
-	SW_SHOW = 5;
-}
 
 type {
 	POINT struct #ordered {
@@ -118,10 +118,8 @@ type {
 
 	GET_FILEEX_INFO_LEVELS i32;
 }
-const {
-	GetFileExInfoStandard = 0 as GET_FILEEX_INFO_LEVELS;
-	GetFileExMaxInfoLevel = 1 as GET_FILEEX_INFO_LEVELS;
-}
+GetFileExInfoStandard: GET_FILEEX_INFO_LEVELS : 0;
+GetFileExMaxInfoLevel: GET_FILEEX_INFO_LEVELS : 1;
 
 proc GetLastError    () -> i32                           #foreign #dll_import
 proc ExitProcess     (exit_code u32)                    #foreign #dll_import
@@ -163,7 +161,7 @@ proc GetActiveWindow () -> HWND #foreign #dll_import
 
 
 proc GetQueryPerformanceFrequency() -> i64 {
-	var r i64;
+	r: i64;
 	QueryPerformanceFrequency(^r);
 	return r;
 }
@@ -191,60 +189,54 @@ proc SetFilePointer(file_handle HANDLE, distance_to_move i32, distance_to_move_h
 
 proc SetHandleInformation(obj HANDLE, mask, flags u32) -> BOOL #foreign #dll_import
 
-const {
-	HANDLE_FLAG_INHERIT = 1;
-	HANDLE_FLAG_PROTECT_FROM_CLOSE = 2;
-}
+HANDLE_FLAG_INHERIT :: 1;
+HANDLE_FLAG_PROTECT_FROM_CLOSE :: 2;
 
 
-const {
-	FILE_BEGIN   = 0;
-	FILE_CURRENT = 1;
-	FILE_END     = 2;
-}
+FILE_BEGIN   :: 0;
+FILE_CURRENT :: 1;
+FILE_END     :: 2;
 
-const {
-	FILE_SHARE_READ      = 0x00000001;
-	FILE_SHARE_WRITE     = 0x00000002;
-	FILE_SHARE_DELETE    = 0x00000004;
-	FILE_GENERIC_ALL     = 0x10000000;
-	FILE_GENERIC_EXECUTE = 0x20000000;
-	FILE_GENERIC_WRITE   = 0x40000000;
-	FILE_GENERIC_READ    = 0x80000000;
-
-	FILE_APPEND_DATA = 0x0004;
-
-	STD_INPUT_HANDLE  = -10;
-	STD_OUTPUT_HANDLE = -11;
-	STD_ERROR_HANDLE  = -12;
-
-	CREATE_NEW        = 1;
-	CREATE_ALWAYS     = 2;
-	OPEN_EXISTING     = 3;
-	OPEN_ALWAYS       = 4;
-	TRUNCATE_EXISTING = 5;
-
-	FILE_ATTRIBUTE_READONLY             = 0x00000001;
-	FILE_ATTRIBUTE_HIDDEN               = 0x00000002;
-	FILE_ATTRIBUTE_SYSTEM               = 0x00000004;
-	FILE_ATTRIBUTE_DIRECTORY            = 0x00000010;
-	FILE_ATTRIBUTE_ARCHIVE              = 0x00000020;
-	FILE_ATTRIBUTE_DEVICE               = 0x00000040;
-	FILE_ATTRIBUTE_NORMAL               = 0x00000080;
-	FILE_ATTRIBUTE_TEMPORARY            = 0x00000100;
-	FILE_ATTRIBUTE_SPARSE_FILE          = 0x00000200;
-	FILE_ATTRIBUTE_REPARSE_POINT        = 0x00000400;
-	FILE_ATTRIBUTE_COMPRESSED           = 0x00000800;
-	FILE_ATTRIBUTE_OFFLINE              = 0x00001000;
-	FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  = 0x00002000;
-	FILE_ATTRIBUTE_ENCRYPTED            = 0x00004000;
-
-	FILE_TYPE_DISK = 0x0001;
-	FILE_TYPE_CHAR = 0x0002;
-	FILE_TYPE_PIPE = 0x0003;
-
-	INVALID_SET_FILE_POINTER = ~(0 as u32);
-}
+FILE_SHARE_READ      :: 0x00000001;
+FILE_SHARE_WRITE     :: 0x00000002;
+FILE_SHARE_DELETE    :: 0x00000004;
+FILE_GENERIC_ALL     :: 0x10000000;
+FILE_GENERIC_EXECUTE :: 0x20000000;
+FILE_GENERIC_WRITE   :: 0x40000000;
+FILE_GENERIC_READ    :: 0x80000000;
+
+FILE_APPEND_DATA :: 0x0004;
+
+STD_INPUT_HANDLE  :: -10;
+STD_OUTPUT_HANDLE :: -11;
+STD_ERROR_HANDLE  :: -12;
+
+CREATE_NEW        :: 1;
+CREATE_ALWAYS     :: 2;
+OPEN_EXISTING     :: 3;
+OPEN_ALWAYS       :: 4;
+TRUNCATE_EXISTING :: 5;
+
+FILE_ATTRIBUTE_READONLY             :: 0x00000001;
+FILE_ATTRIBUTE_HIDDEN               :: 0x00000002;
+FILE_ATTRIBUTE_SYSTEM               :: 0x00000004;
+FILE_ATTRIBUTE_DIRECTORY            :: 0x00000010;
+FILE_ATTRIBUTE_ARCHIVE              :: 0x00000020;
+FILE_ATTRIBUTE_DEVICE               :: 0x00000040;
+FILE_ATTRIBUTE_NORMAL               :: 0x00000080;
+FILE_ATTRIBUTE_TEMPORARY            :: 0x00000100;
+FILE_ATTRIBUTE_SPARSE_FILE          :: 0x00000200;
+FILE_ATTRIBUTE_REPARSE_POINT        :: 0x00000400;
+FILE_ATTRIBUTE_COMPRESSED           :: 0x00000800;
+FILE_ATTRIBUTE_OFFLINE              :: 0x00001000;
+FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  :: 0x00002000;
+FILE_ATTRIBUTE_ENCRYPTED            :: 0x00004000;
+
+FILE_TYPE_DISK :: 0x0001;
+FILE_TYPE_CHAR :: 0x0002;
+FILE_TYPE_PIPE :: 0x0003;
+
+INVALID_SET_FILE_POINTER :: ~(0 as u32);
 
 
 
@@ -255,7 +247,7 @@ proc HeapFree      (h HANDLE, flags u32, memory rawptr) -> BOOL               #f
 proc GetProcessHeap() -> HANDLE #foreign #dll_import
 
 
-const HEAP_ZERO_MEMORY = 0x00000008;
+HEAP_ZERO_MEMORY :: 0x00000008;
 
 // Synchronization
 
@@ -265,7 +257,7 @@ type SECURITY_ATTRIBUTES struct #ordered {
 	inherit_handle      BOOL;
 }
 
-const INFINITE = 0xffffffff;
+INFINITE :: 0xffffffff;
 
 proc CreateSemaphoreA   (attributes ^SECURITY_ATTRIBUTES, initial_count, maximum_count i32, name ^byte) -> HANDLE #foreign #dll_import
 proc ReleaseSemaphore   (semaphore HANDLE, release_count i32, previous_count ^i32) -> BOOL #foreign #dll_import
@@ -314,11 +306,10 @@ type {
 	}
 }
 
-const {
-	BI_RGB         = 0;
-	DIB_RGB_COLORS = 0x00;
-	SRCCOPY        = 0x00cc0020 as u32;
-}
+BI_RGB         :: 0;
+DIB_RGB_COLORS :: 0x00;
+SRCCOPY: u32    : 0x00cc0020;
+
 
 proc StretchDIBits(hdc HDC,
                    x_dst, y_dst, width_dst, height_dst i32,
@@ -338,29 +329,27 @@ proc GetClientRect(hwnd HWND, rect ^RECT) -> BOOL #foreign
 
 
 // Windows OpenGL
-const {
-	PFD_TYPE_RGBA             = 0;
-	PFD_TYPE_COLORINDEX       = 1;
-	PFD_MAIN_PLANE            = 0;
-	PFD_OVERLAY_PLANE         = 1;
-	PFD_UNDERLAY_PLANE        = -1;
-	PFD_DOUBLEBUFFER          = 1;
-	PFD_STEREO                = 2;
-	PFD_DRAW_TO_WINDOW        = 4;
-	PFD_DRAW_TO_BITMAP        = 8;
-	PFD_SUPPORT_GDI           = 16;
-	PFD_SUPPORT_OPENGL        = 32;
-	PFD_GENERIC_FORMAT        = 64;
-	PFD_NEED_PALETTE          = 128;
-	PFD_NEED_SYSTEM_PALETTE   = 0x00000100;
-	PFD_SWAP_EXCHANGE         = 0x00000200;
-	PFD_SWAP_COPY             = 0x00000400;
-	PFD_SWAP_LAYER_BUFFERS    = 0x00000800;
-	PFD_GENERIC_ACCELERATED   = 0x00001000;
-	PFD_DEPTH_DONTCARE        = 0x20000000;
-	PFD_DOUBLEBUFFER_DONTCARE = 0x40000000;
-	PFD_STEREO_DONTCARE       = 0x80000000;
-}
+PFD_TYPE_RGBA             :: 0;
+PFD_TYPE_COLORINDEX       :: 1;
+PFD_MAIN_PLANE            :: 0;
+PFD_OVERLAY_PLANE         :: 1;
+PFD_UNDERLAY_PLANE        :: -1;
+PFD_DOUBLEBUFFER          :: 1;
+PFD_STEREO                :: 2;
+PFD_DRAW_TO_WINDOW        :: 4;
+PFD_DRAW_TO_BITMAP        :: 8;
+PFD_SUPPORT_GDI           :: 16;
+PFD_SUPPORT_OPENGL        :: 32;
+PFD_GENERIC_FORMAT        :: 64;
+PFD_NEED_PALETTE          :: 128;
+PFD_NEED_SYSTEM_PALETTE   :: 0x00000100;
+PFD_SWAP_EXCHANGE         :: 0x00000200;
+PFD_SWAP_COPY             :: 0x00000400;
+PFD_SWAP_LAYER_BUFFERS    :: 0x00000800;
+PFD_GENERIC_ACCELERATED   :: 0x00001000;
+PFD_DEPTH_DONTCARE        :: 0x20000000;
+PFD_DOUBLEBUFFER_DONTCARE :: 0x40000000;
+PFD_STEREO_DONTCARE       :: 0x80000000;
 
 type {
 	HGLRC HANDLE;
@@ -406,13 +395,11 @@ proc ChoosePixelFormat(hdc HDC, pfd ^PIXELFORMATDESCRIPTOR) -> i32 #foreign #dll
 proc SwapBuffers      (hdc HDC) -> BOOL #foreign #dll_import
 proc ReleaseDC        (wnd HWND, hdc HDC) -> i32 #foreign #dll_import
 
-const {
-	WGL_CONTEXT_MAJOR_VERSION_ARB             = 0x2091;
-	WGL_CONTEXT_MINOR_VERSION_ARB             = 0x2092;
-	WGL_CONTEXT_PROFILE_MASK_ARB              = 0x9126;
-	WGL_CONTEXT_CORE_PROFILE_BIT_ARB          = 0x0001;
-	WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x0002;
-}
+WGL_CONTEXT_MAJOR_VERSION_ARB             :: 0x2091;
+WGL_CONTEXT_MINOR_VERSION_ARB             :: 0x2092;
+WGL_CONTEXT_PROFILE_MASK_ARB              :: 0x9126;
+WGL_CONTEXT_CORE_PROFILE_BIT_ARB          :: 0x0001;
+WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB :: 0x0002;
 
 proc wglCreateContext (hdc HDC) -> HGLRC #foreign #dll_import
 proc wglMakeCurrent   (hdc HDC, hglrc HGLRC) -> BOOL #foreign #dll_import

+ 71 - 77
core/utf8.odin

@@ -1,53 +1,49 @@
-const {
-	RUNE_ERROR = '\ufffd';
-	RUNE_SELF  = 0x80;
-	RUNE_BOM   = 0xfeff;
-	RUNE_EOF   = ~(0 as rune);
-	MAX_RUNE   = '\U0010ffff';
-	UTF_MAX    = 4;
-
-	SURROGATE_MIN = 0xd800;
-	SURROGATE_MAX = 0xdfff;
-}
+RUNE_ERROR :: '\ufffd';
+RUNE_SELF  :: 0x80;
+RUNE_BOM   :: 0xfeff;
+RUNE_EOF   :: ~(0 as rune);
+MAX_RUNE   :: '\U0010ffff';
+UTF_MAX    :: 4;
+
+SURROGATE_MIN :: 0xd800;
+SURROGATE_MAX :: 0xdfff;
 
 type Accept_Range struct {
 	lo, hi u8;
 }
 
-var {
-	accept_ranges = [5]Accept_Range{
-		{0x80, 0xbf},
-		{0xa0, 0xbf},
-		{0x80, 0x9f},
-		{0x90, 0xbf},
-		{0x80, 0x8f},
-	};
-
-	accept_sizes = [256]byte{
-		0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x00-0x0f
-		0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x10-0x1f
-		0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x20-0x2f
-		0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x30-0x3f
-		0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x40-0x4f
-		0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x50-0x5f
-		0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x60-0x6f
-		0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x70-0x7f
-
-		0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0x80-0x8f
-		0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0x90-0x9f
-		0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0xa0-0xaf
-		0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0xb0-0xbf
-		0xf1, 0xf1, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xc0-0xcf
-		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xd0-0xdf
-		0x13, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x23, 0x03, 0x03, // 0xe0-0xef
-		0x34, 0x04, 0x04, 0x04, 0x44, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0xf0-0xff
-	};
-}
+accept_ranges := [5]Accept_Range{
+	{0x80, 0xbf},
+	{0xa0, 0xbf},
+	{0x80, 0x9f},
+	{0x90, 0xbf},
+	{0x80, 0x8f},
+};
+
+accept_sizes := [256]byte{
+	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x00-0x0f
+	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x10-0x1f
+	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x20-0x2f
+	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x30-0x3f
+	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x40-0x4f
+	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x50-0x5f
+	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x60-0x6f
+	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // 0x70-0x7f
+
+	0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0x80-0x8f
+	0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0x90-0x9f
+	0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0xa0-0xaf
+	0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0xb0-0xbf
+	0xf1, 0xf1, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xc0-0xcf
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xd0-0xdf
+	0x13, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x23, 0x03, 0x03, // 0xe0-0xef
+	0x34, 0x04, 0x04, 0x04, 0x44, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, // 0xf0-0xff
+};
 
 proc encode_rune(r rune) -> ([4]byte, int) {
-	var buf [4]byte;
-	var i = r as u32;
-	const mask = 0x3f as byte;
+	buf: [4]byte;
+	i := r as u32;
+	mask: byte : 0x3f;
 	if i <= 1<<7-1 {
 		buf[0] = r as byte;
 		return buf, 1;
@@ -79,44 +75,42 @@ proc encode_rune(r rune) -> ([4]byte, int) {
 }
 
 proc decode_rune(s string) -> (rune, int) {
-	var n = s.count;
+	n := s.count;
 	if n < 1 {
 		return RUNE_ERROR, 0;
 	}
-	var b0 = s[0];
-	var x = accept_sizes[b0];
+	b0 := s[0];
+	x := accept_sizes[b0];
 	if x >= 0xf0 {
-		var mask = (x as rune << 31) >> 31; // all zeros or all ones
+		mask := (x as rune << 31) >> 31; // all zeros or all ones
 		return (b0 as rune) &~ mask | RUNE_ERROR&mask, 1;
 	}
-	var size = x & 7;
-	var ar = accept_ranges[x>>4];
+	size := x & 7;
+	ar := accept_ranges[x>>4];
 	if n < size as int {
 		return RUNE_ERROR, 1;
 	}
-	var b1 = s[1];
+	b1 := s[1];
 	if b1 < ar.lo || ar.hi < b1 {
 		return RUNE_ERROR, 1;
 	}
 
-	const {
-		MASK_X = 0b00111111;
-		MASK_2 = 0b00011111;
-		MASK_3 = 0b00001111;
-		MASK_4 = 0b00000111;
-	}
+	MASK_X :: 0b00111111;
+	MASK_2 :: 0b00011111;
+	MASK_3 :: 0b00001111;
+	MASK_4 :: 0b00000111;
 
 	if size == 2 {
 		return (b0&MASK_2) as rune <<6 | (b1&MASK_X) as rune, 2;
 	}
-	var b2 = s[2];
+	b2 := s[2];
 	if b2 < 0x80 || 0xbf < b2 {
 		return RUNE_ERROR, 1;
 	}
 	if size == 3 {
 		return (b0&MASK_3) as rune <<12 | (b1&MASK_X) as rune <<6 | (b2&MASK_X) as rune, 3;
 	}
-	var b3 = s[3];
+	b3 := s[3];
 	if b3 < 0x80 || 0xbf < b3 {
 		return RUNE_ERROR, 1;
 	}
@@ -137,31 +131,31 @@ proc valid_rune(r rune) -> bool {
 }
 
 proc valid_string(s string) -> bool {
-	var n = s.count;
-	for var i = 0; i < n; {
-		var si = s[i];
+	n := s.count;
+	for i := 0; i < n; {
+		si := s[i];
 		if si < RUNE_SELF { // ascii
 			i++;
 			continue;
 		}
-		var x = accept_sizes[si];
+		x := accept_sizes[si];
 		if x == 0xf1 {
 			return false;
 		}
-		var size = (x & 7) as int;
+		size := (x & 7) as int;
 		if i+size > n {
 			return false;
 		}
-		var ar = accept_ranges[x>>4];
-		if var b = s[i+1]; b < ar.lo || ar.hi < b {
+		ar := accept_ranges[x>>4];
+		if b := s[i+1]; b < ar.lo || ar.hi < b {
 			return false;
 		} else if size == 2 {
 			// Okay
-		} else if var b = s[i+2]; b < 0x80 || 0xbf < b {
+		} else if b := s[i+2]; b < 0x80 || 0xbf < b {
 			return false;
 		} else if size == 3 {
 			// Okay
-		} else if var b = s[i+3]; b < 0x80 || 0xbf < b {
+		} else if b := s[i+3]; b < 0x80 || 0xbf < b {
 			return false;
 		}
 		i += size;
@@ -170,34 +164,34 @@ proc valid_string(s string) -> bool {
 }
 
 proc rune_count(s string) -> int {
-	var count = 0;
-	var n = s.count;
-	for var i = 0; i < n; count++ {
-		var si = s[i];
+	count := 0;
+	n := s.count;
+	for i := 0; i < n; count++ {
+		si := s[i];
 		if si < RUNE_SELF { // ascii
 			i++;
 			continue;
 		}
-		var x = accept_sizes[si];
+		x := accept_sizes[si];
 		if x == 0xf1 {
 			i++;
 			continue;
 		}
-		var size = (x & 7) as int;
+		size := (x & 7) as int;
 		if i+size > n {
 			i++;
 			continue;
 		}
-		var ar = accept_ranges[x>>4];
-		if var b = s[i+1]; b < ar.lo || ar.hi < b {
+		ar := accept_ranges[x>>4];
+		if b := s[i+1]; b < ar.lo || ar.hi < b {
 			size = 1;
 		} else if size == 2 {
 			// Okay
-		} else if var b = s[i+2]; b < 0x80 || 0xbf < b {
+		} else if b := s[i+2]; b < 0x80 || 0xbf < b {
 			size = 1;
 		} else if size == 3 {
 			// Okay
-		} else if var b = s[i+3]; b < 0x80 || 0xbf < b {
+		} else if b := s[i+3]; b < 0x80 || 0xbf < b {
 			size = 1;
 		}
 		i += size;

+ 95 - 111
src/checker/checker.c

@@ -1075,36 +1075,33 @@ void init_preload(Checker *c) {
 	c->done_preload = true;
 }
 
-bool check_arity_match(Checker *c, AstNodeValueSpec *s, AstNodeValueSpec *init);
+bool check_arity_match(Checker *c, AstNodeValueDecl *d);
 
 #include "expr.c"
 #include "decl.c"
 #include "stmt.c"
 
-bool check_arity_match(Checker *c, AstNodeValueSpec *s, AstNodeValueSpec *init) {
-	isize lhs = s->names.count;
-	isize rhs = s->values.count;
-	if (init != NULL) {
-		rhs = init->values.count;
-	}
+bool check_arity_match(Checker *c, AstNodeValueDecl *d) {
+	isize lhs = d->names.count;
+	isize rhs = d->values.count;
 
-	if (init == NULL && rhs == 0) {
-		if (s->type == NULL) {
-			error_node(s->names.e[0], "Missing type or initial expression");
+	if (rhs == 0) {
+		if (d->type == NULL) {
+			error_node(d->names.e[0], "Missing type or initial expression");
 			return false;
 		}
 	} else if (lhs < rhs) {
-		if (lhs < s->values.count) {
-			AstNode *n = s->values.e[lhs];
+		if (lhs < d->values.count) {
+			AstNode *n = d->values.e[lhs];
 			gbString str = expr_to_string(n);
 			error_node(n, "Extra initial expression `%s`", str);
 			gb_string_free(str);
 		} else {
-			error_node(s->names.e[0], "Extra initial expression");
+			error_node(d->names.e[0], "Extra initial expression");
 		}
 		return false;
-	} else if (lhs > rhs && (init != NULL || rhs != 1)) {
-		AstNode *n = s->names.e[rhs];
+	} else if (lhs > rhs && rhs != 1) {
+		AstNode *n = d->names.e[rhs];
 		gbString str = expr_to_string(n);
 		error_node(n, "Missing expression for `%s`", str);
 		gb_string_free(str);
@@ -1160,15 +1157,95 @@ void check_global_collect_entities_from_file(Checker *c, Scope *parent_scope, As
 		switch (decl->kind) {
 		case_ast_node(bd, BadDecl, decl);
 		case_end;
+
+		case_ast_node(vd, ValueDecl, decl);
+			if (vd->is_var) {
+				// NOTE(bill): You need to store the entity information here unline a constant declaration
+				isize entity_count = vd->names.count;
+				isize entity_index = 0;
+				Entity **entities = gb_alloc_array(c->allocator, Entity *, entity_count);
+				DeclInfo *di = NULL;
+				if (vd->values.count > 0) {
+					di = make_declaration_info(heap_allocator(), parent_scope);
+					di->entities = entities;
+					di->entity_count = entity_count;
+					di->type_expr = vd->type;
+					di->init_expr = vd->values.e[0];
+				}
+
+				for_array(i, vd->names) {
+					AstNode *name = vd->names.e[i];
+					AstNode *value = NULL;
+					if (i < vd->values.count) {
+						value = vd->values.e[i];
+					}
+					if (name->kind != AstNode_Ident) {
+						error_node(name, "A declaration's name must be an identifier, got %.*s", LIT(ast_node_strings[name->kind]));
+						continue;
+					}
+					Entity *e = make_entity_variable(c->allocator, parent_scope, name->Ident, NULL);
+					e->identifier = name;
+					entities[entity_index++] = e;
+
+					DeclInfo *d = di;
+					if (d == NULL) {
+						AstNode *init_expr = value;
+						d = make_declaration_info(heap_allocator(), e->scope);
+						d->type_expr = vd->type;
+						d->init_expr = init_expr;
+						d->var_decl_tags = vd->tags;
+					}
+
+					add_entity_and_decl_info(c, name, e, d);
+				}
+
+				check_arity_match(c, vd);
+			} else {
+				for_array(i, vd->names) {
+					AstNode *name = vd->names.e[i];
+					if (name->kind != AstNode_Ident) {
+						error_node(name, "A declaration's name must be an identifier, got %.*s", LIT(ast_node_strings[name->kind]));
+						continue;
+					}
+
+
+					AstNode *init = NULL;
+					if (i < vd->values.count) {
+						init = vd->values.e[i];
+					}
+
+					DeclInfo *d = make_declaration_info(c->allocator, parent_scope);
+					Entity *e = NULL;
+
+					AstNode *up_init = unparen_expr(init);
+					if (init != NULL && is_ast_node_type(up_init)) {
+						e = make_entity_type_name(c->allocator, d->scope, name->Ident, NULL);
+						d->type_expr = init;
+						d->init_expr = init;
+					} else if (init != NULL && up_init->kind == AstNode_ProcLit) {
+						e = make_entity_procedure(c->allocator, d->scope, name->Ident, NULL, up_init->ProcLit.tags);
+						d->proc_decl = init;
+					} else {
+						e = make_entity_constant(c->allocator, d->scope, name->Ident, NULL, (ExactValue){0});
+						d->type_expr = vd->type;
+						d->init_expr = init;
+					}
+					GB_ASSERT(e != NULL);
+					e->identifier = name;
+
+					add_entity_and_decl_info(c, name, e, d);
+				}
+
+				check_arity_match(c, vd);
+			}
+		case_end;
+
 		case_ast_node(gd, GenericDecl, decl);
 			if (!parent_scope->is_file) {
 				// NOTE(bill): Within a procedure, variables must be in order
 				continue;
 			}
 
-			AstNodeValueSpec empty_spec_ = {0}, *empty_spec = &empty_spec_;
-			AstNodeValueSpec *prev_spec = NULL;
-
 			for_array(iota, gd->specs) {
 				AstNode *spec = gd->specs.e[iota];
 				switch (spec->kind) {
@@ -1183,99 +1260,6 @@ void check_global_collect_entities_from_file(Checker *c, Scope *parent_scope, As
 					DelayedDecl di = {parent_scope, spec};
 					array_add(&c->delayed_imports, di);
 				case_end;
-				case_ast_node(vs, ValueSpec, spec);
-					switch (vs->keyword) {
-					case Token_var: {
-						// NOTE(bill): You need to store the entity information here unline a constant declaration
-						isize entity_count = vs->names.count;
-						isize entity_index = 0;
-						Entity **entities = gb_alloc_array(c->allocator, Entity *, entity_count);
-						DeclInfo *di = NULL;
-						if (vs->values.count > 0) {
-							di = make_declaration_info(heap_allocator(), parent_scope);
-							di->entities = entities;
-							di->entity_count = entity_count;
-							di->type_expr = vs->type;
-							di->init_expr = vs->values.e[0];
-						}
-
-						for_array(i, vs->names) {
-							AstNode *name = vs->names.e[i];
-							AstNode *value = NULL;
-							if (i < vs->values.count) {
-								value = vs->values.e[i];
-							}
-							if (name->kind != AstNode_Ident) {
-								error_node(name, "A declaration's name must be an identifier, got %.*s", LIT(ast_node_strings[name->kind]));
-								continue;
-							}
-							Entity *e = make_entity_variable(c->allocator, parent_scope, name->Ident, NULL);
-							e->identifier = name;
-							entities[entity_index++] = e;
-
-							DeclInfo *d = di;
-							if (d == NULL) {
-								AstNode *init_expr = value;
-								d = make_declaration_info(heap_allocator(), e->scope);
-								d->type_expr = vs->type;
-								d->init_expr = init_expr;
-								d->var_decl_tags = gd->tags;
-							}
-
-							add_entity_and_decl_info(c, name, e, d);
-						}
-
-						check_arity_match(c, vs, NULL);
-					} break;
-
-					case Token_const: {
-						if (vs->type != NULL || vs->values.count > 0) {
-							prev_spec = vs;
-						} else if (prev_spec == NULL) {
-							prev_spec = empty_spec;
-						}
-
-						for_array(i, vs->names) {
-							AstNode *name = vs->names.e[i];
-							if (name->kind != AstNode_Ident) {
-								error_node(name, "A declaration's name must be an identifier, got %.*s", LIT(ast_node_strings[name->kind]));
-								continue;
-							}
-
-
-							AstNode *init = NULL;
-							if (i < prev_spec->values.count) {
-								init = prev_spec->values.e[i];
-							}
-
-							DeclInfo *d = make_declaration_info(c->allocator, parent_scope);
-							Entity *e = NULL;
-
-							ExactValue v_iota = make_exact_value_integer(iota);
-
-							AstNode *up_init = unparen_expr(init);
-							if (init != NULL && is_ast_node_type(up_init)) {
-								e = make_entity_type_name(c->allocator, d->scope, name->Ident, NULL);
-								d->type_expr = init;
-								d->init_expr = init;
-							} else if (init != NULL && up_init->kind == AstNode_ProcLit) {
-								e = make_entity_procedure(c->allocator, d->scope, name->Ident, NULL, up_init->ProcLit.tags);
-								d->proc_decl = init;
-							} else {
-								e = make_entity_constant(c->allocator, d->scope, name->Ident, NULL, v_iota);
-								d->type_expr = prev_spec->type;
-								d->init_expr = init;
-							}
-							GB_ASSERT(e != NULL);
-							e->identifier = name;
-
-							add_entity_and_decl_info(c, name, e, d);
-						}
-
-						check_arity_match(c, vs, prev_spec);
-					} break;
-					}
-				case_end;
 
 				case_ast_node(ts, TypeSpec, spec);
 					if (ts->name->kind != AstNode_Ident) {

+ 11 - 11
src/checker/decl.c

@@ -107,14 +107,14 @@ void check_init_variables(Checker *c, Entity **lhs, isize lhs_count, AstNodeArra
 	gb_temp_arena_memory_end(tmp);
 }
 
-void check_var_spec_node(Checker *c, AstNodeValueSpec *vs) {
-	GB_ASSERT(vs->keyword == Token_var);
-	isize entity_count = vs->names.count;
+void check_var_decl_node(Checker *c, AstNodeValueDecl *vd) {
+	GB_ASSERT(vd->is_var == true);
+	isize entity_count = vd->names.count;
 	isize entity_index = 0;
 	Entity **entities = gb_alloc_array(c->allocator, Entity *, entity_count);
 
-	for_array(i, vs->names) {
-		AstNode *name = vs->names.e[i];
+	for_array(i, vd->names) {
+		AstNode *name = vd->names.e[i];
 		Entity *entity = NULL;
 		if (name->kind == AstNode_Ident) {
 			Token token = name->Ident;
@@ -145,8 +145,8 @@ void check_var_spec_node(Checker *c, AstNodeValueSpec *vs) {
 	}
 
 	Type *init_type = NULL;
-	if (vs->type) {
-		init_type = check_type_extra(c, vs->type, NULL);
+	if (vd->type) {
+		init_type = check_type_extra(c, vd->type, NULL);
 		if (init_type == NULL) {
 			init_type = t_invalid;
 		}
@@ -165,12 +165,12 @@ void check_var_spec_node(Checker *c, AstNodeValueSpec *vs) {
 			e->type = init_type;
 	}
 
-	check_arity_match(c, vs, NULL);
-	check_init_variables(c, entities, entity_count, vs->values, str_lit("variable declaration"));
+	check_arity_match(c, vd);
+	check_init_variables(c, entities, entity_count, vd->values, str_lit("variable declaration"));
 
-	for_array(i, vs->names) {
+	for_array(i, vd->names) {
 		if (entities[i] != NULL) {
-			add_entity(c, c->context.scope, vs->names.e[i], entities[i]);
+			add_entity(c, c->context.scope, vd->names.e[i], entities[i]);
 		}
 	}
 

+ 44 - 57
src/checker/expr.c

@@ -85,71 +85,58 @@ void check_local_collect_entities(Checker *c, AstNodeArray nodes, DelayedEntitie
 		case_ast_node(ws, WhenStmt, node);
 			// Will be handled later
 		case_end;
-		case_ast_node(gd, GenericDecl, node);
-			AstNodeValueSpec empty_spec_ = {0}, *empty_spec = &empty_spec_;
-			AstNodeValueSpec *last = NULL;
 
-			for_array(iota, gd->specs) {
-				AstNode *spec = gd->specs.e[iota];
-				switch (spec->kind) {
-				case_ast_node(bd, BadDecl, spec);
-				case_end;
-				case_ast_node(vs, ValueSpec, spec);
-					switch (vs->keyword) {
-					case Token_var:
-						break;
-
-					case Token_const: {
-						if (vs->type != NULL || vs->values.count > 0) {
-							last = vs;
-						} else if (last == NULL) {
-							last = empty_spec;
-						}
-
-						for_array(i, vs->names) {
-							AstNode *name = vs->names.e[i];
-							if (name->kind != AstNode_Ident) {
-								error_node(name, "A declaration's name must be an identifier, got %.*s", LIT(ast_node_strings[name->kind]));
-								continue;
-							}
-
-							AstNode *init = NULL;
-							if (i < vs->values.count) {
-								init = vs->values.e[i];
-							}
+		case_ast_node(vd, ValueDecl, node);
+			if (vd->is_var) {
+				// NOTE(bill): Handled later
+			} else {
+				for_array(i, vd->names) {
+					AstNode *name = vd->names.e[i];
+					if (name->kind != AstNode_Ident) {
+						error_node(name, "A declaration's name must be an identifier, got %.*s", LIT(ast_node_strings[name->kind]));
+						continue;
+					}
 
-							DeclInfo *d = make_declaration_info(c->allocator, c->context.scope);
-							Entity *e = NULL;
+					AstNode *init = NULL;
+					if (i < vd->values.count) {
+						init = vd->values.e[i];
+					}
 
-							ExactValue v_iota = make_exact_value_integer(iota);
+					DeclInfo *d = make_declaration_info(c->allocator, c->context.scope);
+					Entity *e = NULL;
+
+					AstNode *up_init = unparen_expr(init);
+					if (init != NULL && is_ast_node_type(up_init)) {
+						e = make_entity_type_name(c->allocator, d->scope, name->Ident, NULL);
+						d->type_expr = init;
+						d->init_expr = init;
+					} else if (init != NULL && up_init->kind == AstNode_ProcLit) {
+						e = make_entity_procedure(c->allocator, d->scope, name->Ident, NULL, up_init->ProcLit.tags);
+						d->proc_decl = init;
+					} else {
+						e = make_entity_constant(c->allocator, d->scope, name->Ident, NULL, (ExactValue){0});
+						d->type_expr = vd->type;
+						d->init_expr = init;
+					}
+					GB_ASSERT(e != NULL);
+					e->identifier = name;
 
-							AstNode *up_init = unparen_expr(init);
-							if (init != NULL && is_ast_node_type(up_init)) {
-								e = make_entity_type_name(c->allocator, d->scope, name->Ident, NULL);
-								d->type_expr = init;
-								d->init_expr = init;
-							} else if (init != NULL && up_init->kind == AstNode_ProcLit) {
-								e = make_entity_procedure(c->allocator, d->scope, name->Ident, NULL, up_init->ProcLit.tags);
-								d->proc_decl = init;
-							} else {
-								e = make_entity_constant(c->allocator, d->scope, name->Ident, NULL, v_iota);
-								d->type_expr = vs->type;
-								d->init_expr = init;
-							}
-							GB_ASSERT(e != NULL);
-							e->identifier = name;
+					add_entity_and_decl_info(c, name, e, d);
 
-							add_entity_and_decl_info(c, name, e, d);
+					DelayedEntity delay = {name, e, d};
+					array_add(delayed_entities, delay);
+				}
 
-							DelayedEntity delay = {name, e, d};
-							array_add(delayed_entities, delay);
-						}
+				check_arity_match(c, vd);
+			}
+		case_end;
 
-						check_arity_match(c, vs, last);
-					} break;
-					}
+		case_ast_node(gd, GenericDecl, node);
+			for_array(iota, gd->specs) {
+				AstNode *spec = gd->specs.e[iota];
+				switch (spec->kind) {
+				case_ast_node(bd, BadDecl, spec);
 				case_end;
-
 				case_ast_node(ts, TypeSpec, spec);
 					if (ts->name->kind != AstNode_Ident) {
 						error_node(ts->name, "A declaration's name must be an identifier, got %.*s", LIT(ast_node_strings[ts->name->kind]));

+ 102 - 111
src/checker/stmt.c

@@ -1026,48 +1026,45 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
 			}
 		case_end;
 
-		case_ast_node(gd, GenericDecl, us->node);
-			for_array(spec_index, gd->specs) {
-				AstNode *spec = gd->specs.e[spec_index];
-				switch (spec->kind) {
-				case_ast_node(vs, ValueSpec, spec);
-					if (vs->keyword != Token_var) {
-						error_node(spec, "`using` can only be applied to a variable declaration");
-						return;
-					}
+		case_ast_node(vd, ValueDecl, us->node);
+			if (!vd->is_var) {
+				error_node(us->node, "`using` can only be applied to a variable declaration");
+				return;
+			}
 
-					if (vs->names.count > 1 && vs->type != NULL) {
-						error(us->token, "`using` can only be applied to one variable of the same type");
-					}
+			if (vd->names.count > 1 && vd->type != NULL) {
+				error(us->token, "`using` can only be applied to one variable of the same type");
+			}
+
+			check_var_decl_node(c, vd);
 
-					check_var_spec_node(c, vs);
-
-					for_array(name_index, vs->names) {
-						AstNode *item = vs->names.e[name_index];
-						ast_node(i, Ident, item);
-						String name = i->string;
-						Entity *e = scope_lookup_entity(c->context.scope, name);
-						Type *t = base_type(type_deref(e->type));
-						if (is_type_struct(t) || is_type_raw_union(t)) {
-							Scope **found = map_scope_get(&c->info.scopes, hash_pointer(t->Record.node));
-							GB_ASSERT(found != NULL);
-							for_array(i, (*found)->elements.entries) {
-								Entity *f = (*found)->elements.entries.e[i].value;
-								if (f->kind == Entity_Variable) {
-									Entity *uvar = make_entity_using_variable(c->allocator, e, f->token, f->type);
-									Entity *prev = scope_insert_entity(c->context.scope, uvar);
-									if (prev != NULL) {
-										error(us->token, "Namespace collision while `using` `%.*s` of: %.*s", LIT(name), LIT(prev->token.string));
-										return;
-									}
-								}
+			for_array(name_index, vd->names) {
+				AstNode *item = vd->names.e[name_index];
+				if (item->kind != AstNode_Ident) {
+					// TODO(bill): Handle error here???
+					continue;
+				}
+				ast_node(i, Ident, item);
+				String name = i->string;
+				Entity *e = scope_lookup_entity(c->context.scope, name);
+				Type *t = base_type(type_deref(e->type));
+				if (is_type_struct(t) || is_type_raw_union(t)) {
+					Scope **found = map_scope_get(&c->info.scopes, hash_pointer(t->Record.node));
+					GB_ASSERT(found != NULL);
+					for_array(i, (*found)->elements.entries) {
+						Entity *f = (*found)->elements.entries.e[i].value;
+						if (f->kind == Entity_Variable) {
+							Entity *uvar = make_entity_using_variable(c->allocator, e, f->token, f->type);
+							Entity *prev = scope_insert_entity(c->context.scope, uvar);
+							if (prev != NULL) {
+								error(us->token, "Namespace collision while `using` `%.*s` of: %.*s", LIT(name), LIT(prev->token.string));
+								return;
 							}
-						} else {
-							error(us->token, "`using` can only be applied to variables of type struct or raw_union");
-							return;
 						}
 					}
-				case_end;
+				} else {
+					error(us->token, "`using` can only be applied to variables of type struct or raw_union");
+					return;
 				}
 			}
 		case_end;
@@ -1096,89 +1093,83 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
 	case_end;
 
 
-
-
-	case_ast_node(gd, GenericDecl, node);
-		for_array(spec_index, gd->specs) {
-			AstNode *spec = gd->specs.e[spec_index];
-			switch (spec->kind) {
-			case_ast_node(bd, BadDecl, spec);
-			case_end;
-			case_ast_node(vs, ValueSpec, spec);
-				switch (vs->keyword) {
-				case Token_var: {
-					isize entity_count = vs->names.count;
-					isize entity_index = 0;
-					Entity **entities = gb_alloc_array(c->allocator, Entity *, entity_count);
-
-					for_array(i, vs->names) {
-						AstNode *name = vs->names.e[i];
-						Entity *entity = NULL;
-						if (name->kind == AstNode_Ident) {
-							Token token = name->Ident;
-							String str = token.string;
-							Entity *found = NULL;
-							// NOTE(bill): Ignore assignments to `_`
-							if (str_ne(str, str_lit("_"))) {
-								found = current_scope_lookup_entity(c->context.scope, str);
-							}
-							if (found == NULL) {
-								entity = make_entity_variable(c->allocator, c->context.scope, token, NULL);
-								add_entity_definition(&c->info, name, entity);
-							} else {
-								TokenPos pos = found->token.pos;
-								error(token,
-								      "Redeclaration of `%.*s` in this scope\n"
-								      "\tat %.*s(%td:%td)",
-								      LIT(str), LIT(pos.file), pos.line, pos.column);
-								entity = found;
-							}
-						} else {
-							error_node(name, "A variable declaration must be an identifier");
-						}
-						if (entity == NULL) {
-							entity = make_entity_dummy_variable(c->allocator, c->global_scope, ast_node_token(name));
-						}
-						entities[entity_index++] = entity;
+	case_ast_node(vd, ValueDecl, node);
+		if (vd->is_var) {
+			isize entity_count = vd->names.count;
+			isize entity_index = 0;
+			Entity **entities = gb_alloc_array(c->allocator, Entity *, entity_count);
+
+			for_array(i, vd->names) {
+				AstNode *name = vd->names.e[i];
+				Entity *entity = NULL;
+				if (name->kind == AstNode_Ident) {
+					Token token = name->Ident;
+					String str = token.string;
+					Entity *found = NULL;
+					// NOTE(bill): Ignore assignments to `_`
+					if (str_ne(str, str_lit("_"))) {
+						found = current_scope_lookup_entity(c->context.scope, str);
 					}
-
-					Type *init_type = NULL;
-					if (vs->type) {
-						init_type = check_type_extra(c, vs->type, NULL);
-						if (init_type == NULL) {
-							init_type = t_invalid;
-						}
+					if (found == NULL) {
+						entity = make_entity_variable(c->allocator, c->context.scope, token, NULL);
+						add_entity_definition(&c->info, name, entity);
+					} else {
+						TokenPos pos = found->token.pos;
+						error(token,
+						      "Redeclaration of `%.*s` in this scope\n"
+						      "\tat %.*s(%td:%td)",
+						      LIT(str), LIT(pos.file), pos.line, pos.column);
+						entity = found;
 					}
+				} else {
+					error_node(name, "A variable declaration must be an identifier");
+				}
+				if (entity == NULL) {
+					entity = make_entity_dummy_variable(c->allocator, c->global_scope, ast_node_token(name));
+				}
+				entities[entity_index++] = entity;
+			}
 
-					for (isize i = 0; i < entity_count; i++) {
-						Entity *e = entities[i];
-						GB_ASSERT(e != NULL);
-						if (e->flags & EntityFlag_Visited) {
-							e->type = t_invalid;
-							continue;
-						}
-						e->flags |= EntityFlag_Visited;
+			Type *init_type = NULL;
+			if (vd->type) {
+				init_type = check_type_extra(c, vd->type, NULL);
+				if (init_type == NULL) {
+					init_type = t_invalid;
+				}
+			}
 
-						if (e->type == NULL)
-							e->type = init_type;
-					}
-					check_arity_match(c, vs, NULL);
+			for (isize i = 0; i < entity_count; i++) {
+				Entity *e = entities[i];
+				GB_ASSERT(e != NULL);
+				if (e->flags & EntityFlag_Visited) {
+					e->type = t_invalid;
+					continue;
+				}
+				e->flags |= EntityFlag_Visited;
 
-					check_init_variables(c, entities, entity_count, vs->values, str_lit("variable declaration"));
+				if (e->type == NULL)
+					e->type = init_type;
+			}
+			check_arity_match(c, vd);
 
-					for_array(i, vs->names) {
-						if (entities[i] != NULL) {
-							add_entity(c, c->context.scope, vs->names.e[i], entities[i]);
-						}
-					}
-				} break;
+			check_init_variables(c, entities, entity_count, vd->values, str_lit("variable declaration"));
 
-				case Token_const:
-					// NOTE(bill): Handled elsewhere
-					break;
+			for_array(i, vd->names) {
+				if (entities[i] != NULL) {
+					add_entity(c, c->context.scope, vd->names.e[i], entities[i]);
 				}
-			case_end;
+			}
+		} else {
+			// NOTE(bill): Handled elsewhere
+		}
+	case_end;
 
+	case_ast_node(gd, GenericDecl, node);
+		for_array(spec_index, gd->specs) {
+			AstNode *spec = gd->specs.e[spec_index];
+			switch (spec->kind) {
+			case_ast_node(bd, BadDecl, spec);
+			case_end;
 			case_ast_node(ts, TypeSpec, spec);
 				// NOTE(bill): Handled elsewhere
 			case_end;

+ 117 - 67
src/parser.c

@@ -251,12 +251,6 @@ AST_NODE_KIND(_ComplexStmtBegin, "", i32) \
 AST_NODE_KIND(_ComplexStmtEnd, "", i32) \
 AST_NODE_KIND(_StmtEnd,        "", i32) \
 AST_NODE_KIND(_SpecBegin, "", i32) \
-	AST_NODE_KIND(ValueSpec, "value specification", struct { \
-		TokenKind    keyword; \
-		AstNodeArray names;   \
-		AstNode *    type;    \
-		AstNodeArray values;  \
-	}) \
 	AST_NODE_KIND(TypeSpec,   "type specification", struct { \
 		AstNode *name; \
 		AstNode *type; \
@@ -280,6 +274,13 @@ AST_NODE_KIND(_DeclBegin,      "", i32) \
 		u64          tags;        \
 		bool         is_using;    \
 	}) \
+	AST_NODE_KIND(ValueDecl, "value declaration", struct { \
+		bool         is_var; \
+		AstNodeArray names;  \
+		AstNode *    type;   \
+		AstNodeArray values; \
+		u64          tags;   \
+	}) \
 	AST_NODE_KIND(ProcDecl, "procedure declaration", struct { \
 		AstNode *name;         \
 		AstNode *type;         \
@@ -498,14 +499,14 @@ Token ast_node_token(AstNode *node) {
 		return node->BadDecl.begin;
 	case AstNode_GenericDecl:
 		return node->GenericDecl.token;
+	case AstNode_ValueDecl:
+		return ast_node_token(node->ValueDecl.names.e[0]);
 	case AstNode_ProcDecl:
 		return ast_node_token(node->ProcDecl.name);
 
 	case AstNode_ForeignLibrary:
 		return node->ForeignLibrary.token;
 
-	case AstNode_ValueSpec:
-		return ast_node_token(node->ValueSpec.names.e[0]);
 	case AstNode_TypeSpec:
 		return ast_node_token(node->TypeSpec.name);
 	case AstNode_ImportSpec:
@@ -1076,12 +1077,12 @@ AstNode *make_generic_decl(AstFile *f, Token token, Token open, Token close, Ast
 	return result;
 }
 
-AstNode *make_value_spec(AstFile *f, TokenKind keyword, AstNodeArray names, AstNode *type, AstNodeArray values) {
-	AstNode *result = make_node(f, AstNode_ValueSpec);
-	result->ValueSpec.keyword = keyword;
-	result->ValueSpec.names = names;
-	result->ValueSpec.type = type;
-	result->ValueSpec.values = values;
+AstNode *make_value_decl(AstFile *f, bool is_var, AstNodeArray names, AstNode *type, AstNodeArray values) {
+	AstNode *result = make_node(f, AstNode_ValueDecl);
+	result->ValueDecl.is_var = is_var;
+	result->ValueDecl.names  = names;
+	result->ValueDecl.type   = type;
+	result->ValueDecl.values = values;
 	return result;
 }
 
@@ -1210,8 +1211,8 @@ void fix_advance_to_next_stmt(AstFile *f) {
 		case Token_Semicolon:
 			return;
 
-		case Token_var:
-		case Token_const:
+		// case Token_var:
+		// case Token_const:
 		case Token_type:
 		case Token_proc:
 		case Token_import:
@@ -2139,42 +2140,42 @@ AstNode *parse_generic_decl(AstFile *f, TokenKind keyword, ParserSpecProc spec_p
 	return make_generic_decl(f, token, open, close, specs, 0, false);
 }
 
-PARSE_SPEC_PROC(parse_value_spec) {
-	AstNodeArray names = parse_identfier_list(f);
-	parse_check_name_list_for_reserves(f, names);
-	AstNode *type = parse_type_attempt(f);
-	AstNodeArray values = {0};
+// PARSE_SPEC_PROC(parse_value_spec) {
+// 	AstNodeArray names = parse_identfier_list(f);
+// 	parse_check_name_list_for_reserves(f, names);
+// 	AstNode *type = parse_type_attempt(f);
+// 	AstNodeArray values = {0};
 
-	if (allow_token(f, Token_Eq)) {
-		values = parse_rhs_expr_list(f);
-	}
+// 	if (allow_token(f, Token_Eq)) {
+// 		values = parse_rhs_expr_list(f);
+// 	}
 
-	if (values.count > names.count) {
-		syntax_error(f->curr_token, "Too many values on the right hand side of the declaration");
-	}
+// 	if (values.count > names.count) {
+// 		syntax_error(f->curr_token, "Too many values on the right hand side of the declaration");
+// 	}
 
-	switch (keyword) {
-	case Token_var:
-		if (type == NULL && values.count == 0 && names.count > 0) {
-			syntax_error(f->curr_token, "Missing type or initialization");
-			return make_bad_decl(f, f->curr_token, f->curr_token);
-		}
-		break;
-	case Token_const:
-		if (values.count == 0 && (index == 0 || type != NULL)) {
-			syntax_error(f->curr_token, "Missing constant value");
-			return make_bad_decl(f, f->curr_token, f->curr_token);
-		}
-		break;
-	}
+// 	switch (keyword) {
+// 	case Token_var:
+// 		if (type == NULL && values.count == 0 && names.count > 0) {
+// 			syntax_error(f->curr_token, "Missing type or initialization");
+// 			return make_bad_decl(f, f->curr_token, f->curr_token);
+// 		}
+// 		break;
+// 	case Token_const:
+// 		if (values.count == 0 && (index == 0 || type != NULL)) {
+// 			syntax_error(f->curr_token, "Missing constant value");
+// 			return make_bad_decl(f, f->curr_token, f->curr_token);
+// 		}
+// 		break;
+// 	}
 
-	// TODO(bill): Fix this so it does not require it
-	if (values.e == NULL) {
-		values = make_ast_node_array(f);
-	}
+// 	// TODO(bill): Fix this so it does not require it
+// 	if (values.e == NULL) {
+// 		values = make_ast_node_array(f);
+// 	}
 
-	return make_value_spec(f, keyword, names, type, values);
-}
+// 	return make_value_spec(f, keyword, names, type, values);
+// }
 PARSE_SPEC_PROC(parse_type_spec) {
 	AstNode *name = parse_identifier(f);
 	AstNode *type = parse_type(f);
@@ -2239,9 +2240,9 @@ PARSE_SPEC_PROC(parse_include_spec) {
 
 AstNode *parse_decl(AstFile *f) {
 	switch (f->curr_token.kind) {
-	case Token_var:
-	case Token_const:
-		return parse_generic_decl(f, f->curr_token.kind, parse_value_spec);
+	// case Token_var:
+	// case Token_const:
+		// return parse_generic_decl(f, f->curr_token.kind, parse_value_spec);
 
 	case Token_type:
 		return parse_generic_decl(f, f->curr_token.kind, parse_type_spec);
@@ -2266,12 +2267,7 @@ AstNode *parse_decl(AstFile *f) {
 
 
 AstNode *parse_simple_stmt(AstFile *f) {
-	switch (f->curr_token.kind) {
-	case Token_var:
-	case Token_const:
-		return parse_decl(f);
-	}
-
+	Token start_token = f->curr_token;
 	AstNodeArray lhs = parse_lhs_expr_list(f);
 	Token token = f->curr_token;
 	switch (token.kind) {
@@ -2302,6 +2298,61 @@ AstNode *parse_simple_stmt(AstFile *f) {
 		}
 		return make_assign_stmt(f, token, lhs, rhs);
 	} break;
+
+	case Token_Colon: {
+		parse_check_name_list_for_reserves(f, lhs);
+
+		AstNode *type = NULL;
+		AstNodeArray values = {0};
+		bool is_mutable = true;
+
+		if (allow_token(f, Token_Colon)) {
+			if (!allow_token(f, Token_type)) {
+				type = parse_type_attempt(f);
+			}
+		} else if (f->curr_token.kind != Token_Eq &&
+		           f->curr_token.kind != Token_Semicolon) {
+			syntax_error(f->curr_token, "Expected a type separator `:` or `=`");
+		}
+
+
+		switch (f->curr_token.kind) {
+		case Token_Colon:
+			is_mutable = false;
+			/*fallthrough*/
+		case Token_Eq:
+			next_token(f);
+			values = parse_rhs_expr_list(f);
+			if (values.count > lhs.count) {
+				syntax_error(f->curr_token, "Too many values on the right hand side of the declaration");
+			} else if (values.count < lhs.count && !is_mutable) {
+				syntax_error(f->curr_token, "All constant declarations must be defined");
+			} else if (values.count == 0) {
+				syntax_error(f->curr_token, "Expected an expression for this declaration");
+			}
+			break;
+		}
+
+		if (is_mutable) {
+			if (type == NULL && values.count == 0) {
+				syntax_error(f->curr_token, "Missing variable type or initialization");
+				return make_bad_decl(f, f->curr_token, f->curr_token);
+			}
+		} else {
+			if (type == NULL && values.count == 0 && lhs.count > 0) {
+				syntax_error(f->curr_token, "Missing constant value");
+				return make_bad_decl(f, f->curr_token, f->curr_token);
+			}
+		}
+
+		if (values.e == NULL) {
+			values = make_ast_node_array(f);
+		}
+
+		AstNodeArray specs = {0};
+		array_init_reserve(&specs, heap_allocator(), 1);
+		return make_value_decl(f, is_mutable, lhs, type, values);
+	} break;
 	}
 
 	if (lhs.count > 1) {
@@ -3025,8 +3076,8 @@ AstNode *parse_stmt(AstFile *f) {
 		expect_semicolon(f, s);
 		return s;
 
-	case Token_var:
-	case Token_const:
+	// case Token_var:
+	// case Token_const:
 	case Token_proc:
 	case Token_type:
 	case Token_import:
@@ -3063,14 +3114,12 @@ AstNode *parse_stmt(AstFile *f) {
 			while (e->kind == AstNode_SelectorExpr) {
 				e = unparen_expr(e->SelectorExpr.selector);
 			}
-		if (e->kind == AstNode_Ident) {
+			if (e->kind == AstNode_Ident) {
 				valid = true;
 			}
 		} break;
-		case AstNode_GenericDecl:
-			if (node->GenericDecl.token.kind == Token_var) {
-				valid = true;
-			}
+		case AstNode_ValueDecl:
+			valid = node->ValueDecl.is_var;
 			break;
 		}
 
@@ -3153,8 +3202,8 @@ AstNode *parse_stmt(AstFile *f) {
 			return s;
 		} else if (str_eq(tag, str_lit("thread_local"))) {
 			AstNode *decl = parse_simple_stmt(f);
-			if (decl->kind == AstNode_GenericDecl &&
-			    decl->GenericDecl.token.kind != Token_var) {
+			if (decl->kind != AstNode_ValueDecl &&
+			    !decl->ValueDecl.is_var) {
 				syntax_error(token, "#thread_local may only be applied to variable declarations");
 				return make_bad_decl(f, token, ast_node_token(decl));
 			}
@@ -3162,8 +3211,9 @@ AstNode *parse_stmt(AstFile *f) {
 				syntax_error(token, "#thread_local is only allowed at the file scope");
 				return make_bad_decl(f, token, ast_node_token(decl));
 			}
-			GB_ASSERT(decl->kind == AstNode_GenericDecl);
-			decl->GenericDecl.tags |= VarDeclTag_thread_local;
+
+			GB_ASSERT(decl->kind == AstNode_ValueDecl);
+			decl->ValueDecl.tags |= VarDeclTag_thread_local;
 			return decl;
 		} else if (str_eq(tag, str_lit("bounds_check"))) {
 			s = parse_stmt(f);

+ 53 - 57
src/ssa.c

@@ -3924,71 +3924,67 @@ void ssa_build_stmt_internal(ssaProcedure *proc, AstNode *node) {
 		ssa_build_when_stmt(proc, ws);
 	case_end;
 
+	case_ast_node(vd, ValueDecl, node);
+		if (vd->is_var) {
+			ssaModule *m = proc->module;
+			gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&m->tmp_arena);
 
-	case_ast_node(gd, GenericDecl, node);
-		for_array(spec_index, gd->specs) {
-			AstNode *spec = gd->specs.e[spec_index];
-			switch (spec->kind) {
-			case_ast_node(vs, ValueSpec, spec);
-				switch (vs->keyword) {
-				case Token_const:
-					break;
-				case Token_var: {
-					ssaModule *m = proc->module;
-					gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&m->tmp_arena);
-
-					if (vs->values.count == 0) { // declared and zero-initialized
-						for_array(i, vs->names) {
-							AstNode *name = vs->names.e[i];
-							if (!ssa_is_blank_ident(name)) {
-								ssa_add_local_for_identifier(proc, name, true);
-							}
-						}
-					} else { // Tuple(s)
-						Array(ssaAddr) lvals;
-						ssaValueArray  inits;
-						array_init_reserve(&lvals, m->tmp_allocator, vs->names.count);
-						array_init_reserve(&inits, m->tmp_allocator, vs->names.count);
-
-						for_array(i, vs->names) {
-							AstNode *name = vs->names.e[i];
-							ssaAddr lval = ssa_make_addr(NULL, NULL);
-							if (!ssa_is_blank_ident(name)) {
-								ssa_add_local_for_identifier(proc, name, false);
-								lval = ssa_build_addr(proc, name);
-							}
+			if (vd->values.count == 0) { // declared and zero-initialized
+				for_array(i, vd->names) {
+					AstNode *name = vd->names.e[i];
+					if (!ssa_is_blank_ident(name)) {
+						ssa_add_local_for_identifier(proc, name, true);
+					}
+				}
+			} else { // Tuple(s)
+				Array(ssaAddr) lvals;
+				ssaValueArray  inits;
+				array_init_reserve(&lvals, m->tmp_allocator, vd->names.count);
+				array_init_reserve(&inits, m->tmp_allocator, vd->names.count);
+
+				for_array(i, vd->names) {
+					AstNode *name = vd->names.e[i];
+					ssaAddr lval = ssa_make_addr(NULL, NULL);
+					if (!ssa_is_blank_ident(name)) {
+						ssa_add_local_for_identifier(proc, name, false);
+						lval = ssa_build_addr(proc, name);
+					}
 
-							array_add(&lvals, lval);
-						}
+					array_add(&lvals, lval);
+				}
 
-						for_array(i, vs->values) {
-							ssaValue *init = ssa_build_expr(proc, vs->values.e[i]);
-							Type *t = ssa_type(init);
-							if (t->kind == Type_Tuple) {
-								for (isize i = 0; i < t->Tuple.variable_count; i++) {
-									Entity *e = t->Tuple.variables[i];
-									ssaValue *v = ssa_emit_struct_ev(proc, init, i);
-									array_add(&inits, v);
-								}
-							} else {
-								array_add(&inits, init);
-							}
+				for_array(i, vd->values) {
+					ssaValue *init = ssa_build_expr(proc, vd->values.e[i]);
+					Type *t = ssa_type(init);
+					if (t->kind == Type_Tuple) {
+						for (isize i = 0; i < t->Tuple.variable_count; i++) {
+							Entity *e = t->Tuple.variables[i];
+							ssaValue *v = ssa_emit_struct_ev(proc, init, i);
+							array_add(&inits, v);
 						}
+					} else {
+						array_add(&inits, init);
+					}
+				}
 
 
-						for_array(i, inits) {
-							if (lvals.e[i].addr == NULL) {
-								continue;
-							}
-							ssaValue *v = ssa_emit_conv(proc, inits.e[i], ssa_addr_type(lvals.e[i]));
-							ssa_addr_store(proc, lvals.e[i], v);
-						}
+				for_array(i, inits) {
+					if (lvals.e[i].addr == NULL) {
+						continue;
 					}
-
-					gb_temp_arena_memory_end(tmp);
-				} break;
+					ssaValue *v = ssa_emit_conv(proc, inits.e[i], ssa_addr_type(lvals.e[i]));
+					ssa_addr_store(proc, lvals.e[i], v);
 				}
-			case_end;
+			}
+
+			gb_temp_arena_memory_end(tmp);
+		}
+	case_end;
+
+	case_ast_node(gd, GenericDecl, node);
+		for_array(spec_index, gd->specs) {
+			AstNode *spec = gd->specs.e[spec_index];
+			switch (spec->kind) {
 			case_ast_node(ts, TypeSpec, spec);
 				// NOTE(bill): Generate a new name
 				// parent_proc.name-guid

+ 2 - 2
src/tokenizer.c

@@ -84,8 +84,8 @@ TOKEN_KIND(Token__OperatorEnd, "_OperatorEnd"), \
 TOKEN_KIND(Token__KeywordBegin, "_KeywordBegin"), \
 	TOKEN_KIND(Token_type,           "type"), \
 	TOKEN_KIND(Token_proc,           "proc"), \
-	TOKEN_KIND(Token_var,            "var"), \
-	TOKEN_KIND(Token_const,          "const"), \
+	/* TOKEN_KIND(Token_var,            "var"),  */\
+	/* TOKEN_KIND(Token_const,          "const"),  */\
 	TOKEN_KIND(Token_import,         "import"), \
 	TOKEN_KIND(Token_include,        "include"), \
 	TOKEN_KIND(Token_macro,          "macro"), \